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 = {