linux_dsm_epyc7002/drivers/gpu/drm
Mario Kleiner eb916a5a93 drm/amd/display: Fix pageflip event race condition for DCN.
Commit '16f17eda8bad ("drm/amd/display: Send vblank and user
events at vsartup for DCN")' introduces a new way of pageflip
completion handling for DCN, and some trouble.

The current implementation introduces a race condition, which
can cause pageflip completion events to be sent out one vblank
too early, thereby confusing userspace and causing flicker:

prepare_flip_isr():

1. Pageflip programming takes the ddev->event_lock.
2. Sets acrtc->pflip_status == AMDGPU_FLIP_SUBMITTED
3. Releases ddev->event_lock.

--> Deadline for surface address regs double-buffering passes on
    target pipe.

4. dc_commit_updates_for_stream() MMIO programs the new pageflip
   into hw, but too late for current vblank.

=> pflip_status == AMDGPU_FLIP_SUBMITTED, but flip won't complete
   in current vblank due to missing the double-buffering deadline
   by a tiny bit.

5. VSTARTUP trigger point in vblank is reached, VSTARTUP irq fires,
   dm_dcn_crtc_high_irq() gets called.

6. Detects pflip_status == AMDGPU_FLIP_SUBMITTED and assumes the
   pageflip has been completed/will complete in this vblank and
   sends out pageflip completion event to userspace and resets
   pflip_status = AMDGPU_FLIP_NONE.

=> Flip completion event sent out one vblank too early.

This behaviour has been observed during my testing with measurement
hardware a couple of time.

The commit message says that the extra flip event code was added to
dm_dcn_crtc_high_irq() to prevent missing to send out pageflip events
in case the pflip irq doesn't fire, because the "DCH HUBP" component
is clock gated and doesn't fire pflip irqs in that state. Also that
this clock gating may happen if no planes are active. This suggests
that the problem addressed by that commit can't happen if planes
are active.

The proposed solution is therefore to only execute the extra pflip
completion code iff the count of active planes is zero and otherwise
leave pflip completion handling to the pflip irq handler, for a
more race-free experience.

Note that i don't know if this fixes the problem the original commit
tried to address, as i don't know what the test scenario was. It
does fix the observed too early pageflip events though and points
out the problem introduced.

