OSDN Git Service

minigbm: add bo import callback
authorGurchetan Singh <gurchetansingh@chromium.org>
Wed, 4 Jan 2017 00:49:56 +0000 (16:49 -0800)
committerchrome-bot <chrome-bot@chromium.org>
Fri, 13 Jan 2017 09:19:06 +0000 (01:19 -0800)
Some drivers may want to import their own private data,
so let's add a driver callback.

BUG=none
TEST=minigbm builds, gbmtest

Change-Id: I96c06a84446c9be4ac3f5f858094c500d43a077f
Reviewed-on: https://chromium-review.googlesource.com/424934
Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
18 files changed:
amdgpu.c
cirrus.c
drv.c
drv_priv.h
evdi.c
exynos.c
gma500.c
helpers.c
helpers.h
i915.c
marvell.c
mediatek.c
nouveau.c
rockchip.c
tegra.c
udl.c
vgem.c
virtio_gpu.c

index b796670..3f519d7 100644 (file)
--- a/amdgpu.c
+++ b/amdgpu.c
@@ -378,6 +378,7 @@ struct backend backend_amdgpu = {
        .close = amdgpu_close,
        .bo_create = amdgpu_bo_create,
        .bo_destroy = drv_gem_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = amdgpu_bo_map,
 };
 
index b656c19..f614e8a 100644 (file)
--- a/cirrus.c
+++ b/cirrus.c
@@ -32,5 +32,6 @@ struct backend backend_cirrus =
        .init = cirrus_init,
        .bo_create = drv_dumb_bo_create,
        .bo_destroy = drv_dumb_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
 };
diff --git a/drv.c b/drv.c
index b4df6a5..34b941a 100644 (file)
--- a/drv.c
+++ b/drv.c
@@ -315,45 +315,24 @@ struct bo *drv_bo_import(struct driver *drv, struct drv_import_fd_data *data)
        int ret;
        size_t plane;
        struct bo *bo;
-       struct drm_prime_handle prime_handle;
 
        bo = drv_bo_new(drv, data->width, data->height, data->format);
 
        if (!bo)
                return NULL;
 
-       for (plane = 0; plane < bo->num_planes; plane++) {
-
-               memset(&prime_handle, 0, sizeof(prime_handle));
-               prime_handle.fd = data->fds[plane];
-
-               ret = drmIoctl(drv->fd, DRM_IOCTL_PRIME_FD_TO_HANDLE,
-                              &prime_handle);
-
-               if (ret) {
-                       fprintf(stderr, "drv: DRM_IOCTL_PRIME_FD_TO_HANDLE failed "
-                               "(fd=%u)\n", prime_handle.fd);
-
-                       if (plane > 0) {
-                               bo->num_planes = plane;
-                               drv_bo_destroy(bo);
-                       } else {
-                               free(bo);
-                       }
-
-                       return NULL;
-               }
+       ret = drv->backend->bo_import(bo, data);
+       if (ret) {
+               free(bo);
+               return NULL;
+       }
 
-               bo->handles[plane].u32 = prime_handle.handle;
+       for (plane = 0; plane < bo->num_planes; plane++) {
                bo->strides[plane] = data->strides[plane];
                bo->offsets[plane] = data->offsets[plane];
                bo->sizes[plane] = data->sizes[plane];
                bo->format_modifiers[plane] = data->format_modifiers[plane];
                bo->total_size += data->sizes[plane];
-
-               pthread_mutex_lock(&drv->driver_lock);
-               drv_increment_reference_count(drv, bo, plane);
-               pthread_mutex_unlock(&drv->driver_lock);
        }
 
        return bo;
index cdd13ee..62492c2 100644 (file)
@@ -72,9 +72,10 @@ 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 map_info *data, size_t plane);
        int (*bo_unmap)(struct bo *bo, struct map_info *data);
-       int (*bo_destroy)(struct bo *bo);
        uint32_t (*resolve_format)(uint32_t format);
        struct list_head combinations;
 };
diff --git a/evdi.c b/evdi.c
index 22f5f14..988797b 100644 (file)
--- a/evdi.c
+++ b/evdi.c
@@ -29,6 +29,7 @@ struct backend backend_evdi =
        .init = evdi_init,
        .bo_create = drv_dumb_bo_create,
        .bo_destroy = drv_dumb_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
 };
 
index 03b092e..4dcf604 100644 (file)
--- a/exynos.c
+++ b/exynos.c
@@ -110,6 +110,7 @@ struct backend backend_exynos =
        .init = exynos_init,
        .bo_create = exynos_bo_create,
        .bo_destroy = drv_gem_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
 };
 
index ca5591d..d8932fb 100644 (file)
--- a/gma500.c
+++ b/gma500.c
@@ -26,5 +26,6 @@ struct backend backend_gma500 =
        .init = gma500_init,
        .bo_create = drv_dumb_bo_create,
        .bo_destroy = drv_dumb_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
 };
index 04e710a..87aad9d 100644 (file)
--- a/helpers.c
+++ b/helpers.c
@@ -210,6 +210,46 @@ int drv_gem_bo_destroy(struct bo *bo)
        return error;
 }
 
