aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)