aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0609-drm-amdgpu-clean-up-pageflip-interrupt-handling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0609-drm-amdgpu-clean-up-pageflip-interrupt-handling.patch')
-rw-r--r--meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0609-drm-amdgpu-clean-up-pageflip-interrupt-handling.patch325
1 files changed, 325 insertions, 0 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0609-drm-amdgpu-clean-up-pageflip-interrupt-handling.patch b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0609-drm-amdgpu-clean-up-pageflip-interrupt-handling.patch
new file mode 100644
index 00000000..a3849c6c
--- /dev/null
+++ b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0609-drm-amdgpu-clean-up-pageflip-interrupt-handling.patch
@@ -0,0 +1,325 @@
+From e9bb44d265a9957190d32f0b2f011eb590c03cef Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Fri, 9 Oct 2015 11:38:49 -0400
+Subject: [PATCH 0609/1050] drm/amdgpu: clean up pageflip interrupt handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Check to make sure we aren't touching a non-existent
+display controller and simplify the code.
+
+Reviewed-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 70 +++++++++-------------------------
+ drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 70 +++++++++-------------------------
+ drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 70 +++++++++-------------------------
+ 3 files changed, 51 insertions(+), 159 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+index ec2bd6a..f040de2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+@@ -3332,37 +3332,20 @@ static int dce_v10_0_set_pageflip_irq_state(struct amdgpu_device *adev,
+ unsigned type,
+ enum amdgpu_interrupt_state state)
+ {
+- u32 reg, reg_block;
+- /* now deal with page flip IRQ */
+- switch (type) {
+- case AMDGPU_PAGEFLIP_IRQ_D1:
+- reg_block = CRTC0_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D2:
+- reg_block = CRTC1_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D3:
+- reg_block = CRTC2_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D4:
+- reg_block = CRTC3_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D5:
+- reg_block = CRTC4_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D6:
+- reg_block = CRTC5_REGISTER_OFFSET;
+- break;
+- default:
+- DRM_ERROR("invalid pageflip crtc %d\n", type);
+- return -EINVAL;
++ u32 reg;
++
++ if (type >= adev->mode_info.num_crtc) {
++ DRM_ERROR("invalid pageflip crtc %d\n", type);
++ return -EINVAL;
+ }
+
+- reg = RREG32(mmGRPH_INTERRUPT_CONTROL + reg_block);
++ reg = RREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type]);
+ if (state == AMDGPU_IRQ_STATE_DISABLE)
+- WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
++ WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
++ reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
+ else
+- WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
++ WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
++ reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
+
+ return 0;
+ }
+@@ -3371,7 +3354,6 @@ static int dce_v10_0_pageflip_irq(struct amdgpu_device *adev,
+ struct amdgpu_irq_src *source,
+ struct amdgpu_iv_entry *entry)
+ {
+- int reg_block;
+ unsigned long flags;
+ unsigned crtc_id;
+ struct amdgpu_crtc *amdgpu_crtc;
+@@ -3380,33 +3362,15 @@ static int dce_v10_0_pageflip_irq(struct amdgpu_device *adev,
+ crtc_id = (entry->src_id - 8) >> 1;
+ amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
+
+- /* ack the interrupt */
+- switch(crtc_id){
+- case AMDGPU_PAGEFLIP_IRQ_D1:
+- reg_block = CRTC0_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D2:
+- reg_block = CRTC1_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D3:
+- reg_block = CRTC2_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D4:
+- reg_block = CRTC3_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D5:
+- reg_block = CRTC4_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D6:
+- reg_block = CRTC5_REGISTER_OFFSET;
+- break;
+- default:
+- DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
+- return -EINVAL;
++ if (crtc_id >= adev->mode_info.num_crtc) {
++ DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
++ return -EINVAL;
+ }
+
+- if (RREG32(mmGRPH_INTERRUPT_STATUS + reg_block) & GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
+- WREG32(mmGRPH_INTERRUPT_STATUS + reg_block, GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
++ if (RREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id]) &
++ GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
++ WREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id],
++ GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
+
+ /* IRQ could occur when in initial stage */
+ if (amdgpu_crtc == NULL)
+diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+index 50cd429..f35d1aa 100644
+--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+@@ -3308,37 +3308,20 @@ static int dce_v11_0_set_pageflip_irq_state(struct amdgpu_device *adev,
+ unsigned type,
+ enum amdgpu_interrupt_state state)
+ {
+- u32 reg, reg_block;
+- /* now deal with page flip IRQ */
+- switch (type) {
+- case AMDGPU_PAGEFLIP_IRQ_D1:
+- reg_block = CRTC0_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D2:
+- reg_block = CRTC1_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D3:
+- reg_block = CRTC2_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D4:
+- reg_block = CRTC3_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D5:
+- reg_block = CRTC4_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D6:
+- reg_block = CRTC5_REGISTER_OFFSET;
+- break;
+- default:
+- DRM_ERROR("invalid pageflip crtc %d\n", type);
+- return -EINVAL;
++ u32 reg;
++
++ if (type >= adev->mode_info.num_crtc) {
++ DRM_ERROR("invalid pageflip crtc %d\n", type);
++ return -EINVAL;
+ }
+
+- reg = RREG32(mmGRPH_INTERRUPT_CONTROL + reg_block);
++ reg = RREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type]);
+ if (state == AMDGPU_IRQ_STATE_DISABLE)
+- WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
++ WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
++ reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
+ else
+- WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
++ WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
++ reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
+
+ return 0;
+ }
+@@ -3347,7 +3330,6 @@ static int dce_v11_0_pageflip_irq(struct amdgpu_device *adev,
+ struct amdgpu_irq_src *source,
+ struct amdgpu_iv_entry *entry)
+ {
+- int reg_block;
+ unsigned long flags;
+ unsigned crtc_id;
+ struct amdgpu_crtc *amdgpu_crtc;
+@@ -3356,33 +3338,15 @@ static int dce_v11_0_pageflip_irq(struct amdgpu_device *adev,
+ crtc_id = (entry->src_id - 8) >> 1;
+ amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
+
+- /* ack the interrupt */
+- switch(crtc_id){
+- case AMDGPU_PAGEFLIP_IRQ_D1:
+- reg_block = CRTC0_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D2:
+- reg_block = CRTC1_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D3:
+- reg_block = CRTC2_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D4:
+- reg_block = CRTC3_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D5:
+- reg_block = CRTC4_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D6:
+- reg_block = CRTC5_REGISTER_OFFSET;
+- break;
+- default:
+- DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
+- return -EINVAL;
++ if (crtc_id >= adev->mode_info.num_crtc) {
++ DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
++ return -EINVAL;
+ }
+
+- if (RREG32(mmGRPH_INTERRUPT_STATUS + reg_block) & GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
+- WREG32(mmGRPH_INTERRUPT_STATUS + reg_block, GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
++ if (RREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id]) &
++ GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
++ WREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id],
++ GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
+
+ /* IRQ could occur when in initial stage */
+ if(amdgpu_crtc == NULL)
+diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+index 02f2100..0a0e8f0 100644
+--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+@@ -3339,37 +3339,20 @@ static int dce_v8_0_set_pageflip_interrupt_state(struct amdgpu_device *adev,
+ unsigned type,
+ enum amdgpu_interrupt_state state)
+ {
+- u32 reg, reg_block;
+- /* now deal with page flip IRQ */
+- switch (type) {
+- case AMDGPU_PAGEFLIP_IRQ_D1:
+- reg_block = CRTC0_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D2:
+- reg_block = CRTC1_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D3:
+- reg_block = CRTC2_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D4:
+- reg_block = CRTC3_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D5:
+- reg_block = CRTC4_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D6:
+- reg_block = CRTC5_REGISTER_OFFSET;
+- break;
+- default:
+- DRM_ERROR("invalid pageflip crtc %d\n", type);
+- return -EINVAL;
++ u32 reg;
++
++ if (type >= adev->mode_info.num_crtc) {
++ DRM_ERROR("invalid pageflip crtc %d\n", type);
++ return -EINVAL;
+ }
+
+- reg = RREG32(mmGRPH_INTERRUPT_CONTROL + reg_block);
++ reg = RREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type]);
+ if (state == AMDGPU_IRQ_STATE_DISABLE)
+- WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
++ WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
++ reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
+ else
+- WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
++ WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
++ reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
+
+ return 0;
+ }
+@@ -3378,7 +3361,6 @@ static int dce_v8_0_pageflip_irq(struct amdgpu_device *adev,
+ struct amdgpu_irq_src *source,
+ struct amdgpu_iv_entry *entry)
+ {
+- int reg_block;
+ unsigned long flags;
+ unsigned crtc_id;
+ struct amdgpu_crtc *amdgpu_crtc;
+@@ -3387,33 +3369,15 @@ static int dce_v8_0_pageflip_irq(struct amdgpu_device *adev,
+ crtc_id = (entry->src_id - 8) >> 1;
+ amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
+
+- /* ack the interrupt */
+- switch(crtc_id){
+- case AMDGPU_PAGEFLIP_IRQ_D1:
+- reg_block = CRTC0_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D2:
+- reg_block = CRTC1_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D3:
+- reg_block = CRTC2_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D4:
+- reg_block = CRTC3_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D5:
+- reg_block = CRTC4_REGISTER_OFFSET;
+- break;
+- case AMDGPU_PAGEFLIP_IRQ_D6:
+- reg_block = CRTC5_REGISTER_OFFSET;
+- break;
+- default:
+- DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
+- return -EINVAL;
++ if (crtc_id >= adev->mode_info.num_crtc) {
++ DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
++ return -EINVAL;
+ }
+
+- if (RREG32(mmGRPH_INTERRUPT_STATUS + reg_block) & GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
+- WREG32(mmGRPH_INTERRUPT_STATUS + reg_block, GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
++ if (RREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id]) &
++ GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
++ WREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id],
++ GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
+
+ /* IRQ could occur when in initial stage */
+ if (amdgpu_crtc == NULL)
+--
+1.9.1
+