linux/drivers/gpu/drm/radeon
Mario Kleiner 363926dc9e drm/radeon: Prevent races on pre DCE4 between flip submission and completion.
Pre DCE4 hw doesn't have reliable pageflip completion
interrupts, so instead polling for flip completion is
used from within the vblank irq handler to complete
page flips.

This causes a race if pageflip ioctl is called close to
vblank:

1. pageflip ioctl queues execution of radeon_flip_work_func.

2. vblank irq fires, radeon_crtc_handle_vblank checks for
   flip_status == FLIP_SUBMITTED finds none, no-ops.

3. radeon_flip_work_func runs inside vblank, decides to
   set flip_status == FLIP_SUBMITTED and programs the
   flip into hw.

4. hw executes flip immediately (because in vblank), but
   as 2 already happened, the flip completion routine only
   emits the flip completion event one refresh later ->
   wrong vblank count/timestamp for completion and no
   performance gain, as instead of delaying the flip until
   next vblank, we now delay the next flip by 1 refresh
   while waiting for the delayed flip completion event.

Given we often don't gain anything due to this race, but
lose precision, prevent the programmed flip from executing
in vblank on pre DCE4 asics to avoid this race.

On pre-AVIVO hw we can't program the hw for edge-triggered
flips, they always execute anywhere in vblank. Therefore delay
the actual flip programming until after vblank on pre-AVIVO.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2016-10-04 11:15:58 -04:00
..
reg_srcs drm/radeon: allow geom rings to be setup on r600/r700 (v2) 2014-02-06 12:13:52 +10:00
.gitignore
atom-bits.h
atom-names.h
atom-types.h
atom.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
atom.h drm/radeon: add locking around atombios scratch space usage 2014-11-11 17:22:26 -05:00
atombios_crtc.c drm/radeon: Prevent races on pre DCE4 between flip submission and completion. 2016-10-04 11:15:58 -04:00
atombios_dp.c drm/radeon: Don't retry 7 times in radeon_dp_dpcd() 2016-08-08 13:28:26 -04:00
atombios_encoders.c drm/radeon: support backlight control for UNIPHY3 2016-07-14 16:46:06 -04:00
atombios_i2c.c drm/radeon: add locking around atombios scratch space usage 2014-11-11 17:22:26 -05:00
atombios.h drm/radeon: fix comment 2015-05-26 15:09:03 +02:00
avivod.h
btc_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
btc_dpm.h Revert "drm/radeon: drop btc_get_max_clock_from_voltage_dependency_table" 2014-10-13 11:34:13 -04:00
btcd.h drm/radeon/dpm: use the driver state for dpm debugfs 2014-02-06 12:22:46 -05:00
cayman_blit_shaders.c drm: fix trivial typos 2015-10-21 11:35:11 -04:00
cayman_blit_shaders.h
ci_dpm.c drm/radeon/ci add comment to document intentionally unreachable code 2016-07-29 14:36:45 -04:00
ci_dpm.h drm/radeon: bind fan control on CI cards to hwmon interface (v2) 2015-01-22 10:38:48 -05:00
ci_smc.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
cik_blit_shaders.c
cik_blit_shaders.h
cik_reg.h drm/radeon: Add H/W debugger kfd->kgd functions 2015-06-03 11:31:12 +03:00
cik_sdma.c drm/radeon: Avoid double gpu reset by adding a timeout on IB ring tests. 2016-02-10 14:17:15 -05:00
cik.c drm/radeon: squash lines for simple wrapper functions 2016-09-15 10:39:37 -04:00
cikd.h drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
clearstate_cayman.h drm/radeon: use NULL instead of zero in clearstate headers 2014-06-02 10:25:07 -04:00
clearstate_ci.h drm/radeon: use NULL instead of zero in clearstate headers 2014-06-02 10:25:07 -04:00
clearstate_defs.h
clearstate_evergreen.h drm/radeon: convert SI,CIK to use sumo_rlc functions 2013-08-30 16:30:08 -04:00
clearstate_si.h drm/radeon: use NULL instead of zero in clearstate headers 2014-06-02 10:25:07 -04:00
cypress_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
cypress_dpm.h
dce3_1_afmt.c drm/radeon: use proper ACR regisiter for DCE3.2 2015-06-01 23:16:22 -04:00
dce6_afmt.c drm/radeon: Add a common function for DFS handling 2016-01-27 12:48:32 -05:00
evergreen_blit_shaders.c drm: fix trivial typos 2015-10-21 11:35:11 -04:00
evergreen_blit_shaders.h
evergreen_cs.c drm/radeon: allow PACKET3_PFP_SYNC_ME on evergreen 2016-07-07 14:50:59 -04:00
evergreen_dma.c drm/radeon: split semaphore and sync object handling v2 2014-11-20 13:00:16 -05:00
evergreen_hdmi.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
evergreen_reg.h drm/radeon: fix vertical bars appear on monitor (v2) 2016-04-27 12:27:08 -04:00
evergreen_smc.h drm/radeon/dpm: fix typo in EVERGREEN_SMC_FIRMWARE_HEADER_softRegisters 2014-03-06 16:46:58 -05:00
evergreen.c drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
evergreend.h drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
Kconfig drm/radeon: remove UMS support 2015-12-02 12:45:54 -05:00
kv_dpm.c drm/radeon: fix array out of bounds 2016-05-16 10:25:13 -04:00
kv_dpm.h drm/radeon/dpm: handle bapm on kb/kv 2013-09-11 11:44:38 -04:00
kv_smc.c drm/radeon/dpm: handle bapm on kb/kv 2013-09-11 11:44:38 -04:00
Makefile drm/radeon: remove UMS support 2015-12-02 12:45:54 -05:00
mkregtable.c Replace mentions of "list_struct" to "list_head" 2014-11-20 14:45:15 +01:00
ni_dma.c drm/radeon: Remove rdev->gart.pages_addr array 2015-01-22 11:48:03 -05:00
ni_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
ni_dpm.h drm/radeon/dpm: implement vblank_too_short callback for si 2013-07-08 17:41:11 -04:00
ni_reg.h drm/radeon/mst: port some MST setup code from DAL. 2016-04-06 14:57:46 -04:00
ni.c drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
nid.h drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
nislands_smc.h
ObjectID.h
ppsmc.h drm/radeon/dpm: add thermal dpm support for CI 2014-11-20 13:00:10 -05:00
pptable.h drm/radeon/dpm: add smc fan control for CI (v2) 2014-11-20 13:00:10 -05:00
r100_track.h
r100.c drm/radeon: squash lines for simple wrapper functions 2016-09-15 10:39:37 -04:00
r100d.h
r200.c drm/radeon: rename radeon_cs_reloc to radeon_bo_list 2014-12-03 14:26:47 -05:00
r300_reg.h
r300.c drm/radeon: allow to force hard GPU reset. 2016-05-02 13:08:54 -04:00
r300d.h
r420.c drm/radeon: Only flush HDP cache for indirect buffers from userspace 2014-08-18 17:09:44 -04:00
r420d.h
r500_reg.h drm/radeon: Bypass hw lut's for > 8 bpc framebuffer scanout. 2014-06-13 12:22:30 -04:00
r520.c drm/radeon: resume old pm late 2014-03-06 16:46:56 -05:00
r520d.h
r600_blit_shaders.c drm: fix trivial typos 2015-10-21 11:35:11 -04:00
r600_blit_shaders.h drm/radeon/kms: remove r6xx+ blit copy routines 2013-08-30 16:29:57 -04:00
r600_cs.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
r600_dma.c drm/radeon: Avoid double gpu reset by adding a timeout on IB ring tests. 2016-02-10 14:17:15 -05:00
r600_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
r600_dpm.h drm/radeon/dpm: add smc fan control for SI (v2) 2014-11-20 13:00:09 -05:00
r600_hdmi.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
r600_reg.h
r600.c drm/radeon: squash lines for simple wrapper functions 2016-09-15 10:39:37 -04:00
r600d.h drm/radeon: add support for UVD_NO_OP register 2016-08-24 16:25:04 -04:00
radeon_acpi.c drm/radeon/atif: Send a hotplug event when we get dgpu display request 2016-09-22 10:30:58 -04:00
radeon_acpi.h drm/radeon: update radeon acpi header 2016-02-26 14:16:58 -05:00
radeon_agp.c add blacklist for thinkpad T40p 2015-11-30 14:44:34 -05:00
radeon_asic.c drm/radeon: add driver option to disable vce block. 2016-05-02 13:08:53 -04:00
radeon_asic.h drm/radeon: Support DRM_MODE_PAGE_FLIP_ASYNC 2016-05-04 20:19:03 -04:00
radeon_atombios.c drm/radeon: fix firmware info version checks 2016-07-28 10:07:07 -04:00
radeon_atpx_handler.c Linux 4.8-rc8 2016-09-28 12:08:49 +10:00
radeon_audio.c drm/radeon: Add a common function for DFS handling 2016-01-27 12:48:32 -05:00
radeon_audio.h drm/radeon: Add a common function for DFS handling 2016-01-27 12:48:32 -05:00
radeon_benchmark.c drm/radeon: fix the crash in benchmark functions 2015-02-02 11:39:35 -05:00
radeon_bios.c drm/radeon: Drop unnecessary #include <linux/vga_switcheroo.h> 2015-10-14 16:16:37 -04:00
radeon_clocks.c
radeon_combios.c PCI: Remove includes of asm/pci-bridge.h 2016-02-05 16:29:28 -06:00
radeon_connectors.c drm/radeon: Poll for both connect/disconnect on analog connectors 2016-07-07 15:06:06 -04:00
radeon_cs.c drm: remove unused dev variables 2016-05-18 19:16:24 +02:00
radeon_cursor.c drm: Remove unused drm_device from drm_gem_object_lookup() 2016-05-17 08:47:30 +02:00
radeon_device.c drm/radeon: narrow asic_init for virtualization 2016-09-22 10:24:15 -04:00
radeon_display.c drm/radeon: Prevent races on pre DCE4 between flip submission and completion. 2016-10-04 11:15:58 -04:00
radeon_dp_auxch.c drm/radeon: Don't print error on aux transaction timeouts 2016-08-08 13:28:12 -04:00
radeon_dp_mst.c drm/radeon: use helper for mst connector dpms. 2016-04-06 14:58:42 -04:00
radeon_drv.c Merge branch 'drm-next-4.9' of git://people.freedesktop.org/~agd5f/linux into drm-next 2016-09-30 13:21:02 +10:00
radeon_drv.h drm/radeon: remove UMS support 2015-12-02 12:45:54 -05:00
radeon_encoders.c drm/radeon: move bl encoder assignment into bl init 2015-10-29 11:13:18 -04:00
radeon_family.h drm/radeon: add Mullins chip family 2014-05-06 12:19:57 +02:00
radeon_fb.c Merge branch 'drm-next-4.9' of git://people.freedesktop.org/~agd5f/linux into drm-next 2016-09-20 06:17:38 +10:00
radeon_fence.c drm/radeon: Avoid double gpu reset by adding a timeout on IB ring tests. 2016-02-10 14:17:15 -05:00
radeon_gart.c drm/radeon: Don't flush the GART TLB if rdev->gart.ptr == NULL 2015-07-16 12:39:37 -04:00
radeon_gem.c drm: Remove unused drm_device from drm_gem_object_lookup() 2016-05-17 08:47:30 +02:00
radeon_i2c.c gpu: drm: radeon: radeon_i2c: don't print error when adding adapter fails 2016-08-10 14:09:50 -04:00
radeon_ib.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
radeon_ioc32.c drm: Remove DRM_ARRAY_SIZE() for ARRAY_SIZE() 2014-06-10 09:36:17 +10:00
radeon_irq_kms.c drm: Nuke ->vblank_disable_allowed 2016-05-21 07:03:31 +10:00
radeon_kfd.c drm/radeon: Return -EPROBE_DEFER when amdkfd not loaded 2016-02-27 22:52:40 +02:00
radeon_kfd.h drm/radeon: Return -EPROBE_DEFER when amdkfd not loaded 2016-02-27 22:52:40 +02:00
radeon_kms.c drm/radeon: handle runtime pm in drm pre/post close 2016-09-02 10:34:49 -04:00
radeon_legacy_crtc.c drm/radeon: use drm_crtc_vblank_{on,off}() 2016-06-13 18:38:00 +02:00
radeon_legacy_encoders.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
radeon_legacy_tv.c
radeon_mn.c drm/radeon: make radeon_mn_get wait for mmap_sem killable 2016-05-23 17:04:14 -07:00
radeon_mode.h Merge branch 'drm-next-4.5' of git://people.freedesktop.org/~agd5f/linux into drm-next 2015-12-23 14:15:26 +10:00
radeon_object.c drm/ttm: remove lazy parameter from ttm_bo_wait 2016-05-04 20:21:26 -04:00
radeon_object.h drm/ttm: remove use_ticket parameter from ttm_bo_reserve 2016-05-04 20:21:21 -04:00
radeon_pm.c drm/radeon: use drm_crtc_vblank_{get,put}() 2016-06-06 18:05:08 +02:00
radeon_prime.c drm/radeon: export reservation_object from dmabuf to ttm 2014-10-03 09:19:17 -04:00
radeon_reg.h
radeon_ring.c drm/radeon: always dump the ring content if it's available 2015-03-27 10:17:43 -04:00
radeon_sa.c drm/radeon: hold reference to fences in radeon_sa_bo_new 2016-02-10 14:07:44 -05:00
radeon_semaphore.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
radeon_sync.c drm/radeon: track VM update fences separately 2014-11-20 13:00:17 -05:00
radeon_test.c drm/radeon: fix the crash in test functions 2015-02-02 11:39:36 -05:00
radeon_trace_points.c
radeon_trace.h tracing/drm: Remove unused TRACE_SYSTEM_STRING define 2015-04-07 12:29:23 -04:00
radeon_ttm.c Linux 4.8-rc8 2016-09-28 12:08:49 +10:00
radeon_ucode.c drm/radeon: add new firmware header definitions (v3) 2014-08-05 08:53:22 -04:00
radeon_ucode.h drm/radeon: add new firmware header definitions (v3) 2014-08-05 08:53:22 -04:00
radeon_uvd.c drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
radeon_vce.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
radeon_vm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
radeon.h drm/radeon: Provide page_flip_target hook 2016-08-10 14:28:07 -04:00
rs100d.h
rs400.c drm/radeon: Split off gart_get_page_entry ASIC hook from set_page_entry 2015-01-22 11:46:17 -05:00
rs400d.h
rs600.c drm/radeon: Support DRM_MODE_PAGE_FLIP_ASYNC 2016-05-04 20:19:03 -04:00
rs600d.h
rs690.c drm/radeon: Fixup hw vblank counter/ts for new drm_update_vblank_count() (v2) 2015-12-18 17:29:47 -05:00
rs690d.h
rs780_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
rs780_dpm.h
rs780d.h drm/radeon/dpm: add debugfs support for RS780/RS880 (v3) 2013-07-17 16:47:52 -04:00
rv6xx_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
rv6xx_dpm.h
rv6xxd.h
rv200d.h
rv250d.h
rv350d.h
rv515.c drm/radeon: Prevent races on pre DCE4 between flip submission and completion. 2016-10-04 11:15:58 -04:00
rv515d.h
rv730_dpm.c drm/radeon: make some dpm errors debug only 2015-11-25 11:28:42 -05:00
rv730d.h
rv740_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
rv740d.h
rv770_dma.c drm/radeon: split semaphore and sync object handling v2 2014-11-20 13:00:16 -05:00
rv770_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
rv770_dpm.h drm/radeon: comment out some currently unused 7xx dpm code 2015-01-22 10:38:58 -05:00
rv770_smc.c drm/radeon: protect concurrent smc register access with a spinlock 2013-09-11 11:44:28 -04:00
rv770_smc.h drm/radeon: protect concurrent smc register access with a spinlock 2013-09-11 11:44:28 -04:00
rv770.c drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
rv770d.h drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
si_blit_shaders.c
si_blit_shaders.h
si_dma.c drm/radeon: Remove rdev->gart.pages_addr array 2015-01-22 11:48:03 -05:00
si_dpm.c drm/radeon/si/dpm: fix phase shedding setup 2016-09-28 16:13:16 -04:00
si_dpm.h drm/radeon: bind fan control on SI cards to hwmon interface 2015-01-22 10:38:48 -05:00
si_reg.h
si_smc.c drm/radeon/si: Add support for new ucode format (v3) 2014-08-05 08:53:23 -04:00
si.c drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
sid.h drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
sislands_smc.h drm/radeon/si/dpm: fix phase shedding setup 2016-09-28 16:13:16 -04:00
smu7_discrete.h drm/radeon/dpm: add smc fan control for CI (v2) 2014-11-20 13:00:10 -05:00
smu7_fusion.h drm/radeon/kms: add dpm support for KB/KV 2013-08-30 16:30:28 -04:00
smu7.h drm/radeon/kms: add dpm support for KB/KV 2013-08-30 16:30:28 -04:00
sumo_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
sumo_dpm.h drm/radeon: comment out some currently unused sumo dpm code 2015-01-22 10:38:57 -05:00
sumo_smc.c drm/radeon/dpm: make some functions static for sumo 2014-01-07 12:55:50 -05:00
sumod.h
trinity_dpm.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
trinity_dpm.h drm/radeon/dpm: add bapm callback for trinity 2013-09-11 11:44:39 -04:00
trinity_smc.c drm/radeon/dpm: make some functions static for TN 2014-01-07 12:55:57 -05:00
trinityd.h
uvd_v1_0.c drm/radeon: handle more than 10 UVD sessions 2016-05-04 20:19:43 -04:00
uvd_v2_2.c drm/radeon: handle more than 10 UVD sessions 2016-05-04 20:19:43 -04:00
uvd_v3_1.c drm/radeon: allow semaphore emission to fail 2013-11-15 15:56:09 -05:00
uvd_v4_2.c drm/radeon: handle more than 10 UVD sessions 2016-05-04 20:19:43 -04:00
vce_v1_0.c drm/radeon: properly byte swap vce firmware setup 2016-01-22 10:50:24 -05:00
vce_v2_0.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00