linux/include/drm
Helen Koike ff8386d948 drm: don't block fb changes for async plane updates
commit 89a4aac0ab upstream.

In the case of a normal sync update, the preparation of framebuffers (be
it calling drm_atomic_helper_prepare_planes() or doing setups with
drm_framebuffer_get()) are performed in the new_state and the respective
cleanups are performed in the old_state.

In the case of async updates, the preparation is also done in the
new_state but the cleanups are done in the new_state (because updates
are performed in place, i.e. in the current state).

The current code blocks async udpates when the fb is changed, turning
async updates into sync updates, slowing down cursor updates and
introducing regressions in igt tests with errors of type:

"CRITICAL: completed 97 cursor updated in a period of 30 flips, we
expect to complete approximately 15360 updates, with the threshold set
at 7680"

Fb changes in async updates were prevented to avoid the following scenario:

- Async update, oldfb = NULL, newfb = fb1, prepare fb1, cleanup fb1
- Async update, oldfb = fb1, newfb = fb2, prepare fb2, cleanup fb2
- Non-async commit, oldfb = fb2, newfb = fb1, prepare fb1, cleanup fb2 (wrong)
Where we have a single call to prepare fb2 but double cleanup call to fb2.

To solve the above problems, instead of blocking async fb changes, we
place the old framebuffer in the new_state object, so when the code
performs cleanups in the new_state it will cleanup the old_fb and we
will have the following scenario instead:

- Async update, oldfb = NULL, newfb = fb1, prepare fb1, no cleanup
- Async update, oldfb = fb1, newfb = fb2, prepare fb2, cleanup fb1
- Non-async commit, oldfb = fb2, newfb = fb1, prepare fb1, cleanup fb2

Where calls to prepare/cleanup are balanced.

