aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0861-drm-amdgpu-Use-asic-specific-doorbell-index-instead-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0861-drm-amdgpu-Use-asic-specific-doorbell-index-instead-.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0861-drm-amdgpu-Use-asic-specific-doorbell-index-instead-.patch299
1 files changed, 299 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0861-drm-amdgpu-Use-asic-specific-doorbell-index-instead-.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0861-drm-amdgpu-Use-asic-specific-doorbell-index-instead-.patch
new file mode 100644
index 00000000..2e77d51e
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0861-drm-amdgpu-Use-asic-specific-doorbell-index-instead-.patch
@@ -0,0 +1,299 @@
+From 441d734215240d81be6e0daa241e2408a24c4b8a Mon Sep 17 00:00:00 2001
+From: Oak Zeng <ozeng@amd.com>
+Date: Mon, 19 Nov 2018 15:20:07 -0600
+Subject: [PATCH 0861/2940] drm/amdgpu: Use asic specific doorbell index
+ instead of macro definition
+
+ASIC specific doorbell layout is used instead of enum definition
+
+Signed-off-by: Oak Zeng <ozeng@amd.com>
+Suggested-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Suggested-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 27 +++++++---------------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 2 +-
+ drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 2 +-
+ drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 10 ++++----
+ drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 8 +++----
+ drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 2 +-
+ drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 25 ++++++++------------
+ drivers/gpu/drm/amd/amdgpu/tonga_ih.c | 2 +-
+ drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | 4 ++--
+ drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 4 ++--
+ drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 2 +-
+ 12 files changed, 36 insertions(+), 54 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+index 9ef877f0c87d..5070c4756259 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+@@ -193,25 +193,14 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
+ * process in case of 64-bit doorbells so we
+ * can use each doorbell assignment twice.
+ */
+- if (adev->asic_type == CHIP_VEGA10) {
+- gpu_resources.sdma_doorbell[0][i] =
+- AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 + (i >> 1);
+- gpu_resources.sdma_doorbell[0][i+1] =
+- AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 + 0x200 + (i >> 1);
+- gpu_resources.sdma_doorbell[1][i] =
+- AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 + (i >> 1);
+- gpu_resources.sdma_doorbell[1][i+1] =
+- AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 + 0x200 + (i >> 1);
+- } else {
+- gpu_resources.sdma_doorbell[0][i] =
+- AMDGPU_DOORBELL64_sDMA_ENGINE0 + (i >> 1);
+- gpu_resources.sdma_doorbell[0][i+1] =
+- AMDGPU_DOORBELL64_sDMA_ENGINE0 + 0x200 + (i >> 1);
+- gpu_resources.sdma_doorbell[1][i] =
+- AMDGPU_DOORBELL64_sDMA_ENGINE1 + (i >> 1);
+- gpu_resources.sdma_doorbell[1][i+1] =
+- AMDGPU_DOORBELL64_sDMA_ENGINE1 + 0x200 + (i >> 1);
+- }
++ gpu_resources.sdma_doorbell[0][i] =
++ adev->doorbell_index.sdma_engine0 + (i >> 1);
++ gpu_resources.sdma_doorbell[0][i+1] =
++ adev->doorbell_index.sdma_engine0 + 0x200 + (i >> 1);
++ gpu_resources.sdma_doorbell[1][i] =
++ adev->doorbell_index.sdma_engine1 + (i >> 1);
++ gpu_resources.sdma_doorbell[1][i+1] =
++ adev->doorbell_index.sdma_engine1 + 0x200 + (i >> 1);
+ }
+ /* Doorbells 0x0f0-0ff and 0x2f0-2ff are reserved for
+ * SDMA, IH and VCN. So don't use them for the CP.
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index c323fd2b7d18..7b4e02835906 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -532,7 +532,7 @@ static int amdgpu_device_doorbell_init(struct amdgpu_device *adev)
+ adev->doorbell.size = pci_resource_len(adev->pdev, 2);
+
+ adev->doorbell.num_doorbells = min_t(u32, adev->doorbell.size / sizeof(u32),
+- AMDGPU_DOORBELL_MAX_ASSIGNMENT+1);
++ adev->doorbell_index.max_assignment+1);
+ if (adev->doorbell.num_doorbells == 0)
+ return -EINVAL;
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
+index 6a70c0b7105f..97a60da62004 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
+@@ -250,7 +250,7 @@ int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,
+ ring->adev = NULL;
+ ring->ring_obj = NULL;
+ ring->use_doorbell = true;
+- ring->doorbell_index = AMDGPU_DOORBELL_KIQ;
++ ring->doorbell_index = adev->doorbell_index.kiq;
+
+ r = amdgpu_gfx_kiq_acquire(adev, ring);
+ if (r)
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+index f467b9bd090d..3a9fb6018c16 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+@@ -4363,7 +4363,7 @@ static int gfx_v7_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,
+
+ ring->ring_obj = NULL;
+ ring->use_doorbell = true;
+- ring->doorbell_index = AMDGPU_DOORBELL_MEC_RING0 + ring_id;
++ ring->doorbell_index = adev->doorbell_index.mec_ring0 + ring_id;
+ sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
+
+ irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+index 326e5b1cd2c1..f454067ba369 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+@@ -1890,7 +1890,7 @@ static int gfx_v8_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,
+
+ ring->ring_obj = NULL;
+ ring->use_doorbell = true;
+- ring->doorbell_index = AMDGPU_DOORBELL_MEC_RING0 + ring_id;
++ ring->doorbell_index = adev->doorbell_index.mec_ring0 + ring_id;
+ ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr
+ + (ring_id * GFX8_MEC_HPD_SIZE);
+ sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
+@@ -2001,7 +2001,7 @@ static int gfx_v8_0_sw_init(void *handle)
+ /* no gfx doorbells on iceland */
+ if (adev->asic_type != CHIP_TOPAZ) {
+ ring->use_doorbell = true;
+- ring->doorbell_index = AMDGPU_DOORBELL_GFX_RING0;
++ ring->doorbell_index = adev->doorbell_index.gfx_ring0;
+ }
+
+ r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq,
+@@ -4215,7 +4215,7 @@ static void gfx_v8_0_set_cpg_door_bell(struct amdgpu_device *adev, struct amdgpu
+
+ tmp = REG_SET_FIELD(0, CP_RB_DOORBELL_RANGE_LOWER,
+ DOORBELL_RANGE_LOWER,
+- AMDGPU_DOORBELL_GFX_RING0);
++ adev->doorbell_index.gfx_ring0);
+ WREG32(mmCP_RB_DOORBELL_RANGE_LOWER, tmp);
+
+ WREG32(mmCP_RB_DOORBELL_RANGE_UPPER,
+@@ -4644,8 +4644,8 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring)
+ static void gfx_v8_0_set_mec_doorbell_range(struct amdgpu_device *adev)
+ {
+ if (adev->asic_type > CHIP_TONGA) {
+- WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, AMDGPU_DOORBELL_KIQ << 2);
+- WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, AMDGPU_DOORBELL_MEC_RING7 << 2);
++ WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, adev->doorbell_index.kiq << 2);
++ WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, adev->doorbell_index.mec_ring7 << 2);
+ }
+ /* enable doorbells */
+ WREG32_FIELD(CP_PQ_STATUS, DOORBELL_ENABLE, 1);
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+index 269c1ef9421d..210e15a18f57 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+@@ -1580,7 +1580,7 @@ static int gfx_v9_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,
+
+ ring->ring_obj = NULL;
+ ring->use_doorbell = true;
+- ring->doorbell_index = (AMDGPU_DOORBELL64_MEC_RING0 + ring_id) << 1;
++ ring->doorbell_index = (adev->doorbell_index.mec_ring0 + ring_id) << 1;
+ ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr
+ + (ring_id * GFX9_MEC_HPD_SIZE);
+ sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
+@@ -1669,7 +1669,7 @@ static int gfx_v9_0_sw_init(void *handle)
+ else
+ sprintf(ring->name, "gfx_%d", i);
+ ring->use_doorbell = true;
+- ring->doorbell_index = AMDGPU_DOORBELL64_GFX_RING0 << 1;
++ ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1;
+ r = amdgpu_ring_init(adev, ring, 1024,
+ &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP);
+ if (r)
+@@ -3000,9 +3000,9 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring)
+ /* enable the doorbell if requested */
+ if (ring->use_doorbell) {
+ WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER,
+- (AMDGPU_DOORBELL64_KIQ *2) << 2);
++ (adev->doorbell_index.kiq * 2) << 2);
+ WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER,
+- (AMDGPU_DOORBELL64_USERQUEUE_END * 2) << 2);
++ (adev->doorbell_index.userqueue_end * 2) << 2);
+ }
+
+ WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL,
+diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+index a9848d28707d..b522f308516f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+@@ -1146,7 +1146,7 @@ static int sdma_v3_0_sw_init(void *handle)
+ if (!amdgpu_sriov_vf(adev)) {
+ ring->use_doorbell = true;
+ ring->doorbell_index = (i == 0) ?
+- AMDGPU_DOORBELL_sDMA_ENGINE0 : AMDGPU_DOORBELL_sDMA_ENGINE1;
++ adev->doorbell_index.sdma_engine0 : adev->doorbell_index.sdma_engine1;
+ } else {
+ ring->use_pollmem = true;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+index 59e454768ebe..f51ba342f659 100644
+--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+@@ -1520,15 +1520,13 @@ static int sdma_v4_0_sw_init(void *handle)
+ ring->ring_obj = NULL;
+ ring->use_doorbell = true;
+
++ DRM_INFO("use_doorbell being set to: [%s]\n",
++ ring->use_doorbell?"true":"false");
++
+ /* doorbell size is 2 dwords, get DWORD offset */
+- if (adev->asic_type == CHIP_VEGA10)
+- ring->doorbell_index = (i == 0) ?
+- (AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 << 1)
+- : (AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 << 1);
+- else
+- ring->doorbell_index = (i == 0) ?
+- (AMDGPU_DOORBELL64_sDMA_ENGINE0 << 1)
+- : (AMDGPU_DOORBELL64_sDMA_ENGINE1 << 1);
++ ring->doorbell_index = (i == 0) ?
++ (adev->doorbell_index.sdma_engine0 << 1)
++ : (adev->doorbell_index.sdma_engine1 << 1);
+
+ sprintf(ring->name, "sdma%d", i);
+ r = amdgpu_ring_init(adev, ring, 1024,
+@@ -1547,14 +1545,9 @@ static int sdma_v4_0_sw_init(void *handle)
+ /* paging queue use same doorbell index/routing as gfx queue
+ * with 0x400 (4096 dwords) offset on second doorbell page
+ */
+- if (adev->asic_type == CHIP_VEGA10)
+- ring->doorbell_index = (i == 0) ?
+- (AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 << 1)
+- : (AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 << 1);
+- else
+- ring->doorbell_index = (i == 0) ?
+- (AMDGPU_DOORBELL64_sDMA_ENGINE0 << 1)
+- : (AMDGPU_DOORBELL64_sDMA_ENGINE1 << 1);
++ ring->doorbell_index = (i == 0) ?
++ (adev->doorbell_index.sdma_engine0 << 1)
++ : (adev->doorbell_index.sdma_engine1 << 1);
+ ring->doorbell_index += 0x400;
+
+ sprintf(ring->name, "page%d", i);
+diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
+index 3abffd06b5c7..dcdbb4d72472 100644
+--- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
++++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
+@@ -322,7 +322,7 @@ static int tonga_ih_sw_init(void *handle)
+ return r;
+
+ adev->irq.ih.use_doorbell = true;
+- adev->irq.ih.doorbell_index = AMDGPU_DOORBELL_IH;
++ adev->irq.ih.doorbell_index = adev->doorbell_index.ih;
+
+ r = amdgpu_irq_init(adev);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
+index 8a4595968d98..3680a013743b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
+@@ -455,9 +455,9 @@ static int uvd_v7_0_sw_init(void *handle)
+ * sriov, so set unused location for other unused rings.
+ */
+ if (i == 0)
+- ring->doorbell_index = AMDGPU_DOORBELL64_UVD_RING0_1 * 2;
++ ring->doorbell_index = adev->doorbell_index.uvd_vce.uvd_ring0_1 * 2;
+ else
+- ring->doorbell_index = AMDGPU_DOORBELL64_UVD_RING2_3 * 2 + 1;
++ ring->doorbell_index = adev->doorbell_index.uvd_vce.uvd_ring2_3 * 2 + 1;
+ }
+ r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst[j].irq, 0);
+ if (r)
+diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
+index 0054ba1b9a68..9fb34b7d8e03 100644
+--- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
+@@ -466,9 +466,9 @@ static int vce_v4_0_sw_init(void *handle)
+ * so set unused location for other unused rings.
+ */
+ if (i == 0)
+- ring->doorbell_index = AMDGPU_DOORBELL64_VCE_RING0_1 * 2;
++ ring->doorbell_index = adev->doorbell_index.uvd_vce.vce_ring0_1 * 2;
+ else
+- ring->doorbell_index = AMDGPU_DOORBELL64_VCE_RING2_3 * 2 + 1;
++ ring->doorbell_index = adev->doorbell_index.uvd_vce.vce_ring2_3 * 2 + 1;
+ }
+ r = amdgpu_ring_init(adev, ring, 512, &adev->vce.irq, 0);
+ if (r)
+diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
+index 55b99ba540d8..7afdb49ffa9f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
++++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
+@@ -385,7 +385,7 @@ static int vega10_ih_sw_init(void *handle)
+ return r;
+
+ adev->irq.ih.use_doorbell = true;
+- adev->irq.ih.doorbell_index = AMDGPU_DOORBELL64_IH << 1;
++ adev->irq.ih.doorbell_index = adev->doorbell_index.ih << 1;
+
+ r = amdgpu_irq_init(adev);
+
+--
+2.17.1
+