From e6d82912e3b59f7892ad1f58f13ce09a4743dc80 Mon Sep 17 00:00:00 2001 From: Deepak Mewar Date: Wed, 11 Oct 2023 06:26:14 -0400 Subject: [PATCH] Added another set of esmi python wrappers for amdsmi python library Change-Id: Ib49efe21d4909c3e4a011eddcd96f587a9b6570c --- py-interface/__init__.py | 15 +++ py-interface/amdsmi_interface.py | 180 +++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) diff --git a/py-interface/__init__.py b/py-interface/__init__.py index bac8f6745d..54885114a4 100644 --- a/py-interface/__init__.py +++ b/py-interface/__init__.py @@ -29,6 +29,21 @@ from .amdsmi_interface import amdsmi_get_processor_handles from .amdsmi_interface import amdsmi_get_socket_handles from .amdsmi_interface import amdsmi_get_socket_info +from .amdsmi_interface import amdsmi_get_cpusocket_handles +from .amdsmi_interface import amdsmi_get_cpusocket_info +from .amdsmi_interface import amdsmi_get_cpucore_handles +from .amdsmi_interface import amdsmi_get_cpu_hsmp_proto_ver +from .amdsmi_interface import amdsmi_get_cpu_smu_fw_version +from .amdsmi_interface import amdsmi_get_cpu_core_energy +from .amdsmi_interface import amdsmi_get_cpu_socket_energy +from .amdsmi_interface import amdsmi_get_cpu_prochot_status +from .amdsmi_interface import amdsmi_get_cpu_fclk_mclk +from .amdsmi_interface import amdsmi_get_cpu_cclk_limit +from .amdsmi_interface import amdsmi_get_cpu_socket_current_active_freq_limit +from .amdsmi_interface import amdsmi_get_cpu_socket_freq_range +from .amdsmi_interface import amdsmi_get_cpu_core_current_freq_limit +from .amdsmi_interface import amdsmi_get_cpu_socket_power + from .amdsmi_interface import amdsmi_get_gpu_device_bdf from .amdsmi_interface import amdsmi_get_gpu_device_uuid from .amdsmi_interface import amdsmi_get_processor_handle_from_bdf diff --git a/py-interface/amdsmi_interface.py b/py-interface/amdsmi_interface.py index ff92663772..1087a35146 100644 --- a/py-interface/amdsmi_interface.py +++ b/py-interface/amdsmi_interface.py @@ -595,6 +595,186 @@ def amdsmi_get_processor_handles() -> List[amdsmi_wrapper.amdsmi_processor_handl return devices +def amdsmi_get_cpu_core_energy( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, core_idx: int +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + if not isinstance(core_idx, int): + raise AmdSmiParameterException(core_idx, int) + + penergy = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_core_energy( + processor_handle, core_idx, ctypes.byref(penergy) + ) + ) + + return penergy.value + +def amdsmi_get_cpu_socket_energy( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, sock_idx: int +) -> int: + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + + penergy = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_socket_energy( + socket_handle, sock_idx, ctypes.byref(penergy) + ) + ) + + return penergy.value + +def amdsmi_get_cpu_prochot_status( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, sock_idx: int +) -> int: + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + + prochot = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_socket_energy( + socket_handle, sock_idx, ctypes.byref(prochot) + ) + ) + + return prochot.value + +def amdsmi_get_cpu_fclk_mclk( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, sock_idx: int +): + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + + fclk = ctypes.c_uint32() + mclk = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_fclk_mclk( + socket_handle, sock_idx, ctypes.byref(fclk), ctypes.byref(mclk) + ) + ) + + return { + "fclk": fclk.value, + "mclk": mclk.value + } + +def amdsmi_get_cpu_cclk_limit( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, sock_idx: int +) -> int: + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + + cclk = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_cclk_limit( + socket_handle, sock_idx, ctypes.byref(cclk) + ) + ) + + return cclk.value + +def amdsmi_get_cpu_socket_current_active_freq_limit( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, sock_idx: int +) -> int: + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + + freq = ctypes.c_uint16() + src_type = ctypes.pointer(ctypes.pointer(ctypes.c_char())) + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_socket_current_active_freq_limit( + socket_handle, sock_idx, ctypes.byref(freq), src_type + ) + ) + + return freq.value + +def amdsmi_get_cpu_socket_freq_range( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, sock_idx: int +): + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + + freq_max = ctypes.c_uint16() + freq_min = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_socket_freq_range( + socket_handle, sock_idx, ctypes.byref(freq_max), ctypes.byref(freq_min) + ) + ) + + return { + "max_socket_freq": freq_max.value, + "min_socket_freq": freq_min.value + } + +def amdsmi_get_cpu_core_current_freq_limit( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, core_idx: int +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + if not isinstance(core_idx, int): + raise AmdSmiParameterException(core_idx, int) + + freq = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_core_current_freq_limit( + processor_handle, core_idx, ctypes.byref(freq) + ) + ) + + return freq.value + +def amdsmi_get_cpu_socket_power( + socket_handle: amdsmi_wrapper.amdsmi_cpusocket_handle, sock_idx: int +) -> int: + if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle): + raise AmdSmiParameterException( + socket_handle, amdsmi_wrapper.amdsmi_cpusocket_handle + ) + if not isinstance(sock_idx, int): + raise AmdSmiParameterException(sock_idx, int) + + ppower = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_cpu_socket_power( + socket_handle, sock_idx, ctypes.byref(ppower) + ) + ) + + return ppower.value + def amdsmi_init(flag=AmdSmiInitFlags.INIT_AMD_GPUS): if not isinstance(flag, AmdSmiInitFlags): raise AmdSmiParameterException(flag, AmdSmiInitFlags)