aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1614-drm-amdgpu-enable-IH-doorbell-for-ring-1-2-on-Vega.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1614-drm-amdgpu-enable-IH-doorbell-for-ring-1-2-on-Vega.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1614-drm-amdgpu-enable-IH-doorbell-for-ring-1-2-on-Vega.patch164
1 files changed, 164 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1614-drm-amdgpu-enable-IH-doorbell-for-ring-1-2-on-Vega.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1614-drm-amdgpu-enable-IH-doorbell-for-ring-1-2-on-Vega.patch
new file mode 100644
index 00000000..708d2cf5
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1614-drm-amdgpu-enable-IH-doorbell-for-ring-1-2-on-Vega.patch
@@ -0,0 +1,164 @@
+From 84df90d7d953a50814dea0869d7609e7d289c049 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Wed, 27 Feb 2019 15:05:20 +0100
+Subject: [PATCH 1614/2940] drm/amdgpu: enable IH doorbell for ring 1&2 on Vega
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The doorbells should already be reserved, just enable them.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Acked-by: Chunming Zhou <david1.zhou@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c | 3 +-
+ drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 66 +++++++++++++++++---------
+ 2 files changed, 45 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c b/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c
+index cc967dbfd631..6590143c3f75 100644
+--- a/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c
++++ b/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c
+@@ -118,7 +118,8 @@ static void nbio_v6_1_ih_doorbell_range(struct amdgpu_device *adev,
+
+ if (use_doorbell) {
+ ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, OFFSET, doorbell_index);
+- ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, SIZE, 2);
++ ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range,
++ BIF_IH_DOORBELL_RANGE, SIZE, 6);
+ } else
+ ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, SIZE, 0);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
+index d4a3cc413af8..fa45234f020f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
++++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
+@@ -136,6 +136,25 @@ static uint32_t vega10_ih_rb_cntl(struct amdgpu_ih_ring *ih, uint32_t ih_rb_cntl
+ return ih_rb_cntl;
+ }
+
++static uint32_t vega10_ih_doorbell_rptr(struct amdgpu_ih_ring *ih)
++{
++ u32 ih_doorbell_rtpr = 0;
++
++ if (ih->use_doorbell) {
++ ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr,
++ IH_DOORBELL_RPTR, OFFSET,
++ ih->doorbell_index);
++ ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr,
++ IH_DOORBELL_RPTR,
++ ENABLE, 1);
++ } else {
++ ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr,
++ IH_DOORBELL_RPTR,
++ ENABLE, 0);
++ }
++ return ih_doorbell_rtpr;
++}
++
+ /**
+ * vega10_ih_irq_init - init and enable the interrupt ring
+ *
+@@ -150,8 +169,8 @@ static uint32_t vega10_ih_rb_cntl(struct amdgpu_ih_ring *ih, uint32_t ih_rb_cntl
+ static int vega10_ih_irq_init(struct amdgpu_device *adev)
+ {
+ struct amdgpu_ih_ring *ih;
++ u32 ih_rb_cntl;
+ int ret = 0;
+- u32 ih_rb_cntl, ih_doorbell_rtpr;
+ u32 tmp;
+
+ /* disable irqs */
+@@ -177,23 +196,11 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
+ upper_32_bits(ih->wptr_addr) & 0xFFFF);
+
+ /* set rptr, wptr to 0 */
+- WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0);
+ WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR, 0);
++ WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0);
+
+- ih_doorbell_rtpr = RREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR);
+- if (adev->irq.ih.use_doorbell) {
+- ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr,
+- IH_DOORBELL_RPTR, OFFSET,
+- adev->irq.ih.doorbell_index);
+- ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr,
+- IH_DOORBELL_RPTR,
+- ENABLE, 1);
+- } else {
+- ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr,
+- IH_DOORBELL_RPTR,
+- ENABLE, 0);
+- }
+- WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR, ih_doorbell_rtpr);
++ WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR,
++ vega10_ih_doorbell_rptr(ih));
+
+ ih = &adev->irq.ih1;
+ if (ih->ring_size) {
+@@ -210,8 +217,11 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
+ WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1, ih_rb_cntl);
+
+ /* set rptr, wptr to 0 */
+- WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING1, 0);
+ WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_RING1, 0);
++ WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING1, 0);
++
++ WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR_RING1,
++ vega10_ih_doorbell_rptr(ih));
+ }
+
+ ih = &adev->irq.ih2;
+@@ -220,13 +230,16 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
+ WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_HI_RING2,
+ (ih->gpu_addr >> 40) & 0xff);
+
+- ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1);
++ ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2);
+ ih_rb_cntl = vega10_ih_rb_cntl(ih, ih_rb_cntl);
+ WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2, ih_rb_cntl);
+
+ /* set rptr, wptr to 0 */
+- WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING2, 0);
+ WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_RING2, 0);
++ WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING2, 0);
++
++ WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR_RING2,
++ vega10_ih_doorbell_rptr(ih));
+ }
+
+ tmp = RREG32_SOC15(OSSSYS, 0, mmIH_STORM_CLIENT_LIST_CNTL);
+@@ -453,19 +466,26 @@ static int vega10_ih_sw_init(void *handle)
+ if (r)
+ return r;
+
++ adev->irq.ih.use_doorbell = true;
++ adev->irq.ih.doorbell_index = adev->doorbell_index.ih << 1;
++
+ if (adev->asic_type == CHIP_VEGA10) {
+ r = amdgpu_ih_ring_init(adev, &adev->irq.ih1, PAGE_SIZE, true);
+ if (r)
+ return r;
+
++ adev->irq.ih1.use_doorbell = true;
++ adev->irq.ih1.doorbell_index =
++ (adev->doorbell_index.ih + 1) << 1;
++
+ r = amdgpu_ih_ring_init(adev, &adev->irq.ih2, PAGE_SIZE, true);
+ if (r)
+ return r;
+- }
+
+- /* TODO add doorbell for IH1 & IH2 as well */
+- adev->irq.ih.use_doorbell = true;
+- adev->irq.ih.doorbell_index = adev->doorbell_index.ih << 1;
++ adev->irq.ih2.use_doorbell = true;
++ adev->irq.ih2.doorbell_index =
++ (adev->doorbell_index.ih + 2) << 1;
++ }
+
+ r = amdgpu_irq_init(adev);
+
+--
+2.17.1
+