add function to check if pmfw is supported, skip eeprom
check and recover when pmfw eeprom is supported

Signed-off-by: Gangliang Xie <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c       |  2 +
 .../gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c    | 46 ++++++++++++++++++-
 .../gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h    |  2 +
 3 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 719991e99161..e84887fe29a3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -3767,6 +3767,8 @@ int amdgpu_ras_init_badpage_info(struct amdgpu_device 
*adev)
                return 0;
 
        control = &con->eeprom_control;
+       con->ras_smu_drv = amdgpu_dpm_get_ras_smu_driver(adev);
+
        ret = amdgpu_ras_eeprom_init(control);
        control->is_eeprom_valid = !ret;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c
index 5a7bf0661dbf..c38d88a60c41 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c
@@ -1545,7 +1545,8 @@ void amdgpu_ras_eeprom_check_and_recover(struct 
amdgpu_device *adev)
        struct amdgpu_ras_eeprom_control *control;
        int res;
 
-       if (!__is_ras_eeprom_supported(adev) || !ras)
+       if (!__is_ras_eeprom_supported(adev) || !ras ||
+           amdgpu_ras_smu_eeprom_supported(adev))
                return;
        control = &ras->eeprom_control;
        if (!control->is_eeprom_valid)
@@ -1565,4 +1566,45 @@ void amdgpu_ras_eeprom_check_and_recover(struct 
amdgpu_device *adev)
                control->is_eeprom_valid = false;
        }
        return;
-}
\ No newline at end of file
+}
+
+static const struct ras_smu_drv *amdgpu_ras_get_smu_ras_drv(struct 
amdgpu_device *adev)
+{
+       struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);
+
+       if (!ras)
+               return NULL;
+
+       return ras->ras_smu_drv;
+}
+
+static uint64_t amdgpu_ras_smu_get_feature_flags(struct amdgpu_device *adev)
+{
+       const struct ras_smu_drv *ras_smu_drv = 
amdgpu_ras_get_smu_ras_drv(adev);
+       uint64_t flags = 0ULL;
+
+       if (!ras_smu_drv)
+               goto out;
+
+       if (ras_smu_drv->ras_smu_feature_flags)
+               ras_smu_drv->ras_smu_feature_flags(adev, &flags);
+
+out:
+       return flags;
+}
+
+bool amdgpu_ras_smu_eeprom_supported(struct amdgpu_device *adev)
+{
+       const struct ras_smu_drv *smu_ras_drv = 
amdgpu_ras_get_smu_ras_drv(adev);
+       uint64_t flags = 0ULL;
+
+       if (!__is_ras_eeprom_supported(adev) || !smu_ras_drv)
+               return false;
+
+       if (!smu_ras_drv->smu_eeprom_funcs)
+               return false;
+
+       flags = amdgpu_ras_smu_get_feature_flags(adev);
+
+       return !!(flags & RAS_SMU_FEATURE_BIT__RAS_EEPROM);
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h
index ebfca4cb5688..feff46b22b6f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h
@@ -163,6 +163,8 @@ int amdgpu_ras_eeprom_check(struct 
amdgpu_ras_eeprom_control *control);
 
 void amdgpu_ras_eeprom_check_and_recover(struct amdgpu_device *adev);
 
+bool amdgpu_ras_smu_eeprom_supported(struct amdgpu_device *adev);
+
 extern const struct file_operations amdgpu_ras_debugfs_eeprom_size_ops;
 extern const struct file_operations amdgpu_ras_debugfs_eeprom_table_ops;
 
-- 
2.34.1

Reply via email to