6064f160a3
- Add generator for python wrapper - Add interface, exception and init files - Add CMake custom targets Change-Id: I63c1d94fbb587387c22f559a3db79987eb214a2e Signed-off-by: Dejan Andjelkovic <Dejan.Andjelkovic@amd.com>
1029 строки
35 KiB
Python
1029 строки
35 KiB
Python
#
|
|
# Copyright (C) 2022 Advanced Micro Devices. All rights reserved.
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
# this software and associated documentation files (the "Software"), to deal in
|
|
# the Software without restriction, including without limitation the rights to
|
|
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
# the Software, and to permit persons to whom the Software is furnished to do so,
|
|
# subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in all
|
|
# copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
#
|
|
|
|
import ctypes
|
|
from typing import Union, Any, Dict, List, Tuple
|
|
from enum import IntEnum
|
|
|
|
|
|
from . import amdsmi_wrapper
|
|
from .amdsmi_exception import *
|
|
|
|
|
|
class AmdSmiInitFlags(IntEnum):
|
|
ALL_DEVICES = amdsmi_wrapper.AMDSMI_INIT_ALL_DEVICES
|
|
AMD_CPUS = amdsmi_wrapper.AMDSMI_INIT_AMD_CPUS
|
|
AMD_GPUS = amdsmi_wrapper.AMDSMI_INIT_AMD_GPUS
|
|
NON_AMD_CPUS = amdsmi_wrapper.AMDSMI_INIT_NON_AMD_CPUS
|
|
NON_AMD_GPUS = amdsmi_wrapper.AMDSMI_INIT_NON_AMD_GPUS
|
|
|
|
|
|
class AmdSmiContainerTypes(IntEnum):
|
|
LXC = amdsmi_wrapper.CONTAINER_LXC
|
|
DOCKER = amdsmi_wrapper.CONTAINER_DOCKER
|
|
|
|
|
|
class AmdSmiDeviceType(IntEnum):
|
|
UNKNOWN_DEVICE = amdsmi_wrapper.UNKNOWN
|
|
AMD_GPU_DEVICE = amdsmi_wrapper.AMD_GPU
|
|
AMD_CPU_DEVICE = amdsmi_wrapper.AMD_CPU
|
|
NON_AMD_GPU_DEVICE = amdsmi_wrapper.NON_AMD_GPU
|
|
NON_AMD_CPU_DEVICE = amdsmi_wrapper.NON_AMD_CPU
|
|
|
|
|
|
class AmdSmiMmIp(IntEnum):
|
|
UVD = amdsmi_wrapper.MM_UVD
|
|
VCE = amdsmi_wrapper.MM_VCE
|
|
VCN = amdsmi_wrapper.MM_VCN
|
|
|
|
|
|
class AmdSmiFWBlock(IntEnum):
|
|
FW_ID_SMU = amdsmi_wrapper.FW_ID_SMU
|
|
FW_ID_CP_CE = amdsmi_wrapper.FW_ID_CP_CE
|
|
FW_ID_CP_PFP = amdsmi_wrapper.FW_ID_CP_PFP
|
|
FW_ID_CP_ME = amdsmi_wrapper.FW_ID_CP_ME
|
|
FW_ID_CP_MEC_JT1 = amdsmi_wrapper.FW_ID_CP_MEC_JT1
|
|
FW_ID_CP_MEC_JT2 = amdsmi_wrapper.FW_ID_CP_MEC_JT2
|
|
FW_ID_CP_MEC1 = amdsmi_wrapper.FW_ID_CP_MEC1
|
|
FW_ID_CP_MEC2 = amdsmi_wrapper.FW_ID_CP_MEC2
|
|
FW_ID_RLC = amdsmi_wrapper.FW_ID_RLC
|
|
FW_ID_SDMA0 = amdsmi_wrapper.FW_ID_SDMA0
|
|
FW_ID_SDMA1 = amdsmi_wrapper.FW_ID_SDMA1
|
|
FW_ID_SDMA2 = amdsmi_wrapper.FW_ID_SDMA2
|
|
FW_ID_SDMA3 = amdsmi_wrapper.FW_ID_SDMA3
|
|
FW_ID_SDMA4 = amdsmi_wrapper.FW_ID_SDMA4
|
|
FW_ID_SDMA5 = amdsmi_wrapper.FW_ID_SDMA5
|
|
FW_ID_SDMA6 = amdsmi_wrapper.FW_ID_SDMA6
|
|
FW_ID_SDMA7 = amdsmi_wrapper.FW_ID_SDMA7
|
|
FW_ID_VCN = amdsmi_wrapper.FW_ID_VCN
|
|
FW_ID_UVD = amdsmi_wrapper.FW_ID_UVD
|
|
FW_ID_VCE = amdsmi_wrapper.FW_ID_VCE
|
|
FW_ID_ISP = amdsmi_wrapper.FW_ID_ISP
|
|
FW_ID_DMCU_ERAM = amdsmi_wrapper.FW_ID_DMCU_ERAM
|
|
FW_ID_DMCU_ISR = amdsmi_wrapper.FW_ID_DMCU_ISR
|
|
FW_ID_RLC_RESTORE_LIST_GPM_MEM = amdsmi_wrapper.FW_ID_RLC_RESTORE_LIST_GPM_MEM
|
|
FW_ID_RLC_RESTORE_LIST_SRM_MEM = amdsmi_wrapper.FW_ID_RLC_RESTORE_LIST_SRM_MEM
|
|
FW_ID_RLC_RESTORE_LIST_CNTL = amdsmi_wrapper.FW_ID_RLC_RESTORE_LIST_CNTL
|
|
FW_ID_RLC_V = amdsmi_wrapper.FW_ID_RLC_V
|
|
FW_ID_MMSCH = amdsmi_wrapper.FW_ID_MMSCH
|
|
FW_ID_PSP_SYSDRV = amdsmi_wrapper.FW_ID_PSP_SYSDRV
|
|
FW_ID_PSP_SOSDRV = amdsmi_wrapper.FW_ID_PSP_SOSDRV
|
|
FW_ID_PSP_TOC = amdsmi_wrapper.FW_ID_PSP_TOC
|
|
FW_ID_PSP_KEYDB = amdsmi_wrapper.FW_ID_PSP_KEYDB
|
|
FW_ID_DFC = amdsmi_wrapper.FW_ID_DFC
|
|
FW_ID_PSP_SPL = amdsmi_wrapper.FW_ID_PSP_SPL
|
|
FW_ID_DRV_CAP = amdsmi_wrapper.FW_ID_DRV_CAP
|
|
FW_ID_MC = amdsmi_wrapper.FW_ID_MC
|
|
FW_ID_PSP_BL = amdsmi_wrapper.FW_ID_PSP_BL
|
|
FW_ID_CP_PM4 = amdsmi_wrapper.FW_ID_CP_PM4
|
|
FW_ID_ASD = amdsmi_wrapper.FW_ID_ASD
|
|
FW_ID_TA_RAS = amdsmi_wrapper.FW_ID_TA_RAS
|
|
FW_ID_XGMI = amdsmi_wrapper.FW_ID_XGMI
|
|
FW_ID_RLC_SRLG = amdsmi_wrapper.FW_ID_RLC_SRLG
|
|
FW_ID_RLC_SRLS = amdsmi_wrapper.FW_ID_RLC_SRLS
|
|
FW_ID_SMC = amdsmi_wrapper.FW_ID_SMC
|
|
FW_ID_DMCU = amdsmi_wrapper.FW_ID_DMCU
|
|
|
|
|
|
class AmdSmiClockType(IntEnum):
|
|
SYS = amdsmi_wrapper.CLK_TYPE_SYS
|
|
GFX = amdsmi_wrapper.CLK_TYPE_GFX
|
|
DF = amdsmi_wrapper.CLK_TYPE_DF
|
|
DCEF = amdsmi_wrapper.CLK_TYPE_DCEF
|
|
SOC = amdsmi_wrapper.CLK_TYPE_SOC
|
|
MEM = amdsmi_wrapper.CLK_TYPE_MEM
|
|
PCIE = amdsmi_wrapper.CLK_TYPE_PCIE
|
|
VCLK0 = amdsmi_wrapper.CLK_TYPE_VCLK0
|
|
VCLK1 = amdsmi_wrapper.CLK_TYPE_VCLK1
|
|
DCLK0 = amdsmi_wrapper.CLK_TYPE_DCLK0
|
|
DCLK1 = amdsmi_wrapper.CLK_TYPE_DCLK1
|
|
|
|
|
|
class AmdSmiTemperatureType(IntEnum):
|
|
EDGE = amdsmi_wrapper.TEMPERATURE_TYPE_EDGE
|
|
JUNCTION = amdsmi_wrapper.TEMPERATURE_TYPE_JUNCTION
|
|
VRAM = amdsmi_wrapper.TEMPERATURE_TYPE_VRAM
|
|
HBM_0 = amdsmi_wrapper.TEMPERATURE_TYPE_HBM_0
|
|
HBM_1 = amdsmi_wrapper.TEMPERATURE_TYPE_HBM_1
|
|
HBM_2 = amdsmi_wrapper.TEMPERATURE_TYPE_HBM_2
|
|
HBM_3 = amdsmi_wrapper.TEMPERATURE_TYPE_HBM_3
|
|
PLX = amdsmi_wrapper.TEMPERATURE_TYPE_PLX
|
|
|
|
|
|
class AmdSmiDevPerfLevel(IntEnum):
|
|
AUTO = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_AUTO
|
|
LOW = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_LOW
|
|
HIGH = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_HIGH
|
|
MANUAL = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_MANUAL
|
|
STABLE_STD = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_STABLE_STD
|
|
STABLE_PEAK = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_STABLE_PEAK
|
|
STABLE_MIN_MCLK = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_STABLE_MIN_MCLK
|
|
STABLE_MIN_SCLK = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_STABLE_MIN_SCLK
|
|
DETERMINISM = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_DETERMINISM
|
|
UNKNOWN = amdsmi_wrapper.AMDSMI_DEV_PERF_LEVEL_UNKNOWN
|
|
|
|
|
|
class AmdSmiSwComponent(IntEnum):
|
|
DRIVER = amdsmi_wrapper.AMDSMI_SW_COMP_DRIVER
|
|
|
|
|
|
class AmdSmiEventGroup(IntEnum):
|
|
XGMI = amdsmi_wrapper.AMDSMI_EVNT_GRP_XGMI
|
|
XGMI_DATA_OUT = amdsmi_wrapper.AMDSMI_EVNT_GRP_XGMI_DATA_OUT
|
|
GRP_INVALID = amdsmi_wrapper.AMDSMI_EVNT_GRP_INVALID
|
|
|
|
|
|
class AmdSmiEventType(IntEnum):
|
|
XGMI_0_NOP_TX = amdsmi_wrapper.AMDSMI_EVNT_XGMI_0_NOP_TX
|
|
XGMI_0_REQUEST_TX = amdsmi_wrapper.AMDSMI_EVNT_XGMI_0_REQUEST_TX
|
|
XGMI_0_RESPONSE_TX = amdsmi_wrapper.AMDSMI_EVNT_XGMI_0_RESPONSE_TX
|
|
XGMI_0_BEATS_TX = amdsmi_wrapper.AMDSMI_EVNT_XGMI_0_BEATS_TX
|
|
XGMI_1_NOP_TX = amdsmi_wrapper.AMDSMI_EVNT_XGMI_1_NOP_TX
|
|
XGMI_1_REQUEST_TX = amdsmi_wrapper.AMDSMI_EVNT_XGMI_1_REQUEST_TX
|
|
XGMI_1_RESPONSE_TX = amdsmi_wrapper.AMDSMI_EVNT_XGMI_1_RESPONSE_TX
|
|
XGMI_1_BEATS_TX = amdsmi_wrapper.AMDSMI_EVNT_XGMI_1_BEATS_TX
|
|
XGMI_DATA_OUT_0 = amdsmi_wrapper.AMDSMI_EVNT_XGMI_DATA_OUT_0
|
|
XGMI_DATA_OUT_1 = amdsmi_wrapper.AMDSMI_EVNT_XGMI_DATA_OUT_1
|
|
XGMI_DATA_OUT_2 = amdsmi_wrapper.AMDSMI_EVNT_XGMI_DATA_OUT_2
|
|
XGMI_DATA_OUT_3 = amdsmi_wrapper.AMDSMI_EVNT_XGMI_DATA_OUT_3
|
|
XGMI_DATA_OUT_4 = amdsmi_wrapper.AMDSMI_EVNT_XGMI_DATA_OUT_4
|
|
XGMI_DATA_OUT_5 = amdsmi_wrapper.AMDSMI_EVNT_XGMI_DATA_OUT_5
|
|
|
|
|
|
class AmdSmiCounterCommand(IntEnum):
|
|
CMD_START = amdsmi_wrapper.AMDSMI_CNTR_CMD_START
|
|
CMD_STOP = amdsmi_wrapper.AMDSMI_CNTR_CMD_STOP
|
|
|
|
|
|
class AmdSmiEvtNotificationType(IntEnum):
|
|
VMFAULT = amdsmi_wrapper.AMDSMI_EVT_NOTIF_VMFAULT
|
|
THERMAL_THROTTLE = amdsmi_wrapper.AMDSMI_EVT_NOTIF_THERMAL_THROTTLE
|
|
GPU_PRE_RESET = amdsmi_wrapper.AMDSMI_EVT_NOTIF_GPU_PRE_RESET
|
|
GPU_POST_RESET = amdsmi_wrapper.AMDSMI_EVT_NOTIF_GPU_POST_RESET
|
|
|
|
|
|
class AmdSmiTemperatureMetric(IntEnum):
|
|
CURRENT = amdsmi_wrapper.AMDSMI_TEMP_CURRENT
|
|
MAX = amdsmi_wrapper.AMDSMI_TEMP_MAX
|
|
MIN = amdsmi_wrapper.AMDSMI_TEMP_MIN
|
|
MAX_HYST = amdsmi_wrapper.AMDSMI_TEMP_MAX_HYST
|
|
MIN_HYST = amdsmi_wrapper.AMDSMI_TEMP_MIN_HYST
|
|
CRITICAL = amdsmi_wrapper.AMDSMI_TEMP_CRITICAL
|
|
CRITICAL_HYST = amdsmi_wrapper.AMDSMI_TEMP_CRITICAL_HYST
|
|
EMERGENCY = amdsmi_wrapper.AMDSMI_TEMP_EMERGENCY
|
|
EMERGENCY_HYST = amdsmi_wrapper.AMDSMI_TEMP_EMERGENCY_HYST
|
|
CRIT_MIN = amdsmi_wrapper.AMDSMI_TEMP_CRIT_MIN
|
|
CRIT_MIN_HYST = amdsmi_wrapper.AMDSMI_TEMP_CRIT_MIN_HYST
|
|
OFFSET = amdsmi_wrapper.AMDSMI_TEMP_OFFSET
|
|
LOWEST = amdsmi_wrapper.AMDSMI_TEMP_LOWEST
|
|
HIGHEST = amdsmi_wrapper.AMDSMI_TEMP_HIGHEST
|
|
|
|
|
|
class AmdSmiVoltageMetric(IntEnum):
|
|
CURRENT = amdsmi_wrapper.AMDSMI_VOLT_CURRENT
|
|
MAX = amdsmi_wrapper.AMDSMI_VOLT_MAX
|
|
MIN_CRIT = amdsmi_wrapper.AMDSMI_VOLT_MIN_CRIT
|
|
MIN = amdsmi_wrapper.AMDSMI_VOLT_MIN
|
|
MAX_CRIT = amdsmi_wrapper.AMDSMI_VOLT_MAX_CRIT
|
|
AVERAGE = amdsmi_wrapper.AMDSMI_VOLT_AVERAGE
|
|
LOWEST = amdsmi_wrapper.AMDSMI_VOLT_LOWEST
|
|
HIGHEST = amdsmi_wrapper.AMDSMI_VOLT_HIGHEST
|
|
|
|
|
|
class AmdSmiVoltageType(IntEnum):
|
|
VDDGFX = amdsmi_wrapper.AMDSMI_VOLT_TYPE_VDDGFX
|
|
INVALID = amdsmi_wrapper.AMDSMI_VOLT_TYPE_INVALID
|
|
|
|
|
|
class AmdSmiPowerProfilePresetMasks(IntEnum):
|
|
CUSTOM_MASK = amdsmi_wrapper.AMDSMI_PWR_PROF_PRST_CUSTOM_MASK
|
|
VIDEO_MASK = amdsmi_wrapper.AMDSMI_PWR_PROF_PRST_VIDEO_MASK
|
|
POWER_SAVING_MASK = amdsmi_wrapper.AMDSMI_PWR_PROF_PRST_POWER_SAVING_MASK
|
|
COMPUTE_MASK = amdsmi_wrapper.AMDSMI_PWR_PROF_PRST_COMPUTE_MASK
|
|
VR_MASK = amdsmi_wrapper.AMDSMI_PWR_PROF_PRST_VR_MASK
|
|
THREE_D_FULL_SCR_MASK = amdsmi_wrapper.AMDSMI_PWR_PROF_PRST_3D_FULL_SCR_MASK
|
|
BOOTUP_DEFAULT = amdsmi_wrapper.AMDSMI_PWR_PROF_PRST_BOOTUP_DEFAULT
|
|
INVALID = amdsmi_wrapper.AMDSMI_PWR_PROF_PRST_INVALID
|
|
|
|
|
|
class AmdSmiGpuBlock(IntEnum):
|
|
INVALID = amdsmi_wrapper.AMDSMI_GPU_BLOCK_INVALID
|
|
UMC = amdsmi_wrapper.AMDSMI_GPU_BLOCK_UMC
|
|
SDMA = amdsmi_wrapper.AMDSMI_GPU_BLOCK_SDMA
|
|
GFX = amdsmi_wrapper.AMDSMI_GPU_BLOCK_GFX
|
|
MMHUB = amdsmi_wrapper.AMDSMI_GPU_BLOCK_MMHUB
|
|
ATHUB = amdsmi_wrapper.AMDSMI_GPU_BLOCK_ATHUB
|
|
PCIE_BIF = amdsmi_wrapper.AMDSMI_GPU_BLOCK_PCIE_BIF
|
|
HDP = amdsmi_wrapper.AMDSMI_GPU_BLOCK_HDP
|
|
XGMI_WAFL = amdsmi_wrapper.AMDSMI_GPU_BLOCK_XGMI_WAFL
|
|
DF = amdsmi_wrapper.AMDSMI_GPU_BLOCK_DF
|
|
SMN = amdsmi_wrapper.AMDSMI_GPU_BLOCK_SMN
|
|
SEM = amdsmi_wrapper.AMDSMI_GPU_BLOCK_SEM
|
|
MP0 = amdsmi_wrapper.AMDSMI_GPU_BLOCK_MP0
|
|
MP1 = amdsmi_wrapper.AMDSMI_GPU_BLOCK_MP1
|
|
FUSE = amdsmi_wrapper.AMDSMI_GPU_BLOCK_FUSE
|
|
RESERVED = amdsmi_wrapper.AMDSMI_GPU_BLOCK_RESERVED
|
|
|
|
|
|
class AmdSmiRasErrState(IntEnum):
|
|
NONE = amdsmi_wrapper.AMDSMI_RAS_ERR_STATE_NONE
|
|
DISABLED = amdsmi_wrapper.AMDSMI_RAS_ERR_STATE_DISABLED
|
|
PARITY = amdsmi_wrapper.AMDSMI_RAS_ERR_STATE_PARITY
|
|
SING_C = amdsmi_wrapper.AMDSMI_RAS_ERR_STATE_SING_C
|
|
MULT_UC = amdsmi_wrapper.AMDSMI_RAS_ERR_STATE_MULT_UC
|
|
POISON = amdsmi_wrapper.AMDSMI_RAS_ERR_STATE_POISON
|
|
ENABLED = amdsmi_wrapper.AMDSMI_RAS_ERR_STATE_ENABLED
|
|
INVALID = amdsmi_wrapper.AMDSMI_RAS_ERR_STATE_INVALID
|
|
|
|
|
|
class AmdSmiMemoryType(IntEnum):
|
|
VRAM = amdsmi_wrapper.AMDSMI_MEM_TYPE_VRAM
|
|
VIS_VRAM = amdsmi_wrapper.AMDSMI_MEM_TYPE_VIS_VRAM
|
|
GTT = amdsmi_wrapper.AMDSMI_MEM_TYPE_GTT
|
|
|
|
|
|
class AmdSmiFreqInd(IntEnum):
|
|
MIN = amdsmi_wrapper.AMDSMI_FREQ_IND_MIN
|
|
MAX = amdsmi_wrapper.AMDSMI_FREQ_IND_MAX
|
|
INVALID = amdsmi_wrapper.AMDSMI_FREQ_IND_INVALID
|
|
|
|
|
|
class AmdSmiXgmiStatus(IntEnum):
|
|
NO_ERRORS = amdsmi_wrapper.AMDSMI_XGMI_STATUS_NO_ERRORS
|
|
ERROR = amdsmi_wrapper.AMDSMI_XGMI_STATUS_ERROR
|
|
MULTIPLE_ERRORS = amdsmi_wrapper.AMDSMI_XGMI_STATUS_MULTIPLE_ERRORS
|
|
|
|
|
|
class AmdSmiMemoryPageStatus(IntEnum):
|
|
RESERVED = amdsmi_wrapper.AMDSMI_MEM_PAGE_STATUS_RESERVED
|
|
PENDING = amdsmi_wrapper.AMDSMI_MEM_PAGE_STATUS_PENDING
|
|
UNRESERVABLE = amdsmi_wrapper.AMDSMI_MEM_PAGE_STATUS_UNRESERVABLE
|
|
|
|
|
|
class AmdSmiIoLinkType(IntEnum):
|
|
UNDEFINED = amdsmi_wrapper.AMDSMI_IOLINK_TYPE_UNDEFINED
|
|
PCIEXPRESS = amdsmi_wrapper.AMDSMI_IOLINK_TYPE_PCIEXPRESS
|
|
XGMI = amdsmi_wrapper.AMDSMI_IOLINK_TYPE_XGMI
|
|
NUMIOLINKTYPES = amdsmi_wrapper.AMDSMI_IOLINK_TYPE_NUMIOLINKTYPES
|
|
SIZE = amdsmi_wrapper.AMDSMI_IOLINK_TYPE_SIZE
|
|
|
|
|
|
class AmdSmiUtilizationCounterType(IntEnum):
|
|
COARSE_GRAIN_GFX_ACTIVITY = amdsmi_wrapper.AMDSMI_COARSE_GRAIN_GFX_ACTIVITY
|
|
COARSE_GRAIN_MEM_ACTIVITY = amdsmi_wrapper.AMDSMI_COARSE_GRAIN_MEM_ACTIVITY
|
|
|
|
|
|
_AMDSMI_MAX_DRIVER_VERSION_LENGTH = 80
|
|
_AMDSMI_GPU_UUID_SIZE = 38
|
|
|
|
|
|
def _parse_fw_info(fw_info: amdsmi_wrapper.amdsmi_fw_info_t) -> Dict[str, Any]:
|
|
"""
|
|
Format firmware info extracted.
|
|
|
|
Parameters:
|
|
fw_info(`amdsmi_fw_info_t`): Struct containing the extracted info to be
|
|
formatted.
|
|
|
|
Returns:
|
|
`dict`: All of the firmware info formatted into a dictionary.
|
|
"""
|
|
if not isinstance(fw_info, amdsmi_wrapper.amdsmi_fw_info_t):
|
|
raise AmdSmiParameterException(fw_info, amdsmi_wrapper.amdsmi_fw_info_t)
|
|
formatted_fw_info = {"num_fw_info": fw_info.num_fw_info}
|
|
for index, value in amdsmi_wrapper.amdsmi_fw_block__enumvalues.items():
|
|
if value == "FW_ID_FIRST":
|
|
value = "FW_ID_SMU"
|
|
if value == "FW_ID__MAX":
|
|
continue
|
|
formatted_fw_info.update({value: fw_info.fw_info_list[index - 1].fw_version})
|
|
|
|
return formatted_fw_info
|
|
|
|
|
|
def _format_bad_page_info(bad_page_info, bad_page_count: ctypes.c_uint32) -> List[Dict]:
|
|
"""
|
|
Format bad page info data retrieved.
|
|
|
|
Parameters:
|
|
bad_page_info(`POINTER(amdsmi_retired_page_record_t)`): Pointer to bad page info
|
|
retrieved.
|
|
bad_page_count(`c_uint32`): Bad page count.
|
|
|
|
Returns:
|
|
`list`: List containing formatted bad pages.
|
|
"""
|
|
if not isinstance(
|
|
bad_page_info, ctypes.POINTER(amdsmi_wrapper.amdsmi_retired_page_record_t)
|
|
):
|
|
raise AmdSmiParameterException(
|
|
bad_page_info, ctypes.POINTER(amdsmi_wrapper.amdsmi_retired_page_record_t)
|
|
)
|
|
|
|
table_records = list()
|
|
for i in range(bad_page_count.value):
|
|
table_records.append(
|
|
{
|
|
"value": i,
|
|
"page_address": bad_page_info[i].page_address,
|
|
"page_size": bad_page_info[i].page_size,
|
|
"status": bad_page_info[i].status,
|
|
}
|
|
)
|
|
return table_records
|
|
|
|
|
|
def _format_bdf(amdsmi_bdf: amdsmi_wrapper.amdsmi_bdf_t) -> str:
|
|
"""
|
|
Format BDF struct to readable data.
|
|
|
|
Parameters:
|
|
amdsmi_bdf(`amdsmi_bdf_t`): Struct containing BDF data that
|
|
will be formatted.
|
|
|
|
Returns:
|
|
`str`: String containing BDF data in a readable format.
|
|
"""
|
|
domain = hex(amdsmi_bdf.amdsmi_bdf_0.domain_number)[2:].zfill(4)
|
|
bus = hex(amdsmi_bdf.amdsmi_bdf_0.bus_number)[2:].zfill(2)
|
|
device = hex(amdsmi_bdf.amdsmi_bdf_0.device_number)[2:].zfill(2)
|
|
function = hex(amdsmi_bdf.amdsmi_bdf_0.function_number)[2:]
|
|
|
|
return domain + ":" + bus + ":" + device + "." + function
|
|
|
|
|
|
def _check_res(ret_code) -> None:
|
|
"""
|
|
Wrapper for amdsmi function calls. Checks the status returned
|
|
by the call. Raises exceptions if the status was inappropriate.
|
|
|
|
Parameters:
|
|
ret_code(`amdsmi_status_t`): Status code returned by function
|
|
call.
|
|
|
|
Returns:
|
|
`None`.
|
|
"""
|
|
if ret_code == amdsmi_wrapper.AMDSMI_STATUS_RETRY:
|
|
raise AmdSmiRetryException()
|
|
|
|
if ret_code == amdsmi_wrapper.AMDSMI_STATUS_TIMEOUT:
|
|
raise AmdSmiTimeoutException()
|
|
|
|
if ret_code != amdsmi_wrapper.AMDSMI_STATUS_SUCCESS:
|
|
raise AmdSmiLibraryException(ret_code)
|
|
|
|
|
|
def _amdsmi_get_socket_handles() -> List[amdsmi_wrapper.amdsmi_socket_handle]:
|
|
"""
|
|
Function that gets socket handles. Wraps the same named function call.
|
|
|
|
Parameters:
|
|
`None`.
|
|
|
|
Returns:
|
|
`List`: List containing all of the found socket handles.
|
|
"""
|
|
socket_count = ctypes.c_uint32(0)
|
|
null_ptr = ctypes.POINTER(amdsmi_wrapper.amdsmi_socket_handle)()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_socket_handles(
|
|
ctypes.byref(socket_count), null_ptr
|
|
)
|
|
)
|
|
socket_handles = (amdsmi_wrapper.amdsmi_socket_handle * socket_count.value)()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_socket_handles(
|
|
ctypes.byref(socket_count), socket_handles
|
|
)
|
|
)
|
|
sockets = [
|
|
amdsmi_wrapper.amdsmi_socket_handle(socket_handles[sock_idx])
|
|
for sock_idx in range(socket_count.value)
|
|
]
|
|
|
|
return sockets
|
|
|
|
|
|
def amdsmi_get_device_handles() -> List[amdsmi_wrapper.amdsmi_device_handle]:
|
|
socket_handles = _amdsmi_get_socket_handles()
|
|
devices = []
|
|
for socket in socket_handles:
|
|
device_count = ctypes.c_uint32()
|
|
null_ptr = ctypes.POINTER(amdsmi_wrapper.amdsmi_device_handle)()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_device_handles(
|
|
socket,
|
|
ctypes.byref(device_count),
|
|
null_ptr,
|
|
)
|
|
)
|
|
device_handles = (amdsmi_wrapper.amdsmi_device_handle * device_count.value)()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_device_handles(
|
|
socket,
|
|
ctypes.byref(device_count),
|
|
device_handles,
|
|
)
|
|
)
|
|
devices.extend(
|
|
[
|
|
amdsmi_wrapper.amdsmi_device_handle(device_handles[dev_idx])
|
|
for dev_idx in range(device_count.value)
|
|
]
|
|
)
|
|
|
|
return devices
|
|
|
|
|
|
def amdsmi_init():
|
|
_check_res(amdsmi_wrapper.amdsmi_init(AmdSmiInitFlags.AMD_GPUS))
|
|
|
|
|
|
def amdsmi_fini():
|
|
_check_res(amdsmi_wrapper.amdsmi_shut_down())
|
|
|
|
|
|
def amdsmi_get_device_type(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> ctypes.c_uint32:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
dev_type = amdsmi_wrapper.device_type_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_device_type(device_handle, ctypes.byref(dev_type))
|
|
)
|
|
return dev_type
|
|
|
|
|
|
def amdsmi_get_device_bdf(device_handle: amdsmi_wrapper.amdsmi_device_handle) -> str:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
bdf_info = amdsmi_wrapper.amdsmi_bdf_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_device_bdf(device_handle, ctypes.byref(bdf_info))
|
|
)
|
|
|
|
return _format_bdf(bdf_info)
|
|
|
|
|
|
def amdsmi_get_asic_info(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
asic_info = amdsmi_wrapper.amdsmi_asic_info_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_asic_info(device_handle, ctypes.byref(asic_info))
|
|
)
|
|
|
|
return {
|
|
"market_name": asic_info.market_name.decode("utf-8"),
|
|
"family": asic_info.family,
|
|
"vendor_id": asic_info.vendor_id,
|
|
"device_id": asic_info.device_id,
|
|
"rev_id": asic_info.rev_id,
|
|
"asic_serial": asic_info.asic_serial.decode("utf-8"),
|
|
}
|
|
|
|
|
|
def amdsmi_get_power_info(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
power_info = amdsmi_wrapper.amdsmi_power_cap_info_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_power_cap_info(
|
|
device_handle, ctypes.c_uint32(0), ctypes.byref(power_info)
|
|
)
|
|
)
|
|
|
|
return {"dpm_cap": power_info.dpm_cap, "power_cap": power_info.power_cap}
|
|
|
|
|
|
def amdsmi_get_caps_info(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
gpu_caps = amdsmi_wrapper.amdsmi_gpu_caps_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_caps_info(device_handle, ctypes.byref(gpu_caps))
|
|
)
|
|
|
|
return {
|
|
"gfx": {
|
|
"gfxip_major": gpu_caps.gfx.gfxip_major,
|
|
"gfxip_minor": gpu_caps.gfx.gfxip_minor,
|
|
"gfxip_cu_count": gpu_caps.gfx.gfxip_cu_count,
|
|
},
|
|
"mm_ip_list": list(gpu_caps.mm.mm_ip_list),
|
|
"ras_supported": gpu_caps.ras_supported,
|
|
"gfx_ip_count": gpu_caps.gfx_ip_count,
|
|
"dma_ip_count": gpu_caps.dma_ip_count,
|
|
}
|
|
|
|
|
|
def amdsmi_get_vbios_info(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
vbios_info = amdsmi_wrapper.amdsmi_vbios_info_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_vbios_info(device_handle, ctypes.byref(vbios_info))
|
|
)
|
|
|
|
return {
|
|
"name": vbios_info.name.decode("utf-8"),
|
|
"vbios_version": vbios_info.vbios_version,
|
|
"build_date": vbios_info.build_date.decode("utf-8"),
|
|
"part_number": vbios_info.part_number.decode("utf-8"),
|
|
"vbios_version_string": vbios_info.vbios_version_string.decode("utf-8"),
|
|
}
|
|
|
|
|
|
def amdsmi_get_gpu_activity(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
engine_usage = amdsmi_wrapper.amdsmi_engine_usage_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_gpu_activity(
|
|
device_handle, ctypes.byref(engine_usage)
|
|
)
|
|
)
|
|
|
|
return {
|
|
"average_gfx_activity": engine_usage.average_gfx_activity,
|
|
"average_umc_activity": engine_usage.average_umc_activity,
|
|
"average_mm_activity": list(engine_usage.average_mm_activity),
|
|
}
|
|
|
|
|
|
def amdsmi_get_clock_measure(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
clock_type: amdsmi_wrapper.amdsmi_clk_type_t,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
clock_measure = amdsmi_wrapper.amdsmi_clk_measure_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_clock_measure(
|
|
device_handle,
|
|
amdsmi_wrapper.amdsmi_clk_type_t(clock_type),
|
|
ctypes.byref(clock_measure),
|
|
)
|
|
)
|
|
|
|
return {
|
|
"cur_clk": clock_measure.cur_clk,
|
|
"avg_clk": clock_measure.avg_clk,
|
|
"min_clk": clock_measure.min_clk,
|
|
"max_clk": clock_measure.max_clk,
|
|
}
|
|
|
|
|
|
def amdsmi_get_temperature_measure(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
temperature_type: amdsmi_wrapper.amdsmi_temperature_type_t,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
temperature_measure = amdsmi_wrapper.amdsmi_temperature_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_temperature_measure(
|
|
device_handle,
|
|
amdsmi_wrapper.amdsmi_temperature_type_t(temperature_type),
|
|
ctypes.byref(temperature_measure),
|
|
)
|
|
)
|
|
|
|
return {"cur_temp": temperature_measure.cur_temp}
|
|
|
|
|
|
def amdsmi_get_power_limit(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
power_limit = amdsmi_wrapper.amdsmi_power_limit_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_power_limit(device_handle, ctypes.byref(power_limit))
|
|
)
|
|
|
|
return {"limit": power_limit.limit}
|
|
|
|
|
|
def amdsmi_get_temperature_limit(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
temperature_type: amdsmi_wrapper.amdsmi_temperature_type_t,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
temperature_limit = amdsmi_wrapper.amdsmi_temperature_limit_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_temperature_limit(
|
|
device_handle,
|
|
amdsmi_wrapper.amdsmi_temperature_type_t(temperature_type),
|
|
ctypes.byref(temperature_limit),
|
|
)
|
|
)
|
|
|
|
return {"limit": temperature_limit.limit}
|
|
|
|
|
|
def amdsmi_get_bad_page_info(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Union[list, str]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
num_pages = ctypes.c_uint32()
|
|
retired_page_record = ctypes.POINTER(amdsmi_wrapper.amdsmi_retired_page_record_t)()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_bad_page_info(
|
|
device_handle, ctypes.byref(num_pages), retired_page_record
|
|
)
|
|
)
|
|
table_records = _format_bad_page_info(retired_page_record, num_pages)
|
|
if num_pages.value == 0:
|
|
return "No bad pages found."
|
|
else:
|
|
table_records = _format_bad_page_info(retired_page_record, num_pages)
|
|
|
|
return table_records
|
|
|
|
|
|
def amdsmi_get_target_frequency_range(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
clock_type: amdsmi_wrapper.amdsmi_clk_type_t,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
freq_range = amdsmi_wrapper.amdsmi_frequency_range_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_target_frequency_range(
|
|
device_handle,
|
|
amdsmi_wrapper.amdsmi_clk_type_t(clock_type),
|
|
ctypes.byref(freq_range),
|
|
)
|
|
)
|
|
|
|
return {
|
|
"supported_upper_bound": freq_range.supported_freq_range.upper_bound,
|
|
"supported_lower_bound": freq_range.supported_freq_range.lower_bound,
|
|
"current_upper_bound": freq_range.current_freq_range.upper_bound,
|
|
"current_lower_bound": freq_range.current_freq_range.lower_bound,
|
|
}
|
|
|
|
|
|
def amdsmi_get_ecc_error_count(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
error_count = amdsmi_wrapper.amdsmi_error_count_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_ecc_error_count(
|
|
device_handle, ctypes.byref(error_count)
|
|
)
|
|
)
|
|
|
|
return {
|
|
"correctable_count": error_count.correctable_count,
|
|
"uncorrectable_count": error_count.uncorrectable_count,
|
|
}
|
|
|
|
|
|
def amdsmi_get_board_info(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
board_info = amdsmi_wrapper.amdsmi_board_info_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_board_info(device_handle, ctypes.byref(board_info))
|
|
)
|
|
|
|
return {
|
|
"serial_number": board_info.serial_number,
|
|
"product_serial": board_info.product_serial.decode("utf-8"),
|
|
"product_name": board_info.product_name.decode("utf-8"),
|
|
}
|
|
|
|
|
|
def amdsmi_get_ras_block_features_enabled(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
ras_state = amdsmi_wrapper.amdsmi_ras_err_state_t()
|
|
ras_states = []
|
|
for key, gpu_block in amdsmi_wrapper.amdsmi_gpu_block__enumvalues.items():
|
|
if gpu_block == "AMDSMI_GPU_BLOCK_RESERVED":
|
|
continue
|
|
if gpu_block == "AMDSMI_GPU_BLOCK_LAST":
|
|
gpu_block = "AMDSMI_GPU_BLOCK_FUSE"
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_ras_block_features_enabled(
|
|
device_handle,
|
|
amdsmi_wrapper.amdsmi_gpu_block_t(key),
|
|
ctypes.byref(ras_state),
|
|
)
|
|
)
|
|
ras_states.append(
|
|
{
|
|
"block": gpu_block,
|
|
"status": amdsmi_wrapper.amdsmi_ras_err_state_t__enumvalues[
|
|
ras_state.value
|
|
],
|
|
}
|
|
)
|
|
|
|
return ras_states
|
|
|
|
|
|
def amdsmi_get_process_list(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> List[amdsmi_wrapper.amdsmi_process_handle]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
max_processes = amdsmi_wrapper.c_uint32(0)
|
|
process_list = (amdsmi_wrapper.amdsmi_process_handle * max_processes.value)()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_process_list(
|
|
device_handle, process_list, ctypes.byref(max_processes)
|
|
)
|
|
)
|
|
|
|
process_list = (amdsmi_wrapper.amdsmi_process_handle * max_processes.value)()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_process_list(
|
|
device_handle, process_list, ctypes.byref(max_processes)
|
|
)
|
|
)
|
|
|
|
return [amdsmi_wrapper.amdsmi_process_handle(x) for x in list(process_list)]
|
|
|
|
|
|
def amdsmi_get_process_info(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
procces_handle: amdsmi_wrapper.amdsmi_process_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
if not isinstance(procces_handle, amdsmi_wrapper.amdsmi_process_handle):
|
|
raise AmdSmiParameterException(
|
|
procces_handle, amdsmi_wrapper.amdsmi_process_handle
|
|
)
|
|
|
|
info = amdsmi_wrapper.amdsmi_process_info()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_process_info(
|
|
device_handle, procces_handle, ctypes.byref(info)
|
|
)
|
|
)
|
|
|
|
return {
|
|
"name": info.name.decode("utf-8"),
|
|
"pid": info.pid,
|
|
"mem": info.mem,
|
|
"usage": {
|
|
"gfx": list(info.engine_usage.gfx),
|
|
"compute": list(info.engine_usage.compute),
|
|
"sdma": list(info.engine_usage.sdma),
|
|
"enc": list(info.engine_usage.enc),
|
|
"dec": list(info.engine_usage.dec),
|
|
},
|
|
"memory_usage": {
|
|
"gtt_mem": info.memory_usage.gtt_mem,
|
|
"cpu_mem": info.memory_usage.cpu_mem,
|
|
"vram_mem": info.memory_usage.vram_mem,
|
|
},
|
|
}
|
|
|
|
|
|
def amdsmi_get_device_uuid(device_handle: amdsmi_wrapper.amdsmi_device_handle) -> str:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
uuid = ctypes.create_string_buffer(_AMDSMI_GPU_UUID_SIZE)
|
|
|
|
uuid_length = ctypes.c_uint32()
|
|
uuid_length.value = _AMDSMI_GPU_UUID_SIZE
|
|
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_device_uuid(
|
|
device_handle, ctypes.byref(uuid_length), uuid
|
|
)
|
|
)
|
|
|
|
return uuid.value.decode("utf-8")
|
|
|
|
|
|
def amdsmi_get_driver_version(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> str:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
length = ctypes.c_int()
|
|
length.value = _AMDSMI_MAX_DRIVER_VERSION_LENGTH
|
|
|
|
version = ctypes.create_string_buffer(_AMDSMI_MAX_DRIVER_VERSION_LENGTH)
|
|
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_driver_version(
|
|
device_handle, ctypes.byref(length), version
|
|
)
|
|
)
|
|
|
|
return version.value.decode("utf-8")
|
|
|
|
|
|
def amdsmi_get_power_measure(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
power_measure = amdsmi_wrapper.amdsmi_power_measure_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_power_measure(
|
|
device_handle, ctypes.byref(power_measure)
|
|
)
|
|
)
|
|
|
|
return {
|
|
"average_socket_power": power_measure.average_socket_power,
|
|
"voltage_gfx": power_measure.voltage_gfx,
|
|
"energy_accumulator": power_measure.energy_accumulator,
|
|
}
|
|
|
|
|
|
def amdsmi_get_fw_info(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
fw_info = amdsmi_wrapper.amdsmi_fw_info_t()
|
|
_check_res(amdsmi_wrapper.amdsmi_get_fw_info(device_handle, ctypes.byref(fw_info)))
|
|
|
|
return _parse_fw_info(fw_info)
|
|
|
|
|
|
def amdsmi_get_vram_usage(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
vram_info = amdsmi_wrapper.amdsmi_vram_info_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_vram_usage(device_handle, ctypes.byref(vram_info))
|
|
)
|
|
|
|
return {"vram_used": vram_info.vram_used, "vram_total": vram_info.vram_total}
|
|
|
|
|
|
def amdsmi_get_pcie_link_status(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
pcie_info = amdsmi_wrapper.amdsmi_pcie_info_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_pcie_link_status(
|
|
device_handle, ctypes.byref(pcie_info)
|
|
)
|
|
)
|
|
|
|
return {"pcie_lanes": pcie_info.pcie_lanes, "pcie_speed": pcie_info.pcie_speed}
|
|
|
|
|
|
def amdsmi_get_pcie_link_caps(
|
|
device_handle: amdsmi_wrapper.amdsmi_device_handle,
|
|
) -> Dict[str, Any]:
|
|
if not isinstance(device_handle, amdsmi_wrapper.amdsmi_device_handle):
|
|
raise AmdSmiParameterException(
|
|
device_handle, amdsmi_wrapper.amdsmi_device_handle
|
|
)
|
|
|
|
pcie_info = amdsmi_wrapper.amdsmi_pcie_info_t()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_pcie_link_caps(device_handle, ctypes.byref(pcie_info))
|
|
)
|
|
|
|
return {"pcie_lanes": pcie_info.pcie_lanes, "pcie_speed": pcie_info.pcie_speed}
|
|
|
|
|
|
def amdsmi_get_device_handle_from_bdf(
|
|
bdf_info: amdsmi_wrapper.amdsmi_bdf_t,
|
|
) -> amdsmi_wrapper.amdsmi_device_handle:
|
|
if not isinstance(bdf_info, amdsmi_wrapper.amdsmi_bdf_t):
|
|
raise AmdSmiParameterException(bdf_info, amdsmi_wrapper.amdsmi_bdf_t)
|
|
|
|
device_handles_pylist = amdsmi_get_device_handles()
|
|
device_handles = (amdsmi_wrapper.amdsmi_device_handle * len(device_handles_pylist))(
|
|
*device_handles_pylist
|
|
)
|
|
device_handle = amdsmi_wrapper.amdsmi_device_handle()
|
|
_check_res(
|
|
amdsmi_wrapper.amdsmi_get_device_handle_from_bdf(
|
|
bdf_info,
|
|
device_handles,
|
|
ctypes.c_uint32(len(device_handles_pylist)),
|
|
ctypes.byref(device_handle),
|
|
)
|
|
)
|
|
|
|
return device_handle
|