diff options
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 7 |
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 | */ |
5269 | int cik_asic_reset(struct radeon_device *rdev) | 5270 | int 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 | ||
3987 | int evergreen_asic_reset(struct radeon_device *rdev) | 3987 | int 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 | ||
1962 | int cayman_asic_reset(struct radeon_device *rdev) | 1962 | int 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 | ||
2558 | int r100_asic_reset(struct radeon_device *rdev) | 2558 | int 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 | ||
413 | int r300_asic_reset(struct radeon_device *rdev) | 413 | int 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 | ||
1874 | int r600_asic_reset(struct radeon_device *rdev) | 1874 | int 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); | |||
64 | int r100_resume(struct radeon_device *rdev); | 64 | int r100_resume(struct radeon_device *rdev); |
65 | void r100_vga_set_state(struct radeon_device *rdev, bool state); | 65 | void r100_vga_set_state(struct radeon_device *rdev, bool state); |
66 | bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | 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 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); | 68 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); |
69 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); | 69 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); |
70 | uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags); | 70 | uint64_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); | |||
167 | extern void r300_fini(struct radeon_device *rdev); | 167 | extern void r300_fini(struct radeon_device *rdev); |
168 | extern int r300_suspend(struct radeon_device *rdev); | 168 | extern int r300_suspend(struct radeon_device *rdev); |
169 | extern int r300_resume(struct radeon_device *rdev); | 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 | extern void r300_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); | 171 | extern void r300_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); |
172 | extern void r300_fence_ring_emit(struct radeon_device *rdev, | 172 | extern 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 | */ |
228 | extern int rs600_asic_reset(struct radeon_device *rdev); | 228 | extern int rs600_asic_reset(struct radeon_device *rdev, bool hard); |
229 | extern int rs600_init(struct radeon_device *rdev); | 229 | extern int rs600_init(struct radeon_device *rdev); |
230 | extern void rs600_fini(struct radeon_device *rdev); | 230 | extern void rs600_fini(struct radeon_device *rdev); |
231 | extern int rs600_suspend(struct radeon_device *rdev); | 231 | extern int rs600_suspend(struct radeon_device *rdev); |
@@ -334,7 +334,7 @@ bool r600_dma_semaphore_ring_emit(struct radeon_device *rdev, | |||
334 | void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 334 | void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
335 | bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); | 335 | bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); |
336 | bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | 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 | int r600_set_surface_reg(struct radeon_device *rdev, int reg, | 338 | int 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); | |||
513 | int evergreen_resume(struct radeon_device *rdev); | 513 | int evergreen_resume(struct radeon_device *rdev); |
514 | bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | 514 | bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); |
515 | bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | 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 | void evergreen_bandwidth_update(struct radeon_device *rdev); | 517 | void evergreen_bandwidth_update(struct radeon_device *rdev); |
518 | void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 518 | void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
519 | void evergreen_hpd_init(struct radeon_device *rdev); | 519 | void evergreen_hpd_init(struct radeon_device *rdev); |
@@ -606,7 +606,7 @@ int cayman_init(struct radeon_device *rdev); | |||
606 | void cayman_fini(struct radeon_device *rdev); | 606 | void cayman_fini(struct radeon_device *rdev); |
607 | int cayman_suspend(struct radeon_device *rdev); | 607 | int cayman_suspend(struct radeon_device *rdev); |
608 | int cayman_resume(struct radeon_device *rdev); | 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 | void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 610 | void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
611 | int cayman_vm_init(struct radeon_device *rdev); | 611 | int cayman_vm_init(struct radeon_device *rdev); |
612 | void cayman_vm_fini(struct radeon_device *rdev); | 612 | void cayman_vm_fini(struct radeon_device *rdev); |
@@ -712,7 +712,7 @@ int si_suspend(struct radeon_device *rdev); | |||
712 | int si_resume(struct radeon_device *rdev); | 712 | int si_resume(struct radeon_device *rdev); |
713 | bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | 713 | bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); |
714 | bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | 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 | void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 716 | void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
717 | int si_irq_set(struct radeon_device *rdev); | 717 | int si_irq_set(struct radeon_device *rdev); |
718 | int si_irq_process(struct radeon_device *rdev); | 718 | int si_irq_process(struct radeon_device *rdev); |
@@ -817,7 +817,7 @@ void cik_fini(struct radeon_device *rdev); | |||
817 | int cik_suspend(struct radeon_device *rdev); | 817 | int cik_suspend(struct radeon_device *rdev); |
818 | int cik_resume(struct radeon_device *rdev); | 818 | int cik_resume(struct radeon_device *rdev); |
819 | bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | 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 | void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 821 | void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
822 | int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring); | 822 | int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring); |
823 | int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring); | 823 | int 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 | ||
447 | int rs600_asic_reset(struct radeon_device *rdev) | 447 | int 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 | ||
4037 | int si_asic_reset(struct radeon_device *rdev) | 4037 | int 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) |