+int drv_prime_bo_import(struct bo *bo, struct drv_import_fd_data *data)
+{
+       int ret;
+       size_t plane;
+       struct drm_prime_handle prime_handle;
+
+       for (plane = 0; plane < bo->num_planes; plane++) {
+               memset(&prime_handle, 0, sizeof(prime_handle));
+               prime_handle.fd = data->fds[plane];
+
+               ret = drmIoctl(bo->drv->fd, DRM_IOCTL_PRIME_FD_TO_HANDLE,
+                              &prime_handle);
+
+               if (ret) {
+                       fprintf(stderr, "drv: DRM_IOCTL_PRIME_FD_TO_HANDLE "
+                               "failed (fd=%u)\n", prime_handle.fd);
+
+                       /*
+                        * Need to call GEM close on planes that were opened,
+                        * if any. Adjust the num_planes variable to be the
+                        * plane that failed, so GEM close will be called on
+                        * planes before that plane.
+                        */
+                       bo->num_planes = plane;
+                       drv_gem_bo_destroy(bo);
+                       return ret;
+               }
+
+               bo->handles[plane].u32 = prime_handle.handle;
+       }
+
+       for (plane = 0; plane < bo->num_planes; plane++) {
+               pthread_mutex_lock(&bo->drv->driver_lock);
+               drv_increment_reference_count(bo->drv, bo, plane);
+               pthread_mutex_unlock(&bo->drv->driver_lock);
+       }
+
+       return 0;
+}
+
 void *drv_dumb_bo_map(struct bo *bo, struct map_info *data, size_t plane)
 {
        int ret;
index 71171c6..64e8489 100644 (file)
--- a/helpers.h
+++ b/helpers.h
@@ -16,6 +16,7 @@ int drv_dumb_bo_create(struct bo *bo, uint32_t width, uint32_t height,
                       uint32_t format, uint32_t flags);
 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 map_info *data, size_t plane);
 uintptr_t drv_get_reference_count(struct driver *drv, struct bo *bo,
                                  size_t plane);
diff --git a/i915.c b/i915.c
index e74df47..9ffed61 100644 (file)
--- a/i915.c
+++ b/i915.c
@@ -262,6 +262,7 @@ struct backend backend_i915 =
        .close = i915_close,
        .bo_create = i915_bo_create,
        .bo_destroy = drv_gem_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = i915_bo_map,
        .resolve_format = i915_resolve_format,
 };
index a3a73ba..ae3dc45 100644 (file)
--- a/marvell.c
+++ b/marvell.c
@@ -31,6 +31,7 @@ struct backend backend_marvell =
        .init = marvell_init,
        .bo_create = drv_dumb_bo_create,
        .bo_destroy = drv_dumb_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
 };
 
index 9dc56a2..7e85f63 100644 (file)
@@ -107,6 +107,7 @@ struct backend backend_mediatek =
        .init = mediatek_init,
        .bo_create = mediatek_bo_create,
        .bo_destroy = drv_gem_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = mediatek_bo_map,
        .resolve_format = mediatek_resolve_format,
 };
index 89122da..e0d5954 100644 (file)
--- a/nouveau.c
+++ b/nouveau.c
@@ -25,5 +25,6 @@ struct backend backend_nouveau =
        .init = nouveau_init,
        .bo_create = drv_dumb_bo_create,
        .bo_destroy = drv_dumb_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
 };
index 5e20036..84aa8cc 100644 (file)
@@ -216,6 +216,7 @@ struct backend backend_rockchip =
        .bo_create = rockchip_bo_create,
        .bo_create_with_modifiers = rockchip_bo_create_with_modifiers,
        .bo_destroy = drv_gem_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = rockchip_bo_map,
        .resolve_format = rockchip_resolve_format,
 };
diff --git a/tegra.c b/tegra.c
index 923fef1..f48352e 100644 (file)
--- a/tegra.c
+++ b/tegra.c
@@ -293,6 +293,7 @@ struct backend backend_tegra =
        .init = tegra_init,
        .bo_create = tegra_bo_create,
        .bo_destroy = drv_gem_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = tegra_bo_map,
        .bo_unmap = tegra_bo_unmap,
 };
diff --git a/udl.c b/udl.c
index bec0022..c607772 100644 (file)
--- a/udl.c
+++ b/udl.c
@@ -29,5 +29,6 @@ struct backend backend_udl =
        .init = udl_init,
        .bo_create = drv_dumb_bo_create,
        .bo_destroy = drv_dumb_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
 };
diff --git a/vgem.c b/vgem.c
index c6f5bb2..0f3d2e3 100644 (file)
--- a/vgem.c
+++ b/vgem.c
@@ -63,6 +63,7 @@ struct backend backend_vgem =
        .init = vgem_init,
        .bo_create = vgem_bo_create,
        .bo_destroy = drv_dumb_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
        .resolve_format = vgem_resolve_format,
 };
index 5336bac..5ac0e31 100644 (file)
@@ -29,6 +29,7 @@ struct backend backend_virtio_gpu =
        .init = virtio_gpu_init,
        .bo_create = drv_dumb_bo_create,
        .bo_destroy = drv_dumb_bo_destroy,
+       .bo_import = drv_prime_bo_import,
        .bo_map = drv_dumb_bo_map,
 };