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},