aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/2048-drm-amdgpu-Fixed-missing-to-clear-some-EDC-count.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/2048-drm-amdgpu-Fixed-missing-to-clear-some-EDC-count.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/2048-drm-amdgpu-Fixed-missing-to-clear-some-EDC-count.patch142
1 files changed, 142 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/2048-drm-amdgpu-Fixed-missing-to-clear-some-EDC-count.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/2048-drm-amdgpu-Fixed-missing-to-clear-some-EDC-count.patch
new file mode 100644
index 00000000..75a4b3e7
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/2048-drm-amdgpu-Fixed-missing-to-clear-some-EDC-count.patch
@@ -0,0 +1,142 @@
+From d39f45e2dea34baa1d3112015e7fdecb42c0c1b6 Mon Sep 17 00:00:00 2001
+From: James Zhu <James.Zhu@amd.com>
+Date: Tue, 4 Jun 2019 12:49:02 -0400
+Subject: [PATCH 2048/2940] drm/amdgpu: Fixed missing to clear some EDC count
+
+EDC counts are related to instance and se. They are not the same
+for different type of EDC. EDC clearing are changed to base on
+individual EDC's instance and SE number.
+
+Signed-off-by: James Zhu <James.Zhu@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 85 +++++++++++++--------------
+ drivers/gpu/drm/amd/amdgpu/soc15.h | 2 +
+ 2 files changed, 42 insertions(+), 45 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+index 879b496ebde8..0377bb021a43 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+@@ -3590,37 +3590,38 @@ static const struct soc15_reg_entry sgpr_init_regs[] = {
+ };
+
+ static const struct soc15_reg_entry sec_ded_counter_registers[] = {
+- { SOC15_REG_ENTRY(GC, 0, mmCPC_EDC_SCRATCH_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmCPC_EDC_UCODE_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_ROQ_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_TAG_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_DMA_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_TAG_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_CSINVOC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_RESTORE_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_STATE_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_GRBM_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_DED) },
+- { SOC15_REG_ENTRY(GC, 0, mmSPI_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_DED_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_INFO) },
+- { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_SEC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmTCP_ATC_EDC_GATCL1_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmTD_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2) },
+- { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmTA_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PHY_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PIPE_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2) },
+- { SOC15_REG_ENTRY(GC, 0, mmTCI_EDC_CNT) },
+- { SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2) },
+- { SOC15_REG_ENTRY(GC, 0, mmTCA_EDC_CNT) },
++ { SOC15_REG_ENTRY(GC, 0, mmCPC_EDC_SCRATCH_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmCPC_EDC_UCODE_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_ROQ_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_TAG_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_DMA_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_TAG_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_CSINVOC_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_RESTORE_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_STATE_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_GRBM_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_DED), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmSPI_EDC_CNT), 0, 4, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT), 0, 4, 6},
++ { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_DED_CNT), 0, 4, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_INFO), 0, 4, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_SEC_CNT), 0, 4, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT), 0, 1, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmTCP_ATC_EDC_GATCL1_CNT), 0, 4, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT), 0, 4, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmTD_EDC_CNT), 0, 4, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2), 0, 4, 6},
++ { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT), 0, 4, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmTA_EDC_CNT), 0, 4, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PHY_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PIPE_CNT), 0, 1, 1},
++ { SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT), 0, 1, 32},
++ { SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2), 0, 1, 32},
++ { SOC15_REG_ENTRY(GC, 0, mmTCI_EDC_CNT), 0, 1, 72},
++ { SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2), 0, 1, 16},
++ { SOC15_REG_ENTRY(GC, 0, mmTCA_EDC_CNT), 0, 1, 2},
++ { SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3), 0, 4, 6},
+ };
+
+ static int gfx_v9_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
+@@ -3628,7 +3629,7 @@ static int gfx_v9_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
+ struct amdgpu_ring *ring = &adev->gfx.compute_ring[0];
+ struct amdgpu_ib ib;
+ struct dma_fence *f = NULL;
+- int r, i, j;
++ int r, i, j, k;
+ unsigned total_size, vgpr_offset, sgpr_offset;
+ u64 gpu_addr;
+
+@@ -3740,19 +3741,13 @@ static int gfx_v9_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
+
+ /* read back registers to clear the counters */
+ mutex_lock(&adev->grbm_idx_mutex);
+- for (j = 0; j < 16; j++) {
+- gfx_v9_0_select_se_sh(adev, 0x01, 0x0, j);
+- for (i = 0; i < ARRAY_SIZE(sec_ded_counter_registers); i++)
+- RREG32(SOC15_REG_ENTRY_OFFSET(sec_ded_counter_registers[i]));
+- gfx_v9_0_select_se_sh(adev, 0x02, 0x0, j);
+- for (i = 0; i < ARRAY_SIZE(sec_ded_counter_registers); i++)
+- RREG32(SOC15_REG_ENTRY_OFFSET(sec_ded_counter_registers[i]));
+- gfx_v9_0_select_se_sh(adev, 0x03, 0x0, j);
+- for (i = 0; i < ARRAY_SIZE(sec_ded_counter_registers); i++)
+- RREG32(SOC15_REG_ENTRY_OFFSET(sec_ded_counter_registers[i]));
+- gfx_v9_0_select_se_sh(adev, 0x04, 0x0, j);
+- for (i = 0; i < ARRAY_SIZE(sec_ded_counter_registers); i++)
+- RREG32(SOC15_REG_ENTRY_OFFSET(sec_ded_counter_registers[i]));
++ for (i = 0; i < ARRAY_SIZE(sec_ded_counter_registers); i++) {
++ for (j = 0; j < sec_ded_counter_registers[i].se_num; j++) {
++ for (k = 0; k < sec_ded_counter_registers[i].instance; k++) {
++ gfx_v9_0_select_se_sh(adev, j, 0x0, k);
++ RREG32(SOC15_REG_ENTRY_OFFSET(sec_ded_counter_registers[i]));
++ }
++ }
+ }
+ WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, 0xe0000000);
+ mutex_unlock(&adev->grbm_idx_mutex);
+diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.h b/drivers/gpu/drm/amd/amdgpu/soc15.h
+index 06f39f5bbf76..48e824d52ad9 100644
+--- a/drivers/gpu/drm/amd/amdgpu/soc15.h
++++ b/drivers/gpu/drm/amd/amdgpu/soc15.h
+@@ -48,6 +48,8 @@ struct soc15_reg_entry {
+ uint32_t seg;
+ uint32_t reg_offset;
+ uint32_t reg_value;
++ uint32_t se_num;
++ uint32_t instance;
+ };
+
+ #define SOC15_REG_ENTRY(ip, inst, reg) ip##_HWIP, inst, reg##_BASE_IDX, reg
+--
+2.17.1
+