]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c
Merge tag 'amd-drm-next-6.5-2023-06-09' of https://gitlab.freedesktop.org/agd5f/linux...
[linux.git] / drivers / gpu / drm / amd / amdgpu / mmhub_v1_8.c
index f40a6a9f3c6dfd8cf02f894f30b0a36b316540cf..5e8b493f86995457158ae1318aea2442211ec8e3 100644 (file)
@@ -271,7 +271,7 @@ static void mmhub_v1_8_init_cache_regs(struct amdgpu_device *adev)
                                            VMC_TAP_PTE_REQUEST_PHYSICAL, 0);
                }
                WREG32_SOC15(MMHUB, i, regVM_L2_CNTL4, tmp);
-       }
+       }
 }
 
 static void mmhub_v1_8_enable_system_domain(struct amdgpu_device *adev)
@@ -328,7 +328,7 @@ static void mmhub_v1_8_disable_identity_aperture(struct amdgpu_device *adev)
 static void mmhub_v1_8_setup_vmid_config(struct amdgpu_device *adev)
 {
        struct amdgpu_vmhub *hub;
-       unsigned num_level, block_size;
+       unsigned int num_level, block_size;
        uint32_t tmp, inst_mask;
        int i, j;
 
@@ -700,3 +700,157 @@ static void mmhub_v1_8_reset_ras_error_count(struct amdgpu_device *adev)
        for_each_inst(i, inst_mask)
                mmhub_v1_8_inst_reset_ras_error_count(adev, i);
 }
