Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f567fc12 authored by Jordan Crouse's avatar Jordan Crouse
Browse files

drm/msm: Add explicit sync operations



Add sync operations to give the user more control
over the behavior of cached buffers.

Change-Id: Ic0dedbad67e19a6b30b2cc5f6b2c7bbe52c2b708
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent 048c7007
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -1537,6 +1537,37 @@ static int msm_ioctl_deregister_event(struct drm_device *dev, void *data,
	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,
				struct drm_event *event, u8 *payload)
{
@@ -1665,6 +1696,8 @@ static const struct drm_ioctl_desc msm_ioctls[] = {
			  DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(MSM_COUNTER_READ, msm_ioctl_counter_read,
			  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 = {
+1 −0
Original line number Diff line number Diff line
@@ -469,6 +469,7 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev,
		uint32_t size, uint32_t flags);
struct drm_gem_object *msm_gem_import(struct drm_device *dev,
		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,
		struct msm_gem_address_space *aspace);
+20 −0
Original line number Diff line number Diff line
@@ -546,6 +546,26 @@ int msm_gem_cpu_fini(struct drm_gem_object *obj)
	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
void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
{
+15 −1
Original line number Diff line number Diff line
@@ -312,6 +312,18 @@ struct drm_msm_counter_read {
	__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
/* placeholder:
@@ -330,6 +342,7 @@ struct drm_msm_counter_read {
#define DRM_MSM_COUNTER_GET            0x43
#define DRM_MSM_COUNTER_PUT            0x44
#define DRM_MSM_COUNTER_READ           0x45
#define DRM_MSM_GEM_SYNC               0x46

/**
 * Currently DRM framework supports only VSYNC event.
@@ -359,5 +372,6 @@ struct drm_msm_counter_read {
#define DRM_IOCTL_MSM_COUNTER_READ \
	DRM_IOWR(DRM_COMMAND_BASE + 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__ */