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 | |
| 10 | Subsystem-wide refactorings |
| 11 | =========================== |
| 12 | |
| 13 | De-midlayer drivers |
| 14 | ------------------- |
| 15 | |
| 16 | With the recent ``drm_bus`` cleanup patches for 3.17 it is no longer required |
| 17 | to have a ``drm_bus`` structure set up. Drivers can directly set up the |
| 18 | ``drm_device`` structure instead of relying on bus methods in ``drm_usb.c`` |
Daniel Vetter | 085c6c0 | 2017-04-04 11:52:54 +0200 | [diff] [blame] | 19 | and ``drm_pci.c``. The goal is to get rid of the driver's ``->load`` / |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 20 | ``->unload`` callbacks and open-code the load/unload sequence properly, using |
| 21 | the new two-stage ``drm_device`` setup/teardown. |
| 22 | |
| 23 | Once all existing drivers are converted we can also remove those bus support |
| 24 | files for USB and platform devices. |
| 25 | |
| 26 | All you need is a GPU for a non-converted driver (currently almost all of |
| 27 | them, but also all the virtual ones used by KVM, so everyone qualifies). |
| 28 | |
| 29 | Contact: Daniel Vetter, Thierry Reding, respective driver maintainers |
| 30 | |
| 31 | Switch from reference/unreference to get/put |
| 32 | -------------------------------------------- |
| 33 | |
| 34 | For some reason DRM core uses ``reference``/``unreference`` suffixes for |
| 35 | refcounting functions, but kernel uses ``get``/``put`` (e.g. |
| 36 | ``kref_get``/``put()``). It would be good to switch over for consistency, and |
| 37 | it's shorter. Needs to be done in 3 steps for each pair of functions: |
| 38 | |
| 39 | * Create new ``get``/``put`` functions, define the old names as compatibility |
| 40 | wrappers |
| 41 | * Switch over each file/driver using a cocci-generated spatch. |
| 42 | * Once all users of the old names are gone, remove them. |
| 43 | |
| 44 | This way drivers/patches in the progress of getting merged won't break. |
| 45 | |
| 46 | Contact: Daniel Vetter |
| 47 | |
| 48 | Convert existing KMS drivers to atomic modesetting |
| 49 | -------------------------------------------------- |
| 50 | |
| 51 | 3.19 has the atomic modeset interfaces and helpers, so drivers can now be |
| 52 | converted over. Modern compositors like Wayland or Surfaceflinger on Android |
| 53 | really want an atomic modeset interface, so this is all about the bright |
| 54 | future. |
| 55 | |
| 56 | There is a conversion guide for atomic and all you need is a GPU for a |
| 57 | non-converted driver (again virtual HW drivers for KVM are still all |
| 58 | suitable). |
| 59 | |
| 60 | As part of this drivers also need to convert to universal plane (which means |
| 61 | exposing primary & cursor as proper plane objects). But that's much easier to |
| 62 | do by directly using the new atomic helper driver callbacks. |
| 63 | |
| 64 | Contact: Daniel Vetter, respective driver maintainers |
| 65 | |
Daniel Vetter | 1a80cc1 | 2017-02-26 20:38:50 +0100 | [diff] [blame] | 66 | Clean up the clipped coordination confusion around planes |
| 67 | --------------------------------------------------------- |
| 68 | |
| 69 | We have a helper to get this right with drm_plane_helper_check_update(), but |
| 70 | it's not consistently used. This should be fixed, preferrably in the atomic |
| 71 | helpers (and drivers then moved over to clipped coordinates). Probably the |
| 72 | helper should also be moved from drm_plane_helper.c to the atomic helpers, to |
| 73 | avoid confusion - the other helpers in that file are all deprecated legacy |
| 74 | helpers. |
| 75 | |
| 76 | Contact: Ville Syrjälä, Daniel Vetter, driver maintainers |
| 77 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 78 | Convert early atomic drivers to async commit helpers |
| 79 | ---------------------------------------------------- |
| 80 | |
| 81 | For the first year the atomic modeset helpers didn't support asynchronous / |
| 82 | nonblocking commits, and every driver had to hand-roll them. This is fixed |
| 83 | now, but there's still a pile of existing drivers that easily could be |
| 84 | converted over to the new infrastructure. |
| 85 | |
| 86 | One issue with the helpers is that they require that drivers handle completion |
| 87 | events for atomic commits correctly. But fixing these bugs is good anyway. |
| 88 | |
| 89 | Contact: Daniel Vetter, respective driver maintainers |
| 90 | |
Daniel Vetter | f217f55 | 2017-03-22 09:36:10 +0100 | [diff] [blame] | 91 | Better manual-upload support for atomic |
| 92 | --------------------------------------- |
| 93 | |
| 94 | This would be especially useful for tinydrm: |
| 95 | |
| 96 | - Add a struct drm_rect dirty_clip to drm_crtc_state. When duplicating the |
| 97 | crtc state, clear that to the max values, x/y = 0 and w/h = MAX_INT, in |
| 98 | __drm_atomic_helper_crtc_duplicate_state(). |
| 99 | |
Thierry Reding | 0cac6ac | 2017-07-31 14:42:59 +0200 | [diff] [blame] | 100 | - Move tinydrm_merge_clips into drm_framebuffer.c, dropping the tinydrm\_ |
| 101 | prefix ofc and using drm_fb\_. drm_framebuffer.c makes sense since this |
Daniel Vetter | f217f55 | 2017-03-22 09:36:10 +0100 | [diff] [blame] | 102 | is a function useful to implement the fb->dirty function. |
| 103 | |
| 104 | - Create a new drm_fb_dirty function which does essentially what e.g. |
| 105 | mipi_dbi_fb_dirty does. You can use e.g. drm_atomic_helper_update_plane as the |
| 106 | template. But instead of doing a simple full-screen plane update, this new |
| 107 | helper also sets crtc_state->dirty_clip to the right coordinates. And of |
| 108 | course it needs to check whether the fb is actually active (and maybe where), |
| 109 | so there's some book-keeping involved. There's also some good fun involved in |
| 110 | scaling things appropriately. For that case we might simply give up and |
| 111 | declare the entire area covered by the plane as dirty. |
| 112 | |
| 113 | Contact: Noralf Trønnes, Daniel Vetter |
| 114 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 115 | Fallout from atomic KMS |
| 116 | ----------------------- |
| 117 | |
| 118 | ``drm_atomic_helper.c`` provides a batch of functions which implement legacy |
| 119 | IOCTLs on top of the new atomic driver interface. Which is really nice for |
| 120 | gradual conversion of drivers, but unfortunately the semantic mismatches are |
| 121 | a bit too severe. So there's some follow-up work to adjust the function |
| 122 | interfaces to fix these issues: |
| 123 | |
| 124 | * atomic needs the lock acquire context. At the moment that's passed around |
| 125 | implicitly with some horrible hacks, and it's also allocate with |
| 126 | ``GFP_NOFAIL`` behind the scenes. All legacy paths need to start allocating |
| 127 | the acquire context explicitly on stack and then also pass it down into |
| 128 | drivers explicitly so that the legacy-on-atomic functions can use them. |
| 129 | |
Daniel Vetter | be05fe1 | 2017-09-11 08:51:51 +0200 | [diff] [blame] | 130 | Except for some driver code this is done. |
| 131 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 132 | * A bunch of the vtable hooks are now in the wrong place: DRM has a split |
| 133 | between core vfunc tables (named ``drm_foo_funcs``), which are used to |
| 134 | implement the userspace ABI. And then there's the optional hooks for the |
| 135 | helper libraries (name ``drm_foo_helper_funcs``), which are purely for |
| 136 | internal use. Some of these hooks should be move from ``_funcs`` to |
| 137 | ``_helper_funcs`` since they are not part of the core ABI. There's a |
| 138 | ``FIXME`` comment in the kerneldoc for each such case in ``drm_crtc.h``. |
| 139 | |
| 140 | * There's a new helper ``drm_atomic_helper_best_encoder()`` which could be |
| 141 | used by all atomic drivers which don't select the encoder for a given |
| 142 | connector at runtime. That's almost all of them, and would allow us to get |
| 143 | rid of a lot of ``best_encoder`` boilerplate in drivers. |
| 144 | |
Daniel Vetter | be05fe1 | 2017-09-11 08:51:51 +0200 | [diff] [blame] | 145 | This was almost done, but new drivers added a few more cases again. |
| 146 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 147 | Contact: Daniel Vetter |
| 148 | |
| 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, |
| 159 | and there's a ``gem_free_object_unlocked`` callback for any drivers which are |
| 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 |
| 167 | fine-grained per-buffer object and per-context lockings scheme. Currently the |
| 168 | following drivers still use ``struct_mutex``: ``msm``, ``omapdrm`` and |
| 169 | ``udl``. |
| 170 | |
Daniel Vetter | 085c6c0 | 2017-04-04 11:52:54 +0200 | [diff] [blame] | 171 | Contact: Daniel Vetter, respective driver maintainers |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 172 | |
Sean Paul | 45ae278 | 2017-09-08 10:32:07 -0400 | [diff] [blame] | 173 | Convert instances of dev_info/dev_err/dev_warn to their DRM_DEV_* equivalent |
| 174 | ---------------------------------------------------------------------------- |
| 175 | |
| 176 | For drivers which could have multiple instances, it is necessary to |
| 177 | differentiate between which is which in the logs. Since DRM_INFO/WARN/ERROR |
| 178 | don't do this, drivers used dev_info/warn/err to make this differentiation. We |
| 179 | now have DRM_DEV_* variants of the drm print macros, so we can start to convert |
| 180 | those drivers back to using drm-formwatted specific log messages. |
| 181 | |
| 182 | Contact: Sean Paul, Maintainer of the driver you plan to convert |
| 183 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 184 | Core refactorings |
| 185 | ================= |
| 186 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 187 | Clean up the DRM header mess |
| 188 | ---------------------------- |
| 189 | |
| 190 | Currently the DRM subsystem has only one global header, ``drmP.h``. This is |
| 191 | used both for functions exported to helper libraries and drivers and functions |
| 192 | only used internally in the ``drm.ko`` module. The goal would be to move all |
| 193 | header declarations not needed outside of ``drm.ko`` into |
| 194 | ``drivers/gpu/drm/drm_*_internal.h`` header files. ``EXPORT_SYMBOL`` also |
| 195 | needs to be dropped for these functions. |
| 196 | |
| 197 | This would nicely tie in with the below task to create kerneldoc after the API |
| 198 | is cleaned up. Or with the "hide legacy cruft better" task. |
| 199 | |
| 200 | Note that this is well in progress, but ``drmP.h`` is still huge. The updated |
| 201 | plan is to switch to per-file driver API headers, which will also structure |
| 202 | the kerneldoc better. This should also allow more fine-grained ``#include`` |
| 203 | directives. |
| 204 | |
Daniel Vetter | 085c6c0 | 2017-04-04 11:52:54 +0200 | [diff] [blame] | 205 | In the end no .c file should need to include ``drmP.h`` anymore. |
| 206 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 207 | Contact: Daniel Vetter |
| 208 | |
| 209 | Add missing kerneldoc for exported functions |
| 210 | -------------------------------------------- |
| 211 | |
| 212 | The DRM reference documentation is still lacking kerneldoc in a few areas. The |
| 213 | task would be to clean up interfaces like moving functions around between |
| 214 | files to better group them and improving the interfaces like dropping return |
| 215 | values for functions that never fail. Then write kerneldoc for all exported |
Mauro Carvalho Chehab | ff41c419 | 2017-05-14 11:50:11 -0300 | [diff] [blame] | 216 | functions and an overview section and integrate it all into the drm book. |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 217 | |
| 218 | See https://dri.freedesktop.org/docs/drm/ for what's there already. |
| 219 | |
| 220 | Contact: Daniel Vetter |
| 221 | |
| 222 | Hide legacy cruft better |
| 223 | ------------------------ |
| 224 | |
| 225 | Way back DRM supported only drivers which shadow-attached to PCI devices with |
| 226 | userspace or fbdev drivers setting up outputs. Modern DRM drivers take charge |
| 227 | of the entire device, you can spot them with the DRIVER_MODESET flag. |
| 228 | |
| 229 | Unfortunately there's still large piles of legacy code around which needs to |
| 230 | be hidden so that driver writers don't accidentally end up using it. And to |
| 231 | prevent security issues in those legacy IOCTLs from being exploited on modern |
| 232 | drivers. This has multiple possible subtasks: |
| 233 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 234 | * Extract support code for legacy features into a ``drm-legacy.ko`` kernel |
| 235 | module and compile it only when one of the legacy drivers is enabled. |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 236 | |
| 237 | This is mostly done, the only thing left is to split up ``drm_irq.c`` into |
| 238 | legacy cruft and the parts needed by modern KMS drivers. |
| 239 | |
| 240 | Contact: Daniel Vetter |
| 241 | |
| 242 | Make panic handling work |
| 243 | ------------------------ |
| 244 | |
| 245 | This is a really varied tasks with lots of little bits and pieces: |
| 246 | |
| 247 | * The panic path can't be tested currently, leading to constant breaking. The |
| 248 | main issue here is that panics can be triggered from hardirq contexts and |
| 249 | hence all panic related callback can run in hardirq context. It would be |
| 250 | awesome if we could test at least the fbdev helper code and driver code by |
| 251 | e.g. trigger calls through drm debugfs files. hardirq context could be |
| 252 | achieved by using an IPI to the local processor. |
| 253 | |
| 254 | * There's a massive confusion of different panic handlers. DRM fbdev emulation |
| 255 | helpers have one, but on top of that the fbcon code itself also has one. We |
| 256 | need to make sure that they stop fighting over each another. |
| 257 | |
| 258 | * ``drm_can_sleep()`` is a mess. It hides real bugs in normal operations and |
| 259 | isn't a full solution for panic paths. We need to make sure that it only |
| 260 | returns true if there's a panic going on for real, and fix up all the |
| 261 | fallout. |
| 262 | |
| 263 | * The panic handler must never sleep, which also means it can't ever |
| 264 | ``mutex_lock()``. Also it can't grab any other lock unconditionally, not |
| 265 | even spinlocks (because NMI and hardirq can panic too). We need to either |
| 266 | make sure to not call such paths, or trylock everything. Really tricky. |
| 267 | |
| 268 | * For the above locking troubles reasons it's pretty much impossible to |
| 269 | attempt a synchronous modeset from panic handlers. The only thing we could |
| 270 | try to achive is an atomic ``set_base`` of the primary plane, and hope that |
| 271 | it shows up. Everything else probably needs to be delayed to some worker or |
| 272 | something else which happens later on. Otherwise it just kills the box |
| 273 | harder, prevent the panic from going out on e.g. netconsole. |
| 274 | |
| 275 | * There's also proposal for a simplied DRM console instead of the full-blown |
| 276 | fbcon and DRM fbdev emulation. Any kind of panic handling tricks should |
| 277 | obviously work for both console, in case we ever get kmslog merged. |
| 278 | |
| 279 | Contact: Daniel Vetter |
| 280 | |
Daniel Vetter | 0cad7f7 | 2017-03-22 21:54:01 +0100 | [diff] [blame] | 281 | Clean up the debugfs support |
| 282 | ---------------------------- |
| 283 | |
| 284 | There's a bunch of issues with it: |
| 285 | |
| 286 | - The drm_info_list ->show() function doesn't even bother to cast to the drm |
| 287 | structure for you. This is lazy. |
| 288 | |
| 289 | - We probably want to have some support for debugfs files on crtc/connectors and |
| 290 | maybe other kms objects directly in core. There's even drm_print support in |
| 291 | the funcs for these objects to dump kms state, so it's all there. And then the |
| 292 | ->show() functions should obviously give you a pointer to the right object. |
| 293 | |
| 294 | - The drm_info_list stuff is centered on drm_minor instead of drm_device. For |
| 295 | anything we want to print drm_device (or maybe drm_file) is the right thing. |
| 296 | |
| 297 | - The drm_driver->debugfs_init hooks we have is just an artifact of the old |
| 298 | midlayered load sequence. DRM debugfs should work more like sysfs, where you |
| 299 | can create properties/files for an object anytime you want, and the core |
| 300 | takes care of publishing/unpuplishing all the files at register/unregister |
| 301 | time. Drivers shouldn't need to worry about these technicalities, and fixing |
| 302 | this (together with the drm_minor->drm_device move) would allow us to remove |
| 303 | debugfs_init. |
| 304 | |
| 305 | Contact: Daniel Vetter |
| 306 | |
Daniel Vetter | 81a7bd4 | 2017-10-17 18:29:18 +0200 | [diff] [blame^] | 307 | KMS cleanups |
| 308 | ------------ |
| 309 | |
| 310 | Some of these date from the very introduction of KMS in 2008 ... |
| 311 | |
| 312 | - drm_mode_config.crtc_idr is misnamed, since it contains all KMS object. Should |
| 313 | be renamed to drm_mode_config.object_idr. |
| 314 | |
| 315 | - drm_display_mode doesn't need to be derived from drm_mode_object. That's |
| 316 | leftovers from older (never merged into upstream) KMS designs where modes |
| 317 | where set using their ID, including support to add/remove modes. |
| 318 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 319 | Better Testing |
| 320 | ============== |
| 321 | |
| 322 | Enable trinity for DRM |
| 323 | ---------------------- |
| 324 | |
| 325 | And fix up the fallout. Should be really interesting ... |
| 326 | |
| 327 | Make KMS tests in i-g-t generic |
| 328 | ------------------------------- |
| 329 | |
| 330 | The i915 driver team maintains an extensive testsuite for the i915 DRM driver, |
| 331 | including tons of testcases for corner-cases in the modesetting API. It would |
| 332 | be awesome if those tests (at least the ones not relying on Intel-specific GEM |
| 333 | features) could be made to run on any KMS driver. |
| 334 | |
| 335 | Basic work to run i-g-t tests on non-i915 is done, what's now missing is mass- |
| 336 | converting things over. For modeset tests we also first need a bit of |
| 337 | infrastructure to use dumb buffers for untiled buffers, to be able to run all |
| 338 | the non-i915 specific modeset tests. |
| 339 | |
| 340 | Contact: Daniel Vetter |
| 341 | |
| 342 | Create a virtual KMS driver for testing (vkms) |
| 343 | ---------------------------------------------- |
| 344 | |
| 345 | With all the latest helpers it should be fairly simple to create a virtual KMS |
| 346 | driver useful for testing, or for running X or similar on headless machines |
| 347 | (to be able to still use the GPU). This would be similar to vgem, but aimed at |
| 348 | the modeset side. |
| 349 | |
| 350 | Once the basics are there there's tons of possibilities to extend it. |
| 351 | |
| 352 | Contact: Daniel Vetter |
| 353 | |
| 354 | Driver Specific |
| 355 | =============== |
| 356 | |
Daniel Vetter | f217f55 | 2017-03-22 09:36:10 +0100 | [diff] [blame] | 357 | tinydrm |
| 358 | ------- |
| 359 | |
| 360 | Tinydrm is the helper driver for really simple fb drivers. The goal is to make |
| 361 | those drivers as simple as possible, so lots of room for refactoring: |
| 362 | |
| 363 | - backlight helpers, probably best to put them into a new drm_backlight.c. |
| 364 | This is because drivers/video is de-facto unmaintained. We could also |
| 365 | move drivers/video/backlight to drivers/gpu/backlight and take it all |
Meghana Madhyastha | 9949b35 | 2017-09-27 16:21:23 +0530 | [diff] [blame] | 366 | over within drm-misc, but that's more work. Backlight helpers require a fair |
| 367 | bit of reworking and refactoring. A simple example is the enabling of a backlight. |
| 368 | Tinydrm has helpers for this. It would be good if other drivers can also use the |
| 369 | helper. However, there are various cases we need to consider i.e different |
| 370 | drivers seem to have different ways of enabling/disabling a backlight. |
| 371 | We also need to consider the backlight drivers (like gpio_backlight). The situation |
| 372 | is further complicated by the fact that the backlight is tied to fbdev |
| 373 | via fb_notifier_callback() which has complicated logic. For further details, refer |
| 374 | to the following discussion thread: |
| 375 | https://groups.google.com/forum/#!topic/outreachy-kernel/8rBe30lwtdA |
Daniel Vetter | f217f55 | 2017-03-22 09:36:10 +0100 | [diff] [blame] | 376 | |
| 377 | - spi helpers, probably best put into spi core/helper code. Thierry said |
| 378 | the spi maintainer is fast&reactive, so shouldn't be a big issue. |
| 379 | |
| 380 | - extract the mipi-dbi helper (well, the non-tinydrm specific parts at |
| 381 | least) into a separate helper, like we have for mipi-dsi already. Or follow |
| 382 | one of the ideas for having a shared dsi/dbi helper, abstracting away the |
| 383 | transport details more. |
| 384 | |
| 385 | - tinydrm_lastclose could be drm_fb_helper_lastclose. Only thing we need |
| 386 | for that is to store the drm_fb_helper pointer somewhere in |
| 387 | drm_device->mode_config. And then we could roll that out to all the |
| 388 | drivers. |
| 389 | |
| 390 | - tinydrm_gem_cma_prime_import_sg_table should probably go into the cma |
| 391 | helpers, as a _vmapped variant (since not every driver needs the vmap). |
| 392 | And tinydrm_gem_cma_free_object could the be merged into |
| 393 | drm_gem_cma_free_object(). |
| 394 | |
| 395 | - tinydrm_fb_create we could move into drm_simple_pipe, only need to add |
| 396 | the fb_create hook to drm_simple_pipe_funcs, which would again simplify a |
| 397 | bunch of things (since it gives you a one-stop vfunc for simple drivers). |
| 398 | |
| 399 | - Quick aside: The unregister devm stuff is kinda getting the lifetimes of |
| 400 | a drm_device wrong. Doesn't matter, since everyone else gets it wrong |
| 401 | too :-) |
| 402 | |
| 403 | - With the fbdev pointer in dev->mode_config we could also make |
| 404 | suspend/resume helpers entirely generic, at least if we add a |
| 405 | dev->mode_config.suspend_state. We could even provide a generic pm_ops |
| 406 | structure with those. |
| 407 | |
| 408 | - also rework the drm_framebuffer_funcs->dirty hook wire-up, see above. |
| 409 | |
| 410 | Contact: Noralf Trønnes, Daniel Vetter |
| 411 | |
Thierry Reding | 0e70dad | 2017-02-07 18:51:13 +0100 | [diff] [blame] | 412 | Outside DRM |
| 413 | =========== |