linux/drivers/gpu/drm
Daniel Vetter 9f2a7950e7 drm/atomic-helper: nonblocking commit support
Design ideas:

- split up the actual commit into different phases, and have
  completions for each of them. This will be useful for the future
  when we want to interleave phases much more aggressively, for e.g.
  queue depth > 1. For not it's just a minimal optimization compared
  to current common nonblocking implementation patterns from drivers,
  which all stall for the entire commit to complete, including vblank
  waits and cleanups.

- Extract a separate atomic_commit_hw hook since that's the part most
  drivers will need to overwrite, hopefully allowing even more shared
  code.

- Enforce EBUSY seamntics by attaching one of the completions to the
  flip_done vblank event. Side benefit of forcing atomic drivers using
  these helpers to implement event handlign at least semi-correct. I'm
  evil that way ;-)

- Ridiculously modular, as usual.

- The main tracking unit for a commit stays struct drm_atomic_state,
  and the ownership rules for that are unchanged. Ownership still
  gets transferred to the driver (and subsequently to the worker) on
  successful commits. What is added is a small, per-crtc, refcounted
  structure to track pending commits called struct drm_crtc_commit.
  No actual state is attached to that though, it's purely for ordering
  and waiting.

- Dependencies are implicitly handled by assuming that any CRTC part
  of &drm_atomic_state is a dependency, and that the current commit
  must wait for any commits to complete on those CRTC. This way
  drivers can easily add more depencies using
  drm_atomic_get_crtc_state(), which is very natural since in most
  case a dependency exists iff there's some bit of state that needs to
  be cross checked.

  Removing depencies is not possible, drivers simply need to be
  careful to not include every CRTC in a commit if that's not
  necessary. Which is a good idea anyway, since that also avoids
  ww_mutex lock contention.

- Queue depth > 1 sees some prep work in this patch by adding a stall
  paramater to drm_atomic_helper_swap_states(). To be able to push
  commits entirely free-standing and in a deeper queue through the
  back-end the driver must not access any obj->state pointers. This
  means we need to track the old state in drm_atomic_state (much
  easier with the consolidated arrays), and pass them all explicitly
  to driver backends (this will be serious amounts of churn).

  Once that's done stall can be set to false in swap_states.

v2: Dont ask for flip_done signalling when the CRTC is off and stays
off: Drivers don't handle events in that case. Instead complete right
away. This way future commits don't need to have special-case logic,
but can keep blocking for the flip_done completion.

v3: Tons of fixes:
- Stall for preceeding commit for real, not the current one by
  accident.
- Add WARN_ON in case drivers don't fire the drm event.
- Don't double-free drm events.

v4: Make legacy cursor not stall.

v5: Extend the helper hook to cover the entire commit tail. Some
drivers need special code for cleanup and vblank waiting, this makes
it a bit more useful. Inspired by the rockchip driver.

v6: Add WARN_ON to catch drivers who forget to send out the
drm event.

v7: Fixup the stalls in swap_state for real!!

v8:
- Fixup trailing whitespace, spotted by Maarten.
- Actually wait for flip_done in cleanup_done, like the comment says
  we should do. Thanks a lot for Tomeu for helping with debugging this
  on.

v9: Now with awesome kerneldoc!

v10: Split out drm_crtc_commit tracking infrastructure.

v:
- Add missing static (Gustavo).
- Split out the sync functions, only do the actual nonblocking
  logic in this patch (Maarten).

