Merge "drm/msm: Add explicit sync operations"
This commit is contained in:
commit
eebdfc41ec
4 changed files with 69 additions and 1 deletions
|
@ -1537,6 +1537,37 @@ static int msm_ioctl_deregister_event(struct drm_device *dev, void *data,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int msm_ioctl_gem_sync(struct drm_device *dev, void *data,
|
||||||
|
struct drm_file *file)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct drm_msm_gem_sync *arg = data;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < arg->nr_ops; i++) {
|
||||||
|
struct drm_msm_gem_syncop syncop;
|
||||||
|
struct drm_gem_object *obj;
|
||||||
|
int ret;
|
||||||
|
void __user *ptr =
|
||||||
|
(void __user *)(uintptr_t)
|
||||||
|
(arg->ops + (i * sizeof(syncop)));
|
||||||
|
|
||||||
|
ret = copy_from_user(&syncop, ptr, sizeof(syncop));
|
||||||
|
if (ret)
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
obj = drm_gem_object_lookup(dev, file, syncop.handle);
|
||||||
|
if (!obj)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
msm_gem_sync(obj, syncop.op);
|
||||||
|
|
||||||
|
drm_gem_object_unreference_unlocked(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void msm_send_crtc_notification(struct drm_crtc *crtc,
|
void msm_send_crtc_notification(struct drm_crtc *crtc,
|
||||||
struct drm_event *event, u8 *payload)
|
struct drm_event *event, u8 *payload)
|
||||||
{
|
{
|
||||||
|
@ -1665,6 +1696,8 @@ static const struct drm_ioctl_desc msm_ioctls[] = {
|
||||||
DRM_AUTH|DRM_RENDER_ALLOW),
|
DRM_AUTH|DRM_RENDER_ALLOW),
|
||||||
DRM_IOCTL_DEF_DRV(MSM_COUNTER_READ, msm_ioctl_counter_read,
|
DRM_IOCTL_DEF_DRV(MSM_COUNTER_READ, msm_ioctl_counter_read,
|
||||||
DRM_AUTH|DRM_RENDER_ALLOW),
|
DRM_AUTH|DRM_RENDER_ALLOW),
|
||||||
|
DRM_IOCTL_DEF_DRV(MSM_GEM_SYNC, msm_ioctl_gem_sync,
|
||||||
|
DRM_AUTH|DRM_RENDER_ALLOW),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct vm_operations_struct vm_ops = {
|
static const struct vm_operations_struct vm_ops = {
|
||||||
|
|
|
@ -469,6 +469,7 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev,
|
||||||
uint32_t size, uint32_t flags);
|
uint32_t size, uint32_t flags);
|
||||||
struct drm_gem_object *msm_gem_import(struct drm_device *dev,
|
struct drm_gem_object *msm_gem_import(struct drm_device *dev,
|
||||||
uint32_t size, struct sg_table *sgt);
|
uint32_t size, struct sg_table *sgt);
|
||||||
|
void msm_gem_sync(struct drm_gem_object *obj, u32 op);
|
||||||
|
|
||||||
int msm_framebuffer_prepare(struct drm_framebuffer *fb,
|
int msm_framebuffer_prepare(struct drm_framebuffer *fb,
|
||||||
struct msm_gem_address_space *aspace);
|
struct msm_gem_address_space *aspace);
|
||||||
|
|
|
@ -546,6 +546,26 @@ int msm_gem_cpu_fini(struct drm_gem_object *obj)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void msm_gem_sync(struct drm_gem_object *obj, u32 op)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = obj->dev;
|
||||||
|
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|
||||||
|
|
||||||
|
if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (op) {
|
||||||
|
case MSM_GEM_SYNC_TO_CPU:
|
||||||
|
dma_sync_sg_for_cpu(dev->dev, msm_obj->sgt->sgl,
|
||||||
|
msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
|
||||||
|
break;
|
||||||
|
case MSM_GEM_SYNC_TO_DEV:
|
||||||
|
dma_sync_sg_for_device(dev->dev, msm_obj->sgt->sgl,
|
||||||
|
msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
|
void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
|
||||||
{
|
{
|
||||||
|
|
|
@ -323,6 +323,18 @@ struct drm_msm_counter_read {
|
||||||
__u32 nr_ops;
|
__u32 nr_ops;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MSM_GEM_SYNC_TO_DEV 0
|
||||||
|
#define MSM_GEM_SYNC_TO_CPU 1
|
||||||
|
|
||||||
|
struct drm_msm_gem_syncop {
|
||||||
|
__u32 handle;
|
||||||
|
__u32 op;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_msm_gem_sync {
|
||||||
|
__u32 nr_ops;
|
||||||
|
__u64 __user ops;
|
||||||
|
};
|
||||||
|
|
||||||
#define DRM_MSM_GET_PARAM 0x00
|
#define DRM_MSM_GET_PARAM 0x00
|
||||||
/* placeholder:
|
/* placeholder:
|
||||||
|
@ -341,6 +353,7 @@ struct drm_msm_counter_read {
|
||||||
#define DRM_MSM_COUNTER_GET 0x43
|
#define DRM_MSM_COUNTER_GET 0x43
|
||||||
#define DRM_MSM_COUNTER_PUT 0x44
|
#define DRM_MSM_COUNTER_PUT 0x44
|
||||||
#define DRM_MSM_COUNTER_READ 0x45
|
#define DRM_MSM_COUNTER_READ 0x45
|
||||||
|
#define DRM_MSM_GEM_SYNC 0x46
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Currently DRM framework supports only VSYNC event.
|
* Currently DRM framework supports only VSYNC event.
|
||||||
|
@ -370,5 +383,6 @@ struct drm_msm_counter_read {
|
||||||
#define DRM_IOCTL_MSM_COUNTER_READ \
|
#define DRM_IOCTL_MSM_COUNTER_READ \
|
||||||
DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_COUNTER_READ, \
|
DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_COUNTER_READ, \
|
||||||
struct drm_msm_counter_read)
|
struct drm_msm_counter_read)
|
||||||
|
#define DRM_IOCTL_MSM_GEM_SYNC DRM_IOW(DRM_COMMAND_BASE + DRM_MSM_GEM_SYNC,\
|
||||||
|
struct drm_msm_gem_sync)
|
||||||
#endif /* __MSM_DRM_H__ */
|
#endif /* __MSM_DRM_H__ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue