From ced110dbb66cf73af42bf1dadac3600543cdc822 Mon Sep 17 00:00:00 2001 From: "Ramalingam, Muthusamy" Date: Thu, 30 Jan 2025 01:15:02 +0530 Subject: [PATCH] amdsmi: Adding Support to get hsmp Driver version * amdsmi: Adding Support to get hsmp Driver version Adding Support to fetch hsmp driver version from ESmi Interfaces. Adding Support to fetch memory bandwidth per socket. Signed-off-by: muthusamy --- docs/reference/amdsmi-py-api.md | 46 ++++++++++ include/amd_smi/amdsmi.h | 21 +++++ include/amd_smi/impl/amd_hsmp.h | 151 +++++++++++++++++++++---------- py-interface/__init__.py | 2 + py-interface/amdsmi_interface.py | 25 +++++ py-interface/amdsmi_wrapper.py | 20 +++- src/amd_smi/amd_smi.cc | 30 +++++- 7 files changed, 246 insertions(+), 49 deletions(-) diff --git a/docs/reference/amdsmi-py-api.md b/docs/reference/amdsmi-py-api.md index fcd387c370..77594ef5e5 100644 --- a/docs/reference/amdsmi-py-api.md +++ b/docs/reference/amdsmi-py-api.md @@ -4010,6 +4010,52 @@ except AmdSmiException as e: print(e) ``` +### amdsmi_get_threads_per_core + +Description: Get number of threads per core. + +Output: cpu family + +Exceptions that can be thrown by `amdsmi_get_cpu_family` function: + +* `AmdSmiLibraryException` + +Example: + +```python +try: + threads_per_core = amdsmi_get_threads_per_core() + print(threads_per_core) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_cpu_hsmp_driver_version + +Description: Get the HSMP Driver version. + +Output: amdsmi HSMP Driver version + +Exceptions that can be thrown by `amdsmi_get_cpu_hsmp_driver_version` function: + +* `AmdSmiLibraryException` + +Example: + +```python +try: + processor_handles = amdsmi_get_cpusocket_handles() + if len(processor_handles) == 0: + print("No CPU sockets on machine") + else: + for processor in processor_handles: + version = amdsmi_get_cpu_hsmp_driver_version(processor) + print(version['major']) + print(version['minor']) +except AmdSmiException as e: + print(e) +``` + ### amdsmi_get_cpu_smu_fw_version Description: Get the SMU Firmware version. diff --git a/include/amd_smi/amdsmi.h b/include/amd_smi/amdsmi.h index dd5f7f9356..c43d4687b5 100644 --- a/include/amd_smi/amdsmi.h +++ b/include/amd_smi/amdsmi.h @@ -1685,6 +1685,14 @@ typedef struct { #define AMDSMI_DEFAULT_VARIANT 0xFFFFFFFFFFFFFFFF #ifdef ENABLE_ESMI_LIB +/** + * @brief This structure holds HSMP Driver version information. + */ +typedef struct { + uint8_t major; //!< Major version number + uint8_t minor; //!< Minor version number +} amdsmi_hsmp_driver_version_t; + /** * @brief This structure holds SMU Firmware version information. */ @@ -5365,6 +5373,19 @@ amdsmi_status_t amdsmi_get_cpu_socket_energy(amdsmi_processor_handle processor_h */ amdsmi_status_t amdsmi_get_threads_per_core(uint32_t *threads_per_core); +/** + * @brief Get HSMP Driver Version. + * + * @platform{cpu_bm} + * + * @param[in] processor_handle Cpu socket which to query + * @param[in,out] amdsmi_hsmp_driver_ver - Input buffer to return the HSMP Driver version + * + * @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail + */ +amdsmi_status_t amdsmi_get_cpu_hsmp_driver_version(amdsmi_processor_handle processor_handle, + amdsmi_hsmp_driver_version_t *amdsmi_hsmp_driver_ver); + /** * @brief Get SMU Firmware Version. * diff --git a/include/amd_smi/impl/amd_hsmp.h b/include/amd_smi/impl/amd_hsmp.h index b027cec2ad..c46a7610c5 100644 --- a/include/amd_smi/impl/amd_hsmp.h +++ b/include/amd_smi/impl/amd_hsmp.h @@ -13,58 +13,65 @@ * HSMP Messages supported */ enum hsmp_message_ids { - HSMP_TEST = 1, /* 01h Increments input value by 1 */ - HSMP_GET_SMU_VER, /* 02h SMU FW version */ - HSMP_GET_PROTO_VER, /* 03h HSMP interface version */ - HSMP_GET_SOCKET_POWER, /* 04h average package power consumption */ + HSMP_TEST = 1, /* 01h Increments input value by 1 */ + HSMP_GET_SMU_VER, /* 02h SMU FW version */ + HSMP_GET_PROTO_VER, /* 03h HSMP interface version */ + HSMP_GET_SOCKET_POWER, /* 04h average package power consumption */ HSMP_SET_SOCKET_POWER_LIMIT, /* 05h Set the socket power limit */ HSMP_GET_SOCKET_POWER_LIMIT, /* 06h Get current socket power limit */ HSMP_GET_SOCKET_POWER_LIMIT_MAX,/* 07h Get maximum socket power value */ - HSMP_SET_BOOST_LIMIT, /* 08h Set a core maximum frequency limit */ + HSMP_SET_BOOST_LIMIT, /* 08h Set a core maximum frequency limit */ HSMP_SET_BOOST_LIMIT_SOCKET, /* 09h Set socket maximum frequency level */ - HSMP_GET_BOOST_LIMIT, /* 0Ah Get current frequency limit */ - HSMP_GET_PROC_HOT, /* 0Bh Get PROCHOT status */ - HSMP_SET_XGMI_LINK_WIDTH, /* 0Ch Set max and min width of xGMI Link */ - HSMP_SET_DF_PSTATE, /* 0Dh Alter APEnable/Disable messages behavior */ - HSMP_SET_AUTO_DF_PSTATE, /* 0Eh Enable DF P-State Performance Boost algorithm */ - HSMP_GET_FCLK_MCLK, /* 0Fh Get FCLK and MEMCLK for current socket */ + HSMP_GET_BOOST_LIMIT, /* 0Ah Get current frequency limit */ + HSMP_GET_PROC_HOT, /* 0Bh Get PROCHOT status */ + HSMP_SET_XGMI_LINK_WIDTH, /* 0Ch Set max and min width of xGMI Link */ + HSMP_SET_DF_PSTATE, /* 0Dh Alter APEnable/Disable messages behavior */ + HSMP_SET_AUTO_DF_PSTATE, /* 0Eh Enable DF P-State Performance Boost algorithm */ + HSMP_GET_FCLK_MCLK, /* 0Fh Get FCLK and MEMCLK for current socket */ HSMP_GET_CCLK_THROTTLE_LIMIT, /* 10h Get CCLK frequency limit in socket */ - HSMP_GET_C0_PERCENT, /* 11h Get average C0 residency in socket */ - HSMP_SET_NBIO_DPM_LEVEL, /* 12h Set max/min LCLK DPM Level for a given NBIO */ - HSMP_GET_NBIO_DPM_LEVEL, /* 13h Get LCLK DPM level min and max for a given NBIO */ - HSMP_GET_DDR_BANDWIDTH, /* 14h Get theoretical maximum and current DDR Bandwidth */ - HSMP_GET_TEMP_MONITOR, /* 15h Get socket temperature */ - HSMP_GET_DIMM_TEMP_RANGE, /* 16h Get per-DIMM temperature range and refresh rate */ - HSMP_GET_DIMM_POWER, /* 17h Get per-DIMM power consumption */ - HSMP_GET_DIMM_THERMAL, /* 18h Get per-DIMM thermal sensors */ - HSMP_GET_SOCKET_FREQ_LIMIT, /* 19h Get current active frequency per socket */ - HSMP_GET_CCLK_CORE_LIMIT, /* 1Ah Get CCLK frequency limit per core */ - HSMP_GET_RAILS_SVI, /* 1Bh Get SVI-based Telemetry for all rails */ - HSMP_GET_SOCKET_FMAX_FMIN,/* 1Ch Get Fmax and Fmin per socket */ - HSMP_GET_IOLINK_BANDWITH, /* 1Dh Get current bandwidth on IO Link */ - HSMP_GET_XGMI_BANDWITH, /* 1Eh Get current bandwidth on xGMI Link */ - HSMP_SET_GMI3_WIDTH, /* 1Fh Set max and min GMI3 Link width */ - HSMP_SET_PCI_RATE, /* 20h Control link rate on PCIe devices */ - HSMP_SET_POWER_MODE, /* 21h Select power efficiency profile policy */ - HSMP_SET_PSTATE_MAX_MIN, /* 22h Set the max and min DF P-State */ - HSMP_GET_METRIC_TABLE_VER,/* 23h Get metrics table version */ - HSMP_GET_METRIC_TABLE, /* 24h Get metrics table */ + HSMP_GET_C0_PERCENT, /* 11h Get average C0 residency in socket */ + HSMP_SET_NBIO_DPM_LEVEL, /* 12h Set max/min LCLK DPM Level for a given NBIO */ + HSMP_GET_NBIO_DPM_LEVEL, /* 13h Get LCLK DPM level min and max for a given NBIO */ + HSMP_GET_DDR_BANDWIDTH, /* 14h Get theoretical maximum and current DDR Bandwidth */ + HSMP_GET_TEMP_MONITOR, /* 15h Get socket temperature */ + HSMP_GET_DIMM_TEMP_RANGE, /* 16h Get per-DIMM temperature range and refresh rate */ + HSMP_GET_DIMM_POWER, /* 17h Get per-DIMM power consumption */ + HSMP_GET_DIMM_THERMAL, /* 18h Get per-DIMM thermal sensors */ + HSMP_GET_SOCKET_FREQ_LIMIT, /* 19h Get current active frequency per socket */ + HSMP_GET_CCLK_CORE_LIMIT, /* 1Ah Get CCLK frequency limit per core */ + HSMP_GET_RAILS_SVI, /* 1Bh Get SVI-based Telemetry for all rails */ + HSMP_GET_SOCKET_FMAX_FMIN, /* 1Ch Get Fmax and Fmin per socket */ + HSMP_GET_IOLINK_BANDWITH, /* 1Dh Get current bandwidth on IO Link */ + HSMP_GET_XGMI_BANDWITH, /* 1Eh Get current bandwidth on xGMI Link */ + HSMP_SET_GMI3_WIDTH, /* 1Fh Set max and min GMI3 Link width */ + HSMP_SET_PCI_RATE, /* 20h Control link rate on PCIe devices */ + HSMP_SET_POWER_MODE, /* 21h Select power efficiency profile policy */ + HSMP_SET_PSTATE_MAX_MIN, /* 22h Set the max and min DF P-State */ + HSMP_GET_METRIC_TABLE_VER, /* 23h Get metrics table version */ + HSMP_GET_METRIC_TABLE, /* 24h Get metrics table */ HSMP_GET_METRIC_TABLE_DRAM_ADDR,/* 25h Get metrics table dram address */ + HSMP_SET_XGMI_PSTATE_RANGE, /* 26h Set xGMI P-state range */ + HSMP_CPU_RAIL_ISO_FREQ_POLICY, /* 27h Get/Set Cpu Iso frequency policy */ + HSMP_DFC_ENABLE_CTRL, /* 28h Enable/Disable DF C-state */ + HSMP_GET_RAPL_UNITS = 0x30, /* 30h Get scaling factor for energy */ + HSMP_GET_RAPL_CORE_COUNTER, /* 31h Get core energy counter value */ + HSMP_GET_RAPL_PACKAGE_COUNTER, /* 32h Get package energy counter value */ HSMP_MSG_ID_MAX, }; struct hsmp_message { - __u32 msg_id; /* Message ID */ - __u16 num_args; /* Number of input argument words in message */ - __u16 response_sz; /* Number of expected output/response words */ - __u32 args[HSMP_MAX_MSG_LEN]; /* argument/response buffer */ - __u16 sock_ind; /* socket number */ + __u32 msg_id; /* Message ID */ + __u16 num_args; /* Number of input argument words in message */ + __u16 response_sz; /* Number of expected output/response words */ + __u32 args[HSMP_MAX_MSG_LEN];/* argument/response buffer */ + __u16 sock_ind; /* socket number */ }; enum hsmp_msg_type { - HSMP_RSVD = -1, - HSMP_SET = 0, - HSMP_GET = 1, + HSMP_RSVD = -1, + HSMP_SET = 0, + HSMP_GET = 1, + HSMP_SET_GET = 2, }; enum hsmp_proto_versions { @@ -72,7 +79,8 @@ enum hsmp_proto_versions { HSMP_PROTO_VER3, HSMP_PROTO_VER4, HSMP_PROTO_VER5, - HSMP_PROTO_VER6 + HSMP_PROTO_VER6, + HSMP_PROTO_VER7 }; struct hsmp_msg_desc { @@ -88,8 +96,7 @@ struct hsmp_msg_desc { * * Not supported messages would return -ENOMSG. */ -static const struct hsmp_msg_desc hsmp_msg_desc_table[] - __attribute__((unused)) = { +static const struct hsmp_msg_desc hsmp_msg_desc_table[] = { /* RESERVED */ {0, 0, HSMP_RSVD}, @@ -252,7 +259,7 @@ static const struct hsmp_msg_desc hsmp_msg_desc_table[] /* * HSMP_GET_CCLK_CORE_LIMIT, num_args = 1, response_sz = 1 - * input: args[0] = apic id [31:0] + * input: args[0] = apic id of the core[31:0] * output: args[0] = frequency in MHz[31:0] */ {1, 1, HSMP_GET}, @@ -297,10 +304,11 @@ static const struct hsmp_msg_desc hsmp_msg_desc_table[] {1, 1, HSMP_SET}, /* - * HSMP_SET_POWER_MODE, num_args = 1, response_sz = 0 - * input: args[0] = power efficiency mode[2:0] + * HSMP_SET_POWER_MODE, num_args = 1, response_sz = 0/1 + * input: args[0] = set/get power mode[31] + power efficiency mode[2:0] + * output: args[0] = current power efficiency mode[2:0] */ - {1, 0, HSMP_SET}, + {1, 1, HSMP_SET_GET}, /* * HSMP_SET_PSTATE_MAX_MIN, num_args = 1, response_sz = 0 @@ -325,6 +333,57 @@ static const struct hsmp_msg_desc hsmp_msg_desc_table[] * output: args[1] = upper 32 bits of the address */ {0, 2, HSMP_GET}, + + /* + * HSMP_SET_XGMI_PSTATE_RANGE, num_args = 1, response_sz = 0 + * input: args[0] = min xGMI p-state[15:8] + max xGMI state[7:0] + */ + {1, 0, HSMP_SET}, + + /* + * HSMP_CPU_RAIL_ISO_FREQ_POLICY, num_args = 1, response_sz = 1 + * input: args[0] = set/get policy[31] + + * disable/enable independent control[0] + * output: args[0] = current policy[0] + */ + {1, 1, HSMP_SET_GET}, + + /* + * HSMP_DFC_ENABLE_CTRL, num_args = 1, response_sz = 1 + * input: args[0] = set/get policy[31] + enable/disable DFC[0] + * output: args[0] = current policy[0] + */ + {1, 1, HSMP_SET_GET}, + + /* RESERVED(0x29-0x2f) */ + {0, 0, HSMP_RSVD}, + {0, 0, HSMP_RSVD}, + {0, 0, HSMP_RSVD}, + {0, 0, HSMP_RSVD}, + {0, 0, HSMP_RSVD}, + {0, 0, HSMP_RSVD}, + {0, 0, HSMP_RSVD}, + + /* + * HSMP_GET_RAPL_UNITS, response_sz = 1 + * output: args[0] = tu value[19:16] + esu value[12:8] + */ + {0, 1, HSMP_GET}, + + /* + * HSMP_GET_RAPL_CORE_COUNTER, num_args = 1, response_sz = 1 + * input: args[0] = Apic id[15:0] + * output: args[0] = lower 32 bits of energy + * output: args[1] = upper 32 bits of energy + */ + {1, 2, HSMP_GET}, + + /* + * HSMP_GET_RAPL_PACKAGE_COUNTER, num_args = 0, response_sz = 1 + * output: args[0] = lower 32 bits of energy + * output: args[1] = upper 32 bits of energy + */ + {0, 2, HSMP_GET}, }; /* Metrics table (supported only with proto version 6) */ diff --git a/py-interface/__init__.py b/py-interface/__init__.py index 30ef0c368d..4c96d2954c 100644 --- a/py-interface/__init__.py +++ b/py-interface/__init__.py @@ -39,6 +39,8 @@ try: from .amdsmi_interface import amdsmi_get_cpu_smu_fw_version from .amdsmi_interface import amdsmi_get_cpu_core_energy from .amdsmi_interface import amdsmi_get_cpu_socket_energy + from .amdsmi_interface import amdsmi_get_threads_per_core + from .amdsmi_interface import amdsmi_get_cpu_hsmp_driver_version from .amdsmi_interface import amdsmi_get_cpu_prochot_status from .amdsmi_interface import amdsmi_get_cpu_fclk_mclk from .amdsmi_interface import amdsmi_get_cpu_cclk_limit diff --git a/py-interface/amdsmi_interface.py b/py-interface/amdsmi_interface.py index 4d04d26912..680857bf2b 100644 --- a/py-interface/amdsmi_interface.py +++ b/py-interface/amdsmi_interface.py @@ -826,6 +826,21 @@ def amdsmi_get_cpu_smu_fw_version(processor_handle: amdsmi_wrapper.amdsmi_proces "smu_fw_major_ver_num": smu_fw.major } +def amdsmi_get_cpu_hsmp_driver_version(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + hsmp_driver_version = amdsmi_wrapper.amdsmi_hsmp_driver_version_t() + + _check_res(amdsmi_wrapper.amdsmi_get_cpu_hsmp_driver_version(processor_handle, hsmp_driver_version)) + + return { + "hsmp_driver_major_ver_num": hsmp_driver_version.major, + "hsmp_driver_minor_ver_num": hsmp_driver_version.minor, + } + def amdsmi_get_cpu_core_energy( processor_handle: amdsmi_wrapper.amdsmi_processor_handle ) -> int: @@ -860,6 +875,16 @@ def amdsmi_get_cpu_socket_energy( return f"{float(penergy.value * pow(10, -6))} J" +def amdsmi_get_threads_per_core(): + threads_per_core = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_threads_per_core( + ctypes.byref(threads_per_core) + ) + ) + + return threads_per_core.value + def amdsmi_get_cpu_prochot_status( processor_handle: amdsmi_wrapper.amdsmi_processor_handle ) -> int: diff --git a/py-interface/amdsmi_wrapper.py b/py-interface/amdsmi_wrapper.py index 006a7533cf..2256c4bf25 100644 --- a/py-interface/amdsmi_wrapper.py +++ b/py-interface/amdsmi_wrapper.py @@ -1989,6 +1989,16 @@ struct_amdsmi_topology_nearest_t._fields_ = [ ] amdsmi_topology_nearest_t = struct_amdsmi_topology_nearest_t +class struct_amdsmi_hsmp_driver_version_t(Structure): + pass + +struct_amdsmi_hsmp_driver_version_t._pack_ = 1 # source:False +struct_amdsmi_hsmp_driver_version_t._fields_ = [ + ('major', ctypes.c_ubyte), + ('minor', ctypes.c_ubyte), +] + +amdsmi_hsmp_driver_version_t = struct_amdsmi_hsmp_driver_version_t class struct_amdsmi_smu_fw_version_t(Structure): pass @@ -2553,6 +2563,9 @@ amdsmi_get_cpu_socket_energy.argtypes = [amdsmi_processor_handle, ctypes.POINTER amdsmi_get_threads_per_core = _libraries['libamd_smi.so'].amdsmi_get_threads_per_core amdsmi_get_threads_per_core.restype = amdsmi_status_t amdsmi_get_threads_per_core.argtypes = [ctypes.POINTER(ctypes.c_uint32)] +amdsmi_get_cpu_hsmp_driver_version = _libraries['libamd_smi.so'].amdsmi_get_cpu_hsmp_driver_version +amdsmi_get_cpu_hsmp_driver_version.restype = amdsmi_status_t +amdsmi_get_cpu_hsmp_driver_version.argtypes = [amdsmi_processor_handle, ctypes.POINTER(struct_amdsmi_hsmp_driver_version_t)] amdsmi_get_cpu_smu_fw_version = _libraries['libamd_smi.so'].amdsmi_get_cpu_smu_fw_version amdsmi_get_cpu_smu_fw_version.restype = amdsmi_status_t amdsmi_get_cpu_smu_fw_version.argtypes = [amdsmi_processor_handle, ctypes.POINTER(struct_amdsmi_smu_fw_version_t)] @@ -2922,6 +2935,7 @@ __all__ = \ 'amdsmi_get_cpu_dimm_temp_range_and_refresh_rate', 'amdsmi_get_cpu_dimm_thermal_sensor', 'amdsmi_get_cpu_family', 'amdsmi_get_cpu_fclk_mclk', 'amdsmi_get_cpu_handles', + 'amdsmi_get_cpu_hsmp_driver_version', 'amdsmi_get_cpu_hsmp_proto_ver', 'amdsmi_get_cpu_model', 'amdsmi_get_cpu_prochot_status', 'amdsmi_get_cpu_pwr_svi_telemetry_all_rails', @@ -2996,8 +3010,9 @@ __all__ = \ 'amdsmi_gpu_cache_info_t', 'amdsmi_gpu_control_counter', 'amdsmi_gpu_counter_group_supported', 'amdsmi_gpu_create_counter', 'amdsmi_gpu_destroy_counter', 'amdsmi_gpu_metrics_t', - 'amdsmi_gpu_read_counter', 'amdsmi_gpu_validate_ras_eeprom', - 'amdsmi_gpu_xcp_metrics_t', 'amdsmi_gpu_xgmi_error_status', + 'amdsmi_gpu_read_counter', 'amdsmi_gpu_xcp_metrics_t', + 'amdsmi_gpu_xgmi_error_status', 'amdsmi_hsmp_driver_version_t', + 'amdsmi_gpu_validate_ras_eeprom', 'amdsmi_hsmp_freqlimit_src_names', 'amdsmi_hsmp_metrics_table_t', 'amdsmi_init', 'amdsmi_init_flags_t', 'amdsmi_init_gpu_event_notification', 'amdsmi_io_bw_encoding_t', @@ -3070,6 +3085,7 @@ __all__ = \ 'struct_amdsmi_frequency_range_t', 'struct_amdsmi_fw_info_t', 'struct_amdsmi_gpu_cache_info_t', 'struct_amdsmi_gpu_metrics_t', 'struct_amdsmi_gpu_xcp_metrics_t', + 'struct_amdsmi_hsmp_driver_version_t', 'struct_amdsmi_hsmp_metrics_table_t', 'struct_amdsmi_kfd_info_t', 'struct_amdsmi_link_id_bw_type_t', 'struct_amdsmi_link_metrics_t', 'struct_amdsmi_memory_partition_config_t', diff --git a/src/amd_smi/amd_smi.cc b/src/amd_smi/amd_smi.cc index f8b61def8d..ef9897410c 100644 --- a/src/amd_smi/amd_smi.cc +++ b/src/amd_smi/amd_smi.cc @@ -3831,6 +3831,27 @@ amdsmi_status_t amdsmi_get_cpu_hsmp_proto_ver(amdsmi_processor_handle processor_ return AMDSMI_STATUS_SUCCESS; } +amdsmi_status_t amdsmi_get_cpu_hsmp_driver_version(amdsmi_processor_handle processor_handle, + amdsmi_hsmp_driver_version_t *amdsmi_hsmp_driver_ver) +{ + amdsmi_status_t status; + struct hsmp_driver_version hsmp_driver_ver; + + AMDSMI_CHECK_INIT(); + + if (processor_handle == nullptr) + return AMDSMI_STATUS_INVAL; + + status = static_cast(esmi_hsmp_driver_version_get(&hsmp_driver_ver)); + if (status != AMDSMI_STATUS_SUCCESS) + return amdsmi_errno_to_esmi_status(status); + + amdsmi_hsmp_driver_ver->major = hsmp_driver_ver.major; + amdsmi_hsmp_driver_ver->minor = hsmp_driver_ver.minor; + + return AMDSMI_STATUS_SUCCESS; +} + amdsmi_status_t amdsmi_get_cpu_smu_fw_version(amdsmi_processor_handle processor_handle, amdsmi_smu_fw_version_t *amdsmi_smu_fw) { @@ -4340,13 +4361,20 @@ amdsmi_status_t amdsmi_get_cpu_ddr_bw(amdsmi_processor_handle processor_handle, { amdsmi_status_t status; struct ddr_bw_metrics ddr; + uint8_t sock_ind; AMDSMI_CHECK_INIT(); if (processor_handle == nullptr) return AMDSMI_STATUS_INVAL; - status = static_cast(esmi_ddr_bw_get(&ddr)); + amdsmi_status_t r = amdsmi_get_processor_info(processor_handle, SIZE, proc_id); + if (r != AMDSMI_STATUS_SUCCESS) + return r; + + sock_ind = (uint8_t)std::stoi(proc_id, NULL, 0); + + status = static_cast(esmi_ddr_bw_get(sock_ind, &ddr)); if (status != AMDSMI_STATUS_SUCCESS) return amdsmi_errno_to_esmi_status(status);