OSDN Git Service

drm/udl: Allocate GEM object via struct drm_driver.gem_create_object
authorThomas Zimmermann <tzimmermann@suse.de>
Thu, 7 Nov 2019 09:43:05 +0000 (10:43 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Fri, 8 Nov 2019 11:29:56 +0000 (12:29 +0100)
In preparation of a switch to SHMEM, udl now allocates its GEM
objects via struct drm_driver.gem_create_object. No functional
changes are made.

For SHMEM GEM objects, udl will require the use of a special mmap
function, which we set though the create-object function.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191107094307.19870-3-tzimmermann@suse.de
drivers/gpu/drm/udl/udl_drv.c
drivers/gpu/drm/udl/udl_drv.h
drivers/gpu/drm/udl/udl_gem.c

index 8426669..778a0b6 100644 (file)
@@ -64,6 +64,7 @@ static struct drm_driver driver = {
 
        /* gem hooks */
        .gem_free_object_unlocked = udl_gem_free_object,
+       .gem_create_object = udl_driver_gem_create_object,
        .gem_vm_ops = &udl_gem_vm_ops,
 
        .dumb_create = udl_dumb_create,
index e1306a5..fc312e7 100644 (file)
@@ -125,6 +125,8 @@ int udl_dumb_create(struct drm_file *file_priv,
 int udl_gem_mmap(struct drm_file *file_priv, struct drm_device *dev,
                 uint32_t handle, uint64_t *offset);
 
+struct drm_gem_object *udl_driver_gem_create_object(struct drm_device *dev,
+                                                   size_t size);
 void udl_gem_free_object(struct drm_gem_object *gem_obj);
 struct udl_gem_object *udl_gem_alloc_object(struct drm_device *dev,
                                            size_t size);
index 7d3c1b7..628749c 100644 (file)
@@ -6,26 +6,43 @@
 #include <linux/dma-buf.h>
 #include <linux/vmalloc.h>
 
+#include <drm/drm_drv.h>
 #include <drm/drm_mode.h>
 #include <drm/drm_prime.h>
 
 #include "udl_drv.h"
 
-struct udl_gem_object *udl_gem_alloc_object(struct drm_device *dev,
-                                           size_t size)
+/*
+ * Helpers for struct drm_driver
+ */
+
+struct drm_gem_object *udl_driver_gem_create_object(struct drm_device *dev,
+                                                   size_t size)
 {
        struct udl_gem_object *obj;
 
        obj = kzalloc(sizeof(*obj), GFP_KERNEL);
+       if (!obj)
+               return NULL;
+
+       return &obj->base;
+}
+
+struct udl_gem_object *udl_gem_alloc_object(struct drm_device *dev,
+                                           size_t size)
+{
+       struct drm_gem_object *obj;
+
+       obj = dev->driver->gem_create_object(dev, size);
        if (obj == NULL)
                return NULL;
 
-       if (drm_gem_object_init(dev, &obj->base, size) != 0) {
+       if (drm_gem_object_init(dev, obj, size) != 0) {
                kfree(obj);
                return NULL;
        }
 
-       return obj;
+       return to_udl_bo(obj);
 }
 
 static int