.. | .. |
---|
42 | 42 | struct drm_mode_create_dumb; |
---|
43 | 43 | struct drm_printer; |
---|
44 | 44 | |
---|
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 | +}; |
---|
61 | 153 | |
---|
62 | 154 | /** |
---|
63 | 155 | * struct drm_driver - DRM driver structure |
---|
64 | 156 | * |
---|
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 |
---|
68 | 160 | * appropriate places like &drm_mode_config_funcs or into a new operations |
---|
69 | 161 | * structure for GEM drivers. |
---|
70 | 162 | */ |
---|
.. | .. |
---|
72 | 164 | /** |
---|
73 | 165 | * @load: |
---|
74 | 166 | * |
---|
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. |
---|
82 | 173 | * |
---|
83 | 174 | * This is deprecated, do not use! |
---|
84 | 175 | * |
---|
.. | .. |
---|
171 | 262 | * @release: |
---|
172 | 263 | * |
---|
173 | 264 | * 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. |
---|
177 | 270 | */ |
---|
178 | 271 | 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); |
---|
332 | 272 | |
---|
333 | 273 | /** |
---|
334 | 274 | * @irq_handler: |
---|
.. | .. |
---|
367 | 307 | void (*irq_uninstall) (struct drm_device *dev); |
---|
368 | 308 | |
---|
369 | 309 | /** |
---|
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 | | - /** |
---|
384 | 310 | * @master_set: |
---|
385 | 311 | * |
---|
386 | 312 | * Called whenever the minor master is set. Only used by vmwgfx. |
---|
387 | 313 | */ |
---|
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); |
---|
390 | 316 | /** |
---|
391 | 317 | * @master_drop: |
---|
392 | 318 | * |
---|
.. | .. |
---|
399 | 325 | * |
---|
400 | 326 | * Allows drivers to create driver-specific debugfs files. |
---|
401 | 327 | */ |
---|
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); |
---|
411 | 329 | |
---|
412 | 330 | /** |
---|
413 | 331 | * @gem_free_object_unlocked: deconstructor for drm_gem_objects |
---|
414 | 332 | * |
---|
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. |
---|
417 | 335 | */ |
---|
418 | 336 | void (*gem_free_object_unlocked) (struct drm_gem_object *obj); |
---|
419 | 337 | |
---|
420 | 338 | /** |
---|
421 | 339 | * @gem_open_object: |
---|
| 340 | + * |
---|
| 341 | + * This callback is deprecated in favour of &drm_gem_object_funcs.open. |
---|
422 | 342 | * |
---|
423 | 343 | * Driver hook called upon gem handle creation |
---|
424 | 344 | */ |
---|
.. | .. |
---|
427 | 347 | /** |
---|
428 | 348 | * @gem_close_object: |
---|
429 | 349 | * |
---|
| 350 | + * This callback is deprecated in favour of &drm_gem_object_funcs.close. |
---|
| 351 | + * |
---|
430 | 352 | * Driver hook called upon gem handle release |
---|
431 | 353 | */ |
---|
432 | 354 | void (*gem_close_object) (struct drm_gem_object *, struct drm_file *); |
---|
433 | 355 | |
---|
434 | 356 | /** |
---|
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 | | - /** |
---|
449 | 357 | * @gem_create_object: constructor for gem objects |
---|
450 | 358 | * |
---|
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. |
---|
453 | 361 | */ |
---|
454 | 362 | struct drm_gem_object *(*gem_create_object)(struct drm_device *dev, |
---|
455 | 363 | size_t size); |
---|
456 | | - |
---|
457 | | - /* prime: */ |
---|
458 | 364 | /** |
---|
459 | 365 | * @prime_handle_to_fd: |
---|
460 | 366 | * |
---|
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>`. |
---|
462 | 372 | */ |
---|
463 | 373 | int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, |
---|
464 | 374 | uint32_t handle, uint32_t flags, int *prime_fd); |
---|
465 | 375 | /** |
---|
466 | 376 | * @prime_fd_to_handle: |
---|
467 | 377 | * |
---|
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>`. |
---|
469 | 383 | */ |
---|
470 | 384 | int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, |
---|
471 | 385 | int prime_fd, uint32_t *handle); |
---|
472 | 386 | /** |
---|
473 | 387 | * @gem_prime_export: |
---|
474 | 388 | * |
---|
475 | | - * export GEM -> dmabuf |
---|
| 389 | + * Export hook for GEM drivers. Deprecated in favour of |
---|
| 390 | + * &drm_gem_object_funcs.export. |
---|
476 | 391 | */ |
---|
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); |
---|
479 | 394 | /** |
---|
480 | 395 | * @gem_prime_import: |
---|
481 | 396 | * |
---|
482 | | - * import dmabuf -> GEM |
---|
| 397 | + * Import hook for GEM drivers. |
---|
| 398 | + * |
---|
| 399 | + * This defaults to drm_gem_prime_import() if not set. |
---|
483 | 400 | */ |
---|
484 | 401 | struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev, |
---|
485 | 402 | struct dma_buf *dma_buf); |
---|
| 403 | + |
---|
| 404 | + /** |
---|
| 405 | + * @gem_prime_pin: |
---|
| 406 | + * |
---|
| 407 | + * Deprecated hook in favour of &drm_gem_object_funcs.pin. |
---|
| 408 | + */ |
---|
486 | 409 | 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 | + */ |
---|
487 | 416 | 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 | + */ |
---|
490 | 424 | 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 | + */ |
---|
491 | 432 | struct drm_gem_object *(*gem_prime_import_sg_table)( |
---|
492 | 433 | struct drm_device *dev, |
---|
493 | 434 | struct dma_buf_attachment *attach, |
---|
494 | 435 | 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 | + */ |
---|
495 | 442 | 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 | + */ |
---|
496 | 450 | 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 | + */ |
---|
497 | 461 | int (*gem_prime_mmap)(struct drm_gem_object *obj, |
---|
498 | 462 | struct vm_area_struct *vma); |
---|
499 | 463 | |
---|
.. | .. |
---|
534 | 498 | * @dumb_map_offset: |
---|
535 | 499 | * |
---|
536 | 500 | * 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. |
---|
539 | 505 | * |
---|
540 | 506 | * Called by the user via ioctl. |
---|
541 | 507 | * |
---|
.. | .. |
---|
555 | 521 | * |
---|
556 | 522 | * Called by the user via ioctl. |
---|
557 | 523 | * |
---|
| 524 | + * The default implementation is drm_gem_dumb_destroy(). GEM based drivers |
---|
| 525 | + * must not overwrite this. |
---|
| 526 | + * |
---|
558 | 527 | * Returns: |
---|
559 | 528 | * |
---|
560 | 529 | * Zero on success, negative errno on failure. |
---|
.. | .. |
---|
565 | 534 | |
---|
566 | 535 | /** |
---|
567 | 536 | * @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. |
---|
568 | 540 | */ |
---|
569 | 541 | const struct vm_operations_struct *gem_vm_ops; |
---|
570 | 542 | |
---|
.. | .. |
---|
581 | 553 | /** @date: driver date */ |
---|
582 | 554 | char *date; |
---|
583 | 555 | |
---|
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 | + */ |
---|
585 | 562 | u32 driver_features; |
---|
586 | 563 | |
---|
587 | 564 | /** |
---|
.. | .. |
---|
615 | 592 | int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv); |
---|
616 | 593 | int (*dma_quiescent) (struct drm_device *); |
---|
617 | 594 | 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); |
---|
618 | 598 | int dev_priv_size; |
---|
619 | 599 | }; |
---|
620 | 600 | |
---|
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); |
---|
622 | 603 | |
---|
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))) |
---|
627 | 633 | |
---|
628 | 634 | struct drm_device *drm_dev_alloc(struct drm_driver *driver, |
---|
629 | 635 | struct device *parent); |
---|
.. | .. |
---|
632 | 638 | |
---|
633 | 639 | void drm_dev_get(struct drm_device *dev); |
---|
634 | 640 | void drm_dev_put(struct drm_device *dev); |
---|
635 | | -void drm_dev_unref(struct drm_device *dev); |
---|
636 | 641 | void drm_put_dev(struct drm_device *dev); |
---|
637 | 642 | bool drm_dev_enter(struct drm_device *dev, int *idx); |
---|
638 | 643 | void drm_dev_exit(int idx); |
---|
.. | .. |
---|
646 | 651 | * Unplugging itself is singalled through drm_dev_unplug(). If a device is |
---|
647 | 652 | * unplugged, these two functions guarantee that any store before calling |
---|
648 | 653 | * 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. |
---|
649 | 658 | */ |
---|
650 | 659 | static inline bool drm_dev_is_unplugged(struct drm_device *dev) |
---|
651 | 660 | { |
---|
.. | .. |
---|
660 | 669 | } |
---|
661 | 670 | |
---|
662 | 671 | /** |
---|
| 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 | +/** |
---|
663 | 691 | * drm_core_check_feature - check driver feature flags |
---|
664 | 692 | * @dev: DRM device to check |
---|
665 | 693 | * @feature: feature flag |
---|
666 | 694 | * |
---|
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. |
---|
669 | 697 | * |
---|
670 | 698 | * Returns true if the @feature is supported, false otherwise. |
---|
671 | 699 | */ |
---|
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) |
---|
673 | 702 | { |
---|
674 | | - return dev->driver->driver_features & feature; |
---|
| 703 | + return drm_core_check_all_features(dev, feature); |
---|
675 | 704 | } |
---|
676 | 705 | |
---|
677 | 706 | /** |
---|