add initialization func for pmfw eeprom

Signed-off-by: Gangliang Xie <[email protected]>
---
 drivers/gpu/drm/amd/ras/rascore/ras_core.c    | 15 +++-
 .../gpu/drm/amd/ras/rascore/ras_eeprom_fw.c   | 84 +++++++++++++++++++
 .../gpu/drm/amd/ras/rascore/ras_eeprom_fw.h   |  2 +
 3 files changed, 98 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_core.c 
b/drivers/gpu/drm/amd/ras/rascore/ras_core.c
index fe188a5304d9..1eba279a020b 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_core.c
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_core.c
@@ -387,7 +387,10 @@ int ras_core_hw_init(struct ras_core_context *ras_core)
 
        ras_fw_init_feature_flags(ras_core);
 
-       ret = ras_eeprom_hw_init(ras_core);
+       if (ras_fw_eeprom_supported(ras_core))
+               ret = ras_fw_eeprom_hw_init(ras_core);
+       else
+               ret = ras_eeprom_hw_init(ras_core);
        if (ret)
                goto init_err6;
 
@@ -411,7 +414,10 @@ int ras_core_hw_init(struct ras_core_context *ras_core)
        return 0;
 
 init_err7:
-       ras_eeprom_hw_fini(ras_core);
+       if (ras_fw_eeprom_supported(ras_core))
+               ras_fw_eeprom_hw_fini(ras_core);
+       else
+               ras_eeprom_hw_fini(ras_core);
 init_err6:
        ras_gfx_hw_fini(ras_core);
 init_err5:
@@ -432,7 +438,10 @@ int ras_core_hw_fini(struct ras_core_context *ras_core)
        ras_core->is_initialized = false;
 
        ras_process_fini(ras_core);
-       ras_eeprom_hw_fini(ras_core);
+       if (ras_fw_eeprom_supported(ras_core))
+               ras_fw_eeprom_hw_fini(ras_core);
+       else
+               ras_eeprom_hw_fini(ras_core);
        ras_gfx_hw_fini(ras_core);
        ras_nbio_hw_fini(ras_core);
        ras_umc_hw_fini(ras_core);
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_eeprom_fw.c 
b/drivers/gpu/drm/amd/ras/rascore/ras_eeprom_fw.c
index 7a2c14f276b5..138d223a1256 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_eeprom_fw.c
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_eeprom_fw.c
@@ -369,3 +369,87 @@ int ras_fw_eeprom_update_record(struct ras_core_context 
*ras_core,
 
        return ret;
 }
+
+static int __check_ras_fw_table_status(struct ras_core_context *ras_core)
+{
+       struct ras_fw_eeprom_control *control = &ras_core->ras_fw_eeprom;
+       uint64_t local_time;
+       int res;
+
+       mutex_init(&control->ras_tbl_mutex);
+
+       res = ras_fw_get_table_version(ras_core, &(control->version));
+       if (res)
+               return res;
+
+       res = ras_fw_get_badpage_count(ras_core, &(control->ras_num_recs), 100);
+       if (res)
+               return res;
+
+       local_time = (uint64_t)ktime_get_real_seconds();
+       res = ras_fw_set_timestamp(ras_core, local_time);
+       if (res)
+               return res;
+
+       control->ras_max_record_count = 4000;
+
+
+       if (control->ras_num_recs > control->ras_max_record_count) {
+               RAS_DEV_ERR(ras_core->dev,
+                       "RAS header invalid, records in header: %u max allowed 
:%u",
+                       control->ras_num_recs, control->ras_max_record_count);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+int ras_fw_eeprom_hw_init(struct ras_core_context *ras_core)
+{
+       struct ras_fw_eeprom_control *control;
+       struct ras_eeprom_config *eeprom_cfg;
+       struct ras_mp1 *mp1;
+       const struct ras_mp1_sys_func *sys_func;
+
+       if (!ras_core)
+               return -EINVAL;
+
+       mp1 = &ras_core->ras_mp1;
+       sys_func = mp1->sys_func;
+
+       if (!sys_func || !sys_func->mp1_send_eeprom_msg)
+               return -EINVAL;
+
+       ras_core->is_rma = false;
+
+       control = &ras_core->ras_fw_eeprom;
+
+       memset(control, 0, sizeof(*control));
+
+       eeprom_cfg = &ras_core->config->eeprom_cfg;
+       control->record_threshold_config =
+               eeprom_cfg->eeprom_record_threshold_config;
+
+       control->record_threshold_count = 4000;
+       if (eeprom_cfg->eeprom_record_threshold_count <
+               control->record_threshold_count)
+               control->record_threshold_count =
+                       eeprom_cfg->eeprom_record_threshold_count;
+
+       control->update_channel_flag = false;
+
+       return __check_ras_fw_table_status(ras_core);
+}
+
+int ras_fw_eeprom_hw_fini(struct ras_core_context *ras_core)
+{
+       struct ras_fw_eeprom_control *control;
+
+       if (!ras_core)
+               return -EINVAL;
+
+       control = &ras_core->ras_fw_eeprom;
+       mutex_destroy(&control->ras_tbl_mutex);
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_eeprom_fw.h 
b/drivers/gpu/drm/amd/ras/rascore/ras_eeprom_fw.h
index ed8ebdf22156..5966955cd847 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_eeprom_fw.h
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_eeprom_fw.h
@@ -77,5 +77,7 @@ int ras_fw_eeprom_read_idx(struct ras_core_context *ras_core,
 uint32_t ras_fw_eeprom_get_record_count(struct ras_core_context *ras_core);
 int ras_fw_eeprom_update_record(struct ras_core_context *ras_core,
                                struct ras_bank_ecc *ras_ecc);
+int ras_fw_eeprom_hw_init(struct ras_core_context *ras_core);
+int ras_fw_eeprom_hw_fini(struct ras_core_context *ras_core);
 
 #endif
-- 
2.34.1

Reply via email to