Commit 52840607 authored by Huacai Chen's avatar Huacai Chen Committed by Hongchen Zhang
Browse files

drm/radeon: Workaround radeon driver bug for Loongson

LoongArch inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5OHOB



--------------------------------

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: default avatarHuacai Chen <chenhuacai@loongson.cn>
Signed-off-by: default avatarZhijie Zhang <zhangzhijie@loongson.cn>
parent f6b83a8c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -8093,6 +8093,9 @@ int cik_irq_process(struct radeon_device *rdev)
	if (queue_thermal)
		schedule_work(&rdev->pm.dpm.thermal.work);
	rdev->ih.rptr = rptr;
#ifdef CONFIG_LOONGARCH
	WREG32(IH_RB_RPTR, rptr);
#endif
	atomic_set(&rdev->ih.lock, 0);

	/* make sure wptr hasn't changed while processing */
+3 −0
Original line number Diff line number Diff line
@@ -4922,6 +4922,9 @@ int evergreen_irq_process(struct radeon_device *rdev)
	if (queue_thermal && rdev->pm.dpm_enabled)
		schedule_work(&rdev->pm.dpm.thermal.work);
	rdev->ih.rptr = rptr;
#ifdef CONFIG_LOONGARCH
	WREG32(IH_RB_RPTR, rptr);
#endif
	atomic_set(&rdev->ih.lock, 0);

	/* make sure wptr hasn't changed while processing */
+3 −0
Original line number Diff line number Diff line
@@ -4328,6 +4328,9 @@ int r600_irq_process(struct radeon_device *rdev)
	if (queue_thermal && rdev->pm.dpm_enabled)
		schedule_work(&rdev->pm.dpm.thermal.work);
	rdev->ih.rptr = rptr;
#ifdef CONFIG_LOONGARCH
	WREG32(IH_RB_RPTR, rptr);
#endif
	atomic_set(&rdev->ih.lock, 0);

	/* make sure wptr hasn't changed while processing */
+3 −0
Original line number Diff line number Diff line
@@ -6438,6 +6438,9 @@ int si_irq_process(struct radeon_device *rdev)
	if (queue_thermal && rdev->pm.dpm_enabled)
		schedule_work(&rdev->pm.dpm.thermal.work);
	rdev->ih.rptr = rptr;
#ifdef CONFIG_LOONGARCH
	WREG32(IH_RB_RPTR, rptr);
#endif
	atomic_set(&rdev->ih.lock, 0);

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