Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 1 | .. _todo: |
| 2 | |
| 3 | ========= |
| 4 | TODO list |
| 5 | ========= |
| 6 | |
| 7 | This section contains a list of smaller janitorial tasks in the kernel DRM |
| 8 | graphics subsystem useful as newbie projects. Or for slow rainy days. |
| 9 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 10 | Difficulty |
| 11 | ---------- |
| 12 | |
| 13 | To make it easier task are categorized into different levels: |
| 14 | |
| 15 | Starter: Good tasks to get started with the DRM subsystem. |
| 16 | |
| 17 | Intermediate: Tasks which need some experience with working in the DRM |
| 18 | subsystem, or some specific GPU/display graphics knowledge. For debugging issue |
| 19 | it's good to have the relevant hardware (or a virtual driver set up) available |
| 20 | for testing. |
| 21 | |
| 22 | Advanced: Tricky tasks that need fairly good understanding of the DRM subsystem |
| 23 | and graphics topics. Generally need the relevant hardware for development and |
| 24 | testing. |
| 25 | |
Daniel Vetter | 5823cca | 2021-01-22 14:36:23 +0100 | [diff] [blame] | 26 | Expert: Only attempt these if you've successfully completed some tricky |
| 27 | refactorings already and are an expert in the specific area |
| 28 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 29 | Subsystem-wide refactorings |
| 30 | =========================== |
| 31 | |
Daniel Vetter | 39dea70 | 2018-11-27 10:19:21 +0100 | [diff] [blame] | 32 | Remove custom dumb_map_offset implementations |
| 33 | --------------------------------------------- |
| 34 | |
| 35 | All GEM based drivers should be using drm_gem_create_mmap_offset() instead. |
| 36 | Audit each individual driver, make sure it'll work with the generic |
| 37 | implementation (there's lots of outdated locking leftovers in various |
| 38 | implementations), and then remove it. |
| 39 | |
| 40 | Contact: Daniel Vetter, respective driver maintainers |
| 41 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 42 | Level: Intermediate |
| 43 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 44 | Convert existing KMS drivers to atomic modesetting |
| 45 | -------------------------------------------------- |
| 46 | |
| 47 | 3.19 has the atomic modeset interfaces and helpers, so drivers can now be |
| 48 | converted over. Modern compositors like Wayland or Surfaceflinger on Android |
| 49 | really want an atomic modeset interface, so this is all about the bright |
| 50 | future. |
| 51 | |
| 52 | There is a conversion guide for atomic and all you need is a GPU for a |
| 53 | non-converted driver (again virtual HW drivers for KVM are still all |
| 54 | suitable). |
| 55 | |
| 56 | As part of this drivers also need to convert to universal plane (which means |
| 57 | exposing primary & cursor as proper plane objects). But that's much easier to |
| 58 | do by directly using the new atomic helper driver callbacks. |
| 59 | |
| 60 | Contact: Daniel Vetter, respective driver maintainers |
| 61 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 62 | Level: Advanced |
| 63 | |
Daniel Vetter | 1a80cc1 | 2017-02-26 20:38:50 +0100 | [diff] [blame] | 64 | Clean up the clipped coordination confusion around planes |
| 65 | --------------------------------------------------------- |
| 66 | |
| 67 | We have a helper to get this right with drm_plane_helper_check_update(), but |
| 68 | it's not consistently used. This should be fixed, preferrably in the atomic |
| 69 | helpers (and drivers then moved over to clipped coordinates). Probably the |
| 70 | helper should also be moved from drm_plane_helper.c to the atomic helpers, to |
| 71 | avoid confusion - the other helpers in that file are all deprecated legacy |
| 72 | helpers. |
| 73 | |
| 74 | Contact: Ville Syrjälä, Daniel Vetter, driver maintainers |
| 75 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 76 | Level: Advanced |
| 77 | |
Daniel Vetter | 9a69bd1 | 2019-12-13 18:26:03 +0100 | [diff] [blame] | 78 | Improve plane atomic_check helpers |
| 79 | ---------------------------------- |
| 80 | |
| 81 | Aside from the clipped coordinates right above there's a few suboptimal things |
| 82 | with the current helpers: |
| 83 | |
| 84 | - drm_plane_helper_funcs->atomic_check gets called for enabled or disabled |
| 85 | planes. At best this seems to confuse drivers, worst it means they blow up |
| 86 | when the plane is disabled without the CRTC. The only special handling is |
| 87 | resetting values in the plane state structures, which instead should be moved |
| 88 | into the drm_plane_funcs->atomic_duplicate_state functions. |
| 89 | |
| 90 | - Once that's done, helpers could stop calling ->atomic_check for disabled |
| 91 | planes. |
| 92 | |
| 93 | - Then we could go through all the drivers and remove the more-or-less confused |
| 94 | checks for plane_state->fb and plane_state->crtc. |
| 95 | |
| 96 | Contact: Daniel Vetter |
| 97 | |
| 98 | Level: Advanced |
| 99 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 100 | Convert early atomic drivers to async commit helpers |
| 101 | ---------------------------------------------------- |
| 102 | |
| 103 | For the first year the atomic modeset helpers didn't support asynchronous / |
| 104 | nonblocking commits, and every driver had to hand-roll them. This is fixed |
| 105 | now, but there's still a pile of existing drivers that easily could be |
| 106 | converted over to the new infrastructure. |
| 107 | |
| 108 | One issue with the helpers is that they require that drivers handle completion |
| 109 | events for atomic commits correctly. But fixing these bugs is good anyway. |
| 110 | |
Daniel Vetter | 7d18e2f | 2020-10-23 14:39:25 +0200 | [diff] [blame] | 111 | Somewhat related is the legacy_cursor_update hack, which should be replaced with |
| 112 | the new atomic_async_check/commit functionality in the helpers in drivers that |
| 113 | still look at that flag. |
| 114 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 115 | Contact: Daniel Vetter, respective driver maintainers |
| 116 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 117 | Level: Advanced |
| 118 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 119 | Fallout from atomic KMS |
| 120 | ----------------------- |
| 121 | |
| 122 | ``drm_atomic_helper.c`` provides a batch of functions which implement legacy |
| 123 | IOCTLs on top of the new atomic driver interface. Which is really nice for |
| 124 | gradual conversion of drivers, but unfortunately the semantic mismatches are |
| 125 | a bit too severe. So there's some follow-up work to adjust the function |
| 126 | interfaces to fix these issues: |
| 127 | |
| 128 | * atomic needs the lock acquire context. At the moment that's passed around |
| 129 | implicitly with some horrible hacks, and it's also allocate with |
| 130 | ``GFP_NOFAIL`` behind the scenes. All legacy paths need to start allocating |
| 131 | the acquire context explicitly on stack and then also pass it down into |
| 132 | drivers explicitly so that the legacy-on-atomic functions can use them. |
| 133 | |
Daniel Vetter | 2ec04b3 | 2018-09-05 20:15:09 +0200 | [diff] [blame] | 134 | Except for some driver code this is done. This task should be finished by |
| 135 | adding WARN_ON(!drm_drv_uses_atomic_modeset) in drm_modeset_lock_all(). |
Daniel Vetter | be05fe1 | 2017-09-11 08:51:51 +0200 | [diff] [blame] | 136 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 137 | * A bunch of the vtable hooks are now in the wrong place: DRM has a split |
| 138 | between core vfunc tables (named ``drm_foo_funcs``), which are used to |
| 139 | implement the userspace ABI. And then there's the optional hooks for the |
| 140 | helper libraries (name ``drm_foo_helper_funcs``), which are purely for |
| 141 | internal use. Some of these hooks should be move from ``_funcs`` to |
| 142 | ``_helper_funcs`` since they are not part of the core ABI. There's a |
| 143 | ``FIXME`` comment in the kerneldoc for each such case in ``drm_crtc.h``. |
| 144 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 145 | Contact: Daniel Vetter |
| 146 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 147 | Level: Intermediate |
| 148 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 149 | Get rid of dev->struct_mutex from GEM drivers |
| 150 | --------------------------------------------- |
| 151 | |
| 152 | ``dev->struct_mutex`` is the Big DRM Lock from legacy days and infested |
| 153 | everything. Nowadays in modern drivers the only bit where it's mandatory is |
| 154 | serializing GEM buffer object destruction. Which unfortunately means drivers |
| 155 | have to keep track of that lock and either call ``unreference`` or |
| 156 | ``unreference_locked`` depending upon context. |
| 157 | |
| 158 | Core GEM doesn't have a need for ``struct_mutex`` any more since kernel 4.8, |
Thomas Zimmermann | d693def | 2020-09-23 12:21:59 +0200 | [diff] [blame] | 159 | and there's a GEM object ``free`` callback for any drivers which are |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 160 | entirely ``struct_mutex`` free. |
| 161 | |
| 162 | For drivers that need ``struct_mutex`` it should be replaced with a driver- |
| 163 | private lock. The tricky part is the BO free functions, since those can't |
| 164 | reliably take that lock any more. Instead state needs to be protected with |
| 165 | suitable subordinate locks or some cleanup work pushed to a worker thread. For |
| 166 | performance-critical drivers it might also be better to go with a more |
Emil Velikov | efdff86 | 2020-05-15 10:50:43 +0100 | [diff] [blame] | 167 | fine-grained per-buffer object and per-context lockings scheme. Currently only |
| 168 | the ``msm`` and `i915` drivers use ``struct_mutex``. |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 169 | |
Daniel Vetter | 085c6c0 | 2017-04-04 11:52:54 +0200 | [diff] [blame] | 170 | Contact: Daniel Vetter, respective driver maintainers |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 171 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 172 | Level: Advanced |
| 173 | |
Daniel Vetter | 5823cca | 2021-01-22 14:36:23 +0100 | [diff] [blame] | 174 | Move Buffer Object Locking to dma_resv_lock() |
| 175 | --------------------------------------------- |
| 176 | |
| 177 | Many drivers have their own per-object locking scheme, usually using |
| 178 | mutex_lock(). This causes all kinds of trouble for buffer sharing, since |
| 179 | depending which driver is the exporter and importer, the locking hierarchy is |
| 180 | reversed. |
| 181 | |
| 182 | To solve this we need one standard per-object locking mechanism, which is |
| 183 | dma_resv_lock(). This lock needs to be called as the outermost lock, with all |
| 184 | other driver specific per-object locks removed. The problem is tha rolling out |
| 185 | the actual change to the locking contract is a flag day, due to struct dma_buf |
| 186 | buffer sharing. |
| 187 | |
| 188 | Level: Expert |
| 189 | |
Daniel Vetter | 93ccfa9 | 2019-12-19 17:17:22 +0100 | [diff] [blame] | 190 | Convert logging to drm_* functions with drm_device paramater |
| 191 | ------------------------------------------------------------ |
Sean Paul | 45ae278 | 2017-09-08 10:32:07 -0400 | [diff] [blame] | 192 | |
| 193 | For drivers which could have multiple instances, it is necessary to |
| 194 | differentiate between which is which in the logs. Since DRM_INFO/WARN/ERROR |
| 195 | don't do this, drivers used dev_info/warn/err to make this differentiation. We |
Daniel Vetter | 93ccfa9 | 2019-12-19 17:17:22 +0100 | [diff] [blame] | 196 | now have drm_* variants of the drm print functions, so we can start to convert |
| 197 | those drivers back to using drm-formatted specific log messages. |
Sean Paul | 45ae278 | 2017-09-08 10:32:07 -0400 | [diff] [blame] | 198 | |
Daniel Vetter | 9f44678 | 2017-10-30 14:15:36 +0100 | [diff] [blame] | 199 | Before you start this conversion please contact the relevant maintainers to make |
| 200 | sure your work will be merged - not everyone agrees that the DRM dmesg macros |
| 201 | are better. |
| 202 | |
Sean Paul | 45ae278 | 2017-09-08 10:32:07 -0400 | [diff] [blame] | 203 | Contact: Sean Paul, Maintainer of the driver you plan to convert |
| 204 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 205 | Level: Starter |
| 206 | |
Noralf Trønnes | 3233fc0 | 2017-11-06 20:18:12 +0100 | [diff] [blame] | 207 | Convert drivers to use simple modeset suspend/resume |
| 208 | ---------------------------------------------------- |
| 209 | |
| 210 | Most drivers (except i915 and nouveau) that use |
| 211 | drm_atomic_helper_suspend/resume() can probably be converted to use |
Daniel Vetter | 2ec04b3 | 2018-09-05 20:15:09 +0200 | [diff] [blame] | 212 | drm_mode_config_helper_suspend/resume(). Also there's still open-coded version |
| 213 | of the atomic suspend/resume code in older atomic modeset drivers. |
Noralf Trønnes | 3233fc0 | 2017-11-06 20:18:12 +0100 | [diff] [blame] | 214 | |
| 215 | Contact: Maintainer of the driver you plan to convert |
| 216 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 217 | Level: Intermediate |
| 218 | |
Thomas Zimmermann | 80ae036 | 2019-11-06 13:47:26 +0100 | [diff] [blame] | 219 | Convert drivers to use drm_fbdev_generic_setup() |
| 220 | ------------------------------------------------ |
Noralf Trønnes | ee05baa | 2017-12-15 18:51:15 +0100 | [diff] [blame] | 221 | |
Thomas Zimmermann | 80ae036 | 2019-11-06 13:47:26 +0100 | [diff] [blame] | 222 | Most drivers can use drm_fbdev_generic_setup(). Driver have to implement |
Thomas Zimmermann | 222ec45 | 2020-11-03 10:30:15 +0100 | [diff] [blame] | 223 | atomic modesetting and GEM vmap support. Historically, generic fbdev emulation |
| 224 | expected the framebuffer in system memory or system-like memory. By employing |
| 225 | struct dma_buf_map, drivers with frambuffers in I/O memory can be supported |
| 226 | as well. |
Noralf Trønnes | ee05baa | 2017-12-15 18:51:15 +0100 | [diff] [blame] | 227 | |
| 228 | Contact: Maintainer of the driver you plan to convert |
| 229 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 230 | Level: Intermediate |
| 231 | |
Thomas Zimmermann | 222ec45 | 2020-11-03 10:30:15 +0100 | [diff] [blame] | 232 | Reimplement functions in drm_fbdev_fb_ops without fbdev |
| 233 | ------------------------------------------------------- |
| 234 | |
| 235 | A number of callback functions in drm_fbdev_fb_ops could benefit from |
| 236 | being rewritten without dependencies on the fbdev module. Some of the |
| 237 | helpers could further benefit from using struct dma_buf_map instead of |
| 238 | raw pointers. |
| 239 | |
| 240 | Contact: Thomas Zimmermann <tzimmermann@suse.de>, Daniel Vetter |
| 241 | |
| 242 | Level: Advanced |
| 243 | |
| 244 | |
Daniel Vetter | 2c81bdc | 2019-11-27 19:00:35 +0100 | [diff] [blame] | 245 | drm_framebuffer_funcs and drm_mode_config_funcs.fb_create cleanup |
| 246 | ----------------------------------------------------------------- |
| 247 | |
| 248 | A lot more drivers could be switched over to the drm_gem_framebuffer helpers. |
| 249 | Various hold-ups: |
| 250 | |
| 251 | - Need to switch over to the generic dirty tracking code using |
| 252 | drm_atomic_helper_dirtyfb first (e.g. qxl). |
| 253 | |
| 254 | - Need to switch to drm_fbdev_generic_setup(), otherwise a lot of the custom fb |
| 255 | setup code can't be deleted. |
| 256 | |
| 257 | - Many drivers wrap drm_gem_fb_create() only to check for valid formats. For |
| 258 | atomic drivers we could check for valid formats by calling |
| 259 | drm_plane_check_pixel_format() against all planes, and pass if any plane |
| 260 | supports the format. For non-atomic that's not possible since like the format |
| 261 | list for the primary plane is fake and we'd therefor reject valid formats. |
| 262 | |
| 263 | - Many drivers subclass drm_framebuffer, we'd need a embedding compatible |
| 264 | version of the varios drm_gem_fb_create functions. Maybe called |
| 265 | drm_gem_fb_create/_with_dirty/_with_funcs as needed. |
| 266 | |
| 267 | Contact: Daniel Vetter |
| 268 | |
| 269 | Level: Intermediate |
| 270 | |
Daniel Vetter | be5cadc | 2019-01-07 11:22:38 +0100 | [diff] [blame] | 271 | Generic fbdev defio support |
| 272 | --------------------------- |
| 273 | |
| 274 | The defio support code in the fbdev core has some very specific requirements, |
Thomas Zimmermann | 955a72c | 2019-10-25 11:27:59 +0200 | [diff] [blame] | 275 | which means drivers need to have a special framebuffer for fbdev. The main |
| 276 | issue is that it uses some fields in struct page itself, which breaks shmem |
| 277 | gem objects (and other things). To support defio, affected drivers require |
| 278 | the use of a shadow buffer, which may add CPU and memory overhead. |
Daniel Vetter | be5cadc | 2019-01-07 11:22:38 +0100 | [diff] [blame] | 279 | |
| 280 | Possible solution would be to write our own defio mmap code in the drm fbdev |
| 281 | emulation. It would need to fully wrap the existing mmap ops, forwarding |
| 282 | everything after it has done the write-protect/mkwrite trickery: |
| 283 | |
| 284 | - In the drm_fbdev_fb_mmap helper, if we need defio, change the |
| 285 | default page prots to write-protected with something like this:: |
| 286 | |
| 287 | vma->vm_page_prot = pgprot_wrprotect(vma->vm_page_prot); |
| 288 | |
| 289 | - Set the mkwrite and fsync callbacks with similar implementions to the core |
| 290 | fbdev defio stuff. These should all work on plain ptes, they don't actually |
| 291 | require a struct page. uff. These should all work on plain ptes, they don't |
| 292 | actually require a struct page. |
| 293 | |
| 294 | - Track the dirty pages in a separate structure (bitfield with one bit per page |
| 295 | should work) to avoid clobbering struct page. |
| 296 | |
| 297 | Might be good to also have some igt testcases for this. |
| 298 | |
| 299 | Contact: Daniel Vetter, Noralf Tronnes |
| 300 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 301 | Level: Advanced |
| 302 | |
Daniel Vetter | 39aead8 | 2020-10-29 14:22:29 +0100 | [diff] [blame] | 303 | Garbage collect fbdev scrolling acceleration |
| 304 | -------------------------------------------- |
| 305 | |
Claudio Suarez | b3ec8cd | 2021-09-30 17:10:26 +0200 | [diff] [blame] | 306 | Scroll acceleration has been disabled in fbcon. Now it works as the old |
| 307 | SCROLL_REDRAW mode. A ton of code was removed in fbcon.c and the hook bmove was |
| 308 | removed from fbcon_ops. |
| 309 | Remaining tasks: |
Daniel Vetter | fa38823 | 2020-11-18 08:36:37 +0100 | [diff] [blame] | 310 | |
Claudio Suarez | b3ec8cd | 2021-09-30 17:10:26 +0200 | [diff] [blame] | 311 | - a bunch of the hooks in fbcon_ops could be removed or simplified by calling |
Daniel Vetter | 39aead8 | 2020-10-29 14:22:29 +0100 | [diff] [blame] | 312 | directly instead of the function table (with a switch on p->rotate) |
Daniel Vetter | fa38823 | 2020-11-18 08:36:37 +0100 | [diff] [blame] | 313 | |
Daniel Vetter | 39aead8 | 2020-10-29 14:22:29 +0100 | [diff] [blame] | 314 | - fb_copyarea is unused after this, and can be deleted from all drivers |
| 315 | |
Claudio Suarez | b3ec8cd | 2021-09-30 17:10:26 +0200 | [diff] [blame] | 316 | - after that, fb_copyarea can be deleted from fb_ops in include/linux/fb.h as |
| 317 | well as cfb_copyarea |
| 318 | |
Daniel Vetter | 39aead8 | 2020-10-29 14:22:29 +0100 | [diff] [blame] | 319 | Note that not all acceleration code can be deleted, since clearing and cursor |
| 320 | support is still accelerated, which might be good candidates for further |
| 321 | deletion projects. |
| 322 | |
| 323 | Contact: Daniel Vetter |
| 324 | |
| 325 | Level: Intermediate |
| 326 | |
Daniel Vetter | 1aecabb | 2018-02-19 15:57:08 +0100 | [diff] [blame] | 327 | idr_init_base() |
| 328 | --------------- |
| 329 | |
| 330 | DRM core&drivers uses a lot of idr (integer lookup directories) for mapping |
| 331 | userspace IDs to internal objects, and in most places ID=0 means NULL and hence |
| 332 | is never used. Switching to idr_init_base() for these would make the idr more |
| 333 | efficient. |
| 334 | |
| 335 | Contact: Daniel Vetter |
| 336 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 337 | Level: Starter |
| 338 | |
Noralf Trønnes | b39b539 | 2018-11-10 15:56:45 +0100 | [diff] [blame] | 339 | struct drm_gem_object_funcs |
| 340 | --------------------------- |
| 341 | |
| 342 | GEM objects can now have a function table instead of having the callbacks on the |
Thomas Zimmermann | d693def | 2020-09-23 12:21:59 +0200 | [diff] [blame] | 343 | DRM driver struct. This is now the preferred way. Callbacks in drivers have been |
| 344 | converted, except for struct drm_driver.gem_prime_mmap. |
Daniel Vetter | 8db420a | 2019-06-14 22:35:17 +0200 | [diff] [blame] | 345 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 346 | Level: Intermediate |
| 347 | |
Daniel Vetter | e57924d | 2019-01-29 14:21:53 +0100 | [diff] [blame] | 348 | Rename CMA helpers to DMA helpers |
| 349 | --------------------------------- |
| 350 | |
| 351 | CMA (standing for contiguous memory allocator) is really a bit an accident of |
| 352 | what these were used for first, a much better name would be DMA helpers. In the |
| 353 | text these should even be called coherent DMA memory helpers (so maybe CDM, but |
| 354 | no one knows what that means) since underneath they just use dma_alloc_coherent. |
| 355 | |
| 356 | Contact: Laurent Pinchart, Daniel Vetter |
| 357 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 358 | Level: Intermediate (mostly because it is a huge tasks without good partial |
| 359 | milestones, not technically itself that challenging) |
| 360 | |
Daniel Vetter | 69b22f51 | 2019-09-17 14:09:36 +0200 | [diff] [blame] | 361 | connector register/unregister fixes |
| 362 | ----------------------------------- |
| 363 | |
| 364 | - For most connectors it's a no-op to call drm_connector_register/unregister |
| 365 | directly from driver code, drm_dev_register/unregister take care of this |
| 366 | already. We can remove all of them. |
| 367 | |
| 368 | - For dp drivers it's a bit more a mess, since we need the connector to be |
| 369 | registered when calling drm_dp_aux_register. Fix this by instead calling |
| 370 | drm_dp_aux_init, and moving the actual registering into a late_register |
| 371 | callback as recommended in the kerneldoc. |
| 372 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 373 | Level: Intermediate |
| 374 | |
Daniel Vetter | 700496f | 2019-10-23 16:49:53 +0200 | [diff] [blame] | 375 | Remove load/unload callbacks from all non-DRIVER_LEGACY drivers |
| 376 | --------------------------------------------------------------- |
| 377 | |
| 378 | The load/unload callbacks in struct &drm_driver are very much midlayers, plus |
| 379 | for historical reasons they get the ordering wrong (and we can't fix that) |
| 380 | between setting up the &drm_driver structure and calling drm_dev_register(). |
| 381 | |
| 382 | - Rework drivers to no longer use the load/unload callbacks, directly coding the |
| 383 | load/unload sequence into the driver's probe function. |
| 384 | |
| 385 | - Once all non-DRIVER_LEGACY drivers are converted, disallow the load/unload |
| 386 | callbacks for all modern drivers. |
| 387 | |
| 388 | Contact: Daniel Vetter |
| 389 | |
| 390 | Level: Intermediate |
| 391 | |
Laurent Pinchart | a92d083 | 2020-02-26 13:24:23 +0200 | [diff] [blame] | 392 | Replace drm_detect_hdmi_monitor() with drm_display_info.is_hdmi |
| 393 | --------------------------------------------------------------- |
| 394 | |
| 395 | Once EDID is parsed, the monitor HDMI support information is available through |
| 396 | drm_display_info.is_hdmi. Many drivers still call drm_detect_hdmi_monitor() to |
| 397 | retrieve the same information, which is less efficient. |
| 398 | |
| 399 | Audit each individual driver calling drm_detect_hdmi_monitor() and switch to |
| 400 | drm_display_info.is_hdmi if applicable. |
| 401 | |
| 402 | Contact: Laurent Pinchart, respective driver maintainers |
| 403 | |
| 404 | Level: Intermediate |
| 405 | |
Emil Velikov | c327479 | 2020-06-03 18:04:34 +0100 | [diff] [blame] | 406 | Consolidate custom driver modeset properties |
| 407 | -------------------------------------------- |
| 408 | |
| 409 | Before atomic modeset took place, many drivers where creating their own |
| 410 | properties. Among other things, atomic brought the requirement that custom, |
| 411 | driver specific properties should not be used. |
| 412 | |
| 413 | For this task, we aim to introduce core helpers or reuse the existing ones |
| 414 | if available: |
| 415 | |
| 416 | A quick, unconfirmed, examples list. |
| 417 | |
| 418 | Introduce core helpers: |
| 419 | - audio (amdgpu, intel, gma500, radeon) |
| 420 | - brightness, contrast, etc (armada, nouveau) - overlay only (?) |
| 421 | - broadcast rgb (gma500, intel) |
| 422 | - colorkey (armada, nouveau, rcar) - overlay only (?) |
| 423 | - dither (amdgpu, nouveau, radeon) - varies across drivers |
| 424 | - underscan family (amdgpu, radeon, nouveau) |
| 425 | |
| 426 | Already in core: |
| 427 | - colorspace (sti) |
| 428 | - tv format names, enhancements (gma500, intel) |
| 429 | - tv overscan, margins, etc. (gma500, intel) |
| 430 | - zorder (omapdrm) - same as zpos (?) |
| 431 | |
| 432 | |
| 433 | Contact: Emil Velikov, respective driver maintainers |
| 434 | |
| 435 | Level: Intermediate |
| 436 | |
Thomas Zimmermann | 49a3f51 | 2020-11-03 10:30:11 +0100 | [diff] [blame] | 437 | Use struct dma_buf_map throughout codebase |
| 438 | ------------------------------------------ |
| 439 | |
| 440 | Pointers to shared device memory are stored in struct dma_buf_map. Each |
| 441 | instance knows whether it refers to system or I/O memory. Most of the DRM-wide |
| 442 | interface have been converted to use struct dma_buf_map, but implementations |
| 443 | often still use raw pointers. |
| 444 | |
| 445 | The task is to use struct dma_buf_map where it makes sense. |
| 446 | |
| 447 | * Memory managers should use struct dma_buf_map for dma-buf-imported buffers. |
| 448 | * TTM might benefit from using struct dma_buf_map internally. |
| 449 | * Framebuffer copying and blitting helpers should operate on struct dma_buf_map. |
| 450 | |
| 451 | Contact: Thomas Zimmermann <tzimmermann@suse.de>, Christian König, Daniel Vetter |
| 452 | |
| 453 | Level: Intermediate |
| 454 | |
Thomas Zimmermann | 84e9dfd5 | 2021-11-10 11:37:02 +0100 | [diff] [blame] | 455 | Review all drivers for setting struct drm_mode_config.{max_width,max_height} correctly |
| 456 | -------------------------------------------------------------------------------------- |
| 457 | |
| 458 | The values in struct drm_mode_config.{max_width,max_height} describe the |
| 459 | maximum supported framebuffer size. It's the virtual screen size, but many |
| 460 | drivers treat it like limitations of the physical resolution. |
| 461 | |
| 462 | The maximum width depends on the hardware's maximum scanline pitch. The |
| 463 | maximum height depends on the amount of addressable video memory. Review all |
| 464 | drivers to initialize the fields to the correct values. |
| 465 | |
| 466 | Contact: Thomas Zimmermann <tzimmermann@suse.de> |
| 467 | |
| 468 | Level: Intermediate |
| 469 | |
Emil Velikov | c327479 | 2020-06-03 18:04:34 +0100 | [diff] [blame] | 470 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 471 | Core refactorings |
| 472 | ================= |
| 473 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 474 | Make panic handling work |
| 475 | ------------------------ |
| 476 | |
| 477 | This is a really varied tasks with lots of little bits and pieces: |
| 478 | |
| 479 | * The panic path can't be tested currently, leading to constant breaking. The |
| 480 | main issue here is that panics can be triggered from hardirq contexts and |
| 481 | hence all panic related callback can run in hardirq context. It would be |
| 482 | awesome if we could test at least the fbdev helper code and driver code by |
| 483 | e.g. trigger calls through drm debugfs files. hardirq context could be |
| 484 | achieved by using an IPI to the local processor. |
| 485 | |
| 486 | * There's a massive confusion of different panic handlers. DRM fbdev emulation |
| 487 | helpers have one, but on top of that the fbcon code itself also has one. We |
| 488 | need to make sure that they stop fighting over each another. |
| 489 | |
| 490 | * ``drm_can_sleep()`` is a mess. It hides real bugs in normal operations and |
| 491 | isn't a full solution for panic paths. We need to make sure that it only |
| 492 | returns true if there's a panic going on for real, and fix up all the |
| 493 | fallout. |
| 494 | |
| 495 | * The panic handler must never sleep, which also means it can't ever |
| 496 | ``mutex_lock()``. Also it can't grab any other lock unconditionally, not |
| 497 | even spinlocks (because NMI and hardirq can panic too). We need to either |
| 498 | make sure to not call such paths, or trylock everything. Really tricky. |
| 499 | |
| 500 | * For the above locking troubles reasons it's pretty much impossible to |
| 501 | attempt a synchronous modeset from panic handlers. The only thing we could |
| 502 | try to achive is an atomic ``set_base`` of the primary plane, and hope that |
| 503 | it shows up. Everything else probably needs to be delayed to some worker or |
| 504 | something else which happens later on. Otherwise it just kills the box |
| 505 | harder, prevent the panic from going out on e.g. netconsole. |
| 506 | |
| 507 | * There's also proposal for a simplied DRM console instead of the full-blown |
| 508 | fbcon and DRM fbdev emulation. Any kind of panic handling tricks should |
| 509 | obviously work for both console, in case we ever get kmslog merged. |
| 510 | |
| 511 | Contact: Daniel Vetter |
| 512 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 513 | Level: Advanced |
| 514 | |
Daniel Vetter | 0cad7f7 | 2017-03-22 21:54:01 +0100 | [diff] [blame] | 515 | Clean up the debugfs support |
| 516 | ---------------------------- |
| 517 | |
| 518 | There's a bunch of issues with it: |
| 519 | |
| 520 | - The drm_info_list ->show() function doesn't even bother to cast to the drm |
| 521 | structure for you. This is lazy. |
| 522 | |
| 523 | - We probably want to have some support for debugfs files on crtc/connectors and |
| 524 | maybe other kms objects directly in core. There's even drm_print support in |
| 525 | the funcs for these objects to dump kms state, so it's all there. And then the |
| 526 | ->show() functions should obviously give you a pointer to the right object. |
| 527 | |
| 528 | - The drm_info_list stuff is centered on drm_minor instead of drm_device. For |
| 529 | anything we want to print drm_device (or maybe drm_file) is the right thing. |
| 530 | |
| 531 | - The drm_driver->debugfs_init hooks we have is just an artifact of the old |
| 532 | midlayered load sequence. DRM debugfs should work more like sysfs, where you |
| 533 | can create properties/files for an object anytime you want, and the core |
| 534 | takes care of publishing/unpuplishing all the files at register/unregister |
| 535 | time. Drivers shouldn't need to worry about these technicalities, and fixing |
| 536 | this (together with the drm_minor->drm_device move) would allow us to remove |
| 537 | debugfs_init. |
| 538 | |
Daniel Vetter | bbbb6fd | 2021-04-21 17:29:11 +0200 | [diff] [blame] | 539 | Previous RFC that hasn't landed yet: https://lore.kernel.org/dri-devel/20200513114130.28641-2-wambui.karugax@gmail.com/ |
| 540 | |
Daniel Vetter | 0cad7f7 | 2017-03-22 21:54:01 +0100 | [diff] [blame] | 541 | Contact: Daniel Vetter |
| 542 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 543 | Level: Intermediate |
| 544 | |
Daniel Vetter | 6a56d09 | 2021-01-21 12:29:19 +0100 | [diff] [blame] | 545 | Object lifetime fixes |
| 546 | --------------------- |
Daniel Vetter | 81a7bd4 | 2017-10-17 18:29:18 +0200 | [diff] [blame] | 547 | |
Daniel Vetter | 6a56d09 | 2021-01-21 12:29:19 +0100 | [diff] [blame] | 548 | There's two related issues here |
Daniel Vetter | 81a7bd4 | 2017-10-17 18:29:18 +0200 | [diff] [blame] | 549 | |
Daniel Vetter | 6a56d09 | 2021-01-21 12:29:19 +0100 | [diff] [blame] | 550 | - Cleanup up the various ->destroy callbacks, which often are all the same |
| 551 | simple code. |
Daniel Vetter | e6a3e40 | 2018-10-04 22:24:45 +0200 | [diff] [blame] | 552 | |
Daniel Vetter | 6a56d09 | 2021-01-21 12:29:19 +0100 | [diff] [blame] | 553 | - Lots of drivers erroneously allocate DRM modeset objects using devm_kzalloc, |
| 554 | which results in use-after free issues on driver unload. This can be serious |
| 555 | trouble even for drivers for hardware integrated on the SoC due to |
| 556 | EPROBE_DEFERRED backoff. |
| 557 | |
| 558 | Both these problems can be solved by switching over to drmm_kzalloc(), and the |
| 559 | various convenience wrappers provided, e.g. drmm_crtc_alloc_with_planes(), |
| 560 | drmm_universal_plane_alloc(), ... and so on. |
| 561 | |
| 562 | Contact: Daniel Vetter |
Daniel Vetter | e6a3e40 | 2018-10-04 22:24:45 +0200 | [diff] [blame] | 563 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 564 | Level: Intermediate |
| 565 | |
Thomas Zimmermann | 659ab7a | 2021-03-03 14:32:29 +0100 | [diff] [blame] | 566 | Remove automatic page mapping from dma-buf importing |
| 567 | ---------------------------------------------------- |
| 568 | |
| 569 | When importing dma-bufs, the dma-buf and PRIME frameworks automatically map |
| 570 | imported pages into the importer's DMA area. drm_gem_prime_fd_to_handle() and |
| 571 | drm_gem_prime_handle_to_fd() require that importers call dma_buf_attach() |
| 572 | even if they never do actual device DMA, but only CPU access through |
| 573 | dma_buf_vmap(). This is a problem for USB devices, which do not support DMA |
| 574 | operations. |
| 575 | |
| 576 | To fix the issue, automatic page mappings should be removed from the |
| 577 | buffer-sharing code. Fixing this is a bit more involved, since the import/export |
| 578 | cache is also tied to &drm_gem_object.import_attach. Meanwhile we paper over |
| 579 | this problem for USB devices by fishing out the USB host controller device, as |
| 580 | long as that supports DMA. Otherwise importing can still needlessly fail. |
| 581 | |
| 582 | Contact: Thomas Zimmermann <tzimmermann@suse.de>, Daniel Vetter |
| 583 | |
| 584 | Level: Advanced |
| 585 | |
| 586 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 587 | Better Testing |
| 588 | ============== |
| 589 | |
| 590 | Enable trinity for DRM |
| 591 | ---------------------- |
| 592 | |
| 593 | And fix up the fallout. Should be really interesting ... |
| 594 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 595 | Level: Advanced |
| 596 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 597 | Make KMS tests in i-g-t generic |
| 598 | ------------------------------- |
| 599 | |
| 600 | The i915 driver team maintains an extensive testsuite for the i915 DRM driver, |
| 601 | including tons of testcases for corner-cases in the modesetting API. It would |
| 602 | be awesome if those tests (at least the ones not relying on Intel-specific GEM |
| 603 | features) could be made to run on any KMS driver. |
| 604 | |
| 605 | Basic work to run i-g-t tests on non-i915 is done, what's now missing is mass- |
| 606 | converting things over. For modeset tests we also first need a bit of |
| 607 | infrastructure to use dumb buffers for untiled buffers, to be able to run all |
| 608 | the non-i915 specific modeset tests. |
| 609 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 610 | Level: Advanced |
| 611 | |
Haneen Mohammed | ad9ff96 | 2018-09-07 20:41:36 +0300 | [diff] [blame] | 612 | Extend virtual test driver (VKMS) |
| 613 | --------------------------------- |
| 614 | |
| 615 | See the documentation of :ref:`VKMS <vkms>` for more details. This is an ideal |
| 616 | internship task, since it only requires a virtual machine and can be sized to |
| 617 | fit the available time. |
| 618 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 619 | Level: See details |
| 620 | |
Daniel Vetter | 3c745e0 | 2019-06-14 22:36:12 +0200 | [diff] [blame] | 621 | Backlight Refactoring |
| 622 | --------------------- |
| 623 | |
| 624 | Backlight drivers have a triple enable/disable state, which is a bit overkill. |
| 625 | Plan to fix this: |
| 626 | |
| 627 | 1. Roll out backlight_enable() and backlight_disable() helpers everywhere. This |
| 628 | has started already. |
| 629 | 2. In all, only look at one of the three status bits set by the above helpers. |
| 630 | 3. Remove the other two status bits. |
| 631 | |
| 632 | Contact: Daniel Vetter |
| 633 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 634 | Level: Intermediate |
| 635 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 636 | Driver Specific |
| 637 | =============== |
| 638 | |
Harry Wentland | 0a26a45 | 2017-09-28 11:53:19 -0400 | [diff] [blame] | 639 | AMD DC Display Driver |
| 640 | --------------------- |
| 641 | |
| 642 | AMD DC is the display driver for AMD devices starting with Vega. There has been |
| 643 | a bunch of progress cleaning it up but there's still plenty of work to be done. |
| 644 | |
| 645 | See drivers/gpu/drm/amd/display/TODO for tasks. |
| 646 | |
| 647 | Contact: Harry Wentland, Alex Deucher |
| 648 | |
Thomas Zimmermann | 2985c96 | 2021-11-29 10:48:40 +0100 | [diff] [blame] | 649 | vmwgfx: Replace hashtable with Linux' implementation |
| 650 | ---------------------------------------------------- |
| 651 | |
| 652 | The vmwgfx driver uses its own hashtable implementation. Replace the |
| 653 | code with Linux' implementation and update the callers. It's mostly a |
| 654 | refactoring task, but the interfaces are different. |
| 655 | |
| 656 | Contact: Zack Rusin, Thomas Zimmermann <tzimmermann@suse.de> |
| 657 | |
| 658 | Level: Intermediate |
| 659 | |
Noralf Trønnes | ce25600 | 2019-06-08 17:26:57 +0200 | [diff] [blame] | 660 | Bootsplash |
| 661 | ========== |
| 662 | |
| 663 | There is support in place now for writing internal DRM clients making it |
| 664 | possible to pick up the bootsplash work that was rejected because it was written |
| 665 | for fbdev. |
| 666 | |
| 667 | - [v6,8/8] drm/client: Hack: Add bootsplash example |
| 668 | https://patchwork.freedesktop.org/patch/306579/ |
| 669 | |
| 670 | - [RFC PATCH v2 00/13] Kernel based bootsplash |
Joe Perches | 05a5f51 | 2021-01-10 12:41:44 -0800 | [diff] [blame] | 671 | https://lore.kernel.org/r/20171213194755.3409-1-mstaudt@suse.de |
Noralf Trønnes | ce25600 | 2019-06-08 17:26:57 +0200 | [diff] [blame] | 672 | |
| 673 | Contact: Sam Ravnborg |
| 674 | |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 675 | Level: Advanced |
| 676 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 677 | Outside DRM |
| 678 | =========== |
Thomas Zimmermann | 3c2ed9c | 2019-10-17 09:47:05 +0200 | [diff] [blame] | 679 | |
| 680 | Convert fbdev drivers to DRM |
| 681 | ---------------------------- |
| 682 | |
Jianhui Zhao | 0f9c4296 | 2021-03-08 14:42:50 +0800 | [diff] [blame] | 683 | There are plenty of fbdev drivers for older hardware. Some hardware has |
Thomas Zimmermann | 3c2ed9c | 2019-10-17 09:47:05 +0200 | [diff] [blame] | 684 | become obsolete, but some still provides good(-enough) framebuffers. The |
| 685 | drivers that are still useful should be converted to DRM and afterwards |
| 686 | removed from fbdev. |
| 687 | |
| 688 | Very simple fbdev drivers can best be converted by starting with a new |
| 689 | DRM driver. Simple KMS helpers and SHMEM should be able to handle any |
| 690 | existing hardware. The new driver's call-back functions are filled from |
| 691 | existing fbdev code. |
| 692 | |
| 693 | More complex fbdev drivers can be refactored step-by-step into a DRM |
| 694 | driver with the help of the DRM fbconv helpers. [1] These helpers provide |
| 695 | the transition layer between the DRM core infrastructure and the fbdev |
| 696 | driver interface. Create a new DRM driver on top of the fbconv helpers, |
| 697 | copy over the fbdev driver, and hook it up to the DRM code. Examples for |
| 698 | several fbdev drivers are available at [1] and a tutorial of this process |
| 699 | available at [2]. The result is a primitive DRM driver that can run X11 |
| 700 | and Weston. |
| 701 | |
| 702 | - [1] https://gitlab.freedesktop.org/tzimmermann/linux/tree/fbconv |
| 703 | - [2] https://gitlab.freedesktop.org/tzimmermann/linux/blob/fbconv/drivers/gpu/drm/drm_fbconv_helper.c |
| 704 | |
| 705 | Contact: Thomas Zimmermann <tzimmermann@suse.de> |
Daniel Vetter | a5e5cf9 | 2019-10-22 17:25:30 +0200 | [diff] [blame] | 706 | |
| 707 | Level: Advanced |