aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4726-drm-amdgpu-Added-RAS-UMC-error-query-support-for-Arc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4726-drm-amdgpu-Added-RAS-UMC-error-query-support-for-Arc.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4726-drm-amdgpu-Added-RAS-UMC-error-query-support-for-Arc.patch175
1 files changed, 175 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4726-drm-amdgpu-Added-RAS-UMC-error-query-support-for-Arc.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4726-drm-amdgpu-Added-RAS-UMC-error-query-support-for-Arc.patch
new file mode 100644
index 00000000..c91ce0bb
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4726-drm-amdgpu-Added-RAS-UMC-error-query-support-for-Arc.patch
@@ -0,0 +1,175 @@
+From b314adff2767fe2e6fdbfba1149f29d6aed845de Mon Sep 17 00:00:00 2001
+From: John Clements <john.clements@amd.com>
+Date: Wed, 11 Dec 2019 10:18:55 +0800
+Subject: [PATCH 4726/4736] drm/amdgpu: Added RAS UMC error query support for
+ Arcturus
+
+Updated UMC 6.1 function set to support UMC 6.1.1 and 6.1.2 devices
+
+Change-Id: I7b106328d24aba5ab93a8f4cddb1635392eecd0f
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: John Clements <john.clements@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 9 +++-
+ drivers/gpu/drm/amd/amdgpu/umc_v6_1.c | 78 ++++++++++++++++++++++-----
+ drivers/gpu/drm/amd/amdgpu/umc_v6_1.h | 3 +-
+ 3 files changed, 74 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+index b051ede2fb83..a2d1016ce81a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+@@ -692,11 +692,18 @@ static void gmc_v9_0_set_umc_funcs(struct amdgpu_device *adev)
+ adev->umc.funcs = &umc_v6_0_funcs;
+ break;
+ case CHIP_VEGA20:
++ adev->umc.max_ras_err_cnt_per_query = UMC_V6_1_TOTAL_CHANNEL_NUM;
++ adev->umc.channel_inst_num = UMC_V6_1_CHANNEL_INSTANCE_NUM;
++ adev->umc.umc_inst_num = UMC_V6_1_UMC_INSTANCE_NUM;
++ adev->umc.channel_offs = UMC_V6_1_PER_CHANNEL_OFFSET_VG20;
++ adev->umc.channel_idx_tbl = &umc_v6_1_channel_idx_tbl[0][0];
++ adev->umc.funcs = &umc_v6_1_funcs;
++ break;
+ case CHIP_ARCTURUS:
+ adev->umc.max_ras_err_cnt_per_query = UMC_V6_1_TOTAL_CHANNEL_NUM;
+ adev->umc.channel_inst_num = UMC_V6_1_CHANNEL_INSTANCE_NUM;
+ adev->umc.umc_inst_num = UMC_V6_1_UMC_INSTANCE_NUM;
+- adev->umc.channel_offs = UMC_V6_1_PER_CHANNEL_OFFSET;
++ adev->umc.channel_offs = UMC_V6_1_PER_CHANNEL_OFFSET_ARCT;
+ adev->umc.channel_idx_tbl = &umc_v6_1_channel_idx_tbl[0][0];
+ adev->umc.funcs = &umc_v6_1_funcs;
+ break;
+diff --git a/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c b/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c
+index 47c4b96b14d1..515eb50cd0f8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c
++++ b/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c
+@@ -31,6 +31,14 @@
+
+ #define smnMCA_UMC0_MCUMC_ADDRT0 0x50f10
+
++/* UMC 6_1_2 register offsets */
++#define mmUMCCH0_0_EccErrCntSel_ARCT 0x0360
++#define mmUMCCH0_0_EccErrCntSel_ARCT_BASE_IDX 1
++#define mmUMCCH0_0_EccErrCnt_ARCT 0x0361
++#define mmUMCCH0_0_EccErrCnt_ARCT_BASE_IDX 1
++#define mmMCA_UMC_UMC0_MCUMC_STATUST0_ARCT 0x03c2
++#define mmMCA_UMC_UMC0_MCUMC_STATUST0_ARCT_BASE_IDX 1
++
+ /*
+ * (addr / 256) * 8192, the higher 26 bits in ErrorAddr
+ * is the index of 8KB block
+@@ -95,12 +103,25 @@ static void umc_v6_1_query_correctable_error_count(struct amdgpu_device *adev,
+ uint64_t mc_umc_status;
+ uint32_t mc_umc_status_addr;
+
+- ecc_err_cnt_sel_addr =
+- SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCntSel);
+- ecc_err_cnt_addr =
+- SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCnt);
+- mc_umc_status_addr =
+- SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0);
++ if (adev->asic_type == CHIP_ARCTURUS) {
++ /* UMC 6_1_2 registers */
++
++ ecc_err_cnt_sel_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCntSel_ARCT);
++ ecc_err_cnt_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCnt_ARCT);
++ mc_umc_status_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0_ARCT);
++ } else {
++ /* UMC 6_1_1 registers */
++
++ ecc_err_cnt_sel_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCntSel);
++ ecc_err_cnt_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCnt);
++ mc_umc_status_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0);
++ }
+
+ /* select the lower chip and check the error count */
+ ecc_err_cnt_sel = RREG32(ecc_err_cnt_sel_addr + umc_reg_offset);
+@@ -141,8 +162,17 @@ static void umc_v6_1_querry_uncorrectable_error_count(struct amdgpu_device *adev
+ uint64_t mc_umc_status;
+ uint32_t mc_umc_status_addr;
+
+- mc_umc_status_addr =
+- SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0);
++ if (adev->asic_type == CHIP_ARCTURUS) {
++ /* UMC 6_1_2 registers */
++
++ mc_umc_status_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0_ARCT);
++ } else {
++ /* UMC 6_1_1 registers */
++
++ mc_umc_status_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0);
++ }
+
+ /* check the MCUMC_STATUS */
+ mc_umc_status = RREG64_UMC(mc_umc_status_addr + umc_reg_offset);
+@@ -179,8 +209,17 @@ static void umc_v6_1_query_error_address(struct amdgpu_device *adev,
+ uint64_t mc_umc_status, err_addr, retired_page;
+ struct eeprom_table_record *err_rec;
+
+- mc_umc_status_addr =
+- SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0);
++ if (adev->asic_type == CHIP_ARCTURUS) {
++ /* UMC 6_1_2 registers */
++
++ mc_umc_status_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0_ARCT);
++ } else {
++ /* UMC 6_1_1 registers */
++
++ mc_umc_status_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmMCA_UMC_UMC0_MCUMC_STATUST0);
++ }
+
+ /* skip error address process if -ENOMEM */
+ if (!err_data->err_addr) {
+@@ -241,10 +280,21 @@ static void umc_v6_1_err_cnt_init_per_channel(struct amdgpu_device *adev,
+ uint32_t ecc_err_cnt_sel, ecc_err_cnt_sel_addr;
+ uint32_t ecc_err_cnt_addr;
+
+- ecc_err_cnt_sel_addr =
+- SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCntSel);
+- ecc_err_cnt_addr =
+- SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCnt);
++ if (adev->asic_type == CHIP_ARCTURUS) {
++ /* UMC 6_1_2 registers */
++
++ ecc_err_cnt_sel_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCntSel_ARCT);
++ ecc_err_cnt_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCnt_ARCT);
++ } else {
++ /* UMC 6_1_1 registers */
++
++ ecc_err_cnt_sel_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCntSel);
++ ecc_err_cnt_addr =
++ SOC15_REG_OFFSET(UMC, 0, mmUMCCH0_0_EccErrCnt);
++ }
+
+ /* select the lower chip and check the error count */
+ ecc_err_cnt_sel = RREG32(ecc_err_cnt_sel_addr + umc_reg_offset);
+diff --git a/drivers/gpu/drm/amd/amdgpu/umc_v6_1.h b/drivers/gpu/drm/amd/amdgpu/umc_v6_1.h
+index dab9cbd292c5..0ce1d323cfdd 100644
+--- a/drivers/gpu/drm/amd/amdgpu/umc_v6_1.h
++++ b/drivers/gpu/drm/amd/amdgpu/umc_v6_1.h
+@@ -35,7 +35,8 @@
+ /* total channel instances in one umc block */
+ #define UMC_V6_1_TOTAL_CHANNEL_NUM (UMC_V6_1_CHANNEL_INSTANCE_NUM * UMC_V6_1_UMC_INSTANCE_NUM)
+ /* UMC regiser per channel offset */
+-#define UMC_V6_1_PER_CHANNEL_OFFSET 0x800
++#define UMC_V6_1_PER_CHANNEL_OFFSET_VG20 0x800
++#define UMC_V6_1_PER_CHANNEL_OFFSET_ARCT 0x400
+
+ /* EccErrCnt max value */
+ #define UMC_V6_1_CE_CNT_MAX 0xffff
+--
+2.17.1
+