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