OSDN Git Service

minigbm: use struct vma for (*bo_map)/(*bo_unmap) callbacks
authorGurchetan Singh <gurchetansingh@chromium.org>
Wed, 15 Nov 2017 02:20:27 +0000 (18:20 -0800)
committerchrome-bot <chrome-bot@chromium.org>
Thu, 16 Nov 2017 18:46:57 +0000 (10:46 -0800)
This sets better expectations for what we expect from the
backends.

BUG=chromium:764871
TEST=mmap_test

Change-Id: I7fb815b58fae8e9fbd73bf7c0263c7db44488844
Reviewed-on: https://chromium-review.googlesource.com/770519
Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Joe Kniss <djmk@google.com>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
amdgpu.c
drv.c
drv_priv.h
helpers.c
helpers.h
i915.c
mediatek.c
rockchip.c
tegra.c
vc4.c

index 57d82e5..4a3eb7b 100644 (file)
--- a/amdgpu.c
+++ b/amdgpu.c
@@ -406,7 +406,7 @@ static int amdgpu_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint
        return ret;
 }
 
-static void *amdgpu_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, uint32_t map_flags)
+static void *amdgpu_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
 {
        int ret;
        union drm_amdgpu_gem_mmap gem_map;
@@ -420,7 +420,7 @@ static void *amdgpu_bo_map(struct bo *bo, struct mapping *mapping, size_t plane,
                return MAP_FAILED;
        }
 
-       mapping->vma->length = bo->total_size;
+       vma->length = bo->total_size;
 
        return mmap(0, bo->total_size, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd,
                    gem_map.out.addr_ptr);
diff --git a/drv.c b/drv.c
index 50d3401..cd8251f 100644 (file)
--- a/drv.c
+++ b/drv.c
@@ -413,7 +413,7 @@ void *drv_bo_map(struct bo *bo, uint32_t x, uint32_t y, uint32_t width, uint32_t
        }
 
        mapping.vma = calloc(1, sizeof(*mapping.vma));
-       addr = bo->drv->backend->bo_map(bo, &mapping, plane, map_flags);
+       addr = bo->drv->backend->bo_map(bo, mapping.vma, plane, map_flags);
        if (addr == MAP_FAILED) {
                *map_data = NULL;
                free(mapping.vma);
@@ -448,7 +448,7 @@ int drv_bo_unmap(struct bo *bo, struct mapping *mapping)
        pthread_mutex_lock(&bo->drv->driver_lock);
 
        if (!--mapping->vma->refcount) {
-               ret = bo->drv->backend->bo_unmap(bo, mapping);
+               ret = bo->drv->backend->bo_unmap(bo, mapping->vma);
                free(mapping->vma);
        }
 
index dceeeb7..048b9a3 100644 (file)
@@ -75,8 +75,8 @@ struct backend {
                                        uint32_t format, const uint64_t *modifiers, uint32_t count);
        int (*bo_destroy)(struct bo *bo);
        int (*bo_import)(struct bo *bo, struct drv_import_fd_data *data);
-       void *(*bo_map)(struct bo *bo, struct mapping *mapping, size_t plane, uint32_t map_flags);
-       int (*bo_unmap)(struct bo *bo, struct mapping *mapping);
+       void *(*bo_map)(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags);
+       int (*bo_unmap)(struct bo *bo, struct vma *vma);
        int (*bo_invalidate)(struct bo *bo, struct mapping *mapping);
        int (*bo_flush)(struct bo *bo, struct mapping *mapping);
        uint32_t (*resolve_format)(uint32_t format, uint64_t use_flags);
index d861b9c..9a33804 100644 (file)
--- a/helpers.c
+++ b/helpers.c
@@ -309,7 +309,7 @@ int drv_prime_bo_import(struct bo *bo, struct drv_import_fd_data *data)
        return 0;
 }
 
-void *drv_dumb_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, uint32_t map_flags)
+void *drv_dumb_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
 {
        int ret;
        size_t i;
@@ -326,15 +326,15 @@ void *drv_dumb_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, uint
 
        for (i = 0; i < bo->num_planes; i++)
                if (bo->handles[i].u32 == bo->handles[plane].u32)
-                       mapping->vma->length += bo->sizes[i];
+                       vma->length += bo->sizes[i];
 
-       return mmap(0, mapping->vma->length, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd,
+       return mmap(0, vma->length, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd,
                    map_dumb.offset);
 }
 
-int drv_bo_munmap(struct bo *bo, struct mapping *mapping)
+int drv_bo_munmap(struct bo *bo, struct vma *vma)
 {
-       return munmap(mapping->vma->addr, mapping->vma->length);
+       return munmap(vma->addr, vma->length);
 }
 
 int drv_mapping_destroy(struct bo *bo)
@@ -359,7 +359,7 @@ int drv_mapping_destroy(struct bo *bo)
                        }
 
                        if (!--mapping->vma->refcount) {
-                               ret = bo->drv->backend->bo_unmap(bo, mapping);
+                               ret = bo->drv->backend->bo_unmap(bo, mapping->vma);
                                if (ret) {
                                        fprintf(stderr, "drv: munmap failed");
                                        return ret;
index 5de7225..9c9dcc6 100644 (file)
--- a/helpers.h
+++ b/helpers.h
@@ -18,8 +18,8 @@ int drv_dumb_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t
 int drv_dumb_bo_destroy(struct bo *bo);
 int drv_gem_bo_destroy(struct bo *bo);
 int drv_prime_bo_import(struct bo *bo, struct drv_import_fd_data *data);
-void *drv_dumb_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, uint32_t map_flags);
-int drv_bo_munmap(struct bo *bo, struct mapping *mapping);
+void *drv_dumb_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags);
+int drv_bo_munmap(struct bo *bo, struct vma *vma);
 int drv_mapping_destroy(struct bo *bo);
 int drv_get_prot(uint32_t map_flags);
 uintptr_t drv_get_reference_count(struct driver *drv, struct bo *bo, size_t plane);
