minigbm: Add mmap() in backends
Gralloc requires the ability to mmap a buffer into userspace. This
change adds the necessary entry points to our internal "drv"
interface.
BUG=chromium:616275
TEST=minigbm still builds. Also ran:
./gralloctest mapping
with CL:362062 applied on minnie and cyan (decided to split that CL
into smaller patches).
CQ-DEPEND=CL:366041
Change-Id: I7396b0c79702f24eb779984805bc679c237bd932
Reviewed-on: https://chromium-review.googlesource.com/370798
Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
diff --git a/i915.c b/i915.c
index 787749f..dbd3d67 100644
--- a/i915.c
+++ b/i915.c
@@ -6,10 +6,10 @@
#ifdef DRV_I915
-#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
+#include <sys/mman.h>
#include <xf86drm.h>
#include <i915_drm.h>
@@ -184,6 +184,24 @@
return 0;
}
+static void *drv_i915_bo_map(struct bo *bo)
+{
+ int ret;
+ struct drm_i915_gem_mmap_gtt gem_map;
+
+ memset(&gem_map, 0, sizeof(gem_map));
+ gem_map.handle = bo->handles[0].u32;
+
+ ret = drmIoctl(bo->drv->fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &gem_map);
+ if (ret) {
+ fprintf(stderr, "drv: DRM_IOCTL_I915_GEM_MMAP_GTT failed\n");
+ return MAP_FAILED;
+ }
+
+ return mmap(0, bo->sizes[0], PROT_READ | PROT_WRITE, MAP_SHARED,
+ bo->drv->fd, gem_map.offset);
+}
+
const struct backend backend_i915 =
{
.name = "i915",
@@ -191,6 +209,7 @@
.close = drv_i915_close,
.bo_create = drv_i915_bo_create,
.bo_destroy = drv_gem_bo_destroy,
+ .bo_map = drv_i915_bo_map,
.format_list = {
{DRV_FORMAT_XRGB8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR | DRV_BO_USE_RENDERING},
{DRV_FORMAT_XRGB8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR | DRV_BO_USE_LINEAR},