Skip to content

Commit d693def

Browse files
author
Thomas Zimmermann
committed
drm: Remove obsolete GEM and PRIME callbacks from struct drm_driver
Several GEM and PRIME callbacks have been deprecated in favor of per-instance GEM object functions. Remove the callbacks as they are now unused. The only exception is .gem_prime_mmap, which is still in use by several drivers. What is also gone is gem_vm_ops in struct drm_driver. All drivers now use struct drm_gem_object_funcs.vm_ops instead. While at it, the patch also improves error handling around calls to .free and .get_sg_table callbacks. v3: * restore default call to drm_gem_prime_export() in drm_gem_prime_handle_to_fd() * return -ENOSYS if get_sg_table is not set * drop all checks for obj->funcs * clean up TODO list and documentation v2: * update related TODO item (Sam) Signed-off-by: Thomas Zimmermann <[email protected]> Acked-by: Daniel Vetter <[email protected]> Acked-by: Christian König <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent c85dce1 commit d693def

File tree

7 files changed

+38
-137
lines changed

7 files changed

+38
-137
lines changed

Documentation/gpu/drm-mm.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,11 @@ acquired and release by calling drm_gem_object_get() and drm_gem_object_put()
182182
respectively.
183183

184184
When the last reference to a GEM object is released the GEM core calls
185-
the :c:type:`struct drm_driver <drm_driver>` gem_free_object_unlocked
185+
the :c:type:`struct drm_gem_object_funcs <gem_object_funcs>` free
186186
operation. That operation is mandatory for GEM-enabled drivers and must
187187
free the GEM object and all associated resources.
188188

189-
void (\*gem_free_object) (struct drm_gem_object \*obj); Drivers are
189+
void (\*free) (struct drm_gem_object \*obj); Drivers are
190190
responsible for freeing all GEM object resources. This includes the
191191
resources created by the GEM core, which need to be released with
192192
drm_gem_object_release().

Documentation/gpu/todo.rst

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ have to keep track of that lock and either call ``unreference`` or
149149
``unreference_locked`` depending upon context.
150150

151151
Core GEM doesn't have a need for ``struct_mutex`` any more since kernel 4.8,
152-
and there's a ``gem_free_object_unlocked`` callback for any drivers which are
152+
and there's a GEM object ``free`` callback for any drivers which are
153153
entirely ``struct_mutex`` free.
154154

155155
For drivers that need ``struct_mutex`` it should be replaced with a driver-
@@ -289,11 +289,8 @@ struct drm_gem_object_funcs
289289
---------------------------
290290

291291
GEM objects can now have a function table instead of having the callbacks on the
292-
DRM driver struct. This is now the preferred way and drivers can be moved over.
293-
294-
We also need a 2nd version of the CMA define that doesn't require the
295-
vmapping to be present (different hook for prime importing). Plus this needs to
296-
be rolled out to all drivers using their own implementations, too.
292+
DRM driver struct. This is now the preferred way. Callbacks in drivers have been
293+
converted, except for struct drm_driver.gem_prime_mmap.
297294

298295
Level: Intermediate
299296