Fixes: 16f17eda8b ("drm/amd/display: Send vblank and user events at vsartup for DCN")
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2020-03-19 16:18:45 -04:00
..
amd drm/amd/display: Fix pageflip event race condition for DCN. 2020-03-19 16:18:45 -04:00
arc DRM: ARC: PGU: add ARGB8888 format to supported format list 2019-12-16 13:53:05 +03:00
arm Linux 5.5-rc7 2020-01-20 11:42:57 +10:00
armada drm: constify fb ops across all drivers 2019-12-05 10:57:42 +02:00
aspeed drm/aspeed: gfc_crtc: Make structure aspeed_gfx_funcs constant 2019-08-14 19:27:26 +02:00
ast drm/vram-helper: Remove BO device from public interface 2020-01-07 11:53:19 +01:00
atmel-hlcdc Revert "drm: atmel-hlcdc: enable sys_clk during initalization." 2020-01-06 19:54:27 +01:00
bochs drm/bochs: Remove unneeded semicolon 2019-12-16 12:39:50 +01:00
bridge drm/bridge: analogix-anx6345: fix set of link bandwidth 2020-02-27 11:55:46 +01:00
cirrus drm/simple-kms: Standardize arguments for callbacks 2019-10-24 13:55:56 +02:00
etnaviv drm pull for 5.6-rc1 2020-01-30 08:04:01 -08:00
exynos drm/exynos: Fix cleanup of IOMMU related objects 2020-03-10 13:25:18 +09:00
fsl-dcu drm/panel: decouple connector from drm_panel 2019-12-09 22:57:26 +01:00
gma500 drm pull for 5.6-rc1 2020-01-30 08:04:01 -08:00
hisilicon drm: kirin: Revert "Fix for hikey620 display offset problem" 2020-03-04 13:29:05 +00:00
i2c drm: tda998x: use cec_notifier_conn_(un)register 2019-10-21 14:23:25 +02:00
i810 drm/i810: Don't include <drm/drm_pci.h> 2019-12-05 08:44:12 +01:00
i915 drm/i915: Defer semaphore priority bumping to a workqueue 2020-03-11 23:12:39 +02:00
imx drm/panel: decouple connector from drm_panel 2019-12-09 22:57:26 +01:00
ingenic gpu/drm: ingenic: Add support for the JZ4770 2019-12-14 19:26:55 +01:00
lib
lima Merge tag 'amd-drm-next-5.6-2020-01-09' of git://people.freedesktop.org/~agd5f/linux into drm-next 2020-01-13 16:49:02 +10:00
mcde drm-misc-next for v5.6: 2020-01-03 11:43:44 +10:00
mediatek drm/mediatek: Handle component type MTK_DISP_OVL_2L correctly 2020-02-25 13:02:22 +08:00
meson drm: meson: fix address type confusion 2020-01-08 13:51:56 +01:00
mga drm/mga: Don't include <drm/drm_pci.h> 2019-12-05 08:44:16 +01:00
mgag200 drm/mgag200: Add module parameter to pin all buffers at offset 0 2020-01-07 11:53:19 +01:00
msm Merge tag 'drm-msm-fixes-2020-02-16' of https://gitlab.freedesktop.org/drm/msm into drm-fixes 2020-02-20 11:01:33 +10:00
mxsfb drm/panel: decouple connector from drm_panel 2019-12-09 22:57:26 +01:00
nouveau drm/nouveau/kms/gv100-: Re-set LUT after clearing for modesets 2020-02-17 17:19:00 +10:00
omapdrm drm/omapdrm: use BUG_ON macro for error debugging. 2020-01-08 18:35:36 +01:00
panel drm/panel: simple: Add Satoz SAT050AT40H12R2 panel support 2020-01-09 20:27:06 +01:00
panfrost drm/panfrost: Don't try to map on error faults 2020-02-25 14:16:04 -06:00
pl111 drm: get drm_bridge_panel connector via helper 2019-12-09 22:57:26 +01:00
qxl drm/qxl: Complete exception handling in qxl_device_init() 2019-11-29 13:09:11 +01:00
r128 drm/r128: Don't include <drm/drm_pci.h> 2019-12-05 08:44:23 +01:00
radeon drm/radeon: Inline drm_get_pci_dev 2020-02-26 14:02:41 -05:00
rcar-du Revert "drm/bridge: Patch atomic hooks to take a drm_bridge_state" 2020-01-08 00:34:28 +01:00
rockchip Linux 5.5-rc7 2020-01-20 11:42:57 +10:00
savage drm/savage: Don't include <drm/drm_pci.h> 2019-12-05 08:44:34 +01:00
scheduler drm/amdgpu: fix doc by clarifying sched_list definition 2020-01-27 16:46:44 -05:00
selftests drm/modes: Make sure to parse valid rotation value from cmdline 2020-02-12 18:32:54 +01:00
shmobile
sis drm/sis: Don't include <drm/drm_pci.h> 2019-12-05 08:44:55 +01:00
sti drm pull for 5.6-rc1 2020-01-30 08:04:01 -08:00
stm drm/stm: ltdc: move pinctrl to encoder mode set 2019-12-20 13:30:42 +01:00
sun4i drm/sun4i: Fix DE2 VI layer format support 2020-03-03 22:44:29 +01:00
tdfx drm/tdfx: Don't include <drm/drm_pci.h> 2019-12-05 08:45:01 +01:00
tegra drm/tegra: Fixes for v5.6-rc1 2020-02-07 12:22:30 +10:00
tilcdc drm pull for 5.6-rc1 2020-01-30 08:04:01 -08:00
tiny Merge tag 'topic/drm-mipi-dsi-dsc-updates-2019-11-11' of git://anongit.freedesktop.org/drm/drm-intel into drm-intel-next-queued 2019-11-20 15:54:38 +02:00
ttm drm/ttm: fix leaking fences via ttm_buffer_object_transfer 2020-02-26 14:24:21 +01:00
tve200 drm: get drm_bridge_panel connector via helper 2019-12-09 22:57:26 +01:00
udl drm/udl: Make udl driver depend on CONFIG_USB 2020-01-09 15:02:48 +01:00
v3d drm/scheduler: rework entity creation 2019-12-18 16:09:12 -05:00
vboxvideo drm/vboxvideo: Use drm_gem_fb_create_with_dirty instead of drm_gem_fb_create 2019-10-29 13:10:07 +01:00
vc4 drm/vc4: dsi: Fix bridge chain handling 2020-01-08 09:09:48 +01:00
vgem drm/vgem: Close use-after-free race in vgem_gem_create 2020-02-06 19:04:41 +01:00
via Merge branch 'akpm' (patches from Andrew) 2020-01-31 12:16:36 -08:00
virtio drm/virtio: fix mmap page attributes 2020-02-27 13:54:39 +01:00
vkms drm/vkms: Fix typo and preposion in function documentation 2019-12-05 18:55:55 -05:00
vmwgfx drm/vmwgfx: Use VM_PFNMAP instead of VM_MIXEDMAP when possible 2020-01-15 14:34:49 +01:00
xen drm/xen: Simplify fb_create 2019-11-19 22:25:55 +01:00
zte drm: zte: Provide ddc symlink in vga connector sysfs directory 2020-01-07 20:26:02 +01:00
drm_agpsupport.c drm: use DIV_ROUND_UP helper macro for calculations 2019-11-04 18:17:36 +01:00
drm_atomic_helper.c Revert "drm/bridge: Add a drm_bridge_state object" 2020-01-08 00:34:34 +01:00
drm_atomic_state_helper.c drm: Add __drm_atomic_helper_crtc_state_reset() & co. 2019-12-18 16:47:34 +02:00
drm_atomic_uapi.c drm/atomic: Spell CRTC consistently 2019-12-22 11:13:00 +01:00
drm_atomic.c Revert "drm/bridge: Add a drm_bridge_state object" 2020-01-08 00:34:34 +01:00
drm_auth.c
drm_blend.c drm: two planes with the same zpos have undefined ordering 2019-10-09 20:04:55 +02:00
drm_bridge.c Revert "drm/bridge: Add a drm_bridge_state object" 2020-01-08 00:34:34 +01:00
drm_bufs.c
drm_cache.c drm/gpu: Fix Memory barrier without comment Issue 2019-10-25 09:35:06 +02:00
drm_client_modeset.c drm/modes: Allow DRM_MODE_ROTATE_0 when applying video mode parameters 2020-02-12 18:32:58 +01:00
drm_client.c drm/client: convert to drm device based logging 2019-12-19 15:52:44 +02:00
drm_color_mgmt.c drm: Inline drm_color_lut_extract() 2019-11-29 21:29:17 +02:00
drm_connector.c drm main pull for 5.5-rc1 2019-11-27 17:45:48 -08:00
drm_context.c
drm_crtc_helper_internal.h drm/connector: Share with non-atomic drivers the function to get the single encoder 2019-09-16 15:13:02 -07:00
drm_crtc_helper.c drm/crtc-helper: drm_connector_get_single_encoder prototype is missing 2019-12-03 17:42:57 +01:00
drm_crtc_internal.h
drm_crtc.c
drm_damage_helper.c drm: damage_helper: Fix race checking plane->state->fb 2019-10-08 09:41:06 -04:00
drm_debugfs_crc.c drm: Set crc->opened to false before setting crc source to NULL. 2020-01-07 15:29:40 -05:00
drm_debugfs.c
drm_dma.c
drm_dp_aux_dev.c drm/dp_mst: Add MST support to DP DPCD R/W functions 2020-01-09 18:07:46 -05:00
drm_dp_cec.c drm_dp_cec: drop use of drmP.h 2019-10-08 18:29:00 +02:00
drm_dp_dual_mode_helper.c
drm_dp_helper.c drm: add dp helper to initialize remote aux channel. 2020-01-09 18:07:48 -05:00
drm_dp_mst_topology_internal.h drm/dp_mst: Add sideband down request tracing + selftests 2019-09-03 19:30:06 -04:00
drm_dp_mst_topology.c drm/dp_mst: Rewrite and fix bandwidth limit checks 2020-03-12 19:07:49 -04:00
drm_drv.c drm: remove duplicate check on parent and avoid BUG_ON 2019-12-17 17:26:08 +01:00
drm_dsc.c drm/dsc: Fix bogus cpu_to_be16() usage 2019-09-30 20:15:53 +03:00
drm_dumb_buffers.c Revert "drm/gem: Rename drm_gem_dumb_map_offset() to drm_gem_map_offset()" 2019-08-07 11:56:48 -04:00
drm_edid_load.c drm/print: add drm_debug_enabled() 2019-10-02 16:28:55 +03:00
drm_edid.c drm/edid: fix building error 2020-02-06 22:01:40 +02:00
drm_encoder_slave.c
drm_encoder.c drm/bridge: Make the bridge chain a double-linked list 2019-12-09 10:03:01 +01:00
drm_fb_cma_helper.c drm/fb-cma-helpers: Fix include issue 2020-01-09 17:33:41 +01:00
drm_fb_helper.c Linux 5.5-rc7 2020-01-20 11:42:57 +10:00
drm_file.c i915 features for v5.6: 2019-12-27 15:25:04 +10:00
drm_flip_work.c
drm_format_helper.c
drm_fourcc.c drm/fourcc: Fill out all block sizes for P210 2019-11-28 11:19:32 +01:00
drm_framebuffer.c drm: silence variable 'conn' set but not used 2019-07-22 16:04:53 -04:00
drm_gem_cma_helper.c
drm_gem_framebuffer_helper.c drm/gem-fb-helper: convert to drm device based logging 2019-12-19 15:55:10 +02:00
drm_gem_shmem_helper.c drm/shmem: drop pgprot_decrypted() 2020-03-02 07:13:19 +01:00
drm_gem_ttm_helper.c drm/ttm: fix mmap refcounting 2019-11-15 08:00:08 +01:00
drm_gem_vram_helper.c drm/vram-helper: Support struct drm_driver.gem_create_object 2020-01-07 11:53:19 +01:00
drm_gem.c drm-misc-next for v5.6: 2019-12-17 13:57:54 +01:00
drm_hashtab.c
drm_hdcp.c drm/hdcp: reference for srm file format 2019-08-06 13:18:42 +05:30
drm_internal.h drm/pci: Only build drm_pci.c if CONFIG_PCI is set 2019-12-05 08:43:14 +01:00
drm_ioc32.c Linus 5.3-rc1 2019-07-22 21:24:10 +02:00
drm_ioctl.c drm: drop DRM_AUTH from PRIME_TO/FROM_HANDLE ioctls 2019-12-02 16:52:15 +00:00
drm_irq.c
drm_kms_helper_common.c drm: fix module name in edid_firmware log message 2019-08-22 10:41:06 +03:00
drm_lease.c
drm_legacy_misc.c
drm_legacy.h
drm_lock.c gpu/drm: clean up white space in drm_legacy_lock_master_cleanup() 2020-01-08 19:51:11 +01:00
drm_memory.c drm: Include prototype for drm_need_swiotlb() 2019-09-30 20:16:28 +03:00
drm_mipi_dbi.c drm/mipi_dbi: Fix off-by-one bugs in mipi_dbi_blank() 2020-01-02 15:35:56 +01:00
drm_mipi_dsi.c drm/dsi: add helpers for DSI compression mode and PPS packets 2019-11-07 15:00:16 +02:00
drm_mm.c drm/mm: Use clear_bit_unlock() for releasing the drm_mm_node() 2019-10-04 13:43:43 +01:00
drm_mode_config.c drm/modeset: Prime modeset lock vs dma_resv 2019-11-21 11:03:31 +01:00
drm_mode_object.c drm/property: Enforce more lifetime rules 2019-11-04 18:17:36 +01:00
drm_modes.c drm/modes: Make sure to parse valid rotation value from cmdline 2020-02-12 18:32:54 +01:00
drm_modeset_helper.c
drm_modeset_lock.c
drm_of.c drm: of: Add drm_of_lvds_get_dual_link_pixel_order 2019-12-18 02:40:16 +02:00
drm_panel_orientation_quirks.c
drm_panel.c drm/drm_panel: Fix EXPORT of drm_panel_of_backlight() one more time 2019-12-17 20:39:33 +01:00
drm_pci.c drm/pci: Hide legacy PCI functions from non-legacy code 2019-12-05 08:44:04 +01:00
drm_plane_helper.c
drm_plane.c
drm_prime.c drm: share address space for dma bufs 2019-12-06 11:18:11 +01:00
drm_print.c drm/print: convert debug category macros into an enum 2019-11-14 14:08:57 +02:00
drm_probe_helper.c drm: Stop accessing encoder->bridge directly 2019-12-09 10:02:45 +01:00
drm_property.c drm: limit to INT_MAX in create_blob ioctl 2019-12-04 19:44:13 -08:00
drm_rect.c drm/rect: update kerneldoc for drm_rect_clip_scaled() 2019-11-28 13:15:43 +01:00
drm_scatter.c
drm_scdc_helper.c
drm_self_refresh_helper.c drm/atomic: fix self-refresh helpers crtc state dereference 2019-11-06 13:00:21 -05:00
drm_simple_kms_helper.c drm/simple-kms: Standardize arguments for callbacks 2019-10-24 13:55:56 +02:00
drm_syncobj.c drm/syncobj: extend syncobj query ability v3 2019-10-18 12:24:56 +02:00
drm_sysfs.c drm: uevent for connector status change 2019-08-06 13:16:54 +05:30
drm_trace_points.c
drm_trace.h drm: Add high-precision time to vblank trace event 2019-09-03 09:46:18 +02:00
drm_vblank.c drm/drm_vblank: Change EINVAL by the correct errno 2019-10-08 18:43:26 -04:00
drm_vm.c
drm_vma_manager.c
drm_vram_helper_common.c drm/vram: Have VRAM MM call GEM VRAM functions directly 2019-09-12 19:54:42 +02:00
drm_writeback.c drm: Clear the fence pointer when writeback job signaled 2019-09-23 15:32:53 +08:00
Kconfig drm/Kconfig: add missing 'depends on DRM' for DRM_DP_CEC 2020-01-09 10:16:35 +01:00
Makefile drm/pci: Only build drm_pci.c if CONFIG_PCI is set 2019-12-05 08:43:14 +01:00