From 14c50c9b4e7edd3a091c05c246b3431a757025dc Mon Sep 17 00:00:00 2001 From: Deepak Mewar Date: Thu, 9 Nov 2023 10:12:46 -0500 Subject: [PATCH 1/6] another set of esmi python wrappers updated to amdsmi python library Change-Id: I33557b9021ecfdab76daaf65ad63f624115aa322 --- py-interface/README.md | 130 +++++++++++++++++++++++++++++++ py-interface/__init__.py | 15 ++++ py-interface/amdsmi_interface.py | 105 +++++++++++++++++++++++++ 3 files changed, 250 insertions(+) diff --git a/py-interface/README.md b/py-interface/README.md index 64ffbc7f04..01a23e4bb8 100644 --- a/py-interface/README.md +++ b/py-interface/README.md @@ -4069,3 +4069,133 @@ try: except AmdSmiException as e: print(e) ``` + +### amdsmi_get_cpu_socket_temperature + +Description: Get the socket temperature. + +Output: amdsmi temperature value + +Exceptions that can be thrown by `amdsmi_get_cpu_socket_temperature` function: + +* `AmdSmiLibraryException` + +Example: + +```python +try: + socket_handles = amdsmi_get_cpusocket_handles() + if len(socket_handles) == 0: + print("No CPU sockets on machine") + else: + for socket in socket_handles: + ptmon = amdsmi_get_cpu_socket_temperature(socket) + print(ptmon) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_cpu_dimm_temp_range_and_refresh_rate + +Description: Get DIMM temperature range and refresh rate. + +Output: amdsmi dimm metric data + +Exceptions that can be thrown by `amdsmi_get_cpu_dimm_temp_range_and_refresh_rate` function: + +* `AmdSmiLibraryException` + +Example: + +```python +try: + socket_handles = amdsmi_get_cpusocket_handles() + if len(socket_handles) == 0: + print("No CPU sockets on machine") + else: + for socket in socket_handles: + dimm = amdsmi_get_cpu_dimm_temp_range_and_refresh_rate(socket) + print(dimm['range']) + print(dimm['ref_rate']) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_cpu_dimm_power_consumption + +Description: amdsmi_get_cpu_dimm_power_consumption. + +Output: amdsmi dimm power consumption value + +Exceptions that can be thrown by `amdsmi_get_cpu_dimm_power_consumption` function: + +* `AmdSmiLibraryException` + +Example: + +```python +try: + socket_handles = amdsmi_get_cpusocket_handles() + if len(socket_handles) == 0: + print("No CPU sockets on machine") + else: + for socket in socket_handles: + dimm = amdsmi_get_cpu_dimm_power_consumption(socket) + print(dimm['power']) + print(dimm['update_rate']) + print(dimm['dimm_addr']) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_cpu_dimm_thermal_sensor + +Description: Get DIMM thermal sensor value. + +Output: amdsmi dimm temperature data + +Exceptions that can be thrown by `amdsmi_get_cpu_dimm_thermal_sensor` function: + +* `AmdSmiLibraryException` + +Example: + +```python +try: + socket_handles = amdsmi_get_cpusocket_handles() + if len(socket_handles) == 0: + print("No CPU sockets on machine") + else: + for socket in socket_handles: + dimm = amdsmi_get_cpu_dimm_thermal_sensor(socket) + print(dimm['sensor']) + print(dimm['update_rate']) + print(dimm['dimm_addr']) + print(dimm['temp']) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_set_cpu_xgmi_width + +Description: Set xgmi width. + +Input: amdsmi xgmi width + +Exceptions that can be thrown by `amdsmi_set_cpu_xgmi_width` function: + +* `AmdSmiLibraryException` + +Example: + +```python +try: + socket_handles = amdsmi_get_cpusocket_handles() + if len(socket_handles) == 0: + print("No CPU sockets on machine") + else: + for socket in socket_handles: + xgmi_width = amdsmi_set_cpu_xgmi_width(socket, 0, 100) +except AmdSmiException as e: + print(e) +``` diff --git a/py-interface/__init__.py b/py-interface/__init__.py index e750df552e..ba2b0c6e38 100644 --- a/py-interface/__init__.py +++ b/py-interface/__init__.py @@ -45,6 +45,21 @@ try: from .amdsmi_interface import amdsmi_get_cpu_socket_freq_range from .amdsmi_interface import amdsmi_get_cpu_core_current_freq_limit from .amdsmi_interface import amdsmi_get_cpu_socket_power + from .amdsmi_interface import amdsmi_get_cpu_socket_power_cap + from .amdsmi_interface import amdsmi_get_cpu_socket_power_cap_max + from .amdsmi_interface import amdsmi_get_cpu_pwr_svi_telemetry_all_rails + from .amdsmi_interface import amdsmi_set_cpu_socket_power_cap + from .amdsmi_interface import amdsmi_set_cpu_pwr_efficiency_mode + from .amdsmi_interface import amdsmi_get_cpu_core_boostlimit + from .amdsmi_interface import amdsmi_get_cpu_socket_c0_residency + from .amdsmi_interface import amdsmi_set_cpu_core_boostlimit + from .amdsmi_interface import amdsmi_set_cpu_socket_boostlimit + from .amdsmi_interface import amdsmi_get_cpu_ddr_bw + from .amdsmi_interface import amdsmi_get_cpu_socket_temperature + from .amdsmi_interface import amdsmi_get_cpu_dimm_temp_range_and_refresh_rate + from .amdsmi_interface import amdsmi_get_cpu_dimm_power_consumption + from .amdsmi_interface import amdsmi_get_cpu_dimm_thermal_sensor + from .amdsmi_interface import amdsmi_set_cpu_xgmi_width except AttributeError: pass diff --git a/py-interface/amdsmi_interface.py b/py-interface/amdsmi_interface.py index 80a3ba6d13..c9724671d4 100644 --- a/py-interface/amdsmi_interface.py +++ b/py-interface/amdsmi_interface.py @@ -1063,6 +1063,111 @@ def amdsmi_get_cpu_ddr_bw(socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle) "ddr_bw_utilized_pct": ddr_bw.utilized_pct } +def amdsmi_get_cpu_socket_temperature( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, sock_idx: int +) -> int: + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + + ptmon = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_socket_temperature( + socket_handle, sock_idx, ctypes.byref(ptmon) + ) + ) + + return ptmon.value + +def amdsmi_get_cpu_dimm_temp_range_and_refresh_rate( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, + sock_idx: int, dimm_addr: int): + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + if not isinstance(dimm_addr, int): + raise AmdSmiParameterException(dimm_addr, int) + + dimm = amdsmi_wrapper.amdsmi_temp_range_refresh_rate_t() + + _check_res(amdsmi_wrapper.amdsmi_get_cpu_dimm_temp_range_and_refresh_rate(socket_handle, dimm)) + + return { + "dimm_temperature_range": dimm.range, + "dimm_refresh_rate": dimm.ref_rate + } + +def amdsmi_get_cpu_dimm_power_consumption( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, + sock_idx: int, dimm_addr: int): + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + if not isinstance(dimm_addr, int): + raise AmdSmiParameterException(dimm_addr, int) + + dimm = amdsmi_wrapper.amdsmi_dimm_power_t() + + _check_res(amdsmi_wrapper.amdsmi_get_cpu_dimm_power_consumption(socket_handle, dimm)) + + return { + "dimm_power_consumed": dimm.power, + "dimm_power_update_rate": dimm.update_rate, + "dimm_dimm_addr": dimm.dimm_addr + } + +def amdsmi_get_cpu_dimm_thermal_sensor( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, + sock_idx: int, dimm_addr: int): + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + if not isinstance(dimm_addr, int): + raise AmdSmiParameterException(dimm_addr, int) + + dimm_thermal = amdsmi_wrapper.amdsmi_dimm_thermal_t() + + _check_res(amdsmi_wrapper.amdsmi_get_cpu_dimm_thermal_sensor(socket_handle, dimm_thermal)) + + return { + "dimm_thermal_sensor_value": dimm_thermal.sensor, + "dimm_thermal_update_rate": dimm_thermal.update_rate, + "dimm_thermal_dimm_addr": dimm_thermal.dimm_addr, + "dimm_thermal_temperature": dimm_thermal.temp + } + +def amdsmi_set_cpu_xgmi_width( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, min_width: int, max_width: int +): + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(min_width, int): + raise AmdSmiParameterException(min_width, int) + if not isinstance(max_width, int): + raise AmdSmiParameterException(max_width, int) + + min_width = ctypes.c_uint8(min_width) + max_width = ctypes.c_uint8(max_width) + + _check_res( + amdsmi_wrapper.amdsmi_set_cpu_xgmi_width( + socket_handle, min_width, max_width) + ) + def amdsmi_init(flag=AmdSmiInitFlags.INIT_AMD_GPUS): if not isinstance(flag, AmdSmiInitFlags): raise AmdSmiParameterException(flag, AmdSmiInitFlags) From 0c790752ac3d22b4c980ad34de899c075f5a4c99 Mon Sep 17 00:00:00 2001 From: Deepak Mewar Date: Thu, 9 Nov 2023 10:26:29 -0500 Subject: [PATCH 2/6] modified local esmi functions called from amdsmi_init for gtest compatibility Change-Id: I627c9887a1f1e340c358f060818a1a7d74ce33f9 --- include/amd_smi/impl/amd_smi_system.h | 10 +++---- src/amd_smi/amd_smi_system.cc | 40 +++++++++++++-------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/include/amd_smi/impl/amd_smi_system.h b/include/amd_smi/impl/amd_smi_system.h index 8c31c2b891..348782cf1b 100644 --- a/include/amd_smi/impl/amd_smi_system.h +++ b/include/amd_smi/impl/amd_smi_system.h @@ -87,15 +87,15 @@ class AMDSmiSystem { amdsmi_status_t cpu_index_to_handle(uint32_t cpu_index, amdsmi_cpusocket_handle* cpusock_handle); - amdsmi_status_t get_cpu_sockets(uint32_t socks); + amdsmi_status_t get_cpu_sockets(uint32_t *socks); - amdsmi_status_t get_cpu_cores(uint32_t cpus); + amdsmi_status_t get_cpu_cores(uint32_t *cpus); - amdsmi_status_t get_threads_per_core(uint32_t threads); + amdsmi_status_t get_threads_per_core(uint32_t *threads); - amdsmi_status_t get_cpu_family(uint32_t family); + amdsmi_status_t get_cpu_family(uint32_t *family); - amdsmi_status_t get_cpu_model(uint32_t model); + amdsmi_status_t get_cpu_model(uint32_t *model); #endif private: AMDSmiSystem() : init_flag_(AMDSMI_INIT_AMD_GPUS) {} diff --git a/src/amd_smi/amd_smi_system.cc b/src/amd_smi/amd_smi_system.cc index 66e481c7ba..939dea6f5d 100644 --- a/src/amd_smi/amd_smi_system.cc +++ b/src/amd_smi/amd_smi_system.cc @@ -100,11 +100,11 @@ amdsmi_status_t AMDSmiSystem::populate_amd_cpus() { } } - amd_smi_status = get_cpu_sockets(sockets); - amd_smi_status = get_cpu_cores(cpus); - amd_smi_status = get_threads_per_core(threads); - amd_smi_status = get_cpu_family(family); - amd_smi_status = get_cpu_model(model); + amd_smi_status = get_cpu_sockets(&sockets); + amd_smi_status = get_cpu_cores(&cpus); + amd_smi_status = get_threads_per_core(&threads); + amd_smi_status = get_cpu_family(&family); + amd_smi_status = get_cpu_model(&model); std::cout << "\n***********************EPYC METRICS***********************" << std::endl; std::cout <<"| NR_SOCKETS | "<(esmi_number_of_sockets_get(&num_socks)); - sockets = num_socks; + ret = static_cast(esmi_number_of_sockets_get(num_socks)); + sockets = *num_socks; if (ret != AMDSMI_STATUS_SUCCESS) { std::cout << "Failed to get number of sockets, Err["<(esmi_number_of_cpus_get(&num_cpus)); - cpus = num_cpus; + ret = static_cast(esmi_number_of_cpus_get(num_cpus)); + cpus = *num_cpus; if (ret != AMDSMI_STATUS_SUCCESS) { std::cout << "Failed to get number of cpus, Err["<(esmi_threads_per_core_get(&threads_per_core)); - threads = threads_per_core; + ret = static_cast(esmi_threads_per_core_get(threads_per_core)); + threads = *threads_per_core; if (ret != AMDSMI_STATUS_SUCCESS) { std::cout << "Failed to get threads per core, Err["<(esmi_cpu_family_get(&cpu_family)); - family = cpu_family; + ret = static_cast(esmi_cpu_family_get(cpu_family)); + family = *cpu_family; if (ret != AMDSMI_STATUS_SUCCESS) { std::cout << "Failed to get cpu family, Err["<(esmi_cpu_model_get(&cpu_model)); - model = cpu_model; + ret = static_cast(esmi_cpu_model_get(cpu_model)); + model = *cpu_model; if (ret != AMDSMI_STATUS_SUCCESS) { std::cout << "Failed to get cpu model, Err["< Date: Fri, 10 Nov 2023 11:47:20 -0700 Subject: [PATCH 3/6] SWDEV-425457 - Correct typo in link to ESMI Library README Change-Id: Ia16ba0175b0cd3d4a38bab71eb0f1281878d81d2 --- docs/esmi_lib_readme_link.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/esmi_lib_readme_link.md b/docs/esmi_lib_readme_link.md index f52aec131a..559434f106 100644 --- a/docs/esmi_lib_readme_link.md +++ b/docs/esmi_lib_readme_link.md @@ -1,3 +1,3 @@ # ESMI Library README -For more information, see the [ESMI Library README](https://raw.githubusercontent.com/am/esmi_ib_library/master/docs/README.md) \ No newline at end of file +For more information, see the [ESMI Library README](https://raw.githubusercontent.com/amd/esmi_ib_library/master/docs/README.md) From 545e57d3e34c6068e195313559b20a7a6c881bba Mon Sep 17 00:00:00 2001 From: Maisam Arif Date: Fri, 10 Nov 2023 23:43:17 -0600 Subject: [PATCH 4/6] SWDEV-426130 - Updated firmware subcommand output Corrected truncation corrected xgmi to ta_xgmi remapped smc(system management controller) to pm(power management) Signed-off-by: Maisam Arif Change-Id: I404cefa7b90a454d4f4b08f6490448b47cf32107 --- amdsmi_cli/amdsmi_commands.py | 2 +- example/amd_smi_drm_example.cc | 8 ++++---- example/amd_smi_nodrm_example.cc | 4 ++-- include/amd_smi/amdsmi.h | 4 ++-- py-interface/amdsmi_interface.py | 17 ++++++++++++----- py-interface/amdsmi_wrapper.py | 14 +++++++------- src/amd_smi/amd_smi.cc | 4 ++-- tests/amd_smi_test/test_utils.cc | 4 ++-- 8 files changed, 32 insertions(+), 25 deletions(-) diff --git a/amdsmi_cli/amdsmi_commands.py b/amdsmi_cli/amdsmi_commands.py index 6c8e95398e..4bbeda5c23 100644 --- a/amdsmi_cli/amdsmi_commands.py +++ b/amdsmi_cli/amdsmi_commands.py @@ -625,7 +625,7 @@ class AMDSMICommands(): for fw_index, fw_entry in enumerate(fw_info['fw_list']): # Change fw_name to fw_id - fw_entry['fw_id'] = fw_entry.pop('fw_name').name.strip('FW_ID_') + fw_entry['fw_id'] = fw_entry.pop('fw_name').name.replace("FW_ID_", "") fw_entry['fw_version'] = fw_entry.pop('fw_version') # popping to ensure order # Add custom human readable formatting diff --git a/example/amd_smi_drm_example.cc b/example/amd_smi_drm_example.cc index 38a6882586..7d046cf4c5 100644 --- a/example/amd_smi_drm_example.cc +++ b/example/amd_smi_drm_example.cc @@ -191,8 +191,8 @@ void getFWNameFromId(int id, char *name) case FW_ID_TA_RAS: strcpy(name, "ID_TA_RAS"); break; - case FW_ID_XGMI: - strcpy(name, "ID_XGMI"); + case FW_ID_TA_XGMI: + strcpy(name, "ID_TA_XGMI"); break; case FW_ID_RLC_SRLG: strcpy(name, "ID_RLC_SRLG"); @@ -200,8 +200,8 @@ void getFWNameFromId(int id, char *name) case FW_ID_RLC_SRLS: strcpy(name, "ID_RLC_SRLS"); break; - case FW_ID_SMC: - strcpy(name, "ID_SMC"); + case FW_ID_PM: + strcpy(name, "ID_PM"); break; case FW_ID_DMCU: strcpy(name, "ID_DMCU"); diff --git a/example/amd_smi_nodrm_example.cc b/example/amd_smi_nodrm_example.cc index 843691d0a6..05ff84d669 100644 --- a/example/amd_smi_nodrm_example.cc +++ b/example/amd_smi_nodrm_example.cc @@ -186,8 +186,8 @@ int main() { printf("\tSMU: %ld\n", fw_information.fw_info_list[amdsmi_fw_block_t::FW_ID_SMU] .fw_version); - printf("\tSMC: %ld\n", - fw_information.fw_info_list[amdsmi_fw_block_t::FW_ID_SMC] + printf("\tPM: %ld\n", + fw_information.fw_info_list[amdsmi_fw_block_t::FW_ID_PM] .fw_version); printf("\tVCN: %ld\n", fw_information.fw_info_list[amdsmi_fw_block_t::FW_ID_VCN] diff --git a/include/amd_smi/amdsmi.h b/include/amd_smi/amdsmi.h index 89c0aca42b..7856d8cf47 100644 --- a/include/amd_smi/amdsmi.h +++ b/include/amd_smi/amdsmi.h @@ -357,10 +357,10 @@ typedef enum { FW_ID_RLC_SAVE_RESTORE_LIST, FW_ID_ASD, FW_ID_TA_RAS, - FW_ID_XGMI, + FW_ID_TA_XGMI, FW_ID_RLC_SRLG, FW_ID_RLC_SRLS, - FW_ID_SMC, + FW_ID_PM, FW_ID_DMCU, FW_ID__MAX } amdsmi_fw_block_t; diff --git a/py-interface/amdsmi_interface.py b/py-interface/amdsmi_interface.py index c9724671d4..71ae0ffd71 100644 --- a/py-interface/amdsmi_interface.py +++ b/py-interface/amdsmi_interface.py @@ -130,10 +130,10 @@ class AmdSmiFwBlock(IntEnum): FW_ID_RLC_SAVE_RESTORE_LIST = amdsmi_wrapper.FW_ID_RLC_SAVE_RESTORE_LIST FW_ID_ASD = amdsmi_wrapper.FW_ID_ASD FW_ID_TA_RAS = amdsmi_wrapper.FW_ID_TA_RAS - FW_ID_XGMI = amdsmi_wrapper.FW_ID_XGMI + FW_ID_TA_XGMI = amdsmi_wrapper.FW_ID_TA_XGMI FW_ID_RLC_SRLG = amdsmi_wrapper.FW_ID_RLC_SRLG FW_ID_RLC_SRLS = amdsmi_wrapper.FW_ID_RLC_SRLS - FW_ID_SMC = amdsmi_wrapper.FW_ID_SMC + FW_ID_PM = amdsmi_wrapper.FW_ID_PM FW_ID_DMCU = amdsmi_wrapper.FW_ID_DMCU @@ -1667,14 +1667,15 @@ def amdsmi_get_fw_info( _check_res(amdsmi_wrapper.amdsmi_get_fw_info( processor_handle, ctypes.byref(fw_info))) - hex_format_fw = [AmdSmiFwBlock.FW_ID_SMC, - AmdSmiFwBlock.FW_ID_PSP_SOSDRV, + hex_format_fw = [AmdSmiFwBlock.FW_ID_PSP_SOSDRV, AmdSmiFwBlock.FW_ID_TA_RAS, - AmdSmiFwBlock.FW_ID_XGMI, + AmdSmiFwBlock.FW_ID_TA_XGMI, AmdSmiFwBlock.FW_ID_UVD, AmdSmiFwBlock.FW_ID_VCE, AmdSmiFwBlock.FW_ID_VCN] + dec_format_fw = [AmdSmiFwBlock.FW_ID_PM] + firmwares = [] for i in range(0, fw_info.num_fw_info): fw_name = AmdSmiFwBlock(fw_info.fw_info_list[i].fw_id) @@ -1682,6 +1683,12 @@ def amdsmi_get_fw_info( if fw_name in hex_format_fw: fw_version_string = ".".join(re.findall('..?', hex(fw_version)[2:])) + elif fw_name in dec_format_fw: + # Convert every two hex digits to decimal and join them with a dot + dec_version_string = '' + for ver1,ver2 in zip(hex(fw_version)[2::2], hex(fw_version)[3::2]): + dec_version_string += str(int(f"0x{ver1}{ver2}", 0)) + "." + fw_version_string = dec_version_string.strip('.') else: fw_version_string = str(fw_version) diff --git a/py-interface/amdsmi_wrapper.py b/py-interface/amdsmi_wrapper.py index fafa936ecf..c19a492943 100644 --- a/py-interface/amdsmi_wrapper.py +++ b/py-interface/amdsmi_wrapper.py @@ -496,10 +496,10 @@ amdsmi_fw_block_t__enumvalues = { 71: 'FW_ID_RLC_SAVE_RESTORE_LIST', 72: 'FW_ID_ASD', 73: 'FW_ID_TA_RAS', - 74: 'FW_ID_XGMI', + 74: 'FW_ID_TA_XGMI', 75: 'FW_ID_RLC_SRLG', 76: 'FW_ID_RLC_SRLS', - 77: 'FW_ID_SMC', + 77: 'FW_ID_PM', 78: 'FW_ID_DMCU', 79: 'FW_ID__MAX', } @@ -577,10 +577,10 @@ FW_ID_RLCV_LX7 = 70 FW_ID_RLC_SAVE_RESTORE_LIST = 71 FW_ID_ASD = 72 FW_ID_TA_RAS = 73 -FW_ID_XGMI = 74 +FW_ID_TA_XGMI = 74 FW_ID_RLC_SRLG = 75 FW_ID_RLC_SRLS = 76 -FW_ID_SMC = 77 +FW_ID_PM = 77 FW_ID_DMCU = 78 FW_ID__MAX = 79 amdsmi_fw_block_t = ctypes.c_uint32 # enum @@ -2235,9 +2235,9 @@ __all__ = \ 'FW_ID_RS64_PFP_P1_DATA', 'FW_ID_SDMA0', 'FW_ID_SDMA1', 'FW_ID_SDMA2', 'FW_ID_SDMA3', 'FW_ID_SDMA4', 'FW_ID_SDMA5', 'FW_ID_SDMA6', 'FW_ID_SDMA7', 'FW_ID_SDMA_TH0', 'FW_ID_SDMA_TH1', - 'FW_ID_SEC_POLICY_STAGE2', 'FW_ID_SMC', 'FW_ID_SMU', - 'FW_ID_TA_RAS', 'FW_ID_UVD', 'FW_ID_VCE', 'FW_ID_VCN', - 'FW_ID_XGMI', 'FW_ID__MAX', 'MEMORY_PARTITION_NPS1', + 'FW_ID_SEC_POLICY_STAGE2', 'FW_ID_PM', 'FW_ID_SMU', + 'FW_ID_TA_RAS', 'FW_ID_TA_XGMI', 'FW_ID_UVD', 'FW_ID_VCE', + 'FW_ID_VCN', 'FW_ID__MAX', 'MEMORY_PARTITION_NPS1', 'MEMORY_PARTITION_NPS2', 'MEMORY_PARTITION_NPS4', 'MEMORY_PARTITION_NPS8', 'MEMORY_PARTITION_UNKNOWN', 'NON_AMD_CPU', 'NON_AMD_GPU', 'RD_BW0', 'TEMPERATURE_TYPE_EDGE', diff --git a/src/amd_smi/amd_smi.cc b/src/amd_smi/amd_smi.cc index 4866bedde6..2281f23593 100644 --- a/src/amd_smi/amd_smi.cc +++ b/src/amd_smi/amd_smi.cc @@ -662,10 +662,10 @@ amdsmi_status_t amdsmi_get_fw_info(amdsmi_processor_handle processor_handle, { FW_ID_RLC_RESTORE_LIST_SRM_MEM, RSMI_FW_BLOCK_RLC_SRLS}, { FW_ID_SDMA0, RSMI_FW_BLOCK_SDMA}, { FW_ID_SDMA1, RSMI_FW_BLOCK_SDMA2}, - { FW_ID_SMC, RSMI_FW_BLOCK_SMC}, + { FW_ID_PM, RSMI_FW_BLOCK_SMC}, { FW_ID_PSP_SOSDRV, RSMI_FW_BLOCK_SOS}, { FW_ID_TA_RAS, RSMI_FW_BLOCK_TA_RAS}, - { FW_ID_XGMI, RSMI_FW_BLOCK_TA_XGMI}, + { FW_ID_TA_XGMI, RSMI_FW_BLOCK_TA_XGMI}, { FW_ID_UVD, RSMI_FW_BLOCK_UVD}, { FW_ID_VCE, RSMI_FW_BLOCK_VCE}, { FW_ID_VCN, RSMI_FW_BLOCK_VCN} diff --git a/tests/amd_smi_test/test_utils.cc b/tests/amd_smi_test/test_utils.cc index 06fa98fe7e..a0b3e8e9e3 100644 --- a/tests/amd_smi_test/test_utils.cc +++ b/tests/amd_smi_test/test_utils.cc @@ -64,10 +64,10 @@ static const std::map kDevFWNameMap = { {FW_ID_RLC_SRLS, "rlc_srls"}, {FW_ID_SDMA1, "sdma1"}, {FW_ID_SDMA2, "sdma2"}, - {FW_ID_SMC, "smc"}, + {FW_ID_PM, "pm"}, {FW_ID_PSP_SOSDRV, "sos"}, {FW_ID_TA_RAS, "ta_ras"}, - {FW_ID_XGMI, "ta_xgmi"}, + {FW_ID_TA_XGMI, "ta_xgmi"}, {FW_ID_UVD, "uvd"}, {FW_ID_VCE, "vce"}, {FW_ID_VCN, "vcn"}, From 6441abdc1a5922a2f644fcb938a4bfc127f0032b Mon Sep 17 00:00:00 2001 From: Maisam Arif Date: Sat, 11 Nov 2023 02:14:16 -0600 Subject: [PATCH 5/6] SWDEV-425887 - Corrected vbios population Signed-off-by: Maisam Arif Change-Id: I3728064c77fae8cfa006254769a2cc821b4d5362 --- amdsmi_cli/amdsmi_commands.py | 4 ++++ src/amd_smi/amd_smi.cc | 19 +++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/amdsmi_cli/amdsmi_commands.py b/amdsmi_cli/amdsmi_commands.py index 4bbeda5c23..35e1bcde23 100644 --- a/amdsmi_cli/amdsmi_commands.py +++ b/amdsmi_cli/amdsmi_commands.py @@ -293,6 +293,10 @@ class AMDSMICommands(): if args.vbios: try: vbios_info = amdsmi_interface.amdsmi_get_gpu_vbios_info(args.gpu) + for key, value in vbios_info.items(): + if isinstance(value, str): + if value.strip() == '': + vbios_info[key] = "N/A" static_dict['vbios'] = vbios_info except amdsmi_exception.AmdSmiLibraryException as e: static_dict['vbios'] = "N/A" diff --git a/src/amd_smi/amd_smi.cc b/src/amd_smi/amd_smi.cc index 2281f23593..008638d1c4 100644 --- a/src/amd_smi/amd_smi.cc +++ b/src/amd_smi/amd_smi.cc @@ -1499,20 +1499,19 @@ amdsmi_get_gpu_vbios_info(amdsmi_processor_handle processor_handle, amdsmi_vbios amdsmi_status_t status; amd::smi::AMDSmiGPUDevice* gpu_device = nullptr; - amdsmi_status_t r = get_gpu_device_from_handle(processor_handle, &gpu_device); - if (r != AMDSMI_STATUS_SUCCESS) - return r; + status = get_gpu_device_from_handle(processor_handle, &gpu_device); + if (status != AMDSMI_STATUS_SUCCESS) + return status; if (gpu_device->check_if_drm_is_supported()) { status = gpu_device->amdgpu_query_vbios(&vbios); - if (status != AMDSMI_STATUS_SUCCESS) { - return status; + if (status == AMDSMI_STATUS_SUCCESS) { + strncpy(info->name, (char *) vbios.name, AMDSMI_MAX_STRING_LENGTH); + strncpy(info->build_date, (char *) vbios.date, AMDSMI_MAX_DATE_LENGTH); + strncpy(info->part_number, (char *) vbios.vbios_pn, AMDSMI_MAX_STRING_LENGTH); + strncpy(info->version, (char *) vbios.vbios_ver_str, AMDSMI_NORMAL_STRING_LENGTH); } - strncpy(info->name, (char *) vbios.name, AMDSMI_MAX_STRING_LENGTH); - strncpy(info->build_date, (char *) vbios.date, AMDSMI_MAX_DATE_LENGTH); - strncpy(info->part_number, (char *) vbios.vbios_pn, AMDSMI_MAX_STRING_LENGTH); - strncpy(info->version, (char *) vbios.vbios_ver_str, AMDSMI_NORMAL_STRING_LENGTH); } else { // get vbios version string from rocm_smi @@ -1528,7 +1527,7 @@ amdsmi_get_gpu_vbios_info(amdsmi_processor_handle processor_handle, amdsmi_vbios } } - return AMDSMI_STATUS_SUCCESS; + return status; } amdsmi_status_t From baa2c94a869e4fa82ac1b8d6a0f40f7b3af72261 Mon Sep 17 00:00:00 2001 From: Deepak Mewar Date: Tue, 14 Nov 2023 08:15:59 -0500 Subject: [PATCH 6/6] Added AMDSMI_CHECK_INIT to esmi library wrappers Change-Id: Id187a9152399cdefec21a0d310bdb78f593426af --- src/amd_smi/amd_smi.cc | 76 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/amd_smi/amd_smi.cc b/src/amd_smi/amd_smi.cc index 008638d1c4..1153416c66 100644 --- a/src/amd_smi/amd_smi.cc +++ b/src/amd_smi/amd_smi.cc @@ -2137,6 +2137,8 @@ amdsmi_status_t amdsmi_get_cpu_hsmp_proto_ver(amdsmi_cpusocket_handle socket_han amdsmi_status_t status; uint32_t hsmp_proto_ver; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2160,6 +2162,8 @@ amdsmi_status_t amdsmi_get_cpu_smu_fw_version(amdsmi_cpusocket_handle socket_han amdsmi_status_t status; struct smu_fw_version smu_fw; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2186,6 +2190,8 @@ amdsmi_status_t amdsmi_get_cpu_core_energy(amdsmi_processor_handle processor_han amdsmi_status_t status; uint64_t core_input; + AMDSMI_CHECK_INIT(); + if (processor_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2210,6 +2216,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_energy(amdsmi_cpusocket_handle socket_hand amdsmi_status_t status; uint64_t pkg_input; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2233,6 +2241,8 @@ amdsmi_status_t amdsmi_get_cpu_prochot_status(amdsmi_cpusocket_handle socket_han amdsmi_status_t status; uint32_t phot; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2256,6 +2266,8 @@ amdsmi_status_t amdsmi_get_cpu_fclk_mclk(amdsmi_cpusocket_handle socket_handle, amdsmi_status_t status; uint32_t f_clk, m_clk; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2280,6 +2292,8 @@ amdsmi_status_t amdsmi_get_cpu_cclk_limit(amdsmi_cpusocket_handle socket_handle, amdsmi_status_t status; uint32_t c_clk; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2303,6 +2317,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_current_active_freq_limit(amdsmi_cpusocket amdsmi_status_t status; uint16_t limit; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2327,6 +2343,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_freq_range(amdsmi_cpusocket_handle socket_ uint16_t f_max; uint16_t f_min; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2351,6 +2369,8 @@ amdsmi_status_t amdsmi_get_cpu_core_current_freq_limit(amdsmi_processor_handle p amdsmi_status_t status; uint32_t c_clk; + AMDSMI_CHECK_INIT(); + if (processor_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2375,6 +2395,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_power(amdsmi_cpusocket_handle socket_handl amdsmi_status_t status; uint32_t avg_power; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2398,6 +2420,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_power_cap(amdsmi_cpusocket_handle socket_h amdsmi_status_t status; uint32_t p_cap; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2421,6 +2445,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_power_cap_max(amdsmi_cpusocket_handle sock amdsmi_status_t status; uint32_t p_max; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2444,6 +2470,8 @@ amdsmi_status_t amdsmi_get_cpu_pwr_svi_telemetry_all_rails(amdsmi_cpusocket_hand amdsmi_status_t status; uint32_t pow; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2466,6 +2494,8 @@ amdsmi_status_t amdsmi_set_cpu_socket_power_cap(amdsmi_cpusocket_handle socket_h { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2487,6 +2517,8 @@ amdsmi_status_t amdsmi_set_cpu_pwr_efficiency_mode(amdsmi_cpusocket_handle socke { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2509,6 +2541,8 @@ amdsmi_status_t amdsmi_get_cpu_core_boostlimit(amdsmi_processor_handle processor amdsmi_status_t status; uint32_t boostlimit; + AMDSMI_CHECK_INIT(); + if (processor_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2532,6 +2566,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_c0_residency(amdsmi_cpusocket_handle socke amdsmi_status_t status; uint32_t res; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2554,6 +2590,8 @@ amdsmi_status_t amdsmi_set_cpu_core_boostlimit(amdsmi_processor_handle processor { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (processor_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2575,6 +2613,8 @@ amdsmi_status_t amdsmi_set_cpu_socket_boostlimit(amdsmi_cpusocket_handle socket_ { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2597,6 +2637,8 @@ amdsmi_status_t amdsmi_get_cpu_ddr_bw(amdsmi_cpusocket_handle socket_handle, amdsmi_status_t status; struct ddr_bw_metrics ddr; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2622,6 +2664,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_temperature(amdsmi_cpusocket_handle socket amdsmi_status_t status; uint32_t tmon; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2646,6 +2690,8 @@ amdsmi_status_t amdsmi_get_cpu_dimm_temp_range_and_refresh_rate( amdsmi_status_t status; struct temp_range_refresh_rate dimm_rate; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2671,6 +2717,8 @@ amdsmi_status_t amdsmi_get_cpu_dimm_power_consumption(amdsmi_cpusocket_handle so amdsmi_status_t status; struct dimm_power d_power; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2697,6 +2745,8 @@ amdsmi_status_t amdsmi_get_cpu_dimm_thermal_sensor(amdsmi_cpusocket_handle socke amdsmi_status_t status; struct dimm_thermal d_sensor; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2722,6 +2772,8 @@ amdsmi_status_t amdsmi_set_cpu_xgmi_width(amdsmi_cpusocket_handle socket_handle, { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2742,6 +2794,8 @@ amdsmi_status_t amdsmi_set_cpu_gmi3_link_width_range(amdsmi_cpusocket_handle soc { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2762,6 +2816,8 @@ amdsmi_status_t amdsmi_cpu_apb_enable(amdsmi_cpusocket_handle socket_handle, uin { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2782,6 +2838,8 @@ amdsmi_status_t amdsmi_cpu_apb_disable(amdsmi_cpusocket_handle socket_handle, { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2802,6 +2860,8 @@ amdsmi_status_t amdsmi_set_cpu_socket_lclk_dpm_level(amdsmi_cpusocket_handle soc { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2823,6 +2883,8 @@ amdsmi_status_t amdsmi_get_cpu_socket_lclk_dpm_level(amdsmi_cpusocket_handle soc amdsmi_status_t status; struct dpm_level nb; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2847,6 +2909,8 @@ amdsmi_status_t amdsmi_set_cpu_pcie_link_rate(amdsmi_cpusocket_handle socket_han { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2868,6 +2932,8 @@ amdsmi_status_t amdsmi_set_cpu_df_pstate_range(amdsmi_cpusocket_handle socket_ha { amdsmi_status_t status; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2891,6 +2957,8 @@ amdsmi_status_t amdsmi_get_cpu_current_io_bandwidth(amdsmi_cpusocket_handle sock uint32_t bw; struct link_id_bw_type io_link; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2918,6 +2986,8 @@ amdsmi_status_t amdsmi_get_cpu_current_xgmi_bw(amdsmi_cpusocket_handle socket_ha uint32_t bw; struct link_id_bw_type io_link; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2943,6 +3013,8 @@ amdsmi_status_t amdsmi_get_metrics_table_version(amdsmi_cpusocket_handle socket_ amdsmi_status_t status; uint32_t metrics_tbl_ver; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2966,6 +3038,8 @@ amdsmi_status_t amdsmi_get_metrics_table(amdsmi_cpusocket_handle socket_handle, amdsmi_status_t status; struct hsmp_metric_table metrics_tbl; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL; @@ -2989,6 +3063,8 @@ amdsmi_status_t amdsmi_first_online_core_on_cpu_socket(amdsmi_cpusocket_handle s amdsmi_status_t status; uint32_t online_core; + AMDSMI_CHECK_INIT(); + if (socket_handle == nullptr) return AMDSMI_STATUS_INVAL;