From 72691cc024d54256259fb739746f33f70e2ab073 Mon Sep 17 00:00:00 2001 From: "Bill(Shuzhou) Liu" Date: Wed, 9 Sep 2020 13:52:19 -0400 Subject: [PATCH] Add new init and destroy API for RAS library. RAS library will provide two new APIs: rdc_status_t rdc_module_init(uint64_t flags); rdc_status_t rdc_module_destroy(); When RDC load the librdc_ras.so, it will call rdc_module_init(). When RDC exit, it will call rdc_module_destroy() Change-Id: I7f5c81fd19a45a906c3c339cd6eabee2277f27ca --- include/rdc_lib/impl/RdcRasLib.h | 5 +++++ rdc_libs/rdc/src/RdcRasLib.cc | 34 +++++++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/include/rdc_lib/impl/RdcRasLib.h b/include/rdc_lib/impl/RdcRasLib.h index e7e1ef703c..7440ed28f6 100644 --- a/include/rdc_lib/impl/RdcRasLib.h +++ b/include/rdc_lib/impl/RdcRasLib.h @@ -53,11 +53,16 @@ class RdcRasLib: public RdcTelemetry { explicit RdcRasLib(const char* lib_name); + ~RdcRasLib(); + private: RdcLibraryLoader lib_loader_; rdc_status_t (*fields_value_get_)(rdc_gpu_field_t*, uint32_t, rdc_field_value_f, void*); rdc_status_t (*fields_query_)(uint32_t[MAX_NUM_FIELDS], uint32_t*); + + rdc_status_t (*rdc_module_init_)(uint64_t); + rdc_status_t (*rdc_module_destroy_)(); }; typedef std::shared_ptr RdcRasLibPtr; diff --git a/rdc_libs/rdc/src/RdcRasLib.cc b/rdc_libs/rdc/src/RdcRasLib.cc index 3de78cdb28..b823333eb3 100644 --- a/rdc_libs/rdc/src/RdcRasLib.cc +++ b/rdc_libs/rdc/src/RdcRasLib.cc @@ -27,14 +27,36 @@ THE SOFTWARE. namespace amd { namespace rdc { -RdcRasLib::RdcRasLib(const char* lib_name) { +RdcRasLib::RdcRasLib(const char* lib_name): + fields_value_get_(nullptr) + , fields_query_(nullptr) + , rdc_module_init_(nullptr) + , rdc_module_destroy_(nullptr) { rdc_status_t status = lib_loader_.load(lib_name); if (status != RDC_ST_OK) { - fields_value_get_ = nullptr; - fields_query_ = nullptr; return; } + status = lib_loader_.load_symbol(&rdc_module_init_, + "rdc_module_init"); + if (status != RDC_ST_OK) { + rdc_module_init_ = nullptr; + return; + } + + if (rdc_module_init_(0) != RDC_ST_OK) { + RDC_LOG(RDC_ERROR, "Fail to init librdc_ras.so:" + << rdc_status_string(status)); + return; + } + + + status = lib_loader_.load_symbol(&rdc_module_destroy_, + "rdc_module_destroy"); + if (status != RDC_ST_OK) { + rdc_module_destroy_ = nullptr; + } + status = lib_loader_.load_symbol(&fields_value_get_, "rdc_telemetry_fields_value_get"); if (status != RDC_ST_OK) { @@ -47,6 +69,12 @@ RdcRasLib::RdcRasLib(const char* lib_name) { } } +RdcRasLib::~RdcRasLib() { + if (rdc_module_destroy_) { + rdc_module_destroy_(); + } +} + rdc_status_t RdcRasLib::rdc_telemetry_fields_query( uint32_t field_ids[MAX_NUM_FIELDS], uint32_t* field_count) { if (field_count == nullptr) {