Merge amd-staging into amd-master 20230914

Signed-off-by: Hao Zhou <Hao.Zhou@amd.com>
Change-Id: Id1d6f305fdcfa723d7b0db5b65fb43d281ccd8cf


[ROCm/amdsmi commit: 3b6251bd6b]
This commit is contained in:
Hao Zhou
2023-09-14 10:22:30 +08:00
9 changed files with 177 additions and 44 deletions
+19 -13
View File
@@ -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:
@@ -621,7 +621,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");
@@ -305,7 +305,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");
@@ -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<amdsmi_cpusocket_handle> sockets(socket_count);
vector<amdsmi_cpusocket_handle> 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<amdsmi_processor_handle> processor_handles(core_count);
vector<amdsmi_processor_handle> 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["<<i<<"] core clock current frequency limit (MHz) : "<<c_clk<<"\t|\n";
cout<<"--------------------------------------------------------------\n";
#endif
uint32_t power;
cout<<"\n-------------------------------------------------";
@@ -310,7 +308,6 @@ int main(int argc, char **argv) {
}
cout<<"\n-------------------------------------------------\n";
#if 0
uint8_t mode;
const char *err_str;
cout <<"Enter the power efficiency mode to be set[0, 1 or 2]:\n";
@@ -329,7 +326,6 @@ int main(int argc, char **argv) {
cout<<"\n-------------------------------------------------\n";
uint32_t svi_power;
cout<<"\n| SVI Power Telemetry (mWatts) \t |";
@@ -343,7 +339,6 @@ int main(int argc, char **argv) {
cout<<" NA (Err:" <<ret<<" |";
}
cout<<"\n-------------------------------------------------\n";
#endif
}
// Clean up resources allocated at amdsmi_init
ret = amdsmi_shut_down();
+59 -4
View File
@@ -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 */
@@ -4246,9 +4301,9 @@ amdsmi_status_t amdsmi_first_online_core_on_cpu_socket(amdsmi_cpusocket_handle s
* @param[in,out] status_string - A pointer to a const char * which will be made
* to point to a description of the provided error code
*
* @return const char* returned on success
* @return const char** returned on success
*/
const char* amdsmi_get_esmi_err_msg(amdsmi_status_t status, const char **status_string);
const char** amdsmi_get_esmi_err_msg(amdsmi_status_t status, const char **status_string);
#endif
/** @} */
#ifdef __cplusplus
@@ -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))
@@ -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']
+67 -3
View File
@@ -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<amdsmi_vram_type_t>(
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);
@@ -2738,7 +2802,7 @@ amdsmi_status_t amdsmi_first_online_core_on_cpu_socket(amdsmi_cpusocket_handle s
return AMDSMI_STATUS_SUCCESS;
}
const char* amdsmi_get_esmi_err_msg(amdsmi_status_t status, const char **status_string)
const char** amdsmi_get_esmi_err_msg(amdsmi_status_t status, const char **status_string)
{
for (auto& iter : amd::smi::esmi_status_map) {
if (iter.first == status) {
@@ -2746,6 +2810,6 @@ const char* amdsmi_get_esmi_err_msg(amdsmi_status_t status, const char **status_
break;
}
}
return *status_string;
return status_string;
}
#endif
@@ -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." <<