rockchip: add support for CPU acquire/release ioctls

After all, we need CPU-GPU synchronization ioctls because they are used
by screenshot capture. Without them we capture broken or partially rendered
images.

CQ-DEPEND=CL:229441
BUG=chrome-os-partner:33438
TEST=run graphics_GLBench/control.bvt-cq$, examine result png files, also run\
X11 application like xev

Change-Id: Ieab12e405b6370ab9a3d20c85528971560fef77b
Signed-off-by: Dominik Behr <dbehr@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/229417
Reviewed-by: Daniel Kurtz <djkurtz@chromium.org>
diff --git a/src/bo_rockchip.c b/src/bo_rockchip.c
index 919f54a..1b77119 100644
--- a/src/bo_rockchip.c
+++ b/src/bo_rockchip.c
@@ -32,6 +32,30 @@
 #include "omap_dumb.h"
 #include "omap_msg.h"
 
+enum {
+	DRM_ROCKCHIP_GEM_CPU_ACQUIRE_SHARED = 0x0,
+	DRM_ROCKCHIP_GEM_CPU_ACQUIRE_EXCLUSIVE = 0x1,
+};
+
+struct drm_rockchip_gem_cpu_acquire {
+	uint32_t handle;
+	uint32_t flags;
+};
+
+struct drm_rockchip_gem_cpu_release {
+	uint32_t handle;
+};
+
+/* TODO: use rockchip_drm.h kernel headers */
+#define DRM_ROCKCHIP_GEM_CPU_ACQUIRE     0x02
+#define DRM_IOCTL_ROCKCHIP_GEM_CPU_ACQUIRE       DRM_IOWR(DRM_COMMAND_BASE + \
+		DRM_ROCKCHIP_GEM_CPU_ACQUIRE, struct drm_rockchip_gem_cpu_acquire)
+#define DRM_ROCKCHIP_GEM_CPU_RELEASE     0x03
+#define DRM_IOCTL_ROCKCHIP_GEM_CPU_RELEASE       DRM_IOWR(DRM_COMMAND_BASE + \
+		DRM_ROCKCHIP_GEM_CPU_RELEASE, struct drm_rockchip_gem_cpu_release)
+
+
+
 static void *bo_rockchip_create(struct omap_device *dev,
 			size_t size, uint32_t flags, uint32_t *handle)
 {
@@ -63,12 +87,35 @@
 
 static int bo_rockchip_cpu_prep(struct omap_bo *bo, enum omap_gem_op op)
 {
-	return 0;
+	ScrnInfoPtr pScrn = bo->dev->pScrn;
+	struct drm_rockchip_gem_cpu_acquire acquire;
+	int ret;
+
+	acquire.handle = bo->handle;
+	acquire.flags = (op & OMAP_GEM_WRITE)
+		? DRM_ROCKCHIP_GEM_CPU_ACQUIRE_EXCLUSIVE
+		: DRM_ROCKCHIP_GEM_CPU_ACQUIRE_SHARED;
+	ret = drmIoctl(bo->dev->fd, DRM_IOCTL_ROCKCHIP_GEM_CPU_ACQUIRE,
+			&acquire);
+	if (ret)
+		ERROR_MSG("DRM_IOCTL_ROCKCHIP_GEM_CPU_ACQUIRE failed: %s",
+				strerror(errno));
+	return ret;
 }
 
 static int bo_rockchip_cpu_fini(struct omap_bo *bo, enum omap_gem_op op)
 {
-	return 0;
+	ScrnInfoPtr pScrn = bo->dev->pScrn;
+	struct drm_rockchip_gem_cpu_release release;
+	int ret;
+
+	release.handle = bo->handle;
+	ret = drmIoctl(bo->dev->fd, DRM_IOCTL_ROCKCHIP_GEM_CPU_RELEASE,
+			&release);
+	if (ret)
+		ERROR_MSG("DRM_IOCTL_ROCKCHIP_GEM_CPU_RELEASE failed: %s",
+				strerror(errno));
+	return ret;
 }
 
 static const struct bo_ops bo_rockchip_ops = {