From e2a1fed08c291d27ee0508758c243f177bf89fc5 Mon Sep 17 00:00:00 2001 From: Maisam Arif Date: Tue, 1 Aug 2023 06:20:12 -0500 Subject: [PATCH] Added Gen type to pcie info Signed-off-by: Maisam Arif Change-Id: Icaa050a6f53fad608ed0353b2a0cbea33dee1dd2 Signed-off-by: Maisam Arif [ROCm/amdsmi commit: 82ac307f9bd4eb792a009901276641909680670a] --- projects/amdsmi/.editorconfig | 6 +- projects/amdsmi/amdsmi_cli/amdsmi_commands.py | 65 +++++++++++++------ .../amdsmi/example/amd_smi_drm_example.cc | 2 + projects/amdsmi/include/amd_smi/amdsmi.h | 3 +- projects/amdsmi/py-interface/README.md | 2 + .../amdsmi/py-interface/amdsmi_interface.py | 9 ++- .../amdsmi/py-interface/amdsmi_wrapper.py | 3 +- projects/amdsmi/src/amd_smi/amd_smi.cc | 58 ++++++++++++++--- 8 files changed, 111 insertions(+), 37 deletions(-) diff --git a/projects/amdsmi/.editorconfig b/projects/amdsmi/.editorconfig index 3e3944a39c..bb852a105e 100644 --- a/projects/amdsmi/.editorconfig +++ b/projects/amdsmi/.editorconfig @@ -4,10 +4,8 @@ # top-most EditorConfig file root = true -# Unix-style newlines with a newline ending every file and no stray whitespaces -[*] -end_of_line = lf -trim_trailing_whitespace = true +[*.py] +indent_style = space # Matches multiple files with brace expansion notation # Set default charset diff --git a/projects/amdsmi/amdsmi_cli/amdsmi_commands.py b/projects/amdsmi/amdsmi_cli/amdsmi_commands.py index 3ce14abd84..176cf94baf 100644 --- a/projects/amdsmi/amdsmi_cli/amdsmi_commands.py +++ b/projects/amdsmi/amdsmi_cli/amdsmi_commands.py @@ -57,13 +57,10 @@ class AMDSMICommands(): Args: args (Namespace): Namespace containing the parsed CLI args """ - try: - amdsmi_lib_version = amdsmi_interface.amdsmi_get_lib_version() + amdsmi_lib_version_str = amdsmi_interface.amdsmi_get_lib_version()["build"] except amdsmi_exception.AmdSmiLibraryException as e: - amdsmi_lib_version = e.get_error_info() - - amdsmi_lib_version_str = amdsmi_lib_version["build"] + amdsmi_lib_version_str = e.get_error_info() self.logger.output['tool'] = 'AMDSMI Tool' self.logger.output['version'] = f'{__version__}' @@ -218,11 +215,34 @@ class AMDSMICommands(): try: bus_info = amdsmi_interface.amdsmi_get_pcie_link_caps(args.gpu) - pcie_speed_GTs_value = round(bus_info['pcie_speed'] / 1000, 1) if bus_info['pcie_speed'] % 1000 != 0 else round(bus_info['pcie_speed'] / 1000) - bus_info['pcie_speed'] = pcie_speed_GTs_value + if bus_info['max_pcie_speed'] % 1000 != 0: + pcie_speed_GTs_value = round(bus_info['max_pcie_speed'] / 1000, 1) + else: + pcie_speed_GTs_value = round(bus_info['max_pcie_speed'] / 1000) + + bus_info['max_pcie_speed'] = pcie_speed_GTs_value + + try: + pcie_slot_type = amdsmi_interface.amdsmi_topo_get_link_type(args.gpu, args.gpu)['type'] + except amdsmi_exception.AmdSmiLibraryException as e: + pcie_slot_type = e.get_error_info() + if self.logger.is_human_readable_format(): unit ='GT/s' - bus_info['pcie_speed'] = f"{bus_info['pcie_speed']} {unit}" + bus_info['max_pcie_speed'] = f"{bus_info['max_pcie_speed']} {unit}" + + if bus_info['pcie_interface_version'] > 0: + bus_info['pcie_interface_version'] = f"Gen {bus_info['pcie_interface_version']}" + + bus_info['pcie_slot_type'] = 'XXXX' + if isinstance(pcie_slot_type, int): + if pcie_slot_type == amdsmi_interface.amdsmi_wrapper.AMDSMI_IOLINK_TYPE_UNDEFINED: + bus_info['pcie_slot_type'] = "UNKNOWN" + elif pcie_slot_type == amdsmi_interface.amdsmi_wrapper.AMDSMI_IOLINK_TYPE_PCIEXPRESS: + bus_info['pcie_slot_type'] = "PCIE" + elif pcie_slot_type == amdsmi_interface.amdsmi_wrapper.AMDSMI_IOLINK_TYPE_XGMI: + bus_info['pcie_slot_type'] = "XGMI" + except amdsmi_exception.AmdSmiLibraryException as e: bus_info = e.get_error_info() if not self.all_arguments: @@ -915,15 +935,23 @@ class AMDSMICommands(): raise e if args.pcie: try: - pcie_link_status = amdsmi_interface.amdsmi_get_pcie_link_caps(args.gpu) - pcie_speed_GTs_value = round(pcie_link_status['pcie_speed'] / 1000, 1) if pcie_link_status['pcie_speed'] % 1000 != 0 else round(pcie_link_status['pcie_speed'] / 1000) + pcie_link_status = amdsmi_interface.amdsmi_get_pcie_link_status(args.gpu) + + if pcie_link_status['pcie_speed'] % 1000 != 0: + pcie_speed_GTs_value = round(pcie_link_status['pcie_speed'] / 1000, 1) + else: + pcie_speed_GTs_value = round(pcie_link_status['pcie_speed'] / 1000) + pcie_link_status['pcie_speed'] = pcie_speed_GTs_value + # The interface version should not be displayed as it is based on the current speed + del pcie_link_status['pcie_interface_version'] + if self.logger.is_human_readable_format(): - unit ='GT/s' + unit = 'GT/s' pcie_link_status['pcie_speed'] = f"{pcie_link_status['pcie_speed']} {unit}" - if self.logger.is_gpuvsmi_compatibility(): pcie_link_status['current_width'] = pcie_link_status.pop('pcie_lanes') pcie_link_status['current_speed'] = pcie_link_status.pop('pcie_speed') + values_dict['pcie'] = pcie_link_status except amdsmi_exception.AmdSmiLibraryException as e: values_dict['pcie'] = e.get_error_info() @@ -1393,18 +1421,17 @@ class AMDSMICommands(): dest_gpu_key = f'gpu_{dest_gpu_id}' if src_gpu == dest_gpu: - src_gpu_link_type[dest_gpu_key] = 0 + src_gpu_link_type[dest_gpu_key] = "SELF" continue - try: link_type = amdsmi_interface.amdsmi_topo_get_link_type(src_gpu, dest_gpu)['type'] if isinstance(link_type, int): - if link_type == 1: + if link_type == amdsmi_interface.amdsmi_wrapper.AMDSMI_IOLINK_TYPE_UNDEFINED: + src_gpu_link_type[dest_gpu_key] = "UNKNOWN" + elif link_type == amdsmi_interface.amdsmi_wrapper.AMDSMI_IOLINK_TYPE_PCIEXPRESS: src_gpu_link_type[dest_gpu_key] = "PCIE" - elif link_type == 2: - src_gpu_link_type[dest_gpu_key] = "XMGI" - else: - src_gpu_link_type[dest_gpu_key] = "XXXX" + elif link_type == amdsmi_interface.amdsmi_wrapper.AMDSMI_IOLINK_TYPE_XGMI: + src_gpu_link_type[dest_gpu_key] = "XGMI" except amdsmi_exception.AmdSmiLibraryException as e: src_gpu_link_type[dest_gpu_key] = e.get_error_info() diff --git a/projects/amdsmi/example/amd_smi_drm_example.cc b/projects/amdsmi/example/amd_smi_drm_example.cc index 6b5767742a..3d5e8c15e9 100644 --- a/projects/amdsmi/example/amd_smi_drm_example.cc +++ b/projects/amdsmi/example/amd_smi_drm_example.cc @@ -377,6 +377,7 @@ int main() { printf(" Output of amdsmi_get_pcie_link_status:\n"); printf("\tPCIe lanes: %d\n", pcie_info.pcie_lanes); printf("\tPCIe speed: %d\n\n", pcie_info.pcie_speed); + printf("\tPCIe Interface Version: %d\n\n", pcie_info.pcie_interface_version); // Get PCIe caps amdsmi_pcie_info_t pcie_caps_info = {}; @@ -385,6 +386,7 @@ int main() { printf(" Output of amdsmi_get_pcie_link_caps:\n"); printf("\tPCIe max lanes: %d\n", pcie_caps_info.pcie_lanes); printf("\tPCIe max speed: %d\n\n", pcie_caps_info.pcie_speed); + printf("\tPCIe Interface Version: %d\n\n", pcie_caps_info.pcie_interface_version); // Get VRAM temperature limit int64_t temperature = 0; diff --git a/projects/amdsmi/include/amd_smi/amdsmi.h b/projects/amdsmi/include/amd_smi/amdsmi.h index 8c0b633807..59956d2a6e 100644 --- a/projects/amdsmi/include/amd_smi/amdsmi.h +++ b/projects/amdsmi/include/amd_smi/amdsmi.h @@ -1105,7 +1105,8 @@ typedef struct { typedef struct { uint16_t pcie_lanes; uint32_t pcie_speed; - uint32_t reserved[6]; + uint32_t reserved[5]; + uint32_t pcie_interface_version; } amdsmi_pcie_info_t; /** * @brief This structure contains information specific to a process. diff --git a/projects/amdsmi/py-interface/README.md b/projects/amdsmi/py-interface/README.md index 9eec994c77..a1c59339e0 100644 --- a/projects/amdsmi/py-interface/README.md +++ b/projects/amdsmi/py-interface/README.md @@ -679,6 +679,7 @@ Field | Description ---|--- `pcie_lanes`| pcie lanes in use `pcie_speed`| current pcie speed +`pcie_interface_version`| current pcie generation Exceptions that can be thrown by `amdsmi_get_pcie_link_status` function: @@ -698,6 +699,7 @@ try: pcie_link_status = amdsmi_get_pcie_link_status(device) print(pcie_link_status["pcie_lanes"]) print(pcie_link_status["pcie_speed"]) + print(pcie_link_status["pcie_interface_version"]) except AmdSmiException as e: print(e) ``` diff --git a/projects/amdsmi/py-interface/amdsmi_interface.py b/projects/amdsmi/py-interface/amdsmi_interface.py index 4df710fa62..850ac680a3 100644 --- a/projects/amdsmi/py-interface/amdsmi_interface.py +++ b/projects/amdsmi/py-interface/amdsmi_interface.py @@ -1019,8 +1019,9 @@ def amdsmi_get_pcie_link_status( ) ) - return {"pcie_lanes": pcie_info.pcie_lanes, "pcie_speed": pcie_info.pcie_speed} - + return {"pcie_speed": pcie_info.pcie_speed, + "pcie_lanes": pcie_info.pcie_lanes, + "pcie_interface_version": pcie_info.pcie_interface_version} def amdsmi_get_pcie_link_caps( processor_handle: amdsmi_wrapper.amdsmi_processor_handle, @@ -1036,7 +1037,9 @@ def amdsmi_get_pcie_link_caps( processor_handle, ctypes.byref(pcie_info)) ) - return {"pcie_speed": pcie_info.pcie_speed, "pcie_lanes": pcie_info.pcie_lanes} + return {"max_pcie_speed": pcie_info.pcie_speed, + "max_pcie_lanes": pcie_info.pcie_lanes, + "pcie_interface_version": pcie_info.pcie_interface_version} def amdsmi_get_processor_handle_from_bdf(bdf): diff --git a/projects/amdsmi/py-interface/amdsmi_wrapper.py b/projects/amdsmi/py-interface/amdsmi_wrapper.py index 7209bfac24..f0105cb5de 100644 --- a/projects/amdsmi/py-interface/amdsmi_wrapper.py +++ b/projects/amdsmi/py-interface/amdsmi_wrapper.py @@ -1368,7 +1368,8 @@ struct_c__SA_amdsmi_pcie_info_t._fields_ = [ ('pcie_lanes', ctypes.c_uint16), ('PADDING_0', ctypes.c_ubyte * 2), ('pcie_speed', ctypes.c_uint32), - ('reserved', ctypes.c_uint32 * 6), + ('reserved', ctypes.c_uint32 * 5), + ('pcie_interface_version', ctypes.c_uint32), ] amdsmi_pcie_info_t = struct_c__SA_amdsmi_pcie_info_t diff --git a/projects/amdsmi/src/amd_smi/amd_smi.cc b/projects/amdsmi/src/amd_smi/amd_smi.cc index 3b0014a08c..5959d52a04 100644 --- a/projects/amdsmi/src/amd_smi/amd_smi.cc +++ b/projects/amdsmi/src/amd_smi/amd_smi.cc @@ -1694,7 +1694,31 @@ amdsmi_get_pcie_link_status(amdsmi_processor_handle processor_handle, amdsmi_pci return status; info->pcie_lanes = metric_info.pcie_link_width; - status = smi_amdgpu_get_pcie_speed_from_pcie_type(metric_info.pcie_link_speed, &info->pcie_speed); // mapping to MT/s + // gpu metrics returns pcie link speed in .1 GT/s ex. 160 vs 16 + info->pcie_speed = (metric_info.pcie_link_speed / 10) * 1000; + + switch (info->pcie_speed) { + case 2500: + info->pcie_interface_version = 1; + break; + case 5000: + info->pcie_interface_version = 2; + break; + case 8000: + info->pcie_interface_version = 3; + break; + case 16000: + info->pcie_interface_version = 4; + break; + case 32000: + info->pcie_interface_version = 5; + break; + case 64000: + info->pcie_interface_version = 6; + break; + default: + info->pcie_interface_version = 0; + } return status; } @@ -1718,7 +1742,6 @@ amdsmi_status_t amdsmi_get_pcie_link_caps(amdsmi_processor_handle processor_hand FILE* fp; double pcie_speed = 0; unsigned pcie_width = 0; - amdsmi_asic_info_t asic_info = {}; memset((void *)info, 0, sizeof(*info)); @@ -1745,15 +1768,32 @@ amdsmi_status_t amdsmi_get_pcie_link_caps(amdsmi_processor_handle processor_hand return AMDSMI_STATUS_API_FAILED; } - status = amdsmi_get_gpu_asic_info(processor_handle, &asic_info); - if (status != AMDSMI_STATUS_SUCCESS) - return status; - - if (pcie_speed == 0 && asic_info.device_id == 29538) - pcie_speed = 16; - + // pcie speed in sysfs returns in GT/s info->pcie_speed = pcie_speed * 1000; + switch (info->pcie_speed) { + case 2500: + info->pcie_interface_version = 1; + break; + case 5000: + info->pcie_interface_version = 2; + break; + case 8000: + info->pcie_interface_version = 3; + break; + case 16000: + info->pcie_interface_version = 4; + break; + case 32000: + info->pcie_interface_version = 5; + break; + case 64000: + info->pcie_interface_version = 6; + break; + default: + info->pcie_interface_version = 0; + } + return status; }