+
+static const u32 mmhub_v1_8_mmea_err_status_reg[] __maybe_unused = {
+       regMMEA0_ERR_STATUS,
+       regMMEA1_ERR_STATUS,
+       regMMEA2_ERR_STATUS,
+       regMMEA3_ERR_STATUS,
+       regMMEA4_ERR_STATUS,
+};
+
+static void mmhub_v1_8_inst_query_ras_err_status(struct amdgpu_device *adev,
+                                                uint32_t mmhub_inst)
+{
+       uint32_t reg_value;
+       uint32_t mmea_err_status_addr_dist;
+       uint32_t i;
+
+       /* query mmea ras err status */
+       mmea_err_status_addr_dist = regMMEA1_ERR_STATUS - regMMEA0_ERR_STATUS;
+       for (i = 0; i < ARRAY_SIZE(mmhub_v1_8_mmea_err_status_reg); i++) {
+               reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst,
+                                               regMMEA0_ERR_STATUS,
+                                               i * mmea_err_status_addr_dist);
+               if (REG_GET_FIELD(reg_value, MMEA0_ERR_STATUS, SDP_RDRSP_STATUS) ||
+                   REG_GET_FIELD(reg_value, MMEA0_ERR_STATUS, SDP_WRRSP_STATUS) ||
+                   REG_GET_FIELD(reg_value, MMEA0_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) {
+                       dev_warn(adev->dev,
+                                "Detected MMEA%d err in MMHUB%d, status: 0x%x\n",
+                                i, mmhub_inst, reg_value);
+               }
+       }
+
+       /* query mm_cane ras err status */
+       reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ERR_STATUS);
+       if (REG_GET_FIELD(reg_value, MM_CANE_ERR_STATUS, SDPM_RDRSP_STATUS) ||
+           REG_GET_FIELD(reg_value, MM_CANE_ERR_STATUS, SDPM_WRRSP_STATUS) ||
+           REG_GET_FIELD(reg_value, MM_CANE_ERR_STATUS, SDPM_RDRSP_DATAPARITY_ERROR)) {
+               dev_warn(adev->dev,
+                        "Detected MM CANE err in MMHUB%d, status: 0x%x\n",
+                        mmhub_inst, reg_value);
+       }
+}
+
+static void mmhub_v1_8_query_ras_error_status(struct amdgpu_device *adev)
+{
+       uint32_t inst_mask;
+       uint32_t i;
+
+       if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__MMHUB)) {
+               dev_warn(adev->dev, "MMHUB RAS is not supported\n");
+               return;
+       }
+
+       inst_mask = adev->aid_mask;
+       for_each_inst(i, inst_mask)
+               mmhub_v1_8_inst_query_ras_err_status(adev, i);
+}
+
+static void mmhub_v1_8_inst_reset_ras_err_status(struct amdgpu_device *adev,
+                                                uint32_t mmhub_inst)
+{
+       uint32_t mmea_cgtt_clk_cntl_addr_dist;
+       uint32_t mmea_err_status_addr_dist;
+       uint32_t reg_value;
+       uint32_t i;
+
+       /* reset mmea ras err status */
+       mmea_cgtt_clk_cntl_addr_dist = regMMEA1_CGTT_CLK_CTRL - regMMEA0_CGTT_CLK_CTRL;
+       mmea_err_status_addr_dist = regMMEA1_ERR_STATUS - regMMEA0_ERR_STATUS;
+       for (i = 0; i < ARRAY_SIZE(mmhub_v1_8_mmea_err_status_reg); i++) {
+               /* force clk branch on for response path
+                * set MMEA0_CGTT_CLK_CTRL.SOFT_OVERRIDE_RETURN = 1
+                */
+               reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst,
+                                               regMMEA0_CGTT_CLK_CTRL,
+                                               i * mmea_cgtt_clk_cntl_addr_dist);
+               reg_value = REG_SET_FIELD(reg_value, MMEA0_CGTT_CLK_CTRL,
+                                         SOFT_OVERRIDE_RETURN, 1);
+               WREG32_SOC15_OFFSET(MMHUB, mmhub_inst,
+                                   regMMEA0_CGTT_CLK_CTRL,
+                                   i * mmea_cgtt_clk_cntl_addr_dist,
+                                   reg_value);
+
+               /* set MMEA0_ERR_STATUS.CLEAR_ERROR_STATUS = 1 */
+               reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst,
+                                               regMMEA0_ERR_STATUS,
+                                               i * mmea_err_status_addr_dist);
+               reg_value = REG_SET_FIELD(reg_value, MMEA0_ERR_STATUS,
+                                         CLEAR_ERROR_STATUS, 1);
+               WREG32_SOC15_OFFSET(MMHUB, mmhub_inst,
+                                   regMMEA0_ERR_STATUS,
+                                   i * mmea_err_status_addr_dist,
+                                   reg_value);
+
+               /* set MMEA0_CGTT_CLK_CTRL.SOFT_OVERRIDE_RETURN = 0 */
+               reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst,
+                                               regMMEA0_CGTT_CLK_CTRL,
+                                               i * mmea_cgtt_clk_cntl_addr_dist);
+               reg_value = REG_SET_FIELD(reg_value, MMEA0_CGTT_CLK_CTRL,
+                                         SOFT_OVERRIDE_RETURN, 0);
+               WREG32_SOC15_OFFSET(MMHUB, mmhub_inst,
+                                   regMMEA0_CGTT_CLK_CTRL,
+                                   i * mmea_cgtt_clk_cntl_addr_dist,
+                                   reg_value);
+       }
+
+       /* reset mm_cane ras err status
+        * force clk branch on for response path
+        * set MM_CANE_ICG_CTRL.SOFT_OVERRIDE_ATRET = 1
+        */
+       reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL);
+       reg_value = REG_SET_FIELD(reg_value, MM_CANE_ICG_CTRL,
+                                 SOFT_OVERRIDE_ATRET, 1);
+       WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL, reg_value);
+
+       /* set MM_CANE_ERR_STATUS.CLEAR_ERROR_STATUS = 1 */
+       reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ERR_STATUS);
+       reg_value = REG_SET_FIELD(reg_value, MM_CANE_ERR_STATUS,
+                                 CLEAR_ERROR_STATUS, 1);
+       WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ERR_STATUS, reg_value);
+
+       /* set MM_CANE_ICG_CTRL.SOFT_OVERRIDE_ATRET = 0 */
+       reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL);
+       reg_value = REG_SET_FIELD(reg_value, MM_CANE_ICG_CTRL,
+                                 SOFT_OVERRIDE_ATRET, 0);
+       WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL, reg_value);
+}
+
+static void mmhub_v1_8_reset_ras_error_status(struct amdgpu_device *adev)
+{
+       uint32_t inst_mask;
+       uint32_t i;
+
+       if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__MMHUB)) {
+               dev_warn(adev->dev, "MMHUB RAS is not supported\n");
+               return;
+       }
+
+       inst_mask = adev->aid_mask;
+       for_each_inst(i, inst_mask)
+               mmhub_v1_8_inst_reset_ras_err_status(adev, i);
+}
+
+static const struct amdgpu_ras_block_hw_ops mmhub_v1_8_ras_hw_ops = {
+       .query_ras_error_count = mmhub_v1_8_query_ras_error_count,
+       .reset_ras_error_count = mmhub_v1_8_reset_ras_error_count,
+       .query_ras_error_status = mmhub_v1_8_query_ras_error_status,
+       .reset_ras_error_status = mmhub_v1_8_reset_ras_error_status,
+};
+
+struct amdgpu_mmhub_ras mmhub_v1_8_ras = {
+       .ras_block = {
+               .hw_ops = &mmhub_v1_8_ras_hw_ops,
+       },
+};
This page took 0.044629 seconds and 4 git commands to generate.