hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/include/drm/drm_drv.h
....@@ -42,29 +42,121 @@
4242 struct drm_mode_create_dumb;
4343 struct drm_printer;
4444
45
-/* driver capabilities and requirements mask */
46
-#define DRIVER_USE_AGP 0x1
47
-#define DRIVER_LEGACY 0x2
48
-#define DRIVER_PCI_DMA 0x8
49
-#define DRIVER_SG 0x10
50
-#define DRIVER_HAVE_DMA 0x20
51
-#define DRIVER_HAVE_IRQ 0x40
52
-#define DRIVER_IRQ_SHARED 0x80
53
-#define DRIVER_GEM 0x1000
54
-#define DRIVER_MODESET 0x2000
55
-#define DRIVER_PRIME 0x4000
56
-#define DRIVER_RENDER 0x8000
57
-#define DRIVER_ATOMIC 0x10000
58
-#define DRIVER_KMS_LEGACY_CONTEXT 0x20000
59
-#define DRIVER_SYNCOBJ 0x40000
60
-#define DRIVER_PREFER_XBGR_30BPP 0x80000
45
+/**
46
+ * enum drm_driver_feature - feature flags
47
+ *
48
+ * See &drm_driver.driver_features, drm_device.driver_features and
49
+ * drm_core_check_feature().
50
+ */
51
+enum drm_driver_feature {
52
+ /**
53
+ * @DRIVER_GEM:
54
+ *
55
+ * Driver use the GEM memory manager. This should be set for all modern
56
+ * drivers.
57
+ */
58
+ DRIVER_GEM = BIT(0),
59
+ /**
60
+ * @DRIVER_MODESET:
61
+ *
62
+ * Driver supports mode setting interfaces (KMS).
63
+ */
64
+ DRIVER_MODESET = BIT(1),
65
+ /**
66
+ * @DRIVER_RENDER:
67
+ *
68
+ * Driver supports dedicated render nodes. See also the :ref:`section on
69
+ * render nodes <drm_render_node>` for details.
70
+ */
71
+ DRIVER_RENDER = BIT(3),
72
+ /**
73
+ * @DRIVER_ATOMIC:
74
+ *
75
+ * Driver supports the full atomic modesetting userspace API. Drivers
76
+ * which only use atomic internally, but do not the support the full
77
+ * userspace API (e.g. not all properties converted to atomic, or
78
+ * multi-plane updates are not guaranteed to be tear-free) should not
79
+ * set this flag.
80
+ */
81
+ DRIVER_ATOMIC = BIT(4),
82
+ /**
83
+ * @DRIVER_SYNCOBJ:
84
+ *
85
+ * Driver supports &drm_syncobj for explicit synchronization of command
86
+ * submission.
87
+ */
88
+ DRIVER_SYNCOBJ = BIT(5),
89
+ /**
90
+ * @DRIVER_SYNCOBJ_TIMELINE:
91
+ *
92
+ * Driver supports the timeline flavor of &drm_syncobj for explicit
93
+ * synchronization of command submission.
94
+ */
95
+ DRIVER_SYNCOBJ_TIMELINE = BIT(6),
96
+
97
+ /* IMPORTANT: Below are all the legacy flags, add new ones above. */
98
+
99
+ /**
100
+ * @DRIVER_USE_AGP:
101
+ *
102
+ * Set up DRM AGP support, see drm_agp_init(), the DRM core will manage
103
+ * AGP resources. New drivers don't need this.
104
+ */
105
+ DRIVER_USE_AGP = BIT(25),
106
+ /**
107
+ * @DRIVER_LEGACY:
108
+ *
109
+ * Denote a legacy driver using shadow attach. Do not use.
110
+ */
111
+ DRIVER_LEGACY = BIT(26),
112
+ /**
113
+ * @DRIVER_PCI_DMA:
114
+ *
115
+ * Driver is capable of PCI DMA, mapping of PCI DMA buffers to userspace
116
+ * will be enabled. Only for legacy drivers. Do not use.
117
+ */
118
+ DRIVER_PCI_DMA = BIT(27),
119
+ /**
120
+ * @DRIVER_SG:
121
+ *
122
+ * Driver can perform scatter/gather DMA, allocation and mapping of
123
+ * scatter/gather buffers will be enabled. Only for legacy drivers. Do
124
+ * not use.
125
+ */
126
+ DRIVER_SG = BIT(28),
127
+
128
+ /**
129
+ * @DRIVER_HAVE_DMA:
130
+ *
131
+ * Driver supports DMA, the userspace DMA API will be supported. Only
132
+ * for legacy drivers. Do not use.
133
+ */
134
+ DRIVER_HAVE_DMA = BIT(29),
135
+ /**
136
+ * @DRIVER_HAVE_IRQ:
137
+ *
138
+ * Legacy irq support. Only for legacy drivers. Do not use.
139
+ *
140
+ * New drivers can either use the drm_irq_install() and
141
+ * drm_irq_uninstall() helper functions, or roll their own irq support
142
+ * code by calling request_irq() directly.
143
+ */
144
+ DRIVER_HAVE_IRQ = BIT(30),
145
+ /**
146
+ * @DRIVER_KMS_LEGACY_CONTEXT:
147
+ *
148
+ * Used only by nouveau for backwards compatibility with existing
149
+ * userspace. Do not use.
150
+ */
151
+ DRIVER_KMS_LEGACY_CONTEXT = BIT(31),
152
+};
61153
62154 /**
63155 * struct drm_driver - DRM driver structure
64156 *
65
- * This structure represent the common code for a family of cards. There will
66
- * one drm_device for each card present in this family. It contains lots of
67
- * vfunc entries, and a pile of those probably should be moved to more
157
+ * This structure represent the common code for a family of cards. There will be
158
+ * one &struct drm_device for each card present in this family. It contains lots
159
+ * of vfunc entries, and a pile of those probably should be moved to more
68160 * appropriate places like &drm_mode_config_funcs or into a new operations
69161 * structure for GEM drivers.
70162 */
....@@ -72,13 +164,12 @@
72164 /**
73165 * @load:
74166 *
75
- * Backward-compatible driver callback to complete
76
- * initialization steps after the driver is registered. For
77
- * this reason, may suffer from race conditions and its use is
78
- * deprecated for new drivers. It is therefore only supported
79
- * for existing drivers not yet converted to the new scheme.
80
- * See drm_dev_init() and drm_dev_register() for proper and
81
- * race-free way to set up a &struct drm_device.
167
+ * Backward-compatible driver callback to complete initialization steps
168
+ * after the driver is registered. For this reason, may suffer from
169
+ * race conditions and its use is deprecated for new drivers. It is
170
+ * therefore only supported for existing drivers not yet converted to
171
+ * the new scheme. See devm_drm_dev_alloc() and drm_dev_register() for
172
+ * proper and race-free way to set up a &struct drm_device.
82173 *
83174 * This is deprecated, do not use!
84175 *
....@@ -171,164 +262,13 @@
171262 * @release:
172263 *
173264 * Optional callback for destroying device data after the final
174
- * reference is released, i.e. the device is being destroyed. Drivers
175
- * using this callback are responsible for calling drm_dev_fini()
176
- * to finalize the device and then freeing the struct themselves.
265
+ * reference is released, i.e. the device is being destroyed.
266
+ *
267
+ * This is deprecated, clean up all memory allocations associated with a
268
+ * &drm_device using drmm_add_action(), drmm_kmalloc() and related
269
+ * managed resources functions.
177270 */
178271 void (*release) (struct drm_device *);
179
-
180
- /**
181
- * @get_vblank_counter:
182
- *
183
- * Driver callback for fetching a raw hardware vblank counter for the
184
- * CRTC specified with the pipe argument. If a device doesn't have a
185
- * hardware counter, the driver can simply leave the hook as NULL.
186
- * The DRM core will account for missed vblank events while interrupts
187
- * where disabled based on system timestamps.
188
- *
189
- * Wraparound handling and loss of events due to modesetting is dealt
190
- * with in the DRM core code, as long as drivers call
191
- * drm_crtc_vblank_off() and drm_crtc_vblank_on() when disabling or
192
- * enabling a CRTC.
193
- *
194
- * This is deprecated and should not be used by new drivers.
195
- * Use &drm_crtc_funcs.get_vblank_counter instead.
196
- *
197
- * Returns:
198
- *
199
- * Raw vblank counter value.
200
- */
201
- u32 (*get_vblank_counter) (struct drm_device *dev, unsigned int pipe);
202
-
203
- /**
204
- * @enable_vblank:
205
- *
206
- * Enable vblank interrupts for the CRTC specified with the pipe
207
- * argument.
208
- *
209
- * This is deprecated and should not be used by new drivers.
210
- * Use &drm_crtc_funcs.enable_vblank instead.
211
- *
212
- * Returns:
213
- *
214
- * Zero on success, appropriate errno if the given @crtc's vblank
215
- * interrupt cannot be enabled.
216
- */
217
- int (*enable_vblank) (struct drm_device *dev, unsigned int pipe);
218
-
219
- /**
220
- * @disable_vblank:
221
- *
222
- * Disable vblank interrupts for the CRTC specified with the pipe
223
- * argument.
224
- *
225
- * This is deprecated and should not be used by new drivers.
226
- * Use &drm_crtc_funcs.disable_vblank instead.
227
- */
228
- void (*disable_vblank) (struct drm_device *dev, unsigned int pipe);
229
-
230
- /**
231
- * @get_scanout_position:
232
- *
233
- * Called by vblank timestamping code.
234
- *
235
- * Returns the current display scanout position from a crtc, and an
236
- * optional accurate ktime_get() timestamp of when position was
237
- * measured. Note that this is a helper callback which is only used if a
238
- * driver uses drm_calc_vbltimestamp_from_scanoutpos() for the
239
- * @get_vblank_timestamp callback.
240
- *
241
- * Parameters:
242
- *
243
- * dev:
244
- * DRM device.
245
- * pipe:
246
- * Id of the crtc to query.
247
- * in_vblank_irq:
248
- * True when called from drm_crtc_handle_vblank(). Some drivers
249
- * need to apply some workarounds for gpu-specific vblank irq quirks
250
- * if flag is set.
251
- * vpos:
252
- * Target location for current vertical scanout position.
253
- * hpos:
254
- * Target location for current horizontal scanout position.
255
- * stime:
256
- * Target location for timestamp taken immediately before
257
- * scanout position query. Can be NULL to skip timestamp.
258
- * etime:
259
- * Target location for timestamp taken immediately after
260
- * scanout position query. Can be NULL to skip timestamp.
261
- * mode:
262
- * Current display timings.
263
- *
264
- * Returns vpos as a positive number while in active scanout area.
265
- * Returns vpos as a negative number inside vblank, counting the number
266
- * of scanlines to go until end of vblank, e.g., -1 means "one scanline
267
- * until start of active scanout / end of vblank."
268
- *
269
- * Returns:
270
- *
271
- * True on success, false if a reliable scanout position counter could
272
- * not be read out.
273
- *
274
- * FIXME:
275
- *
276
- * Since this is a helper to implement @get_vblank_timestamp, we should
277
- * move it to &struct drm_crtc_helper_funcs, like all the other
278
- * helper-internal hooks.
279
- */
280
- bool (*get_scanout_position) (struct drm_device *dev, unsigned int pipe,
281
- bool in_vblank_irq, int *vpos, int *hpos,
282
- ktime_t *stime, ktime_t *etime,
283
- const struct drm_display_mode *mode);
284
-
285
- /**
286
- * @get_vblank_timestamp:
287
- *
288
- * Called by drm_get_last_vbltimestamp(). Should return a precise
289
- * timestamp when the most recent VBLANK interval ended or will end.
290
- *
291
- * Specifically, the timestamp in @vblank_time should correspond as
292
- * closely as possible to the time when the first video scanline of
293
- * the video frame after the end of VBLANK will start scanning out,
294
- * the time immediately after end of the VBLANK interval. If the
295
- * @crtc is currently inside VBLANK, this will be a time in the future.
296
- * If the @crtc is currently scanning out a frame, this will be the
297
- * past start time of the current scanout. This is meant to adhere
298
- * to the OpenML OML_sync_control extension specification.
299
- *
300
- * Paramters:
301
- *
302
- * dev:
303
- * dev DRM device handle.
304
- * pipe:
305
- * crtc for which timestamp should be returned.
306
- * max_error:
307
- * Maximum allowable timestamp error in nanoseconds.
308
- * Implementation should strive to provide timestamp
309
- * with an error of at most max_error nanoseconds.
310
- * Returns true upper bound on error for timestamp.
311
- * vblank_time:
312
- * Target location for returned vblank timestamp.
313
- * in_vblank_irq:
314
- * True when called from drm_crtc_handle_vblank(). Some drivers
315
- * need to apply some workarounds for gpu-specific vblank irq quirks
316
- * if flag is set.
317
- *
318
- * Returns:
319
- *
320
- * True on success, false on failure, which means the core should
321
- * fallback to a simple timestamp taken in drm_crtc_handle_vblank().
322
- *
323
- * FIXME:
324
- *
325
- * We should move this hook to &struct drm_crtc_funcs like all the other
326
- * vblank hooks.
327
- */
328
- bool (*get_vblank_timestamp) (struct drm_device *dev, unsigned int pipe,
329
- int *max_error,
330
- ktime_t *vblank_time,
331
- bool in_vblank_irq);
332272
333273 /**
334274 * @irq_handler:
....@@ -367,26 +307,12 @@
367307 void (*irq_uninstall) (struct drm_device *dev);
368308
369309 /**
370
- * @master_create:
371
- *
372
- * Called whenever a new master is created. Only used by vmwgfx.
373
- */
374
- int (*master_create)(struct drm_device *dev, struct drm_master *master);
375
-
376
- /**
377
- * @master_destroy:
378
- *
379
- * Called whenever a master is destroyed. Only used by vmwgfx.
380
- */
381
- void (*master_destroy)(struct drm_device *dev, struct drm_master *master);
382
-
383
- /**
384310 * @master_set:
385311 *
386312 * Called whenever the minor master is set. Only used by vmwgfx.
387313 */
388
- int (*master_set)(struct drm_device *dev, struct drm_file *file_priv,
389
- bool from_open);
314
+ void (*master_set)(struct drm_device *dev, struct drm_file *file_priv,
315
+ bool from_open);
390316 /**
391317 * @master_drop:
392318 *
....@@ -399,26 +325,20 @@
399325 *
400326 * Allows drivers to create driver-specific debugfs files.
401327 */
402
- int (*debugfs_init)(struct drm_minor *minor);
403
-
404
- /**
405
- * @gem_free_object: deconstructor for drm_gem_objects
406
- *
407
- * This is deprecated and should not be used by new drivers. Use
408
- * @gem_free_object_unlocked instead.
409
- */
410
- void (*gem_free_object) (struct drm_gem_object *obj);
328
+ void (*debugfs_init)(struct drm_minor *minor);
411329
412330 /**
413331 * @gem_free_object_unlocked: deconstructor for drm_gem_objects
414332 *
415
- * This is for drivers which are not encumbered with &drm_device.struct_mutex
416
- * legacy locking schemes. Use this hook instead of @gem_free_object.
333
+ * This is deprecated and should not be used by new drivers. Use
334
+ * &drm_gem_object_funcs.free instead.
417335 */
418336 void (*gem_free_object_unlocked) (struct drm_gem_object *obj);
419337
420338 /**
421339 * @gem_open_object:
340
+ *
341
+ * This callback is deprecated in favour of &drm_gem_object_funcs.open.
422342 *
423343 * Driver hook called upon gem handle creation
424344 */
....@@ -427,73 +347,117 @@
427347 /**
428348 * @gem_close_object:
429349 *
350
+ * This callback is deprecated in favour of &drm_gem_object_funcs.close.
351
+ *
430352 * Driver hook called upon gem handle release
431353 */
432354 void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
433355
434356 /**
435
- * @gem_print_info:
436
- *
437
- * If driver subclasses struct &drm_gem_object, it can implement this
438
- * optional hook for printing additional driver specific info.
439
- *
440
- * drm_printf_indent() should be used in the callback passing it the
441
- * indent argument.
442
- *
443
- * This callback is called from drm_gem_print_info().
444
- */
445
- void (*gem_print_info)(struct drm_printer *p, unsigned int indent,
446
- const struct drm_gem_object *obj);
447
-
448
- /**
449357 * @gem_create_object: constructor for gem objects
450358 *
451
- * Hook for allocating the GEM object struct, for use by core
452
- * helpers.
359
+ * Hook for allocating the GEM object struct, for use by the CMA and
360
+ * SHMEM GEM helpers.
453361 */
454362 struct drm_gem_object *(*gem_create_object)(struct drm_device *dev,
455363 size_t size);
456
-
457
- /* prime: */
458364 /**
459365 * @prime_handle_to_fd:
460366 *
461
- * export handle -> fd (see drm_gem_prime_handle_to_fd() helper)
367
+ * Main PRIME export function. Should be implemented with
368
+ * drm_gem_prime_handle_to_fd() for GEM based drivers.
369
+ *
370
+ * For an in-depth discussion see :ref:`PRIME buffer sharing
371
+ * documentation <prime_buffer_sharing>`.
462372 */
463373 int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv,
464374 uint32_t handle, uint32_t flags, int *prime_fd);
465375 /**
466376 * @prime_fd_to_handle:
467377 *
468
- * import fd -> handle (see drm_gem_prime_fd_to_handle() helper)
378
+ * Main PRIME import function. Should be implemented with
379
+ * drm_gem_prime_fd_to_handle() for GEM based drivers.
380
+ *
381
+ * For an in-depth discussion see :ref:`PRIME buffer sharing
382
+ * documentation <prime_buffer_sharing>`.
469383 */
470384 int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv,
471385 int prime_fd, uint32_t *handle);
472386 /**
473387 * @gem_prime_export:
474388 *
475
- * export GEM -> dmabuf
389
+ * Export hook for GEM drivers. Deprecated in favour of
390
+ * &drm_gem_object_funcs.export.
476391 */
477
- struct dma_buf * (*gem_prime_export)(struct drm_device *dev,
478
- struct drm_gem_object *obj, int flags);
392
+ struct dma_buf * (*gem_prime_export)(struct drm_gem_object *obj,
393
+ int flags);
479394 /**
480395 * @gem_prime_import:
481396 *
482
- * import dmabuf -> GEM
397
+ * Import hook for GEM drivers.
398
+ *
399
+ * This defaults to drm_gem_prime_import() if not set.
483400 */
484401 struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
485402 struct dma_buf *dma_buf);
403
+
404
+ /**
405
+ * @gem_prime_pin:
406
+ *
407
+ * Deprecated hook in favour of &drm_gem_object_funcs.pin.
408
+ */
486409 int (*gem_prime_pin)(struct drm_gem_object *obj);
410
+
411
+ /**
412
+ * @gem_prime_unpin:
413
+ *
414
+ * Deprecated hook in favour of &drm_gem_object_funcs.unpin.
415
+ */
487416 void (*gem_prime_unpin)(struct drm_gem_object *obj);
488
- struct reservation_object * (*gem_prime_res_obj)(
489
- struct drm_gem_object *obj);
417
+
418
+
419
+ /**
420
+ * @gem_prime_get_sg_table:
421
+ *
422
+ * Deprecated hook in favour of &drm_gem_object_funcs.get_sg_table.
423
+ */
490424 struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj);
425
+
426
+ /**
427
+ * @gem_prime_import_sg_table:
428
+ *
429
+ * Optional hook used by the PRIME helper functions
430
+ * drm_gem_prime_import() respectively drm_gem_prime_import_dev().
431
+ */
491432 struct drm_gem_object *(*gem_prime_import_sg_table)(
492433 struct drm_device *dev,
493434 struct dma_buf_attachment *attach,
494435 struct sg_table *sgt);
436
+ /**
437
+ * @gem_prime_vmap:
438
+ *
439
+ * Deprecated vmap hook for GEM drivers. Please use
440
+ * &drm_gem_object_funcs.vmap instead.
441
+ */
495442 void *(*gem_prime_vmap)(struct drm_gem_object *obj);
443
+
444
+ /**
445
+ * @gem_prime_vunmap:
446
+ *
447
+ * Deprecated vunmap hook for GEM drivers. Please use
448
+ * &drm_gem_object_funcs.vunmap instead.
449
+ */
496450 void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);
451
+
452
+ /**
453
+ * @gem_prime_mmap:
454
+ *
455
+ * mmap hook for GEM drivers, used to implement dma-buf mmap in the
456
+ * PRIME helpers.
457
+ *
458
+ * FIXME: There's way too much duplication going on here, and also moved
459
+ * to &drm_gem_object_funcs.
460
+ */
497461 int (*gem_prime_mmap)(struct drm_gem_object *obj,
498462 struct vm_area_struct *vma);
499463
....@@ -534,8 +498,10 @@
534498 * @dumb_map_offset:
535499 *
536500 * Allocate an offset in the drm device node's address space to be able to
537
- * memory map a dumb buffer. GEM-based drivers must use
538
- * drm_gem_create_mmap_offset() to implement this.
501
+ * memory map a dumb buffer.
502
+ *
503
+ * The default implementation is drm_gem_create_mmap_offset(). GEM based
504
+ * drivers must not overwrite this.
539505 *
540506 * Called by the user via ioctl.
541507 *
....@@ -555,6 +521,9 @@
555521 *
556522 * Called by the user via ioctl.
557523 *
524
+ * The default implementation is drm_gem_dumb_destroy(). GEM based drivers
525
+ * must not overwrite this.
526
+ *
558527 * Returns:
559528 *
560529 * Zero on success, negative errno on failure.
....@@ -565,6 +534,9 @@
565534
566535 /**
567536 * @gem_vm_ops: Driver private ops for this object
537
+ *
538
+ * For GEM drivers this is deprecated in favour of
539
+ * &drm_gem_object_funcs.vm_ops.
568540 */
569541 const struct vm_operations_struct *gem_vm_ops;
570542
....@@ -581,7 +553,12 @@
581553 /** @date: driver date */
582554 char *date;
583555
584
- /** @driver_features: driver features */
556
+ /**
557
+ * @driver_features:
558
+ * Driver features, see &enum drm_driver_feature. Drivers can disable
559
+ * some features on a per-instance basis using
560
+ * &drm_device.driver_features.
561
+ */
585562 u32 driver_features;
586563
587564 /**
....@@ -615,15 +592,44 @@
615592 int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
616593 int (*dma_quiescent) (struct drm_device *);
617594 int (*context_dtor) (struct drm_device *dev, int context);
595
+ u32 (*get_vblank_counter)(struct drm_device *dev, unsigned int pipe);
596
+ int (*enable_vblank)(struct drm_device *dev, unsigned int pipe);
597
+ void (*disable_vblank)(struct drm_device *dev, unsigned int pipe);
618598 int dev_priv_size;
619599 };
620600
621
-extern unsigned int drm_debug;
601
+void *__devm_drm_dev_alloc(struct device *parent, struct drm_driver *driver,
602
+ size_t size, size_t offset);
622603
623
-int drm_dev_init(struct drm_device *dev,
624
- struct drm_driver *driver,
625
- struct device *parent);
626
-void drm_dev_fini(struct drm_device *dev);
604
+/**
605
+ * devm_drm_dev_alloc - Resource managed allocation of a &drm_device instance
606
+ * @parent: Parent device object
607
+ * @driver: DRM driver
608
+ * @type: the type of the struct which contains struct &drm_device
609
+ * @member: the name of the &drm_device within @type.
610
+ *
611
+ * This allocates and initialize a new DRM device. No device registration is done.
612
+ * Call drm_dev_register() to advertice the device to user space and register it
613
+ * with other core subsystems. This should be done last in the device
614
+ * initialization sequence to make sure userspace can't access an inconsistent
615
+ * state.
616
+ *
617
+ * The initial ref-count of the object is 1. Use drm_dev_get() and
618
+ * drm_dev_put() to take and drop further ref-counts.
619
+ *
620
+ * It is recommended that drivers embed &struct drm_device into their own device
621
+ * structure.
622
+ *
623
+ * Note that this manages the lifetime of the resulting &drm_device
624
+ * automatically using devres. The DRM device initialized with this function is
625
+ * automatically put on driver detach using drm_dev_put().
626
+ *
627
+ * RETURNS:
628
+ * Pointer to new DRM device, or ERR_PTR on failure.
629
+ */
630
+#define devm_drm_dev_alloc(parent, driver, type, member) \
631
+ ((type *) __devm_drm_dev_alloc(parent, driver, sizeof(type), \
632
+ offsetof(type, member)))
627633
628634 struct drm_device *drm_dev_alloc(struct drm_driver *driver,
629635 struct device *parent);
....@@ -632,7 +638,6 @@
632638
633639 void drm_dev_get(struct drm_device *dev);
634640 void drm_dev_put(struct drm_device *dev);
635
-void drm_dev_unref(struct drm_device *dev);
636641 void drm_put_dev(struct drm_device *dev);
637642 bool drm_dev_enter(struct drm_device *dev, int *idx);
638643 void drm_dev_exit(int idx);
....@@ -646,6 +651,10 @@
646651 * Unplugging itself is singalled through drm_dev_unplug(). If a device is
647652 * unplugged, these two functions guarantee that any store before calling
648653 * drm_dev_unplug() is visible to callers of this function after it completes
654
+ *
655
+ * WARNING: This function fundamentally races against drm_dev_unplug(). It is
656
+ * recommended that drivers instead use the underlying drm_dev_enter() and
657
+ * drm_dev_exit() function pairs.
649658 */
650659 static inline bool drm_dev_is_unplugged(struct drm_device *dev)
651660 {
....@@ -660,18 +669,38 @@
660669 }
661670
662671 /**
672
+ * drm_core_check_all_features - check driver feature flags mask
673
+ * @dev: DRM device to check
674
+ * @features: feature flag(s) mask
675
+ *
676
+ * This checks @dev for driver features, see &drm_driver.driver_features,
677
+ * &drm_device.driver_features, and the various &enum drm_driver_feature flags.
678
+ *
679
+ * Returns true if all features in the @features mask are supported, false
680
+ * otherwise.
681
+ */
682
+static inline bool drm_core_check_all_features(const struct drm_device *dev,
683
+ u32 features)
684
+{
685
+ u32 supported = dev->driver->driver_features & dev->driver_features;
686
+
687
+ return features && (supported & features) == features;
688
+}
689
+
690
+/**
663691 * drm_core_check_feature - check driver feature flags
664692 * @dev: DRM device to check
665693 * @feature: feature flag
666694 *
667
- * This checks @dev for driver features, see &drm_driver.driver_features and the
668
- * various DRIVER_\* flags.
695
+ * This checks @dev for driver features, see &drm_driver.driver_features,
696
+ * &drm_device.driver_features, and the various &enum drm_driver_feature flags.
669697 *
670698 * Returns true if the @feature is supported, false otherwise.
671699 */
672
-static inline bool drm_core_check_feature(struct drm_device *dev, int feature)
700
+static inline bool drm_core_check_feature(const struct drm_device *dev,
701
+ enum drm_driver_feature feature)
673702 {
674
- return dev->driver->driver_features & feature;
703
+ return drm_core_check_all_features(dev, feature);
675704 }
676705
677706 /**