aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérome Glisse <jglisse@redhat.com>2016-03-18 11:58:38 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-05-02 13:08:54 -0400
commit71fe289970430fca85c7c8da5a829e65764e081b (patch)
treef9f3c90169a6342484ad21015ab33cee7ec4c642
parentfabb5935871db1f31fcd2684fd154e24de04d917 (diff)
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>
-rw-r--r--drivers/gpu/drm/radeon/cik.c8
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c7
-rw-r--r--drivers/gpu/drm/radeon/ni.c7
-rw-r--r--drivers/gpu/drm/radeon/r100.c2
-rw-r--r--drivers/gpu/drm/radeon/r300.c2
-rw-r--r--drivers/gpu/drm/radeon/r600.c7
-rw-r--r--drivers/gpu/drm/radeon/radeon.h4
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h16
-rw-r--r--drivers/gpu/drm/radeon/rs600.c2
-rw-r--r--drivers/gpu/drm/radeon/si.c7
10 files changed, 44 insertions, 18 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index dd1a7b206a48..ba192a35c607 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -5261,15 +5261,21 @@ static void cik_gpu_pci_config_reset(struct radeon_device *rdev)
5261 * cik_asic_reset - soft reset GPU 5261 * cik_asic_reset - soft reset GPU
5262 * 5262 *
5263 * @rdev: radeon_device pointer 5263 * @rdev: radeon_device pointer
5264 * @hard: force hard reset
5264 * 5265 *
5265 * Look up which blocks are hung and attempt 5266 * Look up which blocks are hung and attempt
5266 * to reset them. 5267 * to reset them.
5267 * Returns 0 for success. 5268 * Returns 0 for success.
5268 */ 5269 */
5269int cik_asic_reset(struct radeon_device *rdev) 5270int cik_asic_reset(struct radeon_device *rdev, bool hard)
5270{ 5271{
5271 u32 reset_mask; 5272 u32 reset_mask;
5272 5273
5274 if (hard) {
5275 cik_gpu_pci_config_reset(rdev);
5276 return 0;
5277 }
5278
5273 reset_mask = cik_gpu_check_soft_reset(rdev); 5279 reset_mask = cik_gpu_check_soft_reset(rdev);
5274 5280
5275 if (reset_mask) 5281 if (reset_mask)
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index cc0cf9addf65..e483b0752866 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -3984,10 +3984,15 @@ void evergreen_gpu_pci_config_reset(struct radeon_device *rdev)
3984 } 3984 }
3985} 3985}
3986 3986
3987int evergreen_asic_reset(struct radeon_device *rdev) 3987int evergreen_asic_reset(struct radeon_device *rdev, bool hard)
3988{ 3988{
3989 u32 reset_mask; 3989 u32 reset_mask;
3990 3990
3991 if (hard) {
3992 evergreen_gpu_pci_config_reset(rdev);
3993 return 0;
3994 }
3995
3991 reset_mask = evergreen_gpu_check_soft_reset(rdev); 3996 reset_mask = evergreen_gpu_check_soft_reset(rdev);
3992 3997
3993 if (reset_mask) 3998 if (reset_mask)
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index ec0aac8d455f..4a3d7cab83f7 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1959,10 +1959,15 @@ static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
1959 evergreen_print_gpu_status_regs(rdev); 1959 evergreen_print_gpu_status_regs(rdev);
1960} 1960}
1961 1961
1962int cayman_asic_reset(struct radeon_device *rdev) 1962int cayman_asic_reset(struct radeon_device *rdev, bool hard)
1963{ 1963{
1964 u32 reset_mask; 1964 u32 reset_mask;
1965 1965
1966 if (hard) {
1967 evergreen_gpu_pci_config_reset(rdev);
1968 return 0;
1969 }
1970
1966 reset_mask = cayman_gpu_check_soft_reset(rdev); 1971 reset_mask = cayman_gpu_check_soft_reset(rdev);
1967 1972
1968 if (reset_mask) 1973 if (reset_mask)
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 6e478a248628..bbdf15fc9153 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -2555,7 +2555,7 @@ void r100_bm_disable(struct radeon_device *rdev)
2555 mdelay(1); 2555 mdelay(1);
2556} 2556}
2557 2557
2558int r100_asic_reset(struct radeon_device *rdev) 2558int r100_asic_reset(struct radeon_device *rdev, bool hard)
2559{ 2559{
2560 struct r100_mc_save save; 2560 struct r100_mc_save save;
2561 u32 status, tmp; 2561 u32 status, tmp;
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index 718b12b03b57..7e417d8dc733 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -410,7 +410,7 @@ static void r300_gpu_init(struct radeon_device *rdev)
410 rdev->num_gb_pipes, rdev->num_z_pipes); 410 rdev->num_gb_pipes, rdev->num_z_pipes);
411} 411}
412 412
413int r300_asic_reset(struct radeon_device *rdev) 413int r300_asic_reset(struct radeon_device *rdev, bool hard)
414{ 414{
415 struct r100_mc_save save; 415 struct r100_mc_save save;
416 u32 status, tmp; 416 u32 status, tmp;
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 24fa982522ee..d7896bb553a9 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1871,10 +1871,15 @@ static void r600_gpu_pci_config_reset(struct radeon_device *rdev)
1871 } 1871 }
1872} 1872}
1873 1873
1874int r600_asic_reset(struct radeon_device *rdev) 1874int r600_asic_reset(struct radeon_device *rdev, bool hard)
1875{ 1875{
1876 u32 reset_mask; 1876 u32 reset_mask;
1877 1877
1878 if (hard) {
1879 r600_gpu_pci_config_reset(rdev);
1880 return 0;
1881 }
1882
1878 reset_mask = r600_gpu_check_soft_reset(rdev); 1883 reset_mask = r600_gpu_check_soft_reset(rdev);
1879 1884
1880 if (reset_mask) 1885 if (reset_mask)
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 91828ecf39cf..1ededd1a86f5 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1854,7 +1854,7 @@ struct radeon_asic {
1854 int (*resume)(struct radeon_device *rdev); 1854 int (*resume)(struct radeon_device *rdev);
1855 int (*suspend)(struct radeon_device *rdev); 1855 int (*suspend)(struct radeon_device *rdev);
1856 void (*vga_set_state)(struct radeon_device *rdev, bool state); 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 /* Flush the HDP cache via MMIO */ 1858 /* Flush the HDP cache via MMIO */
1859 void (*mmio_hdp_flush)(struct radeon_device *rdev); 1859 void (*mmio_hdp_flush)(struct radeon_device *rdev);
1860 /* check if 3D engine is idle */ 1860 /* check if 3D engine is idle */
@@ -2720,7 +2720,7 @@ static inline void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
2720#define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) 2720#define radeon_suspend(rdev) (rdev)->asic->suspend((rdev))
2721#define radeon_cs_parse(rdev, r, p) (rdev)->asic->ring[(r)]->cs_parse((p)) 2721#define radeon_cs_parse(rdev, r, p) (rdev)->asic->ring[(r)]->cs_parse((p))
2722#define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) 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#define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev)) 2724#define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev))
2725#define radeon_gart_get_page_entry(a, f) (rdev)->asic->gart.get_page_entry((a), (f)) 2725#define radeon_gart_get_page_entry(a, f) (rdev)->asic->gart.get_page_entry((a), (f))
2726#define radeon_gart_set_page(rdev, i, e) (rdev)->asic->gart.set_page((rdev), (i), (e)) 2726#define radeon_gart_set_page(rdev, i, e) (rdev)->asic->gart.set_page((rdev), (i), (e))
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index e0aa33262eac..7675dfaaa005 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -64,7 +64,7 @@ int r100_suspend(struct radeon_device *rdev);
64int r100_resume(struct radeon_device *rdev); 64int r100_resume(struct radeon_device *rdev);
65void r100_vga_set_state(struct radeon_device *rdev, bool state); 65void r100_vga_set_state(struct radeon_device *rdev, bool state);
66bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 66bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
67int r100_asic_reset(struct radeon_device *rdev); 67int r100_asic_reset(struct radeon_device *rdev, bool hard);
68u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); 68u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc);
69void r100_pci_gart_tlb_flush(struct radeon_device *rdev); 69void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
70uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags); 70uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags);
@@ -167,7 +167,7 @@ extern int r300_init(struct radeon_device *rdev);
167extern void r300_fini(struct radeon_device *rdev); 167extern void r300_fini(struct radeon_device *rdev);
168extern int r300_suspend(struct radeon_device *rdev); 168extern int r300_suspend(struct radeon_device *rdev);
169extern int r300_resume(struct radeon_device *rdev); 169extern int r300_resume(struct radeon_device *rdev);
170extern int r300_asic_reset(struct radeon_device *rdev); 170extern int r300_asic_reset(struct radeon_device *rdev, bool hard);
171extern void r300_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); 171extern void r300_ring_start(struct radeon_device *rdev, struct radeon_ring *ring);
172extern void r300_fence_ring_emit(struct radeon_device *rdev, 172extern void r300_fence_ring_emit(struct radeon_device *rdev,
173 struct radeon_fence *fence); 173 struct radeon_fence *fence);
@@ -225,7 +225,7 @@ extern int rs400_mc_wait_for_idle(struct radeon_device *rdev);
225/* 225/*
226 * rs600. 226 * rs600.
227 */ 227 */
228extern int rs600_asic_reset(struct radeon_device *rdev); 228extern int rs600_asic_reset(struct radeon_device *rdev, bool hard);
229extern int rs600_init(struct radeon_device *rdev); 229extern int rs600_init(struct radeon_device *rdev);
230extern void rs600_fini(struct radeon_device *rdev); 230extern void rs600_fini(struct radeon_device *rdev);
231extern int rs600_suspend(struct radeon_device *rdev); 231extern int rs600_suspend(struct radeon_device *rdev);
@@ -334,7 +334,7 @@ bool r600_dma_semaphore_ring_emit(struct radeon_device *rdev,
334void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 334void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
335bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 335bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring);
336bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 336bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
337int r600_asic_reset(struct radeon_device *rdev); 337int r600_asic_reset(struct radeon_device *rdev, bool hard);
338int r600_set_surface_reg(struct radeon_device *rdev, int reg, 338int r600_set_surface_reg(struct radeon_device *rdev, int reg,
339 uint32_t tiling_flags, uint32_t pitch, 339 uint32_t tiling_flags, uint32_t pitch,
340 uint32_t offset, uint32_t obj_size); 340 uint32_t offset, uint32_t obj_size);
@@ -513,7 +513,7 @@ int evergreen_suspend(struct radeon_device *rdev);
513int evergreen_resume(struct radeon_device *rdev); 513int evergreen_resume(struct radeon_device *rdev);
514bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 514bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
515bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 515bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
516int evergreen_asic_reset(struct radeon_device *rdev); 516int evergreen_asic_reset(struct radeon_device *rdev, bool hard);
517void evergreen_bandwidth_update(struct radeon_device *rdev); 517void evergreen_bandwidth_update(struct radeon_device *rdev);
518void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 518void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
519void evergreen_hpd_init(struct radeon_device *rdev); 519void evergreen_hpd_init(struct radeon_device *rdev);
@@ -606,7 +606,7 @@ int cayman_init(struct radeon_device *rdev);
606void cayman_fini(struct radeon_device *rdev); 606void cayman_fini(struct radeon_device *rdev);
607int cayman_suspend(struct radeon_device *rdev); 607int cayman_suspend(struct radeon_device *rdev);
608int cayman_resume(struct radeon_device *rdev); 608int cayman_resume(struct radeon_device *rdev);
609int cayman_asic_reset(struct radeon_device *rdev); 609int cayman_asic_reset(struct radeon_device *rdev, bool hard);
610void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 610void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
611int cayman_vm_init(struct radeon_device *rdev); 611int cayman_vm_init(struct radeon_device *rdev);
612void cayman_vm_fini(struct radeon_device *rdev); 612void cayman_vm_fini(struct radeon_device *rdev);
@@ -712,7 +712,7 @@ int si_suspend(struct radeon_device *rdev);
712int si_resume(struct radeon_device *rdev); 712int si_resume(struct radeon_device *rdev);
713bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 713bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
714bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 714bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
715int si_asic_reset(struct radeon_device *rdev); 715int si_asic_reset(struct radeon_device *rdev, bool hard);
716void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 716void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
717int si_irq_set(struct radeon_device *rdev); 717int si_irq_set(struct radeon_device *rdev);
718int si_irq_process(struct radeon_device *rdev); 718int si_irq_process(struct radeon_device *rdev);
@@ -817,7 +817,7 @@ void cik_fini(struct radeon_device *rdev);
817int cik_suspend(struct radeon_device *rdev); 817int cik_suspend(struct radeon_device *rdev);
818int cik_resume(struct radeon_device *rdev); 818int cik_resume(struct radeon_device *rdev);
819bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 819bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
820int cik_asic_reset(struct radeon_device *rdev); 820int cik_asic_reset(struct radeon_device *rdev, bool hard);
821void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 821void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
822int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring); 822int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring);
823int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring); 823int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring);
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 6244f4e44e9a..3c250c445bdb 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -444,7 +444,7 @@ void rs600_hpd_fini(struct radeon_device *rdev)
444 radeon_irq_kms_disable_hpd(rdev, disable); 444 radeon_irq_kms_disable_hpd(rdev, disable);
445} 445}
446 446
447int rs600_asic_reset(struct radeon_device *rdev) 447int rs600_asic_reset(struct radeon_device *rdev, bool hard)
448{ 448{
449 struct rv515_mc_save save; 449 struct rv515_mc_save save;
450 u32 status, tmp; 450 u32 status, tmp;
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index 9ef41188b814..7afe825ee561 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -4034,10 +4034,15 @@ static void si_gpu_pci_config_reset(struct radeon_device *rdev)
4034 } 4034 }
4035} 4035}
4036 4036
4037int si_asic_reset(struct radeon_device *rdev) 4037int si_asic_reset(struct radeon_device *rdev, bool hard)
4038{ 4038{
4039 u32 reset_mask; 4039 u32 reset_mask;
4040 4040
4041 if (hard) {
4042 si_gpu_pci_config_reset(rdev);
4043 return 0;
4044 }
4045
4041 reset_mask = si_gpu_check_soft_reset(rdev); 4046 reset_mask = si_gpu_check_soft_reset(rdev);
4042 4047
4043 if (reset_mask) 4048 if (reset_mask)