diff --git a/i915.c b/i915.c
index 965f62d..0b30703 100644 (file)
--- a/i915.c
+++ b/i915.c
@@ -404,7 +404,9 @@ static int i915_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint32_t
                                         uint32_t format, const uint64_t *modifiers, uint32_t count)
 {
        static const uint64_t modifier_order[] = {
-               I915_FORMAT_MOD_Y_TILED, I915_FORMAT_MOD_X_TILED, DRM_FORMAT_MOD_LINEAR,
+               I915_FORMAT_MOD_Y_TILED,
+               I915_FORMAT_MOD_X_TILED,
+               DRM_FORMAT_MOD_LINEAR,
        };
        uint64_t modifier;
 
@@ -445,7 +447,7 @@ static int i915_bo_import(struct bo *bo, struct drv_import_fd_data *data)
        return 0;
 }
 
-static void *i915_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, uint32_t map_flags)
+static void *i915_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
 {
        int ret;
        void *addr;
@@ -489,7 +491,7 @@ static void *i915_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, u
                return addr;
        }
 
-       mapping->vma->length = bo->total_size;
+       vma->length = bo->total_size;
        return addr;
 }
 
index 33f57fd..ebc000f 100644 (file)
@@ -78,8 +78,7 @@ static int mediatek_bo_create(struct bo *bo, uint32_t width, uint32_t height, ui
        return 0;
 }
 
