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:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
```
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Yeni konuda referans
Bir kullanıcı engelle