linux/drivers/gpu/drm/radeon
Simon Kitching 16c58081eb drm/radeon: Prevent leak of scratch register on resume from suspend
Cards typically have 5-7 scratch registers; one of these is reserved for
rdev->rptr_save_reg. Unfortunately the reservation is done in function
r100_cp_init, which is called by all drivers except r600 - and this
function is also invoked on resume from suspend. After several resumes,
no scratch registers are free and graphics acceleration is disabled.

Dmesg then reports either:
   *ERROR* radeon: cp failed to get scratch reg (-22).
   *ERROR* radeon: cp isn't working(-22).
   radeon 0000:01:00.0: failed initializing CP (-22).
or:
   *ERROR* radeon: failed to get scratch reg (-22).
   *ERROR* radeon: failed testing IB on GFX ring (-22).
   *ERROR* ib ring test failed (-22).

The chain of calls on boot for all except r600 is:
radeon_init -> ... -> (rXXX_init) -> rXXX_startup -> r100_cp_init

The chain of calls on resume for all except r600 is:
rXXX_resume -> rXXX_startup -> r100_cp_init.

R600 correctly allocates rptr_save_reg in r600_init (ie once only, not
in resume). However moving the code into the init functions for all
drivers means touching 4 drivers. So instead, this patch just adds a
test in r100_cp_init to avoid reallocating on resume. As the rdev
structure is allocated via kzalloc in radeon_driver_load_kms, and zero
is not a valid registerid, zero safely implies not-yet-allocated.

This issue appears to have been introduced in c7eff978 (3.6.0-rcN)

