Skip to content

Commit 608cc09

Browse files
chenhuacaiMingcongBai
authored andcommitted
LOONGSON: drm/radeon: Workaround radeon driver bug for Loongson
Radeon driver can not handle the interrupt is faster than DMA data, so irq handler must update an old ih.rptr value in IH_RB_RPTR register to enable interrupt again when interrupt is faster than DMA data. Signed-off-by: Huacai Chen <chenhuacai@loongson.cn> Signed-off-by: Zhijie Zhang <zhangzhijie@loongson.cn> Link: chenhuacai/linux@6266d00 Signed-off-by: Kexy Biscuit <kexybiscuit@aosc.io> Signed-off-by: Mingcong Bai <jeffbai@aosc.io>
1 parent 85bc88a commit 608cc09

4 files changed

Lines changed: 4 additions & 0 deletions

File tree

drivers/gpu/drm/radeon/cik.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8093,6 +8093,7 @@ int cik_irq_process(struct radeon_device *rdev)
80938093
if (queue_thermal)
80948094
schedule_work(&rdev->pm.dpm.thermal.work);
80958095
rdev->ih.rptr = rptr;
8096+
WREG32(IH_RB_RPTR, rptr);
80968097
atomic_set(&rdev->ih.lock, 0);
80978098

80988099
/* make sure wptr hasn't changed while processing */

drivers/gpu/drm/radeon/evergreen.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4927,6 +4927,7 @@ int evergreen_irq_process(struct radeon_device *rdev)
49274927
if (queue_thermal && rdev->pm.dpm_enabled)
49284928
schedule_work(&rdev->pm.dpm.thermal.work);
49294929
rdev->ih.rptr = rptr;
4930+
WREG32(IH_RB_RPTR, rptr);
49304931
atomic_set(&rdev->ih.lock, 0);
49314932

49324933
/* make sure wptr hasn't changed while processing */

drivers/gpu/drm/radeon/r600.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4328,6 +4328,7 @@ int r600_irq_process(struct radeon_device *rdev)
43284328
if (queue_thermal && rdev->pm.dpm_enabled)
43294329
schedule_work(&rdev->pm.dpm.thermal.work);
43304330
rdev->ih.rptr = rptr;
4331+
WREG32(IH_RB_RPTR, rptr);
43314332
atomic_set(&rdev->ih.lock, 0);
43324333

43334334
/* make sure wptr hasn't changed while processing */

drivers/gpu/drm/radeon/si.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6423,6 +6423,7 @@ int si_irq_process(struct radeon_device *rdev)
64236423
if (queue_thermal && rdev->pm.dpm_enabled)
64246424
schedule_work(&rdev->pm.dpm.thermal.work);
64256425
rdev->ih.rptr = rptr;
6426+
WREG32(IH_RB_RPTR, rptr);
64266427
atomic_set(&rdev->ih.lock, 0);
64276428

64286429
/* make sure wptr hasn't changed while processing */

0 commit comments

Comments
 (0)