Added Gen type to pcie info

Signed-off-by: Maisam Arif <maisarif@amd.com>
Change-Id: Icaa050a6f53fad608ed0353b2a0cbea33dee1dd2
Signed-off-by: Maisam Arif <maisarif@amd.com>


[ROCm/amdsmi commit: 82ac307f9b]
Bu işleme şunda yer alıyor:
Maisam Arif
2023-08-01 06:20:12 -05:00
ebeveyn fa9d79984b
işleme e2a1fed08c
8 değiştirilmiş dosya ile 111 ekleme ve 37 silme
+2 -4
Dosyayı Görüntüle
@@ -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
+46 -19
Dosyayı Görüntüle
@@ -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()
+2
Dosyayı Görüntüle
@@ -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;
+2 -1
Dosyayı Görüntüle
@@ -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.
+2
Dosyayı Görüntüle
@@ -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)
```
+6 -3
Dosyayı Görüntüle
@@ -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):
+2 -1
Dosyayı Görüntüle
@@ -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
+49 -9
Dosyayı Görüntüle
@@ -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;
}