-static void *mediatek_bo_map(struct bo *bo, struct mapping *mapping, size_t plane,
-                            uint32_t map_flags)
+static void *mediatek_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
 {
        int ret;
        struct drm_mtk_gem_map_off gem_map;
@@ -97,31 +96,31 @@ static void *mediatek_bo_map(struct bo *bo, struct mapping *mapping, size_t plan
        void *addr = mmap(0, bo->total_size, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd,
                          gem_map.offset);
 
-       mapping->vma->length = bo->total_size;
+       vma->length = bo->total_size;
 
        if (bo->use_flags & BO_USE_RENDERSCRIPT) {
                priv = calloc(1, sizeof(*priv));
                priv->cached_addr = calloc(1, bo->total_size);
                priv->gem_addr = addr;
                memcpy(priv->cached_addr, priv->gem_addr, bo->total_size);
-               mapping->vma->priv = priv;
+               vma->priv = priv;
                addr = priv->cached_addr;
        }
 
        return addr;
 }
 
-static int mediatek_bo_unmap(struct bo *bo, struct mapping *mapping)
+static int mediatek_bo_unmap(struct bo *bo, struct vma *vma)
 {
-       if (mapping->vma->priv) {
-               struct mediatek_private_map_data *priv = mapping->vma->priv;
-               mapping->vma->addr = priv->gem_addr;
+       if (vma->priv) {
+               struct mediatek_private_map_data *priv = vma->priv;
+               vma->addr = priv->gem_addr;
                free(priv->cached_addr);
                free(priv);
-               mapping->vma->priv = NULL;
+               vma->priv = NULL;
        }
 
-       return munmap(mapping->vma->addr, mapping->vma->length);
+       return munmap(vma->addr, vma->length);
 }
 
 static int mediatek_bo_flush(struct bo *bo, struct mapping *mapping)
index 5076f1f..14c042b 100644 (file)
@@ -239,8 +239,7 @@ static int rockchip_bo_create(struct bo *bo, uint32_t width, uint32_t height, ui
                                                 ARRAY_SIZE(modifiers));
 }
 
-static void *rockchip_bo_map(struct bo *bo, struct mapping *mapping, size_t plane,
-                            uint32_t map_flags)
+static void *rockchip_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
 {
        int ret;
        struct drm_rockchip_gem_map_off gem_map;
@@ -263,31 +262,31 @@ static void *rockchip_bo_map(struct bo *bo, struct mapping *mapping, size_t plan
        void *addr = mmap(0, bo->total_size, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd,
                          gem_map.offset);
 
-       mapping->vma->length = bo->total_size;
+       vma->length = bo->total_size;
 
        if (bo->use_flags & BO_USE_RENDERSCRIPT) {
                priv = calloc(1, sizeof(*priv));
                priv->cached_addr = calloc(1, bo->total_size);
                priv->gem_addr = addr;
                memcpy(priv->cached_addr, priv->gem_addr, bo->total_size);
-               mapping->vma->priv = priv;
+               vma->priv = priv;
                addr = priv->cached_addr;
        }
 
        return addr;
 }
 
-static int rockchip_bo_unmap(struct bo *bo, struct mapping *mapping)
+static int rockchip_bo_unmap(struct bo *bo, struct vma *vma)
 {
-       if (mapping->vma->priv) {
-               struct rockchip_private_map_data *priv = mapping->vma->priv;
-               mapping->vma->addr = priv->gem_addr;
+       if (vma->priv) {
+               struct rockchip_private_map_data *priv = vma->priv;
+               vma->addr = priv->gem_addr;
                free(priv->cached_addr);
                free(priv);
-               mapping->vma->priv = NULL;
+               vma->priv = NULL;
        }
 
-       return munmap(mapping->vma->addr, mapping->vma->length);
+       return munmap(vma->addr, vma->length);
 }
 
 static int rockchip_bo_flush(struct bo *bo, struct mapping *mapping)
diff --git a/tegra.c b/tegra.c
index e365593..4551fcf 100644 (file)
--- a/tegra.c
+++ b/tegra.c
@@ -300,7 +300,7 @@ static int tegra_bo_import(struct bo *bo, struct drv_import_fd_data *data)
        return 0;
 }
 
-static void *tegra_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, uint32_t map_flags)
+static void *tegra_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
 {
        int ret;
        struct drm_tegra_gem_mmap gem_map;
@@ -317,12 +317,12 @@ static void *tegra_bo_map(struct bo *bo, struct mapping *mapping, size_t plane,
 
        void *addr = mmap(0, bo->total_size, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd,
                          gem_map.offset);
-       mapping->vma->length = bo->total_size;
+       vma->length = bo->total_size;
        if ((bo->tiling & 0xFF) == NV_MEM_KIND_C32_2CRA && addr != MAP_FAILED) {
                priv = calloc(1, sizeof(*priv));
                priv->untiled = calloc(1, bo->total_size);
                priv->tiled = addr;
-               mapping->vma->priv = priv;
+               vma->priv = priv;
                transfer_tiled_memory(bo, priv->tiled, priv->untiled, TEGRA_READ_TILED_BUFFER);
                addr = priv->untiled;
        }
@@ -330,17 +330,17 @@ static void *tegra_bo_map(struct bo *bo, struct mapping *mapping, size_t plane,
        return addr;
 }
 
-static int tegra_bo_unmap(struct bo *bo, struct mapping *mapping)
+static int tegra_bo_unmap(struct bo *bo, struct vma *vma)
 {
-       if (mapping->vma->priv) {
-               struct tegra_private_map_data *priv = mapping->vma->priv;
-               mapping->vma->addr = priv->tiled;
+       if (vma->priv) {
+               struct tegra_private_map_data *priv = vma->priv;
+               vma->addr = priv->tiled;
                free(priv->untiled);
                free(priv);
-               mapping->vma->priv = NULL;
+               vma->priv = NULL;
        }
 
-       return munmap(mapping->vma->addr, mapping->vma->length);
+       return munmap(vma->addr, vma->length);
 }
 
 static int tegra_bo_flush(struct bo *bo, struct mapping *mapping)
diff --git a/vc4.c b/vc4.c
index cfcc219..82b7047 100644 (file)
--- a/vc4.c
+++ b/vc4.c
@@ -62,7 +62,7 @@ static int vc4_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_
        return 0;
 }
 
-static void *vc4_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, uint32_t map_flags)
+static void *vc4_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
 {
        int ret;
        struct drm_vc4_mmap_bo bo_map;
@@ -76,7 +76,7 @@ static void *vc4_bo_map(struct bo *bo, struct mapping *mapping, size_t plane, ui
                return MAP_FAILED;
        }
 
-       mapping->vma->length = bo->total_size;
+       vma->length = bo->total_size;
        return mmap(0, bo->total_size, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd,
                    bo_map.offset);
 }