Signed-off-by: Simon Kitching <skitching@vonos.net>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2012-09-20 12:59:16 -04:00
..
reg_srcs drm/radeon: add proper checking of RESOLVE_BOX command for r600-r700 2012-08-29 12:11:00 -04:00
.gitignore
atom-bits.h
atom-names.h
atom-types.h
atom.c drm/radeon/kms: fix fans after resume 2012-04-02 11:07:42 +01:00
atom.h drm/radeon/kms: fix fans after resume 2012-04-02 11:07:42 +01:00
atombios_crtc.c Revert "drm/radeon: rework pll selection (v3)" 2012-09-17 17:26:24 -04:00
atombios_dp.c drm/radeon: rework panel mode setup 2012-08-29 12:11:01 -04:00
atombios_encoders.c drm/radeon: fix dig encoder selection on DCE61 2012-08-29 19:57:34 -04:00
atombios_i2c.c drm/radeon/kms/dce3+: add support for hw i2c using atom 2012-02-03 09:38:05 +00:00
atombios.h drm/radeon/kms: upstream power table updates 2012-03-21 06:55:50 +00:00
avivod.h
cayman_blit_shaders.c bug.h: add include of it to various implicit C users 2012-02-29 17:15:08 -05:00
cayman_blit_shaders.h drm/radeon/kms: add blit support for cayman (v2) 2011-05-26 09:19:31 +10:00
evergreen_blit_kms.c drm/radeon: remove r600_blit_suspend 2012-07-17 10:32:48 +02:00
evergreen_blit_shaders.c bug.h: add include of it to various implicit C users 2012-02-29 17:15:08 -05:00
evergreen_blit_shaders.h
evergreen_cs.c drm/radeon/kms: add MSAA texture support for r600-evergreen 2012-08-13 10:50:56 -04:00
evergreen_hdmi.c drm/radeon: enable HDMI on DCE5 (AKA NI excluding Aruba) 2012-06-16 11:21:19 +01:00
evergreen_reg.h drm/radeon/kms: get rid of hdmi_config_offset 2012-05-01 10:57:52 +01:00
evergreen.c drm/radeon: do not reenable crtc after moving vram start address 2012-08-13 10:50:52 -04:00
evergreend.h drm/radeon/kms: allow "invalid" DB formats as a means to disable DB 2012-08-09 09:53:13 +10:00
Kconfig drm/radeon/kms: clean up the radeon kms Kconfig 2011-05-26 09:22:05 +10:00
Makefile drm/radeon: add PRIME support (v2) 2012-05-23 10:47:11 +01:00
mkregtable.c radeon mkregtable: Add missing fclose() calls 2011-02-14 09:22:54 +10:00
ni_reg.h drm/radeon/kms: add ni_reg.h 2011-01-07 14:11:38 +10:00
ni.c drm/radeon: fix bank tiling parameters on cayman 2012-08-13 10:50:52 -04:00
nid.h drm/radeon: improve GPU lockup debugging info on r6xx/r7xx/r8xx/r9xx 2012-07-19 22:28:07 -04:00
ObjectID.h drm/radeon/kms: Upstream ObjectID.h updates 2012-03-21 06:55:49 +00:00
r100_track.h drm/radeon: Remove more bogus inlines in the radeon driver. 2011-10-18 09:44:52 +01:00
r100.c drm/radeon: Prevent leak of scratch register on resume from suspend 2012-09-20 12:59:16 -04:00
r100d.h drm/radeon: Definition of R_0003C2_GENMO_WT seems wrong 2010-12-21 12:55:33 +10:00
r200.c drm/radeon: remove radeon_fence_create 2012-06-21 09:38:35 +02:00
r300_cmdbuf.c drm/radeon: Move more code out of line 2011-10-18 09:53:05 +01:00
r300_reg.h Fix common misspellings 2011-03-31 11:26:23 -03:00
r300.c drm/radeon: move radeon_ib_ring_tests out of chipset code 2012-07-17 10:33:01 +02:00
r300d.h drm/radeon/kms: manage r300 CMASK RAM access and allow CMASK clear 2011-01-06 13:00:45 +10:00
r420.c drm/radeon: move radeon_ib_ring_tests out of chipset code 2012-07-17 10:33:01 +02:00
r420d.h
r500_reg.h drm/radeon/kms: add wait_for_vblank asic callback 2012-02-27 14:46:13 +00:00
r520.c drm/radeon: move radeon_ib_ring_tests out of chipset code 2012-07-17 10:33:01 +02:00
r520d.h
r600_audio.c drm/radeon: enable HDMI on DCE5 (AKA NI excluding Aruba) 2012-06-16 11:21:19 +01:00
r600_blit_kms.c drm/radeon: remove r600_blit_suspend 2012-07-17 10:32:48 +02:00
r600_blit_shaders.c The following text was taken from the original review request: 2012-03-24 10:08:39 -07:00
r600_blit_shaders.h
r600_blit.c drm/radeon: drop inlines in r600_blit.c 2011-10-18 09:44:38 +01:00
r600_cp.c drm/radeon: replace udelay with mdelay for long timeouts 2012-04-10 10:21:00 +01:00
r600_cs.c drm/radeon: add proper checking of RESOLVE_BOX command for r600-r700 2012-08-29 12:11:00 -04:00
r600_hdmi.c drm/radeon: apply Murphy's law to the kms irq code v3 2012-06-21 09:38:50 +02:00
r600_reg.h drm/radeon/hdmi: store info about all AFMT blocks 2012-05-17 12:15:40 +01:00
r600.c drm/radeon/kms: implement timestamp userspace query (v2) 2012-08-13 10:50:56 -04:00
r600d.h drm/radeon: add proper checking of RESOLVE_BOX command for r600-r700 2012-08-29 12:11:00 -04:00
radeon_acpi.c drm/radeon/kms: Skip ACPI call to ATIF when possible 2011-12-01 09:57:34 +00:00
radeon_agp.c
radeon_asic.c drm/radeon: document radeon_asic.c 2012-07-18 13:53:36 +02:00
radeon_asic.h drm/radeon/kms: implement timestamp userspace query (v2) 2012-08-13 10:50:56 -04:00
radeon_atombios.c drm/radeon/kms: extend the Fujitsu D3003-S2 board connector quirk to cover later silicon stepping 2012-08-20 11:09:50 -04:00
radeon_atpx_handler.c drm/radeon: split ATRM support out from the ATPX handler (v3) 2012-08-20 11:13:05 -04:00
radeon_benchmark.c drm/radeon: remove radeon_fence_create 2012-06-21 09:38:35 +02:00
radeon_bios.c drm/radeon: split ATRM support out from the ATPX handler (v3) 2012-08-20 11:13:05 -04:00
radeon_blit_common.h drm/radeon/kms: common definitions for blit copy code 2012-02-03 09:31:14 +00:00
radeon_clocks.c drm/radeon: replace udelay with mdelay for long timeouts 2012-04-10 10:21:00 +01:00
radeon_combios.c drm/radeon: fix handling for ddc type 5 on combios 2012-08-13 10:50:48 -04:00
radeon_connectors.c drm/radeon: on hotplug force link training to happen (v2) 2012-07-25 14:14:12 +10:00
radeon_cp.c radeon_cp: Remove unneeded tests for NULL before calling release_firmware() 2012-04-30 13:15:31 +02:00
radeon_cs.c drm/radeon: fence virtual address and free it once idle v4 2012-08-13 10:50:55 -04:00
radeon_cursor.c drm/radeon/dce4+: set a more reasonable cursor watermark 2012-08-13 10:50:49 -04:00
radeon_device.c drm/radeon: fix double free in radeon_gpu_reset 2012-08-29 12:11:01 -04:00
radeon_display.c drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
radeon_drv.c drm/radeon: add proper checking of RESOLVE_BOX command for r600-r700 2012-08-29 12:11:00 -04:00
radeon_drv.h Fix common misspellings 2011-03-31 11:26:23 -03:00
radeon_encoders.c drm/radeon/kms: update duallink checks for DCE6 2012-03-21 06:55:58 +00:00
radeon_family.h drm/radeon/kms: add trinity (TN) chip family 2012-03-21 06:55:55 +00:00
radeon_fb.c drm/radeon: Restrict offset for legacy display engine. 2012-03-20 08:47:46 +00:00
radeon_fence.c drm/radeon: make 64bit fences more robust v3 2012-09-13 16:17:49 -04:00
radeon_gart.c drm/radeon: fix typo in function header comment 2012-08-13 10:53:29 -04:00
radeon_gem.c drm/radeon: fence virtual address and free it once idle v4 2012-08-13 10:50:55 -04:00
radeon_i2c.c drm/radeon: only add the mm i2c bus if the hw_i2c module param is set 2012-04-11 09:36:53 +01:00
radeon_ioc32.c
radeon_irq_kms.c drm/radeon: document radeon_irq_kms.c 2012-07-18 13:53:35 +02:00
radeon_irq.c drm/radeon: Move more code out of line 2011-10-18 09:53:05 +01:00
radeon_kms.c drm/radeon/kms: implement timestamp userspace query (v2) 2012-08-13 10:50:56 -04:00
radeon_legacy_crtc.c drm/radeon: properly handle crtc powergating 2012-08-13 10:50:50 -04:00
radeon_legacy_encoders.c drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
radeon_legacy_tv.c drm/radeon: Move more code out of line 2011-10-18 09:53:05 +01:00
radeon_mem.c drivers: use kzalloc/kcalloc instead of 'kmalloc+memset', where possible 2011-07-25 20:57:13 -07:00
radeon_mode.h drm/radeon: properly handle crtc powergating 2012-08-13 10:50:50 -04:00
radeon_object.c Revert "drm/radeon: fix bo creation retry path" 2012-08-21 09:55:01 -04:00
radeon_object.h drm/radeon: add PRIME support (v2) 2012-05-23 10:47:11 +01:00
radeon_pm.c drm/radeon: apply Murphy's law to the kms irq code v3 2012-06-21 09:38:50 +02:00
radeon_prime.c drm/radeon/prime: reserve/unreserve around pin 2012-06-16 11:14:05 +01:00
radeon_reg.h drm/radeon/kms: fix up atom HPD gpio parsing for DCE6 2012-03-21 06:55:50 +00:00
radeon_ring.c drm/radeon: init lockup timeout on ring init 2012-08-20 11:09:48 -04:00
radeon_sa.c drm/radeon: let sa manager block for fences to wait for v2 2012-07-18 13:17:44 +02:00
radeon_semaphore.c drm/radeon: rework ring syncing code 2012-06-21 09:38:40 +02:00
radeon_state.c drm/radeon: Move more code out of line 2011-10-18 09:53:05 +01:00
radeon_test.c drm/radeon: remove radeon_ring_index() 2012-07-18 13:33:54 +02:00
radeon_trace_points.c drm/radeon: add initial tracepoint support. 2010-12-16 14:37:47 +10:00
radeon_trace.h drm/radeon: add initial tracepoint support. 2010-12-16 14:37:47 +10:00
radeon_ttm.c drm: track dev_mapping in more robust and flexible way 2012-07-25 14:09:30 +10:00
radeon.h drm/radeon: split ATRM support out from the ATPX handler (v3) 2012-08-20 11:13:05 -04:00
rs100d.h
rs400.c drm/radeon: move radeon_ib_ring_tests out of chipset code 2012-07-17 10:33:01 +02:00
rs400d.h
rs600.c drm/radeon: move radeon_ib_ring_tests out of chipset code 2012-07-17 10:33:01 +02:00
rs600d.h drm/radeon/kms: add register definitions for audio 2012-04-24 09:50:13 +01:00
rs690.c drm/radeon: move radeon_ib_ring_tests out of chipset code 2012-07-17 10:33:01 +02:00
rs690d.h
rv200d.h
rv250d.h
rv350d.h
rv515.c drm/radeon: do not reenable crtc after moving vram start address 2012-08-13 10:50:52 -04:00
rv515d.h
rv770.c drm/radeon/kms: auto detect pcie link speed from root port 2012-07-19 22:30:32 -04:00
rv770d.h drm/radeon: add some additional 6xx/7xx/EG register init 2012-06-16 14:30:47 +01:00
si_blit_shaders.c The following text was taken from the original review request: 2012-03-24 10:08:39 -07:00
si_blit_shaders.h drm/radeon/kms: add support for CP setup on SI 2012-03-21 06:55:54 +00:00
si_reg.h drm/radeon: SI tiling fixes for display 2012-06-20 19:55:56 +01:00
si.c drm/radeon/kms: implement timestamp userspace query (v2) 2012-08-13 10:50:56 -04:00
sid.h drm/radeon/kms: implement timestamp userspace query (v2) 2012-08-13 10:50:56 -04:00