Cc: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Tested-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Tomeu Vizoso <tomeu.vizoso@gmail.com>
Cc: Daniel Stone <daniels@collabora.com>
Tested-by: Liviu Dudau <Liviu.Dudau@arm.com>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Testcase: igt/kms_flip/*
Testcase: igt/kms_cursor*
Testcase: igt/kms*plane*
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1465388359-8070-10-git-send-email-daniel.vetter@ffwll.ch
2016-06-10 17:11:16 +02:00
..
amd drm/core: Change declaration for gamma_set. 2016-06-07 15:30:09 +02:00
arc drm/arc: Actually bother with handling atomic events. 2016-06-10 16:55:05 +02:00
arm Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
armada Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
ast Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
atmel-hlcdc drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
bochs drm/bochs: Use lockless gem BO free callback 2016-06-01 09:40:16 +02:00
bridge drm/bridge: Add Analogix anx78xx support 2016-05-12 11:32:14 +02:00
cirrus Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
etnaviv dma-buf/fence: make fence context 64 bit v2 2016-06-02 08:27:41 +02:00
exynos drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
fsl-dcu drm/fsl-du: Implement some semblance of vblank event handling 2016-06-09 10:27:56 +02:00
gma500 drm/core: Change declaration for gamma_set. 2016-06-07 15:30:09 +02:00
hisilicon drm/hisilicon: Implement some semblance of vblank event handling 2016-06-09 10:28:14 +02:00
i2c
i810
i915 drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
imx drm/imx: plane: Don't set plane->crtc in ipu_plane_update() 2016-05-30 09:14:00 +02:00
mediatek drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
mga
mgag200 Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
msm drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
nouveau Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
omapdrm drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
panel drm/panel: simple: Add support for TPK U.S.A. LLC Fusion 7" and 10.1" panels 2016-05-12 11:32:14 +02:00
qxl Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
r128
radeon drm/core: Change declaration for gamma_set. 2016-06-07 15:30:09 +02:00
rcar-du drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
rockchip drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
savage
shmobile Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
sis
sti drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
sun4i drm/sun4i: Implement some semblance of vblank event handling 2016-06-10 16:55:48 +02:00
tdfx
tegra drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
tilcdc drm/tilcdc: Use lockless gem BO free callback 2016-06-01 09:41:02 +02:00
ttm Linux 4.6-rc7 2016-05-09 13:49:56 +10:00
udl drm/udl: use drm_crtc_send_vblank_event() 2016-06-06 18:03:06 +02:00
vc4 drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
vgem drm/vgem: Use lockless gem BO free callback 2016-05-31 15:28:10 +02:00
via
virtio drm/atomic-helper: Massage swap_state signature somewhat 2016-06-10 16:52:12 +02:00
vmwgfx drm/core: Change declaration for gamma_set. 2016-06-07 15:30:09 +02:00
Kconfig drm/mediatek: Add DRM Driver for Mediatek SoC MT8173. 2016-05-06 17:47:35 +02:00
Makefile drm: Move format-related helpers to drm_fourcc.c 2016-06-09 11:58:50 +02:00
ati_pcigart.c
drm_agpsupport.c drm: Give drm_agp_clear drm_legacy_ prefix 2016-04-27 08:41:34 +02:00
drm_atomic.c drm/atomic: Add struct drm_crtc_commit to track async updates 2016-06-10 16:57:54 +02:00
drm_atomic_helper.c drm/atomic-helper: nonblocking commit support 2016-06-10 17:11:16 +02:00
drm_auth.c
drm_bridge.c drm/doc: Switch to sphinx/rst fixed-width quoting 2016-06-03 20:58:24 +02:00
drm_bufs.c drm: Hide master MAP cleanup in drm_bufs.c 2016-04-27 10:14:17 +02:00
drm_cache.c
drm_context.c
drm_crtc.c drm/atomic: Add struct drm_crtc_commit to track async updates 2016-06-10 16:57:54 +02:00
drm_crtc_helper.c drm: drm_helper_crtc_enable_color_mgmt() => drm_crtc_enable_color_mgmt() 2016-06-07 17:10:49 +03:00
drm_crtc_internal.h drm/mode: rework drm_mode_object_put to drm_mode_object_unregister. 2016-04-22 10:26:37 +10:00
drm_debugfs.c
drm_dma.c
drm_dp_aux_dev.c drm/dp: Allow signals to interrupt drm_aux-dev reads/writes 2016-04-28 11:48:09 +02:00
drm_dp_dual_mode_helper.c drm: Add helper for DP++ adaptors 2016-05-23 11:10:46 +03:00
drm_dp_helper.c drm/dp_helper: Perform throw-away read before actual read in drm_dp_dpcd_read() 2016-04-22 18:52:24 +02:00
drm_dp_mst_topology.c Linux 4.6-rc7 2016-05-09 13:49:56 +10:00
drm_drv.c drm: Remove dev_pm_ops from drm_class 2016-06-09 08:43:25 +02:00
drm_edid.c drm/edid: add displayid detailed 1 timings to the modelist. (v1.1) 2016-05-23 11:35:31 +10:00
drm_edid_load.c Fix annoyingly awkward typo in drm_edid_load.c 2016-05-30 09:59:28 +02:00
drm_encoder_slave.c
drm_fb_cma_helper.c Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
drm_fb_helper.c drm: Replace fb_helper->atomic with mode_config->atomic_commit 2016-06-09 08:43:28 +02:00
drm_flip_work.c
drm_fops.c drm/atomic: Add struct drm_crtc_commit to track async updates 2016-06-10 16:57:54 +02:00
drm_fourcc.c drm: Move format-related helpers to drm_fourcc.c 2016-06-09 11:58:50 +02:00
drm_gem.c drm/doc: Appease sphinx 2016-06-02 16:25:20 +02:00
drm_gem_cma_helper.c drm: Wrap direct calls to driver->gem_free_object from CMA 2016-06-01 15:00:28 +10:00
drm_global.c
drm_hashtab.c
drm_info.c drm: Protect dev->filelist with its own mutex 2016-04-27 10:16:17 +02:00
drm_internal.h drm: Make drm_vm_open/close_locked private to drm_vm.c 2016-04-27 10:15:56 +02:00
drm_ioc32.c
drm_ioctl.c drm: Move drm_getmap into drm_bufs.c and give it a legacy prefix 2016-04-27 08:42:48 +02:00
drm_irq.c drm/doc: Drop kerneldoc for static functions in drm_irq.c 2016-06-03 20:57:54 +02:00
drm_kms_helper_common.c
drm_legacy.h drm: Move drm_getmap into drm_bufs.c and give it a legacy prefix 2016-04-27 08:42:48 +02:00
drm_lock.c
drm_memory.c
drm_mipi_dsi.c drm/dsi: Implement set tear scanline 2016-06-07 21:44:29 +02:00
drm_mm.c drm/mm: avoid possible null pointer dereference 2016-05-23 14:56:11 +02:00
drm_modes.c Merge tag 'topic/drm-misc-2016-06-07' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-06-09 11:19:28 +10:00
drm_modeset_lock.c drm/doc: Switch to sphinx/rst fixed-width quoting 2016-06-03 20:58:24 +02:00
drm_of.c
drm_panel.c drm/panel: Flesh out kerneldoc 2016-05-06 16:04:48 +02:00
drm_pci.c drm: Give drm_agp_clear drm_legacy_ prefix 2016-04-27 08:41:34 +02:00
drm_plane_helper.c drm/doc: Appease sphinx 2016-06-02 16:25:20 +02:00
drm_platform.c
drm_prime.c drm: Remove unused drm_device from drm_gem_object_lookup() 2016-05-17 08:47:30 +02:00
drm_probe_helper.c drm: Only create a cmdline mode if no probed modes match 2016-06-02 15:10:22 +02:00
drm_rect.c
drm_scatter.c
drm_sysfs.c drm: Remove dev_pm_ops from drm_class 2016-06-09 08:43:25 +02:00
drm_trace.h
drm_trace_points.c
drm_vm.c drm: Make drm_vm_open/close_locked private to drm_vm.c 2016-04-27 10:15:56 +02:00
drm_vma_manager.c drm/doc: Switch to sphinx/rst fixed-width quoting 2016-06-03 20:58:24 +02:00