RAS support capability needs to be updated on top of different
memeory ECC enablement, and remove redundant memory ecc check
in gmc module for vega20 and arcturus.

v2: check HBM ECC enablement and set ras mask accordingly.
v3: avoid to invoke atomfirmware interface to query twice.

Suggested-by: Hawking Zhang <hawking.zh...@amd.com>
Signed-off-by: Guchun Chen <guchun.c...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 24 ++++++++++++-----
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c   | 36 ++++++++++---------------
 2 files changed, 32 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 69b02b9d4131..38782add479a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -1738,18 +1738,30 @@ static void amdgpu_ras_check_supported(struct 
amdgpu_device *adev,
        *hw_supported = 0;
        *supported = 0;
 
-       if (amdgpu_sriov_vf(adev) ||
+       if (amdgpu_sriov_vf(adev) || !adev->is_atom_fw ||
            (adev->asic_type != CHIP_VEGA20 &&
             adev->asic_type != CHIP_ARCTURUS))
                return;
 
-       if (adev->is_atom_fw &&
-                       (amdgpu_atomfirmware_mem_ecc_supported(adev) ||
-                        amdgpu_atomfirmware_sram_ecc_supported(adev)))
-               *hw_supported = AMDGPU_RAS_BLOCK_MASK;
+       if (amdgpu_atomfirmware_mem_ecc_supported(adev)) {
+               DRM_INFO("HBM ECC is active.\n");
+               *hw_supported |= (1 << AMDGPU_RAS_BLOCK__UMC |
+                               1 << AMDGPU_RAS_BLOCK__DF);
+       } else
+               DRM_INFO("HBM ECC is not presented.\n");
+
+       if (amdgpu_atomfirmware_sram_ecc_supported(adev)) {
+               DRM_INFO("SRAM ECC is active.\n");
+               *hw_supported |= ~(1 << AMDGPU_RAS_BLOCK__UMC |
+                               1 << AMDGPU_RAS_BLOCK__DF);
+       } else
+               DRM_INFO("SRAM ECC is not presented.\n");
+
+       /* hw_supported needs to be aligned with RAS block mask. */
+       *hw_supported &= AMDGPU_RAS_BLOCK_MASK;
 
        *supported = amdgpu_ras_enable == 0 ?
-                               0 : *hw_supported & amdgpu_ras_mask;
+                       0 : *hw_supported & amdgpu_ras_mask;
 }
 
 int amdgpu_ras_init(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 90216abf14a4..3cc886e96420 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -886,29 +886,21 @@ static int gmc_v9_0_late_init(void *handle)
        if (r)
                return r;
        /* Check if ecc is available */
-       if (!amdgpu_sriov_vf(adev)) {
-               switch (adev->asic_type) {
-               case CHIP_VEGA10:
-               case CHIP_VEGA20:
-               case CHIP_ARCTURUS:
-                       r = amdgpu_atomfirmware_mem_ecc_supported(adev);
-                       if (!r) {
-                               DRM_INFO("ECC is not present.\n");
-                               if (adev->df.funcs->enable_ecc_force_par_wr_rmw)
-                                       
adev->df.funcs->enable_ecc_force_par_wr_rmw(adev, false);
-                       } else {
-                               DRM_INFO("ECC is active.\n");
-                       }
+       if (!amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_VEGA10)) {
+               r = amdgpu_atomfirmware_mem_ecc_supported(adev);
+               if (!r) {
+                       DRM_INFO("ECC is not present.\n");
+                       if (adev->df.funcs->enable_ecc_force_par_wr_rmw)
+                               
adev->df.funcs->enable_ecc_force_par_wr_rmw(adev, false);
+               } else {
+                       DRM_INFO("ECC is active.\n");
+               }
 
-                       r = amdgpu_atomfirmware_sram_ecc_supported(adev);
-                       if (!r) {
-                               DRM_INFO("SRAM ECC is not present.\n");
-                       } else {
-                               DRM_INFO("SRAM ECC is active.\n");
-                       }
-                       break;
-               default:
-                       break;
+               r = amdgpu_atomfirmware_sram_ecc_supported(adev);
+               if (!r) {
+                       DRM_INFO("SRAM ECC is not present.\n");
+               } else {
+                       DRM_INFO("SRAM ECC is active.\n");
                }
        }
 
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to