| .. | .. |
|---|
| 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 | /** |
|---|