From b14da692eb7b4f95d923d79bca788adf93f33a84 Mon Sep 17 00:00:00 2001 From: Maisam Arif Date: Wed, 9 Aug 2023 10:35:24 -0500 Subject: [PATCH] Added workaround for inconsistent current pcie speed from gpumetrics Change-Id: If8404d21341cd15eb4d0221ab92cb0b351bbdf3e Signed-off-by: Maisam Arif --- include/amd_smi/amdsmi.h | 2 +- py-interface/amdsmi_wrapper.py | 2 +- src/amd_smi/amd_smi.cc | 9 +++++++-- src/amd_smi/amd_smi_utils.cc | 3 +++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/amd_smi/amdsmi.h b/include/amd_smi/amdsmi.h index 59956d2a6e..e47fd436ba 100644 --- a/include/amd_smi/amdsmi.h +++ b/include/amd_smi/amdsmi.h @@ -1105,8 +1105,8 @@ typedef struct { typedef struct { uint16_t pcie_lanes; uint32_t pcie_speed; - uint32_t reserved[5]; uint32_t pcie_interface_version; + uint32_t reserved[5]; } amdsmi_pcie_info_t; /** * @brief This structure contains information specific to a process. diff --git a/py-interface/amdsmi_wrapper.py b/py-interface/amdsmi_wrapper.py index f0105cb5de..9e69a70f80 100644 --- a/py-interface/amdsmi_wrapper.py +++ b/py-interface/amdsmi_wrapper.py @@ -1368,8 +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 * 5), ('pcie_interface_version', ctypes.c_uint32), + ('reserved', ctypes.c_uint32 * 5), ] amdsmi_pcie_info_t = struct_c__SA_amdsmi_pcie_info_t diff --git a/src/amd_smi/amd_smi.cc b/src/amd_smi/amd_smi.cc index 5959d52a04..f087cb5391 100644 --- a/src/amd_smi/amd_smi.cc +++ b/src/amd_smi/amd_smi.cc @@ -1694,8 +1694,13 @@ amdsmi_get_pcie_link_status(amdsmi_processor_handle processor_handle, amdsmi_pci return status; info->pcie_lanes = metric_info.pcie_link_width; - // gpu metrics returns pcie link speed in .1 GT/s ex. 160 vs 16 - info->pcie_speed = (metric_info.pcie_link_speed / 10) * 1000; + // gpu metrics is inconsistent with pcie_speed values, if 0-6 then it needs to be translated + if (metric_info.pcie_link_speed <= 6) { + status = smi_amdgpu_get_pcie_speed_from_pcie_type(metric_info.pcie_link_speed, &info->pcie_speed); // mapping to MT/s + } else { + // gpu metrics returns pcie link speed in .1 GT/s ex. 160 vs 16 + info->pcie_speed = metric_info.pcie_link_speed * 100; + } switch (info->pcie_speed) { case 2500: diff --git a/src/amd_smi/amd_smi_utils.cc b/src/amd_smi/amd_smi_utils.cc index ab056aa8a9..49487e8c4b 100644 --- a/src/amd_smi/amd_smi_utils.cc +++ b/src/amd_smi/amd_smi_utils.cc @@ -468,6 +468,9 @@ amdsmi_status_t smi_amdgpu_get_pcie_speed_from_pcie_type(uint16_t pcie_type, uin case 5: *pcie_speed = 32000; break; + case 6: + *pcie_speed = 64000; + break; default: return AMDSMI_STATUS_API_FAILED; }