Mesa (master): vc4: Use our device-specific ioctls for create/mmap.

Eric Anholt anholt at kemper.freedesktop.org
Tue Mar 24 17:39:47 UTC 2015


Module: Mesa
Branch: master
Commit: 25d60763d9c2767c279f28ac2a7eddcd245f4259
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=25d60763d9c2767c279f28ac2a7eddcd245f4259

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Mar 23 17:17:17 2015 -0700

vc4: Use our device-specific ioctls for create/mmap.

They don't do anything special for us, but I've been told by kernel
maintainers that relying on dumb for my acceleration-capable buffers
is not OK.

---

 src/gallium/drivers/vc4/vc4_bufmgr.c |   51 ++++++++++++++++++++++++----------
 1 file changed, 36 insertions(+), 15 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_bufmgr.c b/src/gallium/drivers/vc4/vc4_bufmgr.c
index 0077864..4bb2c71 100644
--- a/src/gallium/drivers/vc4/vc4_bufmgr.c
+++ b/src/gallium/drivers/vc4/vc4_bufmgr.c
@@ -65,6 +65,8 @@ struct vc4_bo *
 vc4_bo_alloc(struct vc4_screen *screen, uint32_t size, const char *name)
 {
         struct vc4_bo *bo;
+        int ret;
+
         size = align(size, 4096);
 
         bo = vc4_bo_from_cache(screen, size, name);
@@ -81,22 +83,31 @@ vc4_bo_alloc(struct vc4_screen *screen, uint32_t size, const char *name)
         bo->name = name;
         bo->private = true;
 
-        struct drm_mode_create_dumb create;
-        memset(&create, 0, sizeof(create));
+        if (!using_vc4_simulator) {
+                struct drm_vc4_create_bo create;
+                memset(&create, 0, sizeof(create));
+
+                create.size = size;
+
+                ret = drmIoctl(screen->fd, DRM_IOCTL_VC4_CREATE_BO, &create);
+                bo->handle = create.handle;
+        } else {
+                struct drm_mode_create_dumb create;
+                memset(&create, 0, sizeof(create));
 
-        create.width = 128;
-        create.bpp = 8;
-        create.height = (size + 127) / 128;
+                create.width = 128;
+                create.bpp = 8;
+                create.height = (size + 127) / 128;
 
-        int ret = drmIoctl(screen->fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);
+                ret = drmIoctl(screen->fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);
+                bo->handle = create.handle;
+                assert(create.size >= size);
+        }
         if (ret != 0) {
                 fprintf(stderr, "create ioctl failure\n");
                 abort();
         }
 
-        bo->handle = create.handle;
-        assert(create.size >= size);
-
         return bo;
 }
 
@@ -371,25 +382,35 @@ vc4_bo_wait(struct vc4_bo *bo, uint64_t timeout_ns)
 void *
 vc4_bo_map_unsynchronized(struct vc4_bo *bo)
 {
+        uint64_t offset;
         int ret;
 
         if (bo->map)
                 return bo->map;
 
-        struct drm_mode_map_dumb map;
-        memset(&map, 0, sizeof(map));
-        map.handle = bo->handle;
-        ret = drmIoctl(bo->screen->fd, DRM_IOCTL_MODE_MAP_DUMB, &map);
+        if (!using_vc4_simulator) {
+                struct drm_vc4_mmap_bo map;
+                memset(&map, 0, sizeof(map));
+                map.handle = bo->handle;
+                ret = drmIoctl(bo->screen->fd, DRM_IOCTL_VC4_MMAP_BO, &map);
+                offset = map.offset;
+        } else {
+                struct drm_mode_map_dumb map;
+                memset(&map, 0, sizeof(map));
+                map.handle = bo->handle;
+                ret = drmIoctl(bo->screen->fd, DRM_IOCTL_MODE_MAP_DUMB, &map);
+                offset = map.offset;
+        }
         if (ret != 0) {
                 fprintf(stderr, "map ioctl failure\n");
                 abort();
         }
 
         bo->map = mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
-                       bo->screen->fd, map.offset);
+                       bo->screen->fd, offset);
         if (bo->map == MAP_FAILED) {
                 fprintf(stderr, "mmap of bo %d (offset 0x%016llx, size %d) failed\n",
-                        bo->handle, (long long)map.offset, bo->size);
+                        bo->handle, (long long)offset, bo->size);
                 abort();
         }
 




More information about the mesa-commit mailing list