94e194eba2
Co-authored-by: Maisam Arif <Maisam.Arif@amd.com>
776 řádky
24 KiB
Python
776 řádky
24 KiB
Python
#!/usr/bin/env python3
|
|
"""ROCm_SMI_LIB CLI Tool Python Bindings"""
|
|
# NOTE: You MUST call rsmiBindings.initRsmiBindings() when using this library!
|
|
# TODO: Get most (or all) of these from rocm_smi.h to avoid mismatches and redundancy
|
|
|
|
from __future__ import print_function
|
|
from ctypes import *
|
|
from enum import Enum
|
|
|
|
import sys
|
|
|
|
if 'sphinx' in sys.modules:
|
|
path_librocm = str()
|
|
def initRsmiBindings(silent=False):
|
|
# Empty function for document generation
|
|
exit()
|
|
|
|
SMI_HASH = '@PKG_VERSION_HASH@'
|
|
else:
|
|
from rsmiBindingsInit import *
|
|
|
|
|
|
# Device ID
|
|
dv_id = c_uint64()
|
|
# GPU ID
|
|
gpu_id = c_uint32(0)
|
|
|
|
|
|
# Policy enums
|
|
RSMI_MAX_NUM_FREQUENCIES = 33
|
|
RSMI_MAX_FAN_SPEED = 255
|
|
RSMI_NUM_VOLTAGE_CURVE_POINTS = 3
|
|
|
|
|
|
class rsmi_status_t(c_int):
|
|
RSMI_STATUS_SUCCESS = 0x0
|
|
RSMI_STATUS_INVALID_ARGS = 0x1
|
|
RSMI_STATUS_NOT_SUPPORTED = 0x2
|
|
RSMI_STATUS_FILE_ERROR = 0x3
|
|
RSMI_STATUS_PERMISSION = 0x4
|
|
RSMI_STATUS_OUT_OF_RESOURCES = 0x5
|
|
RSMI_STATUS_INTERNAL_EXCEPTION = 0x6
|
|
RSMI_STATUS_INPUT_OUT_OF_BOUNDS = 0x7
|
|
RSMI_STATUS_INIT_ERROR = 0x8
|
|
RSMI_INITIALIZATION_ERROR = RSMI_STATUS_INIT_ERROR
|
|
RSMI_STATUS_NOT_YET_IMPLEMENTED = 0x9
|
|
RSMI_STATUS_NOT_FOUND = 0xA
|
|
RSMI_STATUS_INSUFFICIENT_SIZE = 0xB
|
|
RSMI_STATUS_INTERRUPT = 0xC
|
|
RSMI_STATUS_UNEXPECTED_SIZE = 0xD
|
|
RSMI_STATUS_NO_DATA = 0xE
|
|
RSMI_STATUS_UNEXPECTED_DATA = 0xF
|
|
RSMI_STATUS_BUSY = 0x10
|
|
RSMI_STATUS_REFCOUNT_OVERFLOW = 0x11
|
|
RSMI_STATUS_SETTING_UNAVAILABLE = 0x12
|
|
RSMI_STATUS_AMDGPU_RESTART_ERR = 0x13
|
|
RSMI_STATUS_DRM_ERROR = 0x14
|
|
RSMI_STATUS_FAIL_LOAD_MODULE = 0x15
|
|
RSMI_STATUS_FAIL_LOAD_SYMBOL = 0x16
|
|
RSMI_STATUS_UNKNOWN_ERROR = 0xFFFFFFFF
|
|
|
|
|
|
#Dictionary of rsmi ret codes and it's verbose output
|
|
rsmi_status_verbose_err_out = {
|
|
rsmi_status_t.RSMI_STATUS_SUCCESS: 'Operation was successful',
|
|
rsmi_status_t.RSMI_STATUS_INVALID_ARGS: 'Invalid arguments provided',
|
|
rsmi_status_t.RSMI_STATUS_NOT_SUPPORTED: 'Not supported on the given system',
|
|
rsmi_status_t.RSMI_STATUS_FILE_ERROR: 'Problem accessing a file',
|
|
rsmi_status_t.RSMI_STATUS_PERMISSION: 'Permission denied',
|
|
rsmi_status_t.RSMI_STATUS_OUT_OF_RESOURCES: 'Unable to acquire memory or other resource',
|
|
rsmi_status_t.RSMI_STATUS_INTERNAL_EXCEPTION: 'An internal exception was caught',
|
|
rsmi_status_t.RSMI_STATUS_INPUT_OUT_OF_BOUNDS: 'Provided input is out of allowable or safe range',
|
|
rsmi_status_t.RSMI_INITIALIZATION_ERROR: 'Error occurred during rsmi initialization',
|
|
rsmi_status_t.RSMI_STATUS_NOT_YET_IMPLEMENTED: 'Requested function is not implemented on this setup',
|
|
rsmi_status_t.RSMI_STATUS_NOT_FOUND: 'Item searched for but not found',
|
|
rsmi_status_t.RSMI_STATUS_INSUFFICIENT_SIZE: 'Insufficient resources available',
|
|
rsmi_status_t.RSMI_STATUS_INTERRUPT: 'Interrupt occurred during execution',
|
|
rsmi_status_t.RSMI_STATUS_UNEXPECTED_SIZE: 'Unexpected amount of data read',
|
|
rsmi_status_t.RSMI_STATUS_NO_DATA: 'No data found for the given input',
|
|
rsmi_status_t.RSMI_STATUS_UNEXPECTED_DATA: 'Unexpected data received',
|
|
rsmi_status_t.RSMI_STATUS_BUSY: 'Busy - resources are preventing call the ability to execute',
|
|
rsmi_status_t.RSMI_STATUS_REFCOUNT_OVERFLOW: 'Data overflow - data exceeded INT32_MAX',
|
|
rsmi_status_t.RSMI_STATUS_SETTING_UNAVAILABLE: 'Requested setting is unavailable for current device',
|
|
rsmi_status_t.RSMI_STATUS_AMDGPU_RESTART_ERR: 'Could not successfully restart the amdgpu driver',
|
|
rsmi_status_t.RSMI_STATUS_DRM_ERROR: 'Error when calling libdrm',
|
|
rsmi_status_t.RSMI_STATUS_FAIL_LOAD_MODULE: 'Failed to load a library',
|
|
rsmi_status_t.RSMI_STATUS_FAIL_LOAD_SYMBOL: 'Failed to load a library symbol',
|
|
rsmi_status_t.RSMI_STATUS_UNKNOWN_ERROR: 'Unknown error occured'
|
|
}
|
|
|
|
|
|
class rsmi_init_flags_t(c_int):
|
|
RSMI_INIT_FLAG_ALL_GPUS = 0x1
|
|
|
|
|
|
class rsmi_dev_perf_level_t(c_int):
|
|
RSMI_DEV_PERF_LEVEL_AUTO = 0
|
|
RSMI_DEV_PERF_LEVEL_FIRST = RSMI_DEV_PERF_LEVEL_AUTO
|
|
RSMI_DEV_PERF_LEVEL_LOW = 1
|
|
RSMI_DEV_PERF_LEVEL_HIGH = 2
|
|
RSMI_DEV_PERF_LEVEL_MANUAL = 3
|
|
RSMI_DEV_PERF_LEVEL_STABLE_STD = 4
|
|
RSMI_DEV_PERF_LEVEL_STABLE_PEAK = 5
|
|
RSMI_DEV_PERF_LEVEL_STABLE_MIN_MCLK = 6
|
|
RSMI_DEV_PERF_LEVEL_STABLE_MIN_SCLK = 7
|
|
RSMI_DEV_PERF_LEVEL_DETERMINISM = 8
|
|
RSMI_DEV_PERF_LEVEL_LAST = RSMI_DEV_PERF_LEVEL_DETERMINISM
|
|
RSMI_DEV_PERF_LEVEL_UNKNOWN = 0x100
|
|
|
|
|
|
notification_type_names = [
|
|
'VM_FAULT',
|
|
'THERMAL_THROTTLE',
|
|
'GPU_PRE_RESET',
|
|
'GPU_POST_RESET',
|
|
'MIGRATE_START',
|
|
'MIGRATE_END',
|
|
'PAGE_FAULT_START',
|
|
'PAGE_FAULT_END',
|
|
'QUEUE_EVICTION',
|
|
'QUEUE_RESTORE',
|
|
'UNMAP_FROM_GPU'
|
|
]
|
|
|
|
|
|
class rsmi_evt_notification_type_t(c_int):
|
|
RSMI_EVT_NOTIF_NONE = 0
|
|
RSMI_EVT_NOTIF_VMFAULT = 1
|
|
RSMI_EVT_NOTIF_FIRST = RSMI_EVT_NOTIF_VMFAULT
|
|
RSMI_EVT_NOTIF_THERMAL_THROTTLE = 2
|
|
RSMI_EVT_NOTIF_GPU_PRE_RESET = 3
|
|
RSMI_EVT_NOTIF_GPU_POST_RESET = 4
|
|
RSMI_EVT_NOTIF_MIGRATE_START = 5
|
|
RSMI_EVT_NOTIF_MIGRATE_END = 6
|
|
RSMI_EVT_NOTIF_PAGE_FAULT_START = 7
|
|
RSMI_EVT_NOTIF_PAGE_FAULT_END = 8
|
|
RSMI_EVT_NOTIF_QUEUE_EVICTION = 9
|
|
RSMI_EVT_NOTIF_QUEUE_RESTORE = 10
|
|
RSMI_EVT_NOTIF_UNMAP_FROM_GPU = 11
|
|
RSMI_EVT_NOTIF_LAST = RSMI_EVT_NOTIF_UNMAP_FROM_GPU
|
|
|
|
|
|
class rsmi_voltage_metric_t(c_int):
|
|
RSMI_VOLT_CURRENT = 0
|
|
RSMI_VOLT_FIRST = RSMI_VOLT_CURRENT
|
|
RSMI_VOLT_MAX = 1
|
|
RSMI_VOLT_MIN_CRIT = 2
|
|
RSMI_VOLT_MIN = 3
|
|
RSMI_VOLT_MAX_CRIT = 4
|
|
RSMI_VOLT_AVERAGE = 5
|
|
RSMI_VOLT_LOWEST = 6
|
|
RSMI_VOLT_HIGHEST = 7
|
|
RSMI_VOLT_LAST = RSMI_VOLT_HIGHEST
|
|
RSMI_VOLT_UNKNOWN = 0x100
|
|
|
|
|
|
class rsmi_voltage_type_t(c_int):
|
|
RSMI_VOLT_TYPE_FIRST = 0
|
|
RSMI_VOLT_TYPE_VDDGFX = RSMI_VOLT_TYPE_FIRST
|
|
RSMI_VOLT_TYPE_LAST = RSMI_VOLT_TYPE_VDDGFX
|
|
RSMI_VOLT_TYPE_INVALID = 0xFFFFFFFF
|
|
|
|
|
|
# The perf_level_string is correlated to rsmi_dev_perf_level_t
|
|
def perf_level_string(i):
|
|
switcher = {
|
|
0: 'AUTO',
|
|
1: 'LOW',
|
|
2: 'HIGH',
|
|
3: 'MANUAL',
|
|
4: 'STABLE_STD',
|
|
5: 'STABLE_PEAK',
|
|
6: 'STABLE_MIN_MCLK',
|
|
7: 'STABLE_MIN_SCLK',
|
|
8: 'PERF_DETERMINISM',
|
|
}
|
|
return switcher.get(i, 'UNKNOWN')
|
|
|
|
|
|
rsmi_dev_perf_level = rsmi_dev_perf_level_t
|
|
|
|
|
|
class rsmi_sw_component_t(c_int):
|
|
RSMI_SW_COMP_FIRST = 0x0
|
|
RSMI_SW_COMP_DRIVER = RSMI_SW_COMP_FIRST
|
|
RSMI_SW_COMP_LAST = RSMI_SW_COMP_DRIVER
|
|
|
|
|
|
|
|
rsmi_event_handle_t = POINTER(c_uint)
|
|
|
|
|
|
class rsmi_event_group_t(Enum):
|
|
RSMI_EVNT_GRP_XGMI = 0
|
|
RSMI_EVNT_GRP_XGMI_DATA_OUT = 10
|
|
RSMI_EVNT_GRP_INVALID = 0xFFFFFFFF
|
|
|
|
|
|
class rsmi_event_type_t(c_int):
|
|
RSMI_EVNT_FIRST = rsmi_event_group_t.RSMI_EVNT_GRP_XGMI
|
|
RSMI_EVNT_XGMI_FIRST = rsmi_event_group_t.RSMI_EVNT_GRP_XGMI
|
|
RSMI_EVNT_XGMI_0_NOP_TX = RSMI_EVNT_XGMI_FIRST
|
|
RSMI_EVNT_XGMI_0_REQUEST_TX = 1
|
|
RSMI_EVNT_XGMI_0_RESPONSE_TX = 2
|
|
RSMI_EVNT_XGMI_0_BEATS_TX = 3
|
|
RSMI_EVNT_XGMI_1_NOP_TX = 4
|
|
RSMI_EVNT_XGMI_1_REQUEST_TX = 5
|
|
RSMI_EVNT_XGMI_1_RESPONSE_TX = 6
|
|
RSMI_EVNT_XGMI_1_BEATS_TX = 7
|
|
RSMI_EVNT_XGMI_LAST = RSMI_EVNT_XGMI_1_BEATS_TX
|
|
|
|
RSMI_EVNT_XGMI_DATA_OUT_FIRST = rsmi_event_group_t.RSMI_EVNT_GRP_XGMI_DATA_OUT
|
|
RSMI_EVNT_XGMI_DATA_OUT_0 = RSMI_EVNT_XGMI_DATA_OUT_FIRST
|
|
RSMI_EVNT_XGMI_DATA_OUT_1 = 11
|
|
RSMI_EVNT_XGMI_DATA_OUT_2 = 12
|
|
RSMI_EVNT_XGMI_DATA_OUT_3 = 13
|
|
RSMI_EVNT_XGMI_DATA_OUT_4 = 14
|
|
RSMI_EVNT_XGMI_DATA_OUT_5 = 15
|
|
RSMI_EVNT_XGMI_DATA_OUT_LAST = RSMI_EVNT_XGMI_DATA_OUT_5
|
|
|
|
RSMI_EVNT_LAST = RSMI_EVNT_XGMI_DATA_OUT_LAST,
|
|
|
|
|
|
class rsmi_counter_command_t(c_int):
|
|
RSMI_CNTR_CMD_START = 0
|
|
RSMI_CNTR_CMD_STOP = 1
|
|
|
|
|
|
class rsmi_counter_value_t(Structure):
|
|
_fields_ = [('value', c_uint64),
|
|
('time_enabled', c_uint64),
|
|
('time_running', c_uint64)]
|
|
|
|
|
|
class rsmi_clk_type_t(c_int):
|
|
RSMI_CLK_TYPE_SYS = 0x0
|
|
RSMI_CLK_TYPE_FIRST = RSMI_CLK_TYPE_SYS
|
|
RSMI_CLK_TYPE_DF = 0x1
|
|
RSMI_CLK_TYPE_DCEF = 0x2
|
|
RSMI_CLK_TYPE_SOC = 0x3
|
|
RSMI_CLK_TYPE_MEM = 0x4
|
|
RSMI_CLK_TYPE_LAST = RSMI_CLK_TYPE_MEM
|
|
RSMI_CLK_INVALID = 0xFFFFFFFF
|
|
|
|
|
|
# Clock names here are correlated to the rsmi_clk_type_t values above
|
|
clk_type_names = ['sclk', 'sclk', 'fclk', 'dcefclk',\
|
|
'socclk', 'mclk', 'mclk', 'invalid']
|
|
rsmi_clk_type_dict = {'RSMI_CLK_TYPE_SYS': 0x0, 'RSMI_CLK_TYPE_FIRST': 0x0,\
|
|
'RSMI_CLK_TYPE_DF': 0x1, 'RSMI_CLK_TYPE_DCEF': 0x2,\
|
|
'RSMI_CLK_TYPE_SOC': 0x3, 'RSMI_CLK_TYPE_MEM': 0x4,\
|
|
'RSMI_CLK_TYPE_LAST': 0X4, 'RSMI_CLK_INVALID': 0xFFFFFFFF}
|
|
rsmi_clk_names_dict = {'sclk': 0x0, 'fclk': 0x1, 'dcefclk': 0x2,\
|
|
'socclk': 0x3, 'mclk': 0x4}
|
|
rsmi_clk_type = rsmi_clk_type_t
|
|
|
|
|
|
class rsmi_temperature_metric_t(c_int):
|
|
RSMI_TEMP_CURRENT = 0x0
|
|
RSMI_TEMP_FIRST = RSMI_TEMP_CURRENT
|
|
RSMI_TEMP_MAX = 0x1
|
|
RSMI_TEMP_MIN = 0x2
|
|
RSMI_TEMP_MAX_HYST = 0x3
|
|
RSMI_TEMP_MIN_HYST = 0x4
|
|
RSMI_TEMP_CRITICAL = 0x5
|
|
RSMI_TEMP_CRITICAL_HYST = 0x6
|
|
RSMI_TEMP_EMERGENCY = 0x7
|
|
RSMI_TEMP_EMERGENCY_HYST = 0x8
|
|
RSMI_TEMP_CRIT_MIN = 0x9
|
|
RSMI_TEMP_CRIT_MIN_HYST = 0xA
|
|
RSMI_TEMP_OFFSET = 0xB
|
|
RSMI_TEMP_LOWEST = 0xC
|
|
RSMI_TEMP_HIGHEST = 0xD
|
|
RSMI_TEMP_LAST = RSMI_TEMP_HIGHEST
|
|
|
|
|
|
rsmi_temperature_metric = rsmi_temperature_metric_t
|
|
|
|
|
|
class rsmi_temperature_type_t(c_int):
|
|
RSMI_TEMP_TYPE_FIRST = 0
|
|
RSMI_TEMP_TYPE_EDGE = RSMI_TEMP_TYPE_FIRST
|
|
RSMI_TEMP_TYPE_JUNCTION = 1
|
|
RSMI_TEMP_TYPE_MEMORY = 2
|
|
RSMI_TEMP_TYPE_HBM_0 = 3
|
|
RSMI_TEMP_TYPE_HBM_1 = 4
|
|
RSMI_TEMP_TYPE_HBM_2 = 5
|
|
RSMI_TEMP_TYPE_HBM_3 = 6
|
|
RSMI_TEMP_TYPE_LAST = RSMI_TEMP_TYPE_HBM_3
|
|
|
|
|
|
# temp_type_lst list correlates to rsmi_temperature_type_t
|
|
temp_type_lst = ['edge', 'junction', 'memory', 'HBM 0', 'HBM 1', 'HBM 2', 'HBM 3']
|
|
|
|
|
|
class rsmi_power_profile_preset_masks_t(c_uint64):
|
|
RSMI_PWR_PROF_PRST_CUSTOM_MASK = 0x1
|
|
RSMI_PWR_PROF_PRST_VIDEO_MASK = 0x2
|
|
RSMI_PWR_PROF_PRST_POWER_SAVING_MASK = 0x4
|
|
RSMI_PWR_PROF_PRST_COMPUTE_MASK = 0x8
|
|
RSMI_PWR_PROF_PRST_VR_MASK = 0x10
|
|
RSMI_PWR_PROF_PRST_3D_FULL_SCR_MASK = 0x20
|
|
RSMI_PWR_PROF_PRST_BOOTUP_DEFAULT = 0x40
|
|
RSMI_PWR_PROF_PRST_LAST = RSMI_PWR_PROF_PRST_BOOTUP_DEFAULT
|
|
RSMI_PWR_PROF_PRST_INVALID = 0xFFFFFFFFFFFFFFFF
|
|
|
|
|
|
rsmi_power_profile_preset_masks = rsmi_power_profile_preset_masks_t
|
|
|
|
|
|
class rsmi_gpu_block_t(c_int):
|
|
RSMI_GPU_BLOCK_INVALID = 0x0000000000000000
|
|
RSMI_GPU_BLOCK_FIRST = 0x0000000000000001
|
|
RSMI_GPU_BLOCK_UMC = RSMI_GPU_BLOCK_FIRST
|
|
RSMI_GPU_BLOCK_SDMA = 0x0000000000000002
|
|
RSMI_GPU_BLOCK_GFX = 0x0000000000000004
|
|
RSMI_GPU_BLOCK_MMHUB = 0x0000000000000008
|
|
RSMI_GPU_BLOCK_ATHUB = 0x0000000000000010
|
|
RSMI_GPU_BLOCK_PCIE_BIF = 0x0000000000000020
|
|
RSMI_GPU_BLOCK_HDP = 0x0000000000000040
|
|
RSMI_GPU_BLOCK_XGMI_WAFL = 0x0000000000000080
|
|
RSMI_GPU_BLOCK_DF = 0x0000000000000100
|
|
RSMI_GPU_BLOCK_SMN = 0x0000000000000200
|
|
RSMI_GPU_BLOCK_SEM = 0x0000000000000400
|
|
RSMI_GPU_BLOCK_MP0 = 0x0000000000000800
|
|
RSMI_GPU_BLOCK_MP1 = 0x0000000000001000
|
|
RSMI_GPU_BLOCK_FUSE = 0x0000000000002000
|
|
RSMI_GPU_BLOCK_LAST = RSMI_GPU_BLOCK_FUSE
|
|
RSMI_GPU_BLOCK_RESERVED = 0x8000000000000000
|
|
|
|
|
|
rsmi_gpu_block = rsmi_gpu_block_t
|
|
|
|
|
|
# The following dictionary correlates with rsmi_gpu_block_t enum
|
|
rsmi_gpu_block_d = {
|
|
'UMC' : 0x0000000000000001,
|
|
'SDMA' : 0x0000000000000002,
|
|
'GFX' : 0x0000000000000004,
|
|
'MMHUB': 0x0000000000000008,
|
|
'ATHUB': 0x0000000000000010,
|
|
'PCIE_BIF': 0x0000000000000020,
|
|
'HDP': 0x0000000000000040,
|
|
'XGMI_WAFL': 0x0000000000000080,
|
|
'DF': 0x0000000000000100,
|
|
'SMN': 0x0000000000000200,
|
|
'SEM': 0x0000000000000400,
|
|
'MP0': 0x0000000000000800,
|
|
'MP1': 0x0000000000001000,
|
|
'FUSE': 0x0000000000002000
|
|
}
|
|
|
|
|
|
class rsmi_ras_err_state_t(c_int):
|
|
RSMI_RAS_ERR_STATE_NONE = 0
|
|
RSMI_RAS_ERR_STATE_DISABLED = 1
|
|
RSMI_RAS_ERR_STATE_PARITY = 2
|
|
RSMI_RAS_ERR_STATE_SING_C = 3
|
|
RSMI_RAS_ERR_STATE_MULT_UC = 4
|
|
RSMI_RAS_ERR_STATE_POISON = 5
|
|
RSMI_RAS_ERR_STATE_ENABLED = 6
|
|
RSMI_RAS_ERR_STATE_LAST = RSMI_RAS_ERR_STATE_ENABLED
|
|
RSMI_RAS_ERR_STATE_INVALID = 0xFFFFFFFF
|
|
|
|
|
|
# Error type list correlates to rsmi_ras_err_state_t
|
|
rsmi_ras_err_stale_readable = ['no errors', 'ECC disabled',
|
|
'unknown type err', 'single correctable err',
|
|
'multiple uncorrectable err',
|
|
'page isolated, treat as uncorrectable err',
|
|
'ECC enabled', 'status invalid']
|
|
rsmi_ras_err_stale_machine = ['none', 'disabled', 'unknown error',
|
|
'sing', 'mult', 'position', 'enabled']
|
|
|
|
validRasTypes = ['ue', 'ce']
|
|
|
|
validRasActions = ['disable', 'enable', 'inject']
|
|
|
|
validRasBlocks = ['fuse', 'mp1', 'mp0', 'sem', 'smn', 'df', 'xgmi_wafl', 'hdp', 'pcie_bif',
|
|
|
|
'athub', 'mmhub', 'gfx', 'sdma', 'umc']
|
|
|
|
|
|
class rsmi_memory_type_t(c_int):
|
|
RSMI_MEM_TYPE_FIRST = 0
|
|
RSMI_MEM_TYPE_VRAM = RSMI_MEM_TYPE_FIRST
|
|
RSMI_MEM_TYPE_VIS_VRAM = 1
|
|
RSMI_MEM_TYPE_GTT = 2
|
|
RSMI_MEM_TYPE_LAST = RSMI_MEM_TYPE_GTT
|
|
|
|
|
|
# memory_type_l includes names for with rsmi_memory_type_t
|
|
# Usage example to get corresponding names:
|
|
# memory_type_l[rsmi_memory_type_t.RSMI_MEM_TYPE_VRAM] will return string 'vram'
|
|
memory_type_l = ['VRAM', 'VIS_VRAM', 'GTT']
|
|
|
|
|
|
class rsmi_freq_ind_t(c_int):
|
|
RSMI_FREQ_IND_MIN = 0
|
|
RSMI_FREQ_IND_MAX = 1
|
|
RSMI_FREQ_IND_INVALID = 0xFFFFFFFF
|
|
|
|
|
|
rsmi_freq_ind = rsmi_freq_ind_t
|
|
|
|
|
|
class rsmi_fw_block_t(c_int):
|
|
RSMI_FW_BLOCK_FIRST = 0
|
|
RSMI_FW_BLOCK_ASD = RSMI_FW_BLOCK_FIRST
|
|
RSMI_FW_BLOCK_CE = 1
|
|
RSMI_FW_BLOCK_DMCU = 2
|
|
RSMI_FW_BLOCK_MC = 3
|
|
RSMI_FW_BLOCK_ME = 4
|
|
RSMI_FW_BLOCK_MEC = 5
|
|
RSMI_FW_BLOCK_MEC2 = 6
|
|
RSMI_FW_BLOCK_MES = 7
|
|
RSMI_FW_BLOCK_MES_KIQ = 8
|
|
RSMI_FW_BLOCK_PFP = 9
|
|
RSMI_FW_BLOCK_RLC = 10
|
|
RSMI_FW_BLOCK_RLC_SRLC = 11
|
|
RSMI_FW_BLOCK_RLC_SRLG = 12
|
|
RSMI_FW_BLOCK_RLC_SRLS = 13
|
|
RSMI_FW_BLOCK_SDMA = 14
|
|
RSMI_FW_BLOCK_SDMA2 = 15
|
|
RSMI_FW_BLOCK_SMC = 16
|
|
RSMI_FW_BLOCK_SOS = 17
|
|
RSMI_FW_BLOCK_TA_RAS = 18
|
|
RSMI_FW_BLOCK_TA_XGMI = 19
|
|
RSMI_FW_BLOCK_UVD = 20
|
|
RSMI_FW_BLOCK_VCE = 21
|
|
RSMI_FW_BLOCK_VCN = 22
|
|
RSMI_FW_BLOCK_LAST = RSMI_FW_BLOCK_VCN
|
|
|
|
|
|
# The following list correlated to the rsmi_fw_block_t
|
|
fw_block_names_l = ['ASD', 'CE', 'DMCU', 'MC', 'ME', 'MEC', 'MEC2', 'MES', 'MES KIQ', 'PFP',\
|
|
'RLC', 'RLC SRLC', 'RLC SRLG', 'RLC SRLS', 'SDMA', 'SDMA2',\
|
|
'SMC', 'SOS', 'TA RAS', 'TA XGMI', 'UVD', 'VCE', 'VCN']
|
|
|
|
|
|
rsmi_bit_field_t = c_uint64()
|
|
rsmi_bit_field = rsmi_bit_field_t
|
|
|
|
class rsmi_utilization_counter_type(c_int):
|
|
RSMI_UTILIZATION_COUNTER_FIRST = 0
|
|
RSMI_COARSE_GRAIN_GFX_ACTIVITY = RSMI_UTILIZATION_COUNTER_FIRST
|
|
RSMI_COARSE_GRAIN_MEM_ACTIVITY = 1
|
|
RSMI_UTILIZATION_COUNTER_LAST = RSMI_COARSE_GRAIN_MEM_ACTIVITY
|
|
|
|
utilization_counter_name = ['GFX Activity', 'Memory Activity']
|
|
|
|
class rsmi_utilization_counter_t(Structure):
|
|
_fields_ = [('type', c_int),
|
|
('val', c_uint64)]
|
|
|
|
|
|
class rsmi_xgmi_status_t(c_int):
|
|
RSMI_XGMI_STATUS_NO_ERRORS = 0
|
|
RSMI_XGMI_STATUS_ERROR = 1
|
|
RSMI_XGMI_STATUS_MULTIPLE_ERRORS = 2
|
|
|
|
|
|
class rsmi_memory_page_status_t(c_int):
|
|
RSMI_MEM_PAGE_STATUS_RESERVED = 0
|
|
RSMI_MEM_PAGE_STATUS_PENDING = 1
|
|
RSMI_MEM_PAGE_STATUS_UNRESERVABLE = 2
|
|
|
|
|
|
memory_page_status_l = ['reserved', 'pending', 'unreservable']
|
|
|
|
|
|
class rsmi_retired_page_record_t(Structure):
|
|
_fields_ = [('page_address', c_uint64),
|
|
('page_size', c_uint64),
|
|
('status', c_int)]
|
|
|
|
|
|
RSMI_MAX_NUM_POWER_PROFILES = (sizeof(rsmi_bit_field_t) * 8)
|
|
|
|
|
|
class rsmi_power_profile_status_t(Structure):
|
|
_fields_ = [('available_profiles', c_uint32),
|
|
('current', c_uint64),
|
|
('num_profiles', c_uint32)]
|
|
|
|
|
|
rsmi_power_profile_status = rsmi_power_profile_status_t
|
|
|
|
|
|
class rsmi_frequencies_t(Structure):
|
|
_fields_ = [('has_deep_sleep', c_bool),
|
|
('num_supported', c_int32),
|
|
('current', c_uint32),
|
|
('frequency', c_uint64 * RSMI_MAX_NUM_FREQUENCIES)]
|
|
|
|
|
|
rsmi_frequencies = rsmi_frequencies_t
|
|
|
|
|
|
class rsmi_pcie_bandwidth_t(Structure):
|
|
_fields_ = [('transfer_rate', rsmi_frequencies_t),
|
|
('lanes', c_uint32 * RSMI_MAX_NUM_FREQUENCIES)]
|
|
|
|
|
|
rsmi_pcie_bandwidth = rsmi_pcie_bandwidth_t
|
|
|
|
|
|
class rsmi_version_t(Structure):
|
|
_fields_ = [('major', c_uint32),
|
|
('minor', c_uint32),
|
|
('patch', c_uint32),
|
|
('build', c_char_p)]
|
|
|
|
|
|
rsmi_version = rsmi_version_t
|
|
|
|
|
|
class rsmi_range_t(Structure):
|
|
_fields_ = [('lower_bound', c_uint64),
|
|
('upper_bound', c_uint64)]
|
|
|
|
|
|
rsmi_range = rsmi_range_t
|
|
|
|
|
|
class rsmi_od_vddc_point_t(Structure):
|
|
_fields_ = [('frequency', c_uint64),
|
|
('voltage', c_uint64)]
|
|
|
|
|
|
rsmi_od_vddc_point = rsmi_od_vddc_point_t
|
|
|
|
|
|
class rsmi_freq_volt_region_t(Structure):
|
|
_fields_ = [('freq_range', rsmi_range_t),
|
|
('volt_range', rsmi_range_t)]
|
|
|
|
|
|
rsmi_freq_volt_region = rsmi_freq_volt_region_t
|
|
|
|
|
|
class rsmi_od_volt_curve_t(Structure):
|
|
_fields_ = [('vc_points', rsmi_od_vddc_point_t *\
|
|
RSMI_NUM_VOLTAGE_CURVE_POINTS)]
|
|
|
|
|
|
rsmi_od_volt_curve = rsmi_od_volt_curve_t
|
|
|
|
|
|
class rsmi_od_volt_freq_data_t(Structure):
|
|
_fields_ = [('curr_sclk_range', rsmi_range_t),
|
|
('curr_mclk_range', rsmi_range_t),
|
|
('sclk_freq_limits', rsmi_range_t),
|
|
('mclk_freq_limits', rsmi_range_t),
|
|
('curve', rsmi_od_volt_curve_t),
|
|
('num_regions', c_uint32)]
|
|
|
|
|
|
rsmi_od_volt_freq_data = rsmi_od_volt_freq_data_t
|
|
|
|
|
|
class rsmi_error_count_t(Structure):
|
|
_fields_ = [('correctable_err', c_uint64),
|
|
('uncorrectable_err', c_uint64)]
|
|
|
|
MAX_EVENT_NOTIFICATION_MSG_SIZE = 96
|
|
|
|
class rsmi_evt_notification_data_t(Structure):
|
|
_fields_ = [('dv_ind', c_uint32),
|
|
('event', rsmi_evt_notification_type_t),
|
|
('message', c_char*MAX_EVENT_NOTIFICATION_MSG_SIZE)]
|
|
|
|
|
|
class rsmi_process_info_t(Structure):
|
|
_fields_ = [('process_id', c_uint32),
|
|
('pasid', c_uint32),
|
|
('vram_usage', c_uint64),
|
|
('sdma_usage', c_uint64),
|
|
('cu_occupancy', c_uint32)]
|
|
|
|
|
|
class rsmi_func_id_iter_handle(Structure):
|
|
_fields_ = [('func_id_iter', POINTER(c_uint)),
|
|
('container_ptr', POINTER(c_uint)),
|
|
('id_type', c_uint32)]
|
|
|
|
|
|
rsmi_func_id_iter_handle_t = POINTER(rsmi_func_id_iter_handle)
|
|
|
|
|
|
RSMI_DEFAULT_VARIANT = 0xFFFFFFFFFFFFFFFF
|
|
|
|
|
|
class submodule_union(Union):
|
|
_fields_ = [('memory_type', c_int), # rsmi_memory_type_t,
|
|
('temp_metric', c_int), # rsmi_temperature_metric_t,
|
|
('evnt_type', c_int), # rsmi_event_type_t,
|
|
('evnt_group', c_int), # rsmi_event_group_t,
|
|
('clk_type', c_int), # rsmi_clk_type_t,
|
|
('fw_block', c_int), # rsmi_fw_block_t,
|
|
('gpu_block_type', c_int)] # rsmi_gpu_block_t
|
|
|
|
|
|
class rsmi_func_id_value_t(Union):
|
|
_fields_ = [('id', c_uint64),
|
|
('name', c_char_p),
|
|
('submodule', submodule_union)]
|
|
|
|
class rsmi_compute_partition_type_t(c_int):
|
|
RSMI_COMPUTE_PARTITION_INVALID = 0
|
|
RSMI_COMPUTE_PARTITION_SPX = 1
|
|
RSMI_COMPUTE_PARTITION_DPX = 2
|
|
RSMI_COMPUTE_PARTITION_TPX = 3
|
|
RSMI_COMPUTE_PARTITION_QPX = 4
|
|
RSMI_COMPUTE_PARTITION_CPX = 5
|
|
|
|
rsmi_compute_partition_type_dict = {
|
|
#'RSMI_COMPUTE_PARTITION_INVALID': 0,
|
|
'SPX': 1,
|
|
'DPX': 2,
|
|
'TPX': 3,
|
|
'QPX': 4,
|
|
'CPX': 5,
|
|
}
|
|
|
|
rsmi_compute_partition_type = rsmi_compute_partition_type_t
|
|
|
|
# compute_partition_type_l includes string names for the rsmi_compute_partition_type_t
|
|
# Usage example to get corresponding names:
|
|
# compute_partition_type_l[rsmi_compute_partition_type_t.RSMI_COMPUTE_PARTITION_CPX]
|
|
# will return string 'CPX'
|
|
compute_partition_type_l = ['SPX', 'DPX', 'TPX', 'QPX', 'CPX']
|
|
|
|
class rsmi_memory_partition_type_t(c_int):
|
|
RSMI_MEMORY_PARTITION_UNKNOWN = 0
|
|
RSMI_MEMORY_PARTITION_NPS1 = 1
|
|
RSMI_MEMORY_PARTITION_NPS2 = 2
|
|
RSMI_MEMORY_PARTITION_NPS4 = 3
|
|
RSMI_MEMORY_PARTITION_NPS8 = 4
|
|
|
|
rsmi_memory_partition_type_dict = {
|
|
'NPS1': 1,
|
|
'NPS2': 2,
|
|
'NPS4': 3,
|
|
'NPS8': 4
|
|
}
|
|
|
|
rsmi_memory_partition_type = rsmi_memory_partition_type_t
|
|
|
|
# memory_partition_type_l includes string names for the rsmi_compute_partition_type_t
|
|
# Usage example to get corresponding names:
|
|
# memory_partition_type_l[rsmi_memory_partition_type_t.RSMI_MEMORY_PARTITION_NPS2]
|
|
# will return string 'NPS2'
|
|
memory_partition_type_l = ['NPS1', 'NPS2', 'NPS4', 'NPS8']
|
|
|
|
class rsmi_power_label(str, Enum):
|
|
AVG_POWER = '(Avg)'
|
|
CURRENT_SOCKET_POWER = '(Socket)'
|
|
|
|
class rsmi_power_type_t(c_int):
|
|
RSMI_AVERAGE_POWER = 0,
|
|
RSMI_CURRENT_POWER = 1,
|
|
RSMI_INVALID_POWER = 0xFFFFFFFF
|
|
|
|
rsmi_power_type_dict = {
|
|
0: 'AVERAGE',
|
|
1: 'CURRENT SOCKET',
|
|
0xFFFFFFFF: 'INVALID_POWER_TYPE'
|
|
}
|
|
|
|
class metrics_table_header_t(Structure):
|
|
pass
|
|
|
|
# metrics_table_header_t._pack_ = 1 # source:False
|
|
metrics_table_header_t._fields_ = [
|
|
('structure_size', c_uint16),
|
|
('format_revision', c_uint8),
|
|
('content_revision', c_uint8),
|
|
]
|
|
amd_metrics_table_header_t = metrics_table_header_t
|
|
|
|
class amdgpu_xcp_metrics_t(Structure):
|
|
pass
|
|
|
|
# amdgpu_xcp_metrics_t._pack_ = 1 # source:False
|
|
amdgpu_xcp_metrics_t._fields_ = [
|
|
('gfx_busy_inst', c_uint32 * 8),
|
|
('jpeg_busy', c_uint16 * 40),
|
|
('vcn_busy', c_uint16 * 4),
|
|
('gfx_busy_acc', c_uint64 * 8),
|
|
('gfx_below_host_limit_acc', c_uint64 * 8),
|
|
('gfx_below_host_limit_ppt_acc', c_uint64 * 8),
|
|
('gfx_below_host_limit_thm_acc', c_uint64 * 8),
|
|
('gfx_low_utilization_acc', c_uint64 * 8),
|
|
('gfx_below_host_limit_total_acc', c_uint64 * 8),
|
|
]
|
|
xcp_stats_t = amdgpu_xcp_metrics_t
|
|
|
|
class rsmi_gpu_metrics_t(Structure):
|
|
pass
|
|
|
|
|
|
# rsmi_gpu_metrics_t._pack_ = 1 # source:False
|
|
rsmi_gpu_metrics_t._fields_ = [
|
|
('common_header', amd_metrics_table_header_t),
|
|
('temperature_edge', c_uint16),
|
|
('temperature_hotspot', c_uint16),
|
|
('temperature_mem', c_uint16),
|
|
('temperature_vrgfx', c_uint16),
|
|
('temperature_vrsoc', c_uint16),
|
|
('temperature_vrmem', c_uint16),
|
|
('average_gfx_activity', c_uint16),
|
|
('average_umc_activity', c_uint16),
|
|
('average_mm_activity', c_uint16),
|
|
('average_socket_power', c_uint16),
|
|
('energy_accumulator', c_uint64),
|
|
('system_clock_counter', c_uint64),
|
|
('average_gfxclk_frequency', c_uint16),
|
|
('average_socclk_frequency', c_uint16),
|
|
('average_uclk_frequency', c_uint16),
|
|
('average_vclk0_frequency', c_uint16),
|
|
('average_dclk0_frequency', c_uint16),
|
|
('average_vclk1_frequency', c_uint16),
|
|
('average_dclk1_frequency', c_uint16),
|
|
('current_gfxclk', c_uint16),
|
|
('current_socclk', c_uint16),
|
|
('current_uclk', c_uint16),
|
|
('current_vclk0', c_uint16),
|
|
('current_dclk0', c_uint16),
|
|
('current_vclk1', c_uint16),
|
|
('current_dclk1', c_uint16),
|
|
('throttle_status', c_uint32),
|
|
('current_fan_speed', c_uint16),
|
|
('pcie_link_width', c_uint16),
|
|
('pcie_link_speed', c_uint16),
|
|
('gfx_activity_acc', c_uint32),
|
|
('mem_activity_acc', c_uint32),
|
|
('temperature_hbm', c_uint16 * 4),
|
|
('firmware_timestamp', c_uint64),
|
|
('voltage_soc', c_uint16),
|
|
('voltage_gfx', c_uint16),
|
|
('voltage_mem', c_uint16),
|
|
('indep_throttle_status', c_uint64),
|
|
('current_socket_power', c_uint16),
|
|
('vcn_activity', c_uint16 * 4),
|
|
('gfxclk_lock_status', c_uint32),
|
|
('xgmi_link_width', c_uint16),
|
|
('xgmi_link_speed', c_uint16),
|
|
('pcie_bandwidth_acc', c_uint64),
|
|
('pcie_bandwidth_inst', c_uint64),
|
|
('pcie_l0_to_recov_count_acc', c_uint64),
|
|
('pcie_replay_count_acc', c_uint64),
|
|
('pcie_replay_rover_count_acc', c_uint64),
|
|
('xgmi_read_data_acc', c_uint64 * 8),
|
|
('xgmi_write_data_acc', c_uint64 * 8),
|
|
('current_gfxclks', c_uint16 * 8),
|
|
('current_socclks', c_uint16 * 4),
|
|
('current_vclk0s', c_uint16 * 4),
|
|
('current_dclk0s', c_uint16 * 4),
|
|
('jpeg_activity', c_uint16 * 32),
|
|
('pcie_nak_sent_count_acc', c_uint32),
|
|
('pcie_nak_rcvd_count_acc', c_uint32),
|
|
('accumulation_counter', c_uint64),
|
|
('prochot_residency_acc', c_uint64),
|
|
('ppt_residency_acc', c_uint64),
|
|
('socket_thm_residency_acc', c_uint64),
|
|
('vr_thm_residency_acc', c_uint64),
|
|
('hbm_thm_residency_acc', c_uint64),
|
|
('num_partition', c_uint16),
|
|
('xcp_stats', xcp_stats_t * 8),
|
|
('pcie_lc_perf_other_end_recovery', c_uint32),
|
|
('vram_max_bandwidth', c_uint64),
|
|
('xgmi_link_status', c_uint16 * 8),
|
|
]
|
|
amdsmi_gpu_metrics_t = rsmi_gpu_metrics_t
|