drivers/gpu/drm/drm_gem.c

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,9 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
247247
{
248248
struct drm_file *file_priv = data;
249249
struct drm_gem_object *obj = ptr;
250-
struct drm_device *dev = obj->dev;
251250

252-
if (obj->funcs && obj->funcs->close)
251+
if (obj->funcs->close)
253252
obj->funcs->close(obj, file_priv);
254-
else if (dev->driver->gem_close_object)
255-
dev->driver->gem_close_object(obj, file_priv);
256253

257254
drm_gem_remove_prime_handles(obj, file_priv);
258255
drm_vma_node_revoke(&obj->vma_node, file_priv);
@@ -403,14 +400,10 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
403400
if (ret)
404401
goto err_remove;
405402

406-
if (obj->funcs && obj->funcs->open) {
403+
if (obj->funcs->open) {
407404
ret = obj->funcs->open(obj, file_priv);
408405
if (ret)
409406
goto err_revoke;
410-
} else if (dev->driver->gem_open_object) {
411-
ret = dev->driver->gem_open_object(obj, file_priv);
412-
if (ret)
413-
goto err_revoke;
414407
}
415408

416409
*handlep = handle;
@@ -982,12 +975,11 @@ drm_gem_object_free(struct kref *kref)
982975
{
983976
struct drm_gem_object *obj =
984977
container_of(kref, struct drm_gem_object, refcount);
985-
struct drm_device *dev = obj->dev;
986978

987-
if (obj->funcs)
988-
obj->funcs->free(obj);
989-
else if (dev->driver->gem_free_object_unlocked)
990-
dev->driver->gem_free_object_unlocked(obj);
979+
if (WARN_ON(!obj->funcs->free))
980+
return;
981+
982+
obj->funcs->free(obj);
991983
}
992984
EXPORT_SYMBOL(drm_gem_object_free);
993985

@@ -1049,9 +1041,9 @@ EXPORT_SYMBOL(drm_gem_vm_close);
10491041
* @obj_size: the object size to be mapped, in bytes
10501042
* @vma: VMA for the area to be mapped
10511043
*
1052-
* Set up the VMA to prepare mapping of the GEM object using the gem_vm_ops
1053-
* provided by the driver. Depending on their requirements, drivers can either
1054-
* provide a fault handler in their gem_vm_ops (in which case any accesses to
1044+
* Set up the VMA to prepare mapping of the GEM object using the GEM object's
1045+
* vm_ops. Depending on their requirements, GEM objects can either
1046+
* provide a fault handler in their vm_ops (in which case any accesses to
10551047
* the object will be trapped, to perform migration, GTT binding, surface
10561048
* register allocation, or performance monitoring), or mmap the buffer memory
10571049
* synchronously after calling drm_gem_mmap_obj.
@@ -1065,12 +1057,11 @@ EXPORT_SYMBOL(drm_gem_vm_close);
10651057
* callers must verify access restrictions before calling this helper.
10661058
*
10671059
* Return 0 or success or -EINVAL if the object size is smaller than the VMA
1068-
* size, or if no gem_vm_ops are provided.
1060+
* size, or if no vm_ops are provided.
10691061
*/
10701062
int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
10711063
struct vm_area_struct *vma)
10721064
{
1073-
struct drm_device *dev = obj->dev;
10741065
int ret;
10751066

10761067
/* Check for valid size. */
@@ -1085,18 +1076,16 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
10851076
*/
10861077
drm_gem_object_get(obj);
10871078

1088-
if (obj->funcs && obj->funcs->mmap) {
1079+
if (obj->funcs->mmap) {
10891080
ret = obj->funcs->mmap(obj, vma);
10901081
if (ret) {
10911082
drm_gem_object_put(obj);
10921083
return ret;
10931084
}
10941085
WARN_ON(!(vma->vm_flags & VM_DONTEXPAND));
10951086
} else {
1096-
if (obj->funcs && obj->funcs->vm_ops)
1087+
if (obj->funcs->vm_ops)
10971088
vma->vm_ops = obj->funcs->vm_ops;
1098-
else if (dev->driver->gem_vm_ops)
1099-
vma->vm_ops = dev->driver->gem_vm_ops;
11001089
else {
11011090
drm_gem_object_put(obj);
11021091
return -EINVAL;
@@ -1198,36 +1187,30 @@ void drm_gem_print_info(struct drm_printer *p, unsigned int indent,
11981187
drm_printf_indent(p, indent, "imported=%s\n",
11991188
obj->import_attach ? "yes" : "no");
12001189

1201-
if (obj->funcs && obj->funcs->print_info)
1190+
if (obj->funcs->print_info)
12021191
obj->funcs->print_info(p, indent, obj);
12031192
}
12041193

12051194
int drm_gem_pin(struct drm_gem_object *obj)
12061195
{
1207-
if (obj->funcs && obj->funcs->pin)
1196+
if (obj->funcs->pin)
12081197
return obj->funcs->pin(obj);
1209-
else if (obj->dev->driver->gem_prime_pin)
1210-
return obj->dev->driver->gem_prime_pin(obj);
12111198
else
12121199
return 0;
12131200
}
12141201

12151202
void drm_gem_unpin(struct drm_gem_object *obj)
12161203
{
1217-
if (obj->funcs && obj->funcs->unpin)
1204+
if (obj->funcs->unpin)
12181205
obj->funcs->unpin(obj);
1219-
else if (obj->dev->driver->gem_prime_unpin)
1220-
obj->dev->driver->gem_prime_unpin(obj);
12211206
}
12221207

12231208
void *drm_gem_vmap(struct drm_gem_object *obj)
12241209
{
12251210
void *vaddr;
12261211

1227-
if (obj->funcs && obj->funcs->vmap)
1212+
if (obj->funcs->vmap)
12281213
vaddr = obj->funcs->vmap(obj);
1229-
else if (obj->dev->driver->gem_prime_vmap)
1230-
vaddr = obj->dev->driver->gem_prime_vmap(obj);
12311214
else
12321215
vaddr = ERR_PTR(-EOPNOTSUPP);
12331216

@@ -1242,10 +1225,8 @@ void drm_gem_vunmap(struct drm_gem_object *obj, void *vaddr)
12421225
if (!vaddr)
12431226
return;
12441227

1245-
if (obj->funcs && obj->funcs->vunmap)
1228+
if (obj->funcs->vunmap)
12461229
obj->funcs->vunmap(obj, vaddr);
1247-
else if (obj->dev->driver->gem_prime_vunmap)
1248-
obj->dev->driver->gem_prime_vunmap(obj, vaddr);
12491230
}
12501231

12511232
/**

drivers/gpu/drm/drm_gem_cma_helper.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ drm_gem_cma_create_with_handle(struct drm_file *file_priv,
171171
* GEM object state and frees the memory used to store the object itself.
172172
* If the buffer is imported and the virtual address is set, it is released.
173173
* Drivers using the CMA helpers should set this as their
174-
* &drm_driver.gem_free_object_unlocked callback.
174+
* &drm_gem_object_funcs.free callback.
175175
*/
176176
void drm_gem_cma_free_object(struct drm_gem_object *gem_obj)
177177
{
@@ -419,7 +419,7 @@ EXPORT_SYMBOL(drm_gem_cma_print_info);
419419
*
420420
* This function exports a scatter/gather table suitable for PRIME usage by
421421
* calling the standard DMA mapping API. Drivers using the CMA helpers should
422-
* set this as their &drm_driver.gem_prime_get_sg_table callback.
422+
* set this as their &drm_gem_object_funcs.get_sg_table callback.
423423
*
424424
* Returns:
425425
* A pointer to the scatter/gather table of pinned pages or NULL on failure.
@@ -542,7 +542,7 @@ EXPORT_SYMBOL_GPL(drm_gem_cma_prime_mmap);
542542
* virtual address space. Since the CMA buffers are already mapped into the
543543
* kernel virtual address space this simply returns the cached virtual
544544
* address. Drivers using the CMA helpers should set this as their DRM
545-
* driver's &drm_driver.gem_prime_vmap callback.
545+
* driver's &drm_gem_object_funcs.vmap callback.
546546
*
547547
* Returns:
548548
* The kernel virtual address of the CMA GEM object's backing store.
@@ -564,7 +564,7 @@ EXPORT_SYMBOL_GPL(drm_gem_cma_prime_vmap);
564564
* This function removes a buffer exported via DRM PRIME from the kernel's
565565
* virtual address space. This is a no-op because CMA buffers cannot be
566566
* unmapped from kernel space. Drivers using the CMA helpers should set this
567-
* as their &drm_driver.gem_prime_vunmap callback.
567+
* as their &drm_gem_object_funcs.vunmap callback.
568568
*/
569569
void drm_gem_cma_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
570570
{

drivers/gpu/drm/drm_prime.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -386,8 +386,6 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev,
386386

387387
if (obj->funcs && obj->funcs->export)
388388
dmabuf = obj->funcs->export(obj, flags);
389-
else if (dev->driver->gem_prime_export)
390-
dmabuf = dev->driver->gem_prime_export(obj, flags);
391389
else
392390
dmabuf = drm_gem_prime_export(obj, flags);
393391
if (IS_ERR(dmabuf)) {
@@ -419,7 +417,7 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev,
419417
* This is the PRIME export function which must be used mandatorily by GEM
420418
* drivers to ensure correct lifetime management of the underlying GEM object.
421419
* The actual exporting from GEM object to a dma-buf is done through the
422-
* &drm_driver.gem_prime_export driver callback.
420+
* &drm_gem_object_funcs.export callback.
423421
*/
424422
int drm_gem_prime_handle_to_fd(struct drm_device *dev,
425423
struct drm_file *file_priv, uint32_t handle,
@@ -621,10 +619,12 @@ struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
621619
if (WARN_ON(dir == DMA_NONE))
622620
return ERR_PTR(-EINVAL);
623621

624-
if (obj->funcs)
625-
sgt = obj->funcs->get_sg_table(obj);
626-
else
627-
sgt = obj->dev->driver->gem_prime_get_sg_table(obj);
622+
if (WARN_ON(!obj->funcs->get_sg_table))
623+
return ERR_PTR(-ENOSYS);
624+
625+
sgt = obj->funcs->get_sg_table(obj);
626+
if (IS_ERR(sgt))
627+
return sgt;
628628

629629
if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir,
630630
DMA_ATTR_SKIP_CPU_SYNC)) {

include/drm/drm_drv.h

Lines changed: 4 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ struct drm_file;
3636
struct drm_gem_object;
3737
struct drm_master;
3838
struct drm_minor;
39+
struct dma_buf;
3940
struct dma_buf_attachment;
4041
struct drm_display_mode;
4142
struct drm_mode_create_dumb;
4243
struct drm_printer;
44+
struct sg_table;
4345

4446
/**
4547
* enum drm_driver_feature - feature flags
@@ -326,32 +328,6 @@ struct drm_driver {
326328
*/
327329
void (*debugfs_init)(struct drm_minor *minor);
328330

329-
/**
330-
* @gem_free_object_unlocked: deconstructor for drm_gem_objects
331-
*
332-
* This is deprecated and should not be used by new drivers. Use
333-
* &drm_gem_object_funcs.free instead.
334-
*/
335-
void (*gem_free_object_unlocked) (struct drm_gem_object *obj);
336-
337-
/**
338-
* @gem_open_object:
339-
*
340-
* This callback is deprecated in favour of &drm_gem_object_funcs.open.
341-
*
342-
* Driver hook called upon gem handle creation
343-
*/
344-
int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
345-
346-
/**
347-
* @gem_close_object:
348-
*
349-
* This callback is deprecated in favour of &drm_gem_object_funcs.close.
350-
*
351-
* Driver hook called upon gem handle release
352-
*/
353-
void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
354-
355331
/**
356332
* @gem_create_object: constructor for gem objects
357333
*
@@ -360,6 +336,7 @@ struct drm_driver {
360336
*/
361337
struct drm_gem_object *(*gem_create_object)(struct drm_device *dev,
362338
size_t size);
339+
363340
/**
364341
* @prime_handle_to_fd:
365342
*
@@ -382,14 +359,7 @@ struct drm_driver {
382359
*/
383360
int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv,
384361
int prime_fd, uint32_t *handle);
385-
/**
386-
* @gem_prime_export:
387-
*
388-
* Export hook for GEM drivers. Deprecated in favour of
389-
* &drm_gem_object_funcs.export.
390-
*/
391-
struct dma_buf * (*gem_prime_export)(struct drm_gem_object *obj,
392-
int flags);
362+
393363
/**
394364
* @gem_prime_import:
395365
*
@@ -399,29 +369,6 @@ struct drm_driver {
399369
*/
400370
struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
401371
struct dma_buf *dma_buf);
402-
403-
/**
404-
* @gem_prime_pin:
405-
*
406-
* Deprecated hook in favour of &drm_gem_object_funcs.pin.
407-
*/
408-
int (*gem_prime_pin)(struct drm_gem_object *obj);
409-
410-
/**
411-
* @gem_prime_unpin:
412-
*
413-
* Deprecated hook in favour of &drm_gem_object_funcs.unpin.
414-
*/
415-
void (*gem_prime_unpin)(struct drm_gem_object *obj);
416-
417-
418-
/**
419-
* @gem_prime_get_sg_table:
420-
*
421-
* Deprecated hook in favour of &drm_gem_object_funcs.get_sg_table.
422-
*/
423-
struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj);
424-
425372
/**
426373
* @gem_prime_import_sg_table:
427374
*
@@ -432,22 +379,6 @@ struct drm_driver {
432379
struct drm_device *dev,
433380
struct dma_buf_attachment *attach,
434381
struct sg_table *sgt);
435-
/**
436-
* @gem_prime_vmap:
437-
*
438-
* Deprecated vmap hook for GEM drivers. Please use
439-
* &drm_gem_object_funcs.vmap instead.
440-
*/
441-
void *(*gem_prime_vmap)(struct drm_gem_object *obj);
442-
443-
/**
444-
* @gem_prime_vunmap:
445-
*
446-
* Deprecated vunmap hook for GEM drivers. Please use
447-
* &drm_gem_object_funcs.vunmap instead.
448-
*/
449-
void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);
450-
451382
/**
452383
* @gem_prime_mmap:
453384
*
@@ -522,14 +453,6 @@ struct drm_driver {
522453
struct drm_device *dev,
523454
uint32_t handle);
524455

525-
/**
526-
* @gem_vm_ops: Driver private ops for this object
527-
*
528-
* For GEM drivers this is deprecated in favour of
529-
* &drm_gem_object_funcs.vm_ops.
530-
*/
531-
const struct vm_operations_struct *gem_vm_ops;
532-
533456
/** @major: driver major number */
534457
int major;
535458
/** @minor: driver minor number */

0 commit comments

Comments
 (0)