Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 1 | ============= |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 2 | DRM Internals |
| 3 | ============= |
| 4 | |
| 5 | This chapter documents DRM internals relevant to driver authors and |
| 6 | developers working to add support for the latest features to existing |
| 7 | drivers. |
| 8 | |
| 9 | First, we go over some typical driver initialization requirements, like |
| 10 | setting up command buffers, creating an initial output configuration, |
| 11 | and initializing core services. Subsequent sections cover core internals |
| 12 | in more detail, providing implementation notes and examples. |
| 13 | |
| 14 | The DRM layer provides several services to graphics drivers, many of |
| 15 | them driven by the application interfaces it provides through libdrm, |
| 16 | the library that wraps most of the DRM ioctls. These include vblank |
| 17 | event handling, memory management, output management, framebuffer |
| 18 | management, command submission & fencing, suspend/resume support, and |
| 19 | DMA services. |
| 20 | |
| 21 | Driver Initialization |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 22 | ===================== |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 23 | |
| 24 | At the core of every DRM driver is a :c:type:`struct drm_driver |
| 25 | <drm_driver>` structure. Drivers typically statically initialize |
| 26 | a drm_driver structure, and then pass it to |
| 27 | :c:func:`drm_dev_alloc()` to allocate a device instance. After the |
| 28 | device instance is fully initialized it can be registered (which makes |
| 29 | it accessible from userspace) using :c:func:`drm_dev_register()`. |
| 30 | |
| 31 | The :c:type:`struct drm_driver <drm_driver>` structure |
| 32 | contains static information that describes the driver and features it |
| 33 | supports, and pointers to methods that the DRM core will call to |
| 34 | implement the DRM API. We will first go through the :c:type:`struct |
| 35 | drm_driver <drm_driver>` static information fields, and will |
| 36 | then describe individual operations in details as they get used in later |
| 37 | sections. |
| 38 | |
| 39 | Driver Information |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 40 | ------------------ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 41 | |
| 42 | Driver Features |
Jani Nikula | 2fa91d1 | 2016-06-21 14:49:02 +0300 | [diff] [blame] | 43 | ~~~~~~~~~~~~~~~ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 44 | |
| 45 | Drivers inform the DRM core about their requirements and supported |
| 46 | features by setting appropriate flags in the driver_features field. |
| 47 | Since those flags influence the DRM core behaviour since registration |
| 48 | time, most of them must be set to registering the :c:type:`struct |
| 49 | drm_driver <drm_driver>` instance. |
| 50 | |
| 51 | u32 driver_features; |
| 52 | |
| 53 | DRIVER_USE_AGP |
| 54 | Driver uses AGP interface, the DRM core will manage AGP resources. |
| 55 | |
Daniel Vetter | 3cbf6a5 | 2016-08-03 21:11:09 +0200 | [diff] [blame] | 56 | DRIVER_LEGACY |
| 57 | Denote a legacy driver using shadow attach. Don't use. |
| 58 | |
| 59 | DRIVER_KMS_LEGACY_CONTEXT |
| 60 | Used only by nouveau for backwards compatibility with existing userspace. |
| 61 | Don't use. |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 62 | |
| 63 | DRIVER_PCI_DMA |
| 64 | Driver is capable of PCI DMA, mapping of PCI DMA buffers to |
| 65 | userspace will be enabled. Deprecated. |
| 66 | |
| 67 | DRIVER_SG |
| 68 | Driver can perform scatter/gather DMA, allocation and mapping of |
| 69 | scatter/gather buffers will be enabled. Deprecated. |
| 70 | |
| 71 | DRIVER_HAVE_DMA |
| 72 | Driver supports DMA, the userspace DMA API will be supported. |
| 73 | Deprecated. |
| 74 | |
| 75 | DRIVER_HAVE_IRQ; DRIVER_IRQ_SHARED |
| 76 | DRIVER_HAVE_IRQ indicates whether the driver has an IRQ handler |
| 77 | managed by the DRM Core. The core will support simple IRQ handler |
| 78 | installation when the flag is set. The installation process is |
| 79 | described in ?. |
| 80 | |
| 81 | DRIVER_IRQ_SHARED indicates whether the device & handler support |
| 82 | shared IRQs (note that this is required of PCI drivers). |
| 83 | |
| 84 | DRIVER_GEM |
| 85 | Driver use the GEM memory manager. |
| 86 | |
| 87 | DRIVER_MODESET |
| 88 | Driver supports mode setting interfaces (KMS). |
| 89 | |
| 90 | DRIVER_PRIME |
| 91 | Driver implements DRM PRIME buffer sharing. |
| 92 | |
| 93 | DRIVER_RENDER |
| 94 | Driver supports dedicated render nodes. |
| 95 | |
| 96 | DRIVER_ATOMIC |
| 97 | Driver supports atomic properties. In this case the driver must |
| 98 | implement appropriate obj->atomic_get_property() vfuncs for any |
| 99 | modeset objects with driver specific properties. |
| 100 | |
| 101 | Major, Minor and Patchlevel |
Jani Nikula | 2fa91d1 | 2016-06-21 14:49:02 +0300 | [diff] [blame] | 102 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 103 | |
| 104 | int major; int minor; int patchlevel; |
| 105 | The DRM core identifies driver versions by a major, minor and patch |
| 106 | level triplet. The information is printed to the kernel log at |
| 107 | initialization time and passed to userspace through the |
| 108 | DRM_IOCTL_VERSION ioctl. |
| 109 | |
| 110 | The major and minor numbers are also used to verify the requested driver |
| 111 | API version passed to DRM_IOCTL_SET_VERSION. When the driver API |
| 112 | changes between minor versions, applications can call |
| 113 | DRM_IOCTL_SET_VERSION to select a specific version of the API. If the |
| 114 | requested major isn't equal to the driver major, or the requested minor |
| 115 | is larger than the driver minor, the DRM_IOCTL_SET_VERSION call will |
| 116 | return an error. Otherwise the driver's set_version() method will be |
| 117 | called with the requested version. |
| 118 | |
| 119 | Name, Description and Date |
Jani Nikula | 2fa91d1 | 2016-06-21 14:49:02 +0300 | [diff] [blame] | 120 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 121 | |
| 122 | char \*name; char \*desc; char \*date; |
| 123 | The driver name is printed to the kernel log at initialization time, |
| 124 | used for IRQ registration and passed to userspace through |
| 125 | DRM_IOCTL_VERSION. |
| 126 | |
| 127 | The driver description is a purely informative string passed to |
| 128 | userspace through the DRM_IOCTL_VERSION ioctl and otherwise unused by |
| 129 | the kernel. |
| 130 | |
| 131 | The driver date, formatted as YYYYMMDD, is meant to identify the date of |
| 132 | the latest modification to the driver. However, as most drivers fail to |
| 133 | update it, its value is mostly useless. The DRM core prints it to the |
| 134 | kernel log at initialization time and passes it to userspace through the |
| 135 | DRM_IOCTL_VERSION ioctl. |
| 136 | |
| 137 | Device Instance and Driver Handling |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 138 | ----------------------------------- |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 139 | |
| 140 | .. kernel-doc:: drivers/gpu/drm/drm_drv.c |
| 141 | :doc: driver instance overview |
| 142 | |
| 143 | .. kernel-doc:: drivers/gpu/drm/drm_drv.c |
| 144 | :export: |
| 145 | |
| 146 | Driver Load |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 147 | ----------- |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 148 | |
| 149 | IRQ Registration |
Jani Nikula | 2fa91d1 | 2016-06-21 14:49:02 +0300 | [diff] [blame] | 150 | ~~~~~~~~~~~~~~~~ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 151 | |
| 152 | The DRM core tries to facilitate IRQ handler registration and |
| 153 | unregistration by providing :c:func:`drm_irq_install()` and |
| 154 | :c:func:`drm_irq_uninstall()` functions. Those functions only |
| 155 | support a single interrupt per device, devices that use more than one |
| 156 | IRQs need to be handled manually. |
| 157 | |
| 158 | Managed IRQ Registration |
| 159 | '''''''''''''''''''''''' |
| 160 | |
| 161 | :c:func:`drm_irq_install()` starts by calling the irq_preinstall |
| 162 | driver operation. The operation is optional and must make sure that the |
| 163 | interrupt will not get fired by clearing all pending interrupt flags or |
| 164 | disabling the interrupt. |
| 165 | |
| 166 | The passed-in IRQ will then be requested by a call to |
| 167 | :c:func:`request_irq()`. If the DRIVER_IRQ_SHARED driver feature |
| 168 | flag is set, a shared (IRQF_SHARED) IRQ handler will be requested. |
| 169 | |
| 170 | The IRQ handler function must be provided as the mandatory irq_handler |
| 171 | driver operation. It will get passed directly to |
| 172 | :c:func:`request_irq()` and thus has the same prototype as all IRQ |
| 173 | handlers. It will get called with a pointer to the DRM device as the |
| 174 | second argument. |
| 175 | |
| 176 | Finally the function calls the optional irq_postinstall driver |
| 177 | operation. The operation usually enables interrupts (excluding the |
| 178 | vblank interrupt, which is enabled separately), but drivers may choose |
| 179 | to enable/disable interrupts at a different time. |
| 180 | |
| 181 | :c:func:`drm_irq_uninstall()` is similarly used to uninstall an |
| 182 | IRQ handler. It starts by waking up all processes waiting on a vblank |
| 183 | interrupt to make sure they don't hang, and then calls the optional |
| 184 | irq_uninstall driver operation. The operation must disable all hardware |
| 185 | interrupts. Finally the function frees the IRQ by calling |
| 186 | :c:func:`free_irq()`. |
| 187 | |
| 188 | Manual IRQ Registration |
| 189 | ''''''''''''''''''''''' |
| 190 | |
| 191 | Drivers that require multiple interrupt handlers can't use the managed |
| 192 | IRQ registration functions. In that case IRQs must be registered and |
| 193 | unregistered manually (usually with the :c:func:`request_irq()` and |
Daniel Vetter | a9eaa99 | 2016-07-15 21:48:08 +0200 | [diff] [blame] | 194 | :c:func:`free_irq()` functions, or their :c:func:`devm_request_irq()` and |
| 195 | :c:func:`devm_free_irq()` equivalents). |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 196 | |
| 197 | When manually registering IRQs, drivers must not set the |
| 198 | DRIVER_HAVE_IRQ driver feature flag, and must not provide the |
| 199 | irq_handler driver operation. They must set the :c:type:`struct |
| 200 | drm_device <drm_device>` irq_enabled field to 1 upon |
| 201 | registration of the IRQs, and clear it to 0 after unregistering the |
| 202 | IRQs. |
| 203 | |
| 204 | Memory Manager Initialization |
Jani Nikula | 2fa91d1 | 2016-06-21 14:49:02 +0300 | [diff] [blame] | 205 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 206 | |
| 207 | Every DRM driver requires a memory manager which must be initialized at |
| 208 | load time. DRM currently contains two memory managers, the Translation |
| 209 | Table Manager (TTM) and the Graphics Execution Manager (GEM). This |
| 210 | document describes the use of the GEM memory manager only. See ? for |
| 211 | details. |
| 212 | |
| 213 | Miscellaneous Device Configuration |
Jani Nikula | 2fa91d1 | 2016-06-21 14:49:02 +0300 | [diff] [blame] | 214 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 215 | |
| 216 | Another task that may be necessary for PCI devices during configuration |
| 217 | is mapping the video BIOS. On many devices, the VBIOS describes device |
| 218 | configuration, LCD panel timings (if any), and contains flags indicating |
| 219 | device state. Mapping the BIOS can be done using the pci_map_rom() |
| 220 | call, a convenience function that takes care of mapping the actual ROM, |
| 221 | whether it has been shadowed into memory (typically at address 0xc0000) |
| 222 | or exists on the PCI device in the ROM BAR. Note that after the ROM has |
| 223 | been mapped and any necessary information has been extracted, it should |
| 224 | be unmapped; on many devices, the ROM address decoder is shared with |
| 225 | other BARs, so leaving it mapped could cause undesired behaviour like |
| 226 | hangs or memory corruption. |
| 227 | |
| 228 | Bus-specific Device Registration and PCI Support |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 229 | ------------------------------------------------ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 230 | |
| 231 | A number of functions are provided to help with device registration. The |
| 232 | functions deal with PCI and platform devices respectively and are only |
| 233 | provided for historical reasons. These are all deprecated and shouldn't |
| 234 | be used in new drivers. Besides that there's a few helpers for pci |
| 235 | drivers. |
| 236 | |
| 237 | .. kernel-doc:: drivers/gpu/drm/drm_pci.c |
| 238 | :export: |
| 239 | |
| 240 | .. kernel-doc:: drivers/gpu/drm/drm_platform.c |
| 241 | :export: |
| 242 | |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 243 | Open/Close, File Operations and IOCTLs |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 244 | ====================================== |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 245 | |
| 246 | Open and Close |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 247 | -------------- |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 248 | |
Daniel Vetter | a9eaa99 | 2016-07-15 21:48:08 +0200 | [diff] [blame] | 249 | Open and close handlers. None of those methods are mandatory:: |
| 250 | |
| 251 | int (*firstopen) (struct drm_device *); |
| 252 | void (*lastclose) (struct drm_device *); |
| 253 | int (*open) (struct drm_device *, struct drm_file *); |
| 254 | void (*preclose) (struct drm_device *, struct drm_file *); |
| 255 | void (*postclose) (struct drm_device *, struct drm_file *); |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 256 | |
| 257 | The firstopen method is called by the DRM core for legacy UMS (User Mode |
| 258 | Setting) drivers only when an application opens a device that has no |
| 259 | other opened file handle. UMS drivers can implement it to acquire device |
| 260 | resources. KMS drivers can't use the method and must acquire resources |
| 261 | in the load method instead. |
| 262 | |
| 263 | Similarly the lastclose method is called when the last application |
| 264 | holding a file handle opened on the device closes it, for both UMS and |
| 265 | KMS drivers. Additionally, the method is also called at module unload |
| 266 | time or, for hot-pluggable devices, when the device is unplugged. The |
| 267 | firstopen and lastclose calls can thus be unbalanced. |
| 268 | |
| 269 | The open method is called every time the device is opened by an |
| 270 | application. Drivers can allocate per-file private data in this method |
| 271 | and store them in the struct :c:type:`struct drm_file |
| 272 | <drm_file>` driver_priv field. Note that the open method is |
| 273 | called before firstopen. |
| 274 | |
| 275 | The close operation is split into preclose and postclose methods. |
| 276 | Drivers must stop and cleanup all per-file operations in the preclose |
| 277 | method. For instance pending vertical blanking and page flip events must |
| 278 | be cancelled. No per-file operation is allowed on the file handle after |
| 279 | returning from the preclose method. |
| 280 | |
| 281 | Finally the postclose method is called as the last step of the close |
| 282 | operation, right before calling the lastclose method if no other open |
| 283 | file handle exists for the device. Drivers that have allocated per-file |
| 284 | private data in the open method should free it here. |
| 285 | |
| 286 | The lastclose method should restore CRTC and plane properties to default |
| 287 | value, so that a subsequent open of the device will not inherit state |
| 288 | from the previous user. It can also be used to execute delayed power |
Lukas Wunner | fb001df | 2016-07-11 10:22:33 +0200 | [diff] [blame] | 289 | switching state changes, e.g. in conjunction with the :ref:`vga_switcheroo` |
| 290 | infrastructure. Beyond that KMS drivers should not do any |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 291 | further cleanup. Only legacy UMS drivers might need to clean up device |
| 292 | state so that the vga console or an independent fbdev driver could take |
| 293 | over. |
| 294 | |
| 295 | File Operations |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 296 | --------------- |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 297 | |
| 298 | .. kernel-doc:: drivers/gpu/drm/drm_fops.c |
| 299 | :doc: file operations |
| 300 | |
| 301 | .. kernel-doc:: drivers/gpu/drm/drm_fops.c |
| 302 | :export: |
| 303 | |
| 304 | IOCTLs |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 305 | ------ |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 306 | |
| 307 | struct drm_ioctl_desc \*ioctls; int num_ioctls; |
| 308 | Driver-specific ioctls descriptors table. |
| 309 | |
| 310 | Driver-specific ioctls numbers start at DRM_COMMAND_BASE. The ioctls |
| 311 | descriptors table is indexed by the ioctl number offset from the base |
| 312 | value. Drivers can use the DRM_IOCTL_DEF_DRV() macro to initialize |
| 313 | the table entries. |
| 314 | |
| 315 | :: |
| 316 | |
| 317 | DRM_IOCTL_DEF_DRV(ioctl, func, flags) |
| 318 | |
| 319 | ``ioctl`` is the ioctl name. Drivers must define the DRM_##ioctl and |
| 320 | DRM_IOCTL_##ioctl macros to the ioctl number offset from |
| 321 | DRM_COMMAND_BASE and the ioctl number respectively. The first macro is |
| 322 | private to the device while the second must be exposed to userspace in a |
| 323 | public header. |
| 324 | |
| 325 | ``func`` is a pointer to the ioctl handler function compatible with the |
| 326 | ``drm_ioctl_t`` type. |
| 327 | |
| 328 | :: |
| 329 | |
| 330 | typedef int drm_ioctl_t(struct drm_device *dev, void *data, |
| 331 | struct drm_file *file_priv); |
| 332 | |
| 333 | ``flags`` is a bitmask combination of the following values. It restricts |
| 334 | how the ioctl is allowed to be called. |
| 335 | |
| 336 | - DRM_AUTH - Only authenticated callers allowed |
| 337 | |
| 338 | - DRM_MASTER - The ioctl can only be called on the master file handle |
| 339 | |
| 340 | - DRM_ROOT_ONLY - Only callers with the SYSADMIN capability allowed |
| 341 | |
| 342 | - DRM_CONTROL_ALLOW - The ioctl can only be called on a control |
| 343 | device |
| 344 | |
| 345 | - DRM_UNLOCKED - The ioctl handler will be called without locking the |
| 346 | DRM global mutex. This is the enforced default for kms drivers (i.e. |
| 347 | using the DRIVER_MODESET flag) and hence shouldn't be used any more |
| 348 | for new drivers. |
| 349 | |
| 350 | .. kernel-doc:: drivers/gpu/drm/drm_ioctl.c |
| 351 | :export: |
| 352 | |
| 353 | Legacy Support Code |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 354 | =================== |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 355 | |
| 356 | The section very briefly covers some of the old legacy support code |
| 357 | which is only used by old DRM drivers which have done a so-called |
| 358 | shadow-attach to the underlying device instead of registering as a real |
| 359 | driver. This also includes some of the old generic buffer management and |
| 360 | command submission code. Do not use any of this in new and modern |
| 361 | drivers. |
| 362 | |
| 363 | Legacy Suspend/Resume |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 364 | --------------------- |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 365 | |
| 366 | The DRM core provides some suspend/resume code, but drivers wanting full |
| 367 | suspend/resume support should provide save() and restore() functions. |
| 368 | These are called at suspend, hibernate, or resume time, and should |
| 369 | perform any state save or restore required by your device across suspend |
| 370 | or hibernate states. |
| 371 | |
| 372 | int (\*suspend) (struct drm_device \*, pm_message_t state); int |
| 373 | (\*resume) (struct drm_device \*); |
| 374 | Those are legacy suspend and resume methods which *only* work with the |
| 375 | legacy shadow-attach driver registration functions. New driver should |
| 376 | use the power management interface provided by their bus type (usually |
| 377 | through the :c:type:`struct device_driver <device_driver>` |
| 378 | dev_pm_ops) and set these methods to NULL. |
| 379 | |
| 380 | Legacy DMA Services |
Jani Nikula | 2255402 | 2016-06-21 14:49:00 +0300 | [diff] [blame] | 381 | ------------------- |
Jani Nikula | ca00c2b | 2016-06-21 14:48:58 +0300 | [diff] [blame] | 382 | |
| 383 | This should cover how DMA mapping etc. is supported by the core. These |
| 384 | functions are deprecated and should not be used. |