Commit 20ab3f03 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.

Change-Id: If15325e6c22c6e01e0fdf78588f0b4f2fd4ef569
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
Signed-off-by: default avatarZhijie Zhang <zhangzhijie@loongson.cn>
parent 2fae03bc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -8108,6 +8108,7 @@ int cik_irq_process(struct radeon_device *rdev)
	if (queue_thermal)
		schedule_work(&rdev->pm.dpm.thermal.work);
	rdev->ih.rptr = rptr;
	WREG32(IH_RB_RPTR, rptr);
	atomic_set(&rdev->ih.lock, 0);

	/* make sure wptr hasn't changed while processing */
+1 −0
Original line number Diff line number Diff line
@@ -4919,6 +4919,7 @@ 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;
	WREG32(IH_RB_RPTR, rptr);
	atomic_set(&rdev->ih.lock, 0);

	/* make sure wptr hasn't changed while processing */
+1 −0
Original line number Diff line number Diff line
@@ -4331,6 +4331,7 @@ 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;
	WREG32(IH_RB_RPTR, rptr);
	atomic_set(&rdev->ih.lock, 0);

	/* make sure wptr hasn't changed while processing */
+1 −0
Original line number Diff line number Diff line
@@ -6443,6 +6443,7 @@ 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;
	WREG32(IH_RB_RPTR, rptr);
	atomic_set(&rdev->ih.lock, 0);

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