Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: allow to force hard GPU reset.

In some cases, like when freezing for hibernation, we need to be
able to force hard reset even if no engine are stuck. This patch
add a bool option to current asic reset callback to allow to force
hard reset on asic that supports it.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Jérôme Glisse <jglisse@redhat.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Jérome Glisse and committed by
Alex Deucher
71fe2899 fabb5935

+44 -18
+7 -1
drivers/gpu/drm/radeon/cik.c
··· 5261 5261 * cik_asic_reset - soft reset GPU 5262 5262 * 5263 5263 * @rdev: radeon_device pointer 5264 + * @hard: force hard reset 5264 5265 * 5265 5266 * Look up which blocks are hung and attempt 5266 5267 * to reset them. 5267 5268 * Returns 0 for success. 5268 5269 */ 5269 - int cik_asic_reset(struct radeon_device *rdev) 5270 + int cik_asic_reset(struct radeon_device *rdev, bool hard) 5270 5271 { 5271 5272 u32 reset_mask; 5273 + 5274 + if (hard) { 5275 + cik_gpu_pci_config_reset(rdev); 5276 + return 0; 5277 + } 5272 5278 5273 5279 reset_mask = cik_gpu_check_soft_reset(rdev); 5274 5280
+6 -1
drivers/gpu/drm/radeon/evergreen.c
··· 3984 3984 } 3985 3985 } 3986 3986 3987 - int evergreen_asic_reset(struct radeon_device *rdev) 3987 + int evergreen_asic_reset(struct radeon_device *rdev, bool hard) 3988 3988 { 3989 3989 u32 reset_mask; 3990 + 3991 + if (hard) { 3992 + evergreen_gpu_pci_config_reset(rdev); 3993 + return 0; 3994 + } 3990 3995 3991 3996 reset_mask = evergreen_gpu_check_soft_reset(rdev); 3992 3997
+6 -1
drivers/gpu/drm/radeon/ni.c
··· 1959 1959 evergreen_print_gpu_status_regs(rdev); 1960 1960 } 1961 1961 1962 - int cayman_asic_reset(struct radeon_device *rdev) 1962 + int cayman_asic_reset(struct radeon_device *rdev, bool hard) 1963 1963 { 1964 1964 u32 reset_mask; 1965 + 1966 + if (hard) { 1967 + evergreen_gpu_pci_config_reset(rdev); 1968 + return 0; 1969 + } 1965 1970 1966 1971 reset_mask = cayman_gpu_check_soft_reset(rdev); 1967 1972
+1 -1
drivers/gpu/drm/radeon/r100.c
··· 2555 2555 mdelay(1); 2556 2556 } 2557 2557 2558 - int r100_asic_reset(struct radeon_device *rdev) 2558 + int r100_asic_reset(struct radeon_device *rdev, bool hard) 2559 2559 { 2560 2560 struct r100_mc_save save; 2561 2561 u32 status, tmp;
+1 -1
drivers/gpu/drm/radeon/r300.c
··· 410 410 rdev->num_gb_pipes, rdev->num_z_pipes); 411 411 } 412 412 413 - int r300_asic_reset(struct radeon_device *rdev) 413 + int r300_asic_reset(struct radeon_device *rdev, bool hard) 414 414 { 415 415 struct r100_mc_save save; 416 416 u32 status, tmp;
+6 -1
drivers/gpu/drm/radeon/r600.c
··· 1871 1871 } 1872 1872 } 1873 1873 1874 - int r600_asic_reset(struct radeon_device *rdev) 1874 + int r600_asic_reset(struct radeon_device *rdev, bool hard) 1875 1875 { 1876 1876 u32 reset_mask; 1877 + 1878 + if (hard) { 1879 + r600_gpu_pci_config_reset(rdev); 1880 + return 0; 1881 + } 1877 1882 1878 1883 reset_mask = r600_gpu_check_soft_reset(rdev); 1879 1884
+2 -2
drivers/gpu/drm/radeon/radeon.h
··· 1854 1854 int (*resume)(struct radeon_device *rdev); 1855 1855 int (*suspend)(struct radeon_device *rdev); 1856 1856 void (*vga_set_state)(struct radeon_device *rdev, bool state); 1857 - int (*asic_reset)(struct radeon_device *rdev); 1857 + int (*asic_reset)(struct radeon_device *rdev, bool hard); 1858 1858 /* Flush the HDP cache via MMIO */ 1859 1859 void (*mmio_hdp_flush)(struct radeon_device *rdev); 1860 1860 /* check if 3D engine is idle */ ··· 2720 2720 #define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) 2721 2721 #define radeon_cs_parse(rdev, r, p) (rdev)->asic->ring[(r)]->cs_parse((p)) 2722 2722 #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) 2723 - #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) 2723 + #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev), false) 2724 2724 #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev)) 2725 2725 #define radeon_gart_get_page_entry(a, f) (rdev)->asic->gart.get_page_entry((a), (f)) 2726 2726 #define radeon_gart_set_page(rdev, i, e) (rdev)->asic->gart.set_page((rdev), (i), (e))
+8 -8
drivers/gpu/drm/radeon/radeon_asic.h
··· 64 64 int r100_resume(struct radeon_device *rdev); 65 65 void r100_vga_set_state(struct radeon_device *rdev, bool state); 66 66 bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 67 - int r100_asic_reset(struct radeon_device *rdev); 67 + int r100_asic_reset(struct radeon_device *rdev, bool hard); 68 68 u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); 69 69 void r100_pci_gart_tlb_flush(struct radeon_device *rdev); 70 70 uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags); ··· 167 167 extern void r300_fini(struct radeon_device *rdev); 168 168 extern int r300_suspend(struct radeon_device *rdev); 169 169 extern int r300_resume(struct radeon_device *rdev); 170 - extern int r300_asic_reset(struct radeon_device *rdev); 170 + extern int r300_asic_reset(struct radeon_device *rdev, bool hard); 171 171 extern void r300_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); 172 172 extern void r300_fence_ring_emit(struct radeon_device *rdev, 173 173 struct radeon_fence *fence); ··· 225 225 /* 226 226 * rs600. 227 227 */ 228 - extern int rs600_asic_reset(struct radeon_device *rdev); 228 + extern int rs600_asic_reset(struct radeon_device *rdev, bool hard); 229 229 extern int rs600_init(struct radeon_device *rdev); 230 230 extern void rs600_fini(struct radeon_device *rdev); 231 231 extern int rs600_suspend(struct radeon_device *rdev); ··· 334 334 void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 335 335 bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 336 336 bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 337 - int r600_asic_reset(struct radeon_device *rdev); 337 + int r600_asic_reset(struct radeon_device *rdev, bool hard); 338 338 int r600_set_surface_reg(struct radeon_device *rdev, int reg, 339 339 uint32_t tiling_flags, uint32_t pitch, 340 340 uint32_t offset, uint32_t obj_size); ··· 513 513 int evergreen_resume(struct radeon_device *rdev); 514 514 bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 515 515 bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 516 - int evergreen_asic_reset(struct radeon_device *rdev); 516 + int evergreen_asic_reset(struct radeon_device *rdev, bool hard); 517 517 void evergreen_bandwidth_update(struct radeon_device *rdev); 518 518 void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 519 519 void evergreen_hpd_init(struct radeon_device *rdev); ··· 606 606 void cayman_fini(struct radeon_device *rdev); 607 607 int cayman_suspend(struct radeon_device *rdev); 608 608 int cayman_resume(struct radeon_device *rdev); 609 - int cayman_asic_reset(struct radeon_device *rdev); 609 + int cayman_asic_reset(struct radeon_device *rdev, bool hard); 610 610 void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 611 611 int cayman_vm_init(struct radeon_device *rdev); 612 612 void cayman_vm_fini(struct radeon_device *rdev); ··· 712 712 int si_resume(struct radeon_device *rdev); 713 713 bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 714 714 bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 715 - int si_asic_reset(struct radeon_device *rdev); 715 + int si_asic_reset(struct radeon_device *rdev, bool hard); 716 716 void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 717 717 int si_irq_set(struct radeon_device *rdev); 718 718 int si_irq_process(struct radeon_device *rdev); ··· 817 817 int cik_suspend(struct radeon_device *rdev); 818 818 int cik_resume(struct radeon_device *rdev); 819 819 bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 820 - int cik_asic_reset(struct radeon_device *rdev); 820 + int cik_asic_reset(struct radeon_device *rdev, bool hard); 821 821 void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 822 822 int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring); 823 823 int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring);
+1 -1
drivers/gpu/drm/radeon/rs600.c
··· 444 444 radeon_irq_kms_disable_hpd(rdev, disable); 445 445 } 446 446 447 - int rs600_asic_reset(struct radeon_device *rdev) 447 + int rs600_asic_reset(struct radeon_device *rdev, bool hard) 448 448 { 449 449 struct rv515_mc_save save; 450 450 u32 status, tmp;
+6 -1
drivers/gpu/drm/radeon/si.c
··· 4034 4034 } 4035 4035 } 4036 4036 4037 - int si_asic_reset(struct radeon_device *rdev) 4037 + int si_asic_reset(struct radeon_device *rdev, bool hard) 4038 4038 { 4039 4039 u32 reset_mask; 4040 + 4041 + if (hard) { 4042 + si_gpu_pci_config_reset(rdev); 4043 + return 0; 4044 + } 4040 4045 4041 4046 reset_mask = si_gpu_check_soft_reset(rdev); 4042 4047