Cc: <stable@vger.kernel.org> # v4.14+
Fixes: 25dc194b34 ("drm: Block fb changes for async plane updates")
Suggested-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Helen Koike <helen.koike@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190603165610.24614-6-helen.koike@collabora.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-06-15 11:55:00 +02:00
..
bridge Merge airlied/drm-next into drm-misc-next 2017-07-26 13:43:33 +02:00
i2c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tinydrm drm/tinydrm: Generalize tinydrm_xrgb8888_to_gray8() 2017-08-09 17:55:50 +02:00
ttm drm/ttm: make ttm_mem_type_manager_func debug more useful 2017-08-17 15:45:59 -04:00
ati_pcigart.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
drm_agpsupport.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
drm_atomic_helper.h drm: Nuke drm_atomic_helper_connector_dpms 2017-08-08 14:48:48 +02:00
drm_atomic.h drm: Nuke drm_atomic_legacy_backoff 2017-08-08 14:49:29 +02:00
drm_auth.h drm: Move drm_lock_data out of drmP.h 2017-03-09 16:18:02 +01:00
drm_blend.h drm: Add DRM_MODE_ROTATE_ and DRM_MODE_REFLECT_ to UAPI 2017-05-22 09:49:48 +02:00
drm_bridge.h drm/bridge: Add a devm_ allocator for panel bridge. 2017-07-26 12:19:47 -07:00
drm_cache.h drm: disable uncached DMA optimization for ARM and arm64 2019-03-13 14:03:23 -07:00
drm_color_mgmt.h drm: drm_color_mgmt.h needs struct drm_crtc declaration 2017-05-02 10:30:23 +02:00
drm_connector.h drm: Handle properties in the core for atomic drivers 2017-08-08 14:45:09 +02:00
drm_crtc_helper.h drm: Allow determining if current task is output poll worker 2018-03-15 10:54:29 +01:00
drm_crtc.h drm: Handle properties in the core for atomic drivers 2017-08-08 14:45:09 +02:00
drm_debugfs_crc.h drm: Add API for capturing frame CRCs 2016-10-17 16:44:34 +02:00
drm_debugfs.h drm/debugfs: Add kerneldoc 2017-03-24 09:36:06 +01:00
drm_device.h drm: Extract drm_device.h 2017-08-11 10:47:17 +02:00
drm_displayid.h drm/edid: add displayid detailed 1 timings to the modelist. (v1.1) 2016-05-23 11:35:31 +10:00
drm_dp_dual_mode_helper.h drm: Fix LSPCON kernel-doc 2016-10-19 18:20:40 +03:00
drm_dp_helper.h drm: Add DP PSR2 sink enable bit 2018-08-03 07:50:42 +02:00
drm_dp_mst_helper.h drm/atomic: Make private objs proper objects 2017-07-13 19:28:43 +03:00
drm_drv.h drm/nouveau: prefer XBGR2101010 for addfb ioctl 2018-03-15 10:54:30 +01:00
drm_edid.h drm/edid: VSDB yCBCr420 Deep Color mode bit definitions 2018-11-10 07:48:35 -08:00
drm_encoder_slave.h drm: Don't include <drm/drm_encoder.h> in <drm/drm_crtc.h> 2016-12-18 16:29:29 +05:30
drm_encoder.h drm/doc: Fix typos for early_unregister doc 2017-01-26 10:49:09 +01:00
drm_fb_cma_helper.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
drm_fb_helper.h drm: remove unused and redundant callbacks 2017-08-07 11:20:36 +02:00
drm_file.h drm: introduce sync objects (v4) 2017-06-14 12:10:22 +10:00
drm_fixed.h drm: Add drm_fixp_from_fraction and drm_fixp2int_ceil 2016-02-05 15:23:48 +10:00
drm_flip_work.h drm/kms-helpers: Use recommened kerneldoc for struct member refs 2017-01-25 16:18:57 +01:00
drm_fourcc.h drm: Add mode_config .get_format_info() hook 2017-03-22 19:45:00 +02:00
drm_framebuffer.h drm: Add GEM backed framebuffer library 2017-08-16 21:32:23 +02:00
drm_gem_cma_helper.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
drm_gem_framebuffer_helper.h drm: Add GEM backed framebuffer library 2017-08-16 21:32:23 +02:00
drm_gem.h drm/gem: Add drm_gem_dumb_map_offset() 2017-07-29 13:49:55 +02:00
drm_global.h drm: drop extern from function decls 2017-03-24 09:36:06 +01:00
drm_hashtab.h drm: drop extern from function decls 2017-03-24 09:36:06 +01:00
drm_ioctl.h new helper: drm_ioctl_kernel() 2017-05-27 15:39:28 -04:00
drm_irq.h drm: Extract drm_vblank.[hc] 2017-06-01 08:02:14 +02:00
drm_legacy.h drm: document drm_auth.c 2016-06-21 22:10:55 +02:00
drm_mipi_dsi.h drm/dsi: Implement DCS set/get display brightness 2016-08-24 13:34:00 +02:00
drm_mm.h lib/interval_tree: fast overlap detection 2017-09-08 18:26:49 -07:00
drm_mode_config.h drm: Create a format/modifier blob 2017-08-01 17:50:06 +01:00
drm_mode_object.h drm: Introduce drm_mode_object_{get,put}() 2017-02-28 16:14:55 +01:00
drm_modes.h drm: add helper functions for YCBCR420 handling 2017-07-14 21:23:54 +03:00
drm_modeset_helper_vtables.h drm: don't block fb changes for async plane updates 2019-06-15 11:55:00 +02:00
drm_modeset_helper.h drm: Pass 'dev' to drm_helper_mode_fill_fb_struct() 2016-12-15 14:03:30 +02:00
drm_modeset_lock.h drm: Remove drm_modeset_legacy_acquire_ctx and crtc->acquire_ctx 2017-04-05 09:26:45 +02:00
drm_of.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
drm_os_linux.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
drm_panel.h drm: make drm_panel.h self-contained 2017-05-16 17:17:02 +02:00
drm_pci.h drm/pci: Deprecate drm_pci_init/exit completely 2017-06-20 10:41:03 +02:00
drm_pciids.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
drm_plane_helper.h drm: Add acquire ctx parameter to ->plane_disable 2017-03-29 09:14:58 +02:00
drm_plane.h drm: Handle properties in the core for atomic drivers 2017-08-08 14:45:09 +02:00
drm_prime.h drm: Extract drm_vblank.[hc] 2017-06-01 08:02:14 +02:00
drm_print.h drm: drm_printer: add __printf validation 2017-02-26 21:43:08 +01:00
drm_property.h drm: rename, adjust and export drm_atomic_replace_property_blob 2017-07-14 15:53:06 +02:00
drm_rect.h drm/doc: move printf helpers out of drmP.h 2017-05-31 09:59:41 +02:00
drm_scdc_helper.h drm: Fix warning when building docs for scdc_helper 2017-07-31 14:24:14 +02:00
drm_simple_kms_helper.h drm: Plumb modifiers through plane init 2017-08-01 17:50:06 +01:00
drm_syncobj.h drm/syncobj: Stop reusing the same struct file for all syncobj -> fd 2018-03-28 18:24:47 +02:00
drm_sysfs.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
drm_vblank.h drm/vblank: Unexport drm_vblank_cleanup 2017-06-28 12:51:13 +02:00
drm_vma_manager.h drm: Extract drm_prime.h 2017-03-09 16:18:02 +01:00
drmP.h drm: Document device unplug infrastructure 2017-08-11 10:48:03 +02:00
gma_drm.h
i915_component.h drm/i915/dp: DP audio API changes for MST 2016-09-22 09:01:55 -07:00
i915_drm.h drm: avoid "possible bad bitmask?" warning 2016-08-09 22:18:26 +02:00
i915_pciids.h x86/gpu: add CFL to early quirks 2018-02-22 15:42:18 +01:00
intel_lpe_audio.h ALSA: x86: Register multiple PCM devices for the LPE audio card 2017-05-03 16:24:00 +03:00
intel-gtt.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00