From a997bf8c082b82fda20b62116a4c2569d8f122af Mon Sep 17 00:00:00 2001 From: Maisam Arif Date: Wed, 30 Aug 2023 10:43:29 -0500 Subject: [PATCH 1/3] Removed replay_count from Virtual OS's Change-Id: I5abb12d32e756f954f7e36595979bb8f1cbe5ad9 Signed-off-by: Maisam Arif [ROCm/amdsmi commit: cc4417d3012eb41b6f7e0b248b796f495b535261] --- projects/amdsmi/amdsmi_cli/amdsmi_commands.py | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/projects/amdsmi/amdsmi_cli/amdsmi_commands.py b/projects/amdsmi/amdsmi_cli/amdsmi_commands.py index c157d7141a..12b3fb4cd8 100644 --- a/projects/amdsmi/amdsmi_cli/amdsmi_commands.py +++ b/projects/amdsmi/amdsmi_cli/amdsmi_commands.py @@ -678,11 +678,13 @@ class AMDSMICommands(): args.iterations = iterations if fb_usage: args.fb_usage = fb_usage - if replay_count: - args.replay_count = replay_count if mem_usage: args.mem_usage = mem_usage + if not self.helpers.is_virtual_os(): + if replay_count: + args.replay_count = replay_count + if self.helpers.is_linux() and self.helpers.is_baremetal(): if usage: args.usage = usage @@ -753,8 +755,8 @@ class AMDSMICommands(): # Check if any of the options have been set, if not then set them all to true if self.helpers.is_linux() and self.helpers.is_virtual_os(): - if not any([args.fb_usage, args.replay_count, args.mem_usage]): - args.fb_usage = args.replay_count = args.mem_usage = self.all_arguments = True + if not any([args.fb_usage, args.mem_usage]): + args.fb_usage = args.mem_usage = self.all_arguments = True if self.helpers.is_linux() and self.helpers.is_baremetal(): if not any([args.usage, args.fb_usage, args.power, args.clock, args.temperature, @@ -788,6 +790,7 @@ class AMDSMICommands(): values_dict['usage'] = e.get_error_info() if not self.all_arguments: raise e + if args.fb_usage: try: vram_usage = amdsmi_interface.amdsmi_get_gpu_vram_usage(args.gpu) @@ -923,7 +926,6 @@ class AMDSMICommands(): values_dict['ecc'] = e.get_error_info() if not self.all_arguments: raise e - if args.ecc_block: ecc_dict = {} try: @@ -1042,14 +1044,17 @@ class AMDSMICommands(): values_dict['perf_level'] = e.get_error_info() if not self.all_arguments: raise e - if args.replay_count: - try: - pci_replay_counter = amdsmi_interface.amdsmi_get_gpu_pci_replay_counter(args.gpu) - values_dict['replay_count'] = pci_replay_counter - except amdsmi_exception.AmdSmiLibraryException as e: - values_dict['replay_count'] = e.get_error_info() - if not self.all_arguments: - raise e + + if not self.helpers.is_virtual_os(): + if args.replay_count: + try: + pci_replay_counter = amdsmi_interface.amdsmi_get_gpu_pci_replay_counter(args.gpu) + values_dict['replay_count'] = pci_replay_counter + except amdsmi_exception.AmdSmiLibraryException as e: + values_dict['replay_count'] = e.get_error_info() + if not self.all_arguments: + raise e + if self.helpers.is_linux() and self.helpers.is_baremetal(): if args.xgmi_err: try: @@ -1061,6 +1066,7 @@ class AMDSMICommands(): raise e if args.energy: pass + if args.mem_usage: memory_total = {} try: From 9d8c10b3e5f59c3d324d9a49d203b1e45caf10a0 Mon Sep 17 00:00:00 2001 From: Deepak Mewar Date: Mon, 4 Sep 2023 08:14:16 -0400 Subject: [PATCH 2/3] Updated esmi error checking for graceful return Change-Id: I1bcd498e3482dc7acd92b1a762f892b3dd978ff2 [ROCm/amdsmi commit: 14cf5f2762d1e74dbb58e727949a67ccba793544] --- .../example/amdsmi_esmi_intg_example.cc | 23 ++++++++----------- projects/amdsmi/include/amd_smi/amdsmi.h | 4 ++-- projects/amdsmi/src/amd_smi/amd_smi.cc | 4 ++-- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/projects/amdsmi/example/amdsmi_esmi_intg_example.cc b/projects/amdsmi/example/amdsmi_esmi_intg_example.cc index bc84b7a73d..363124bb01 100644 --- a/projects/amdsmi/example/amdsmi_esmi_intg_example.cc +++ b/projects/amdsmi/example/amdsmi_esmi_intg_example.cc @@ -60,10 +60,10 @@ using namespace std; if (RET != AMDSMI_STATUS_SUCCESS) { \ const char *err_str; \ const char **status_str; \ - std::cout << "AMDSMI call returned " << RET << " at line " \ - << __LINE__ << std::endl; \ - *status_str = amdsmi_get_esmi_err_msg(RET, &err_str); \ - std::cout << *status_str << std::endl; \ + cout << "AMDSMI call returned " << RET << " at line " \ + << __LINE__ << endl; \ + status_str = amdsmi_get_esmi_err_msg(RET, &err_str); \ + cout << *status_str << endl; \ return RET; \ } \ } @@ -85,13 +85,13 @@ int main(int argc, char **argv) { CHK_AMDSMI_RET(ret) // Allocate the memory for the sockets - std::vector sockets(socket_count); + vector sockets(socket_count); // Get the sockets of the system ret = amdsmi_get_cpusocket_handles(&socket_count, &sockets[0]); CHK_AMDSMI_RET(ret) - std::cout << "Total Socket: " << socket_count << std::endl; + cout << "Total Socket: " << socket_count << endl; // For each socket, get identifier and cores for (uint32_t i = 0; i < socket_count; i++) { @@ -99,7 +99,7 @@ int main(int argc, char **argv) { uint32_t socket_info; ret = amdsmi_get_cpusocket_info(sockets[i], socket_info); CHK_AMDSMI_RET(ret) - std::cout << "Socket " << socket_info << std::endl; + cout << "Socket " << socket_info << endl; // Get the core count available for the socket. uint32_t core_count = 0; @@ -107,12 +107,12 @@ int main(int argc, char **argv) { CHK_AMDSMI_RET(ret) // Allocate the memory for the cpu core handles on the socket - std::vector processor_handles(core_count); + vector processor_handles(core_count); // Get all cores of the socket ret = amdsmi_get_cpucore_handles(sockets[i], &core_count, &processor_handles[0]); CHK_AMDSMI_RET(ret) - std::cout << "core_count=" << core_count << std::endl; + cout << "core_count=" << core_count << endl; ret = amdsmi_get_cpu_hsmp_proto_ver(sockets[i], &proto_ver); CHK_AMDSMI_RET(ret) @@ -235,7 +235,6 @@ int main(int argc, char **argv) { } cout<<"\n-------------------------------------------------\n"; -#if 0 uint32_t c_clk = 0; ret = amdsmi_get_cpu_core_current_freq_limit(processor_handles[i], i, &c_clk); CHK_AMDSMI_RET(ret) @@ -243,7 +242,6 @@ int main(int argc, char **argv) { cout<<"--------------------------------------------------------------"; cout<<"\n| CPU["< Date: Thu, 31 Aug 2023 09:08:46 -0500 Subject: [PATCH 3/3] Add API for the memory type Get the memory type from libdrm and add a new API. Change-Id: I89327bca2ef860f2e3f4f6ca20def2331eba66c0 [ROCm/amdsmi commit: b52034fed8fb890792088e027dd75ea35666bd9b] --- .../amdsmi/example/amd_smi_drm_example.cc | 2 +- .../amdsmi/example/amd_smi_nodrm_example.cc | 2 +- projects/amdsmi/include/amd_smi/amdsmi.h | 59 ++++++++++++++++- .../amdsmi/py-interface/amdsmi_interface.py | 2 +- .../amdsmi/py-interface/amdsmi_wrapper.py | 14 ++-- projects/amdsmi/src/amd_smi/amd_smi.cc | 66 ++++++++++++++++++- .../amd_smi_test/functional/id_info_read.cc | 13 ++++ 7 files changed, 145 insertions(+), 13 deletions(-) diff --git a/projects/amdsmi/example/amd_smi_drm_example.cc b/projects/amdsmi/example/amd_smi_drm_example.cc index 3696c4a1df..6083324519 100644 --- a/projects/amdsmi/example/amd_smi_drm_example.cc +++ b/projects/amdsmi/example/amd_smi_drm_example.cc @@ -619,7 +619,7 @@ int main() { << "\n\n"; // Get frame buffer - amdsmi_vram_info_t vram_usage = {}; + amdsmi_vram_usage_t vram_usage = {}; ret = amdsmi_get_gpu_vram_usage(processor_handles[j], &vram_usage); CHK_AMDSMI_RET(ret) printf(" Output of amdsmi_get_gpu_vram_usage:\n"); diff --git a/projects/amdsmi/example/amd_smi_nodrm_example.cc b/projects/amdsmi/example/amd_smi_nodrm_example.cc index 0e159f1658..afa66edfd7 100644 --- a/projects/amdsmi/example/amd_smi_nodrm_example.cc +++ b/projects/amdsmi/example/amd_smi_nodrm_example.cc @@ -308,7 +308,7 @@ int main() { << "\n\n"; // Get frame buffer - amdsmi_vram_info_t vram_usage = {}; + amdsmi_vram_usage_t vram_usage = {}; ret = amdsmi_get_gpu_vram_usage(processor_handles[j], &vram_usage); CHK_AMDSMI_RET(ret) printf(" Output of amdsmi_get_gpu_vram_usage:\n"); diff --git a/projects/amdsmi/include/amd_smi/amdsmi.h b/projects/amdsmi/include/amd_smi/amdsmi.h index c1ae90cdae..0b6723f8f8 100644 --- a/projects/amdsmi/include/amd_smi/amdsmi.h +++ b/projects/amdsmi/include/amd_smi/amdsmi.h @@ -322,6 +322,40 @@ typedef enum { FW_ID__MAX } amdsmi_fw_block_t; + +typedef enum { + VRAM_TYPE_UNKNOWN = 0, + VRAM_TYPE_GDDR1 = 1, + VRAM_TYPE_DDR2 = 2, + VRAM_TYPE_GDDR3 = 3, + VRAM_TYPE_GDDR4 = 4, + VRAM_TYPE_GDDR5 = 5, + VRAM_TYPE_HBM = 6, + VRAM_TYPE_DDR3 = 7, + VRAM_TYPE_DDR4 = 8, + VRAM_TYPE_GDDR6 = 9, + VRAM_TYPE__MAX = VRAM_TYPE_GDDR6 +} amdsmi_vram_type_t; + +typedef enum { + AMDSMI_VRAM_VENDOR__PLACEHOLDER0, + AMDSMI_VRAM_VENDOR__SAMSUNG, + AMDSMI_VRAM_VENDOR__INFINEON, + AMDSMI_VRAM_VENDOR__ELPIDA, + AMDSMI_VRAM_VENDOR__ETRON, + AMDSMI_VRAM_VENDOR__NANYA, + AMDSMI_VRAM_VENDOR__HYNIX, + AMDSMI_VRAM_VENDOR__MOSEL, + AMDSMI_VRAM_VENDOR__WINBOND, + AMDSMI_VRAM_VENDOR__ESMT, + AMDSMI_VRAM_VENDOR__PLACEHOLDER1, + AMDSMI_VRAM_VENDOR__PLACEHOLDER2, + AMDSMI_VRAM_VENDOR__PLACEHOLDER3, + AMDSMI_VRAM_VENDOR__PLACEHOLDER4, + AMDSMI_VRAM_VENDOR__PLACEHOLDER5, + AMDSMI_VRAM_VENDOR__MICRON, +} amdsmi_vram_vendor_type_t; + /** * @brief This structure represents a range (e.g., frequencies or voltages). */ @@ -343,7 +377,7 @@ typedef struct { uint32_t vram_total; uint32_t vram_used; uint32_t reserved[2]; -} amdsmi_vram_info_t; +} amdsmi_vram_usage_t; typedef struct { amdsmi_range_t supported_freq_range; @@ -399,6 +433,13 @@ typedef struct { uint32_t reserved[19]; } amdsmi_asic_info_t; +typedef struct{ + amdsmi_vram_type_t vram_type; + amdsmi_vram_vendor_type_t vram_vendor; + uint64_t vram_size_mb; +} amdsmi_vram_info_t; + + typedef struct { char driver_version[AMDSMI_MAX_STRING_LENGTH]; char driver_date[AMDSMI_MAX_STRING_LENGTH]; @@ -3425,6 +3466,19 @@ amdsmi_get_gpu_driver_info(amdsmi_processor_handle processor_handle, amdsmi_driv amdsmi_status_t amdsmi_get_gpu_asic_info(amdsmi_processor_handle processor_handle, amdsmi_asic_info_t *info); +/** + * @brief Returns vram info + * + * @param[in] processor_handle PF of a processor for which to query + * + * @param[out] info Reference to vram info structure + * Must be allocated by user. + * + * @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail + */ +amdsmi_status_t amdsmi_get_gpu_vram_info( + amdsmi_processor_handle processor_handle, amdsmi_vram_info_t *info); + /** * @brief Returns the board part number and board information for the requested device * @@ -3566,7 +3620,8 @@ amdsmi_get_clock_info(amdsmi_processor_handle processor_handle, amdsmi_clk_type_ * @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail */ amdsmi_status_t -amdsmi_get_gpu_vram_usage(amdsmi_processor_handle processor_handle, amdsmi_vram_info_t *info); +amdsmi_get_gpu_vram_usage(amdsmi_processor_handle processor_handle, amdsmi_vram_usage_t *info); + /** @} End gpumon */ diff --git a/projects/amdsmi/py-interface/amdsmi_interface.py b/projects/amdsmi/py-interface/amdsmi_interface.py index bc83181d2a..c0e10a3404 100644 --- a/projects/amdsmi/py-interface/amdsmi_interface.py +++ b/projects/amdsmi/py-interface/amdsmi_interface.py @@ -995,7 +995,7 @@ def amdsmi_get_gpu_vram_usage( processor_handle, amdsmi_wrapper.amdsmi_processor_handle ) - vram_info = amdsmi_wrapper.amdsmi_vram_info_t() + vram_info = amdsmi_wrapper.amdsmi_vram_usage_t() _check_res( amdsmi_wrapper.amdsmi_get_gpu_vram_usage( processor_handle, ctypes.byref(vram_info)) diff --git a/projects/amdsmi/py-interface/amdsmi_wrapper.py b/projects/amdsmi/py-interface/amdsmi_wrapper.py index eeded45f6b..d2f9eefa92 100644 --- a/projects/amdsmi/py-interface/amdsmi_wrapper.py +++ b/projects/amdsmi/py-interface/amdsmi_wrapper.py @@ -578,17 +578,17 @@ struct_amdsmi_xgmi_info_t._fields_ = [ ] amdsmi_xgmi_info_t = struct_amdsmi_xgmi_info_t -class struct_amdsmi_vram_info_t(Structure): +class struct_amdsmi_vram_usage_t(Structure): pass -struct_amdsmi_vram_info_t._pack_ = 1 # source:False -struct_amdsmi_vram_info_t._fields_ = [ +struct_amdsmi_vram_usage_t._pack_ = 1 # source:False +struct_amdsmi_vram_usage_t._fields_ = [ ('vram_total', ctypes.c_uint32), ('vram_used', ctypes.c_uint32), ('reserved', ctypes.c_uint32 * 2), ] -amdsmi_vram_info_t = struct_amdsmi_vram_info_t +amdsmi_vram_usage_t = struct_amdsmi_vram_usage_t class struct_amdsmi_frequency_range_t(Structure): pass @@ -1637,7 +1637,7 @@ amdsmi_get_clock_info.restype = amdsmi_status_t amdsmi_get_clock_info.argtypes = [amdsmi_processor_handle, amdsmi_clk_type_t, ctypes.POINTER(struct_amdsmi_clk_info_t)] amdsmi_get_gpu_vram_usage = _libraries['libamd_smi.so'].amdsmi_get_gpu_vram_usage amdsmi_get_gpu_vram_usage.restype = amdsmi_status_t -amdsmi_get_gpu_vram_usage.argtypes = [amdsmi_processor_handle, ctypes.POINTER(struct_amdsmi_vram_info_t)] +amdsmi_get_gpu_vram_usage.argtypes = [amdsmi_processor_handle, ctypes.POINTER(struct_amdsmi_vram_usage_t)] amdsmi_get_gpu_process_list = _libraries['libamd_smi.so'].amdsmi_get_gpu_process_list amdsmi_get_gpu_process_list.restype = amdsmi_status_t amdsmi_get_gpu_process_list.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint32)] @@ -1868,7 +1868,7 @@ __all__ = \ 'amdsmi_topo_get_numa_node_number', 'amdsmi_utilization_counter_t', 'amdsmi_vbios_info_t', 'amdsmi_version_t', 'amdsmi_voltage_metric_t', - 'amdsmi_voltage_type_t', 'amdsmi_vram_info_t', + 'amdsmi_voltage_type_t', 'amdsmi_vram_usage_t', 'amdsmi_xgmi_info_t', 'amdsmi_xgmi_status_t', 'processor_type_t', 'size_t', 'struct_amd_metrics_table_header_t', 'struct_amdsmi_asic_info_t', 'struct_amdsmi_board_info_t', @@ -1888,7 +1888,7 @@ __all__ = \ 'struct_amdsmi_range_t', 'struct_amdsmi_retired_page_record_t', 'struct_amdsmi_utilization_counter_t', 'struct_amdsmi_vbios_info_t', 'struct_amdsmi_version_t', - 'struct_amdsmi_vram_info_t', 'struct_amdsmi_xgmi_info_t', + 'struct_amdsmi_vram_usage_t', 'struct_amdsmi_xgmi_info_t', 'struct_engine_usage_', 'struct_fields_', 'struct_fw_info_list_', 'struct_memory_usage_', 'uint32_t', 'uint64_t', 'union_amdsmi_bdf_t'] diff --git a/projects/amdsmi/src/amd_smi/amd_smi.cc b/projects/amdsmi/src/amd_smi/amd_smi.cc index b48fc5c60f..6a70a880a5 100644 --- a/projects/amdsmi/src/amd_smi/amd_smi.cc +++ b/projects/amdsmi/src/amd_smi/amd_smi.cc @@ -503,7 +503,7 @@ amdsmi_status_t amdsmi_get_temp_metric(amdsmi_processor_handle processor_handle } amdsmi_status_t amdsmi_get_gpu_vram_usage(amdsmi_processor_handle processor_handle, - amdsmi_vram_info_t *vram_info) { + amdsmi_vram_usage_t *vram_info) { AMDSMI_CHECK_INIT(); @@ -716,6 +716,70 @@ amdsmi_status_t amdsmi_get_gpu_vram_vendor(amdsmi_processor_handle processor_han return rsmi_wrapper(rsmi_dev_vram_vendor_get, processor_handle, brand, len); } +amdsmi_status_t amdsmi_get_gpu_vram_info( + amdsmi_processor_handle processor_handle, amdsmi_vram_info_t *info) { + AMDSMI_CHECK_INIT(); + + if (info == nullptr) { + return AMDSMI_STATUS_INVAL; + } + + 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; + + // init the info structure with default value + info->vram_type = VRAM_TYPE_UNKNOWN; + info->vram_size_mb = 0; + info->vram_vendor = AMDSMI_VRAM_VENDOR__PLACEHOLDER0; + + // Only can read vram type from libdrm + if (gpu_device->check_if_drm_is_supported()) { + struct drm_amdgpu_info_device dev_info = {}; + r = gpu_device->amdgpu_query_info( + AMDGPU_INFO_DEV_INFO, + sizeof(struct drm_amdgpu_info_device), &dev_info); + if (r == AMDSMI_STATUS_SUCCESS) { + info->vram_type = static_cast( + dev_info.vram_type); + } + } + + // map the vendor name to enum + char brand[256]; + r = rsmi_wrapper(rsmi_dev_vram_vendor_get, processor_handle, brand, 255); + if (r == AMDSMI_STATUS_SUCCESS) { + if (strcasecmp(brand, "SAMSUNG") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__SAMSUNG; + if (strcasecmp(brand, "INFINEON") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__INFINEON; + if (strcasecmp(brand, "ELPIDA") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__ELPIDA; + if (strcasecmp(brand, "ETRON") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__ETRON; + if (strcasecmp(brand, "NANYA") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__NANYA; + if (strcasecmp(brand, "HYNIX") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__HYNIX; + if (strcasecmp(brand, "MOSEL") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__MOSEL; + if (strcasecmp(brand, "WINBOND") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__WINBOND; + if (strcasecmp(brand, "ESMT") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__ESMT; + if (strcasecmp(brand, "MICRON") == 0) + info->vram_vendor = AMDSMI_VRAM_VENDOR__MICRON; + } + uint64_t total = 0; + r = rsmi_wrapper(rsmi_dev_memory_total_get, processor_handle, + RSMI_MEM_TYPE_VRAM, &total); + info->vram_size_mb = total; + + return AMDSMI_STATUS_SUCCESS; +} + amdsmi_status_t amdsmi_init_gpu_event_notification(amdsmi_processor_handle processor_handle) { return rsmi_wrapper(rsmi_event_notification_init, processor_handle); diff --git a/projects/amdsmi/tests/amd_smi_test/functional/id_info_read.cc b/projects/amdsmi/tests/amd_smi_test/functional/id_info_read.cc index c22f127ac0..35345ffd18 100755 --- a/projects/amdsmi/tests/amd_smi_test/functional/id_info_read.cc +++ b/projects/amdsmi/tests/amd_smi_test/functional/id_info_read.cc @@ -145,6 +145,19 @@ void TestIdInfoRead::Run(void) { } } + + amdsmi_vram_info_t vram_info; + err = amdsmi_get_gpu_vram_info(processor_handles_[i], &vram_info); + CHK_ERR_ASRT(err) + IF_VERB(STANDARD) { + std::cout << "\t**Device Vram type id: " + << vram_info.vram_type << std::endl; + std::cout << "\t**Device Vram vendor id: " + << vram_info.vram_vendor << std::endl; + std::cout << "\t**Device Vram size: " + << vram_info.vram_size_mb << std::endl; + } + err = amdsmi_get_gpu_vendor_name(processor_handles_[i], buffer, kBufferLen); if (err == AMDSMI_STATUS_NOT_SUPPORTED) { std::cout << "\t**Device Vendor name string not found on this system." <<