HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux WebLive 5.15.0-79-generic #86-Ubuntu SMP Mon Jul 10 16:07:21 UTC 2023 x86_64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //usr/local/qcloud/monitor/barad/lib/pyzxml/pyzxml.py
# -*- coding: utf-8 -*-
#####
# Tencent Tech, All Rights Reserved. 2019-2020 Copyright (c)
#####

##
# Python bindings for the ZXML library
##
from ctypes import *
from ctypes.util import find_library
import sys
import os
import threading
import string

## C Type mappings ##
## Enums

zxmlReturn = c_uint
ZXML_SUCCESS = 0
ZXML_ERROR_UNINITIALIZED = 1
ZXML_ERROR_INVALID_ARGUMENT = 2
ZXML_ERROR_NOT_SUPPORTED = 3
ZXML_ERROR_LIBRARY_NOT_FOUND = 4
ZXML_ERROR_NOT_SUPPORTED_ERROR_CODE = 5
ZXML_ERROR_DRIVER_NOT_LOADED = 6
ZXML_ERROR_ESL_PORT_NUMBER_ERR = 7
ZXML_ERROR_INVALID_INPUT = 8
ZXML_ERROR_MAX = 255

zxmlErrorMessage = {
    ZXML_SUCCESS : 'succeed',
    ZXML_ERROR_UNINITIALIZED : 'device uninitialized',
    ZXML_ERROR_INVALID_ARGUMENT : 'invalid argument',
    ZXML_ERROR_NOT_SUPPORTED : 'not supported',
    ZXML_ERROR_LIBRARY_NOT_FOUND : 'library not found',
    ZXML_ERROR_NOT_SUPPORTED_ERROR_CODE : 'not supported error code',
    ZXML_ERROR_DRIVER_NOT_LOADED : 'driver not loaded',
    ZXML_ERROR_ESL_PORT_NUMBER_ERR : 'esl port number error',
    ZXML_ERROR_INVALID_INPUT : 'invalid input',
    ZXML_ERROR_MAX : 'error max'
}

zxmlLinkSpeed_t = c_uint
ZXML_LINK_SPEED_GEN1 = 1
ZXML_LINK_SPEED_GEN2 = 2
ZXML_LINK_SPEED_GEN3 = 3
ZXML_LINK_SPEED_GEN4 = 4
ZXML_LINK_SPEED_GEN5 = 5

zxmlEslLinkSpeed_t = c_uint
ZXML_ESL_LINK_SPEED_GEN1 = 1
ZXML_ESL_LINK_SPEED_GEN2 = 2
ZXML_ESL_LINK_SPEED_GEN3 = 3
ZXML_ESL_LINK_SPEED_GEN4 = 4
ZXML_ESL_LINK_SPEED_GEN5 = 5
ZXML_ESL_LINK_SPEED_ESM_2P5GT   = 16
ZXML_ESL_LINK_SPEED_ESM_5GT = 17
ZXML_ESL_LINK_SPEED_ESM_8GT = 18
ZXML_ESL_LINK_SPEED_ESM_16GT = 19
ZXML_ESL_LINK_SPEED_ESM_20GT = 20
ZXML_ESL_LINK_SPEED_ESM_25GT = 21

zxmlLinkWidth_t = c_uint
ZXML_LINK_WIDTH_X1 = 1
ZXML_LINK_WIDTH_X2 = 2
ZXML_LINK_WIDTH_X4 = 4
ZXML_LINK_WIDTH_X8 = 8
ZXML_LINK_WIDTH_X16 = 16

zxmlEslLinkWidth_t = c_uint
ZXML_ESL_LINK_WIDTH_X1 = 1
ZXML_ESL_LINK_WIDTH_X2 = 2
ZXML_ESL_LINK_WIDTH_X4 = 4
ZXML_ESL_LINK_WIDTH_X8 = 8
ZXML_ESL_LINK_WIDTH_X16 = 16

zxmlEslPortType_t = c_uint
ZXML_ESL_PORT_RC = 0
ZXML_ESL_PORT_EP = 1

## driver version buffer length
ZXML_DRIVER_VER_LEN = 128

## max buffer length
ZXML_MAX_CHAR_BUFF_LEN = 128

class zxmlDeviceInfo_t(Structure):
    _fields_ = [
        ('name', c_char * ZXML_MAX_CHAR_BUFF_LEN),
        ('vendor_id', c_uint),
        ('device_id', c_uint),
        ('domain_id', c_uint),
        ('bus_id', c_uint),
        ('dev_id', c_uint),
        ('func_id', c_uint),
        ('logic_id', c_uint),
    ]

class zxmlDevPowerInfo_t(Structure):
    _fields_ = [
        ('pwr_capability', c_float),
        ('cur_pwr_consumption', c_float),
    ]

class zxmlDriverInfo_t(Structure):
    _fields_ = [
        ('driver_ver', c_char * ZXML_DRIVER_VER_LEN),
    ]

class zxmlDevMemInfo_t(Structure):
    _fields_ = [
        ('mem_total_size', c_ulonglong),
        ('mem_used', c_uint),
    ]

class zxmlClusterHbmMemInfo_t(Structure):
    _fields_ = [
        ('mem_total_size', c_ulonglong),
        ('mem_used', c_uint),
    ]

class zxmlDevClkInfo_t(Structure):
    _fields_ = [
        ('cur_hbm_clock', c_uint),
        ('cur_dtu_clock', c_uint),
    ]

class zxmlDevThermalInfo_t(Structure):
    _fields_ = [
        ('cur_dev_temp', c_float),
        ('cur_hbm0_temp', c_float),
        ('cur_hbm1_temp', c_float),
    ]

class zxmlDevThermalInfoV2_t(Structure):
    _fields_ = [
       ('cur_asic_temp', c_float),
       ('cur_mem_temp', c_float),
       ('cur_board_temp', c_float),
    ]

class zxmlDevVoltInfo_t(Structure):
    _fields_ = [
        ('vdd_dtu', c_float),
        ('vdd_soc', c_float),
        ('vdd_hbmqc', c_float),
        ('vdd_1v8', c_float),
        ('vdd_vddp', c_float),
    ]

class zxmlPcieLinkInfo_t(Structure):
    _fields_ = [
        ('link_speed', c_uint),
        ('max_link_speed', c_uint),
        ('link_width', c_uint),
        ('max_link_width', c_uint),
    ]

class zxmlPcieThroughputInfo_t(Structure):
    _fields_ = [
        ('tx_throughput', c_float),
        ('rx_throughput', c_float),
        ('tx_nak', c_ulonglong),
        ('rx_nak', c_ulonglong),
    ]

class zxmlEslLinkInfo_t(Structure):
    _fields_ = [
        ('link_speed', c_uint),
        ('max_link_speed', c_uint),
        ('link_width', c_uint),
        ('max_link_width', c_uint),
    ]

class zxmlEslThroughputInfo_t(Structure):
    _fields_ = [
        ('tx_throughput', c_float),
        ('rx_throughput', c_float),
        ('tx_nak', c_ulonglong),
        ('rx_nak', c_ulonglong),
    ]

class zxmlEslPortInfo_t(Structure):
    _fields_ = [
        ('connected', c_uint),
        ('uuid', c_char * 16),
        ('vendor_id', c_uint),
        ('device_id', c_uint),
        ('domain_id', c_uint),
        ('bus_id', c_uint),
        ('dev_id', c_uint),
        ('func_id', c_uint),
        ('port_id', c_uint),
        ('port_type', zxmlEslPortType_t),

        ('remote_card_id', c_uint),
        ('remote_uuid', c_char * 16),
        ('remote_vendor_id', c_uint),
        ('remote_device_id', c_uint),
        ('remote_domain_id', c_uint),
        ('remote_bus_id', c_uint),
        ('remote_dev_id', c_uint),
        ('remote_func_id', c_uint),
        ('remote_port_id', c_uint),
        ('remote_port_type', zxmlEslPortType_t),
    ]

# handler zxml library
zxmlLib = None

## Error Checking ##
def zxmlError(err_code):
    if(err_code >= ZXML_ERROR_MAX):
        raise Exception("error code not supported!")

    if(err_code != ZXML_SUCCESS):
        raise Exception('error ' + zxmlErrorMessage[err_code])

def zxmlLoadLibrary():
    global zxmlLib
    if (zxmlLib == None):
        try:
            zxmlLib = CDLL('libzxml.so')
        except OSError as ose:
            print('library not found!')
            raise
        finally:
            pass

# function entry list
zxmlFunctionEntryList_cache = dict()

def zxmlGetFunctionEntry(entry_str):
    global zxmlLib

    if entry_str in zxmlFunctionEntryList_cache:
        return zxmlFunctionEntryList_cache[entry_str]

    try:
        if (zxmlLib == None):
            zxmlError(ZXML_ERROR_UNINITIALIZED)

        zxmlFunctionEntryList_cache[entry_str] = getattr(zxmlLib, entry_str)
        return zxmlFunctionEntryList_cache[entry_str]
    finally:
        pass

# init device and library
def zxmlInit(no_driver=False):
    """
    Init zxml libary

    parameters:
              no_driver(bool): not use kmd

    return:
           ZXML_SUCCESS
    """
    zxmlLoadLibrary()
    func = zxmlGetFunctionEntry("ZxmlInit")
    c_no_driver = c_bool(no_driver)
    try:
        ret = func(c_no_driver)
        zxmlError(ret)
    except Exception as e:
        raise

    return ret

# shutdown and release loaded library
def zxmlShutdown():
    """
    Close zxml libary, release allocated resource

    parameters:
              None

    return:
           None
    """
    zxmlLoadLibrary()
    func = zxmlGetFunctionEntry("ZxmlShutdown")
    try:
        func()
    except Exception as e:
        raise

    return None

def zxmlErrorString(ret_val):
    """
    Translate returned error code to string

    parameters:
            ret_val (zxmlReturn): function return value

    return:
          string of return value
    """
    fn = zxmlGetFunctionEntry("ZxmlErrorString")
    fn.restype = c_char_p # the return result should be a string
    ret = fn(ret_val)
    return ret

def zxmlDriverVer():
    """
    Get KMD (kernel mode driver) version info

    parameters:
              None

    return:
          string of driver version
    """
    c_driver_info = create_string_buffer(ZXML_DRIVER_VER_LEN)
    fn = zxmlGetFunctionEntry("ZxmlGetDriverVer")
    ret = fn(c_driver_info)
    zxmlError(ret)

    return c_driver_info.value

def zxmlLibVer():
    """
    Get ZXML lib version info

    parameters:
              None

    return:
          string of zxml lib version
    """
    c_zxml_ver_info = create_string_buffer(ZXML_DRIVER_VER_LEN)
    fn = zxmlGetFunctionEntry("ZxmlGetLibVer")
    ret = fn(c_zxml_ver_info)
    zxmlError(ret)

    return c_zxml_ver_info.value

def zxmlSelDevByIndex(idx):
    """
    Select current device by index

    parameters:
              idx (int): selected device index

    return:
          None

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    fn = zxmlGetFunctionEntry("ZxmlSelDevByIndex")
    c_idx = c_uint(idx)
    ret = fn(c_idx)
    zxmlError(ret)

def zxmlGetDevCount():
    """
    Get total DTU device numbers in the system

    parameters:
              None

    return:
          total device numbers

    error:
          ZXML_ERROR_UNINITIALIZED: library not initialized
    """
    cnt = c_uint()
    fn = zxmlGetFunctionEntry("ZxmlGetDevCount")
    ret = fn(byref(cnt))
    zxmlError(ret)
    return cnt.value

def zxmlGetDevName(idx):
    """
    Get DTU device name

    parameters:
              idx (int): selected device index

    return:
          device name in string

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_name = create_string_buffer(ZXML_MAX_CHAR_BUFF_LEN)
    fn = zxmlGetFunctionEntry("ZxmlGetDevName")

    ret = fn(c_idx, c_name)
    zxmlError(ret)
    return c_name.value

def zxmlGetDevUuid(idx):
    """
    Get DTU device UUID(Universally Unique Identifier)

    parameters:
              idx (int): selected device index

    return:
          device UUID in string

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_uuid = create_string_buffer(ZXML_MAX_CHAR_BUFF_LEN)
    fn = zxmlGetFunctionEntry("ZxmlGetDevUuid")

    ret = fn(c_idx, c_uuid)
    zxmlError(ret)
    return c_uuid.value

def zxmlGetDevSn(idx):
    """
    Get DTU device SN info(Serial Number)

    parameters:
              idx (int): selected device index

    return:
          device SN in string

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_sn = create_string_buffer(ZXML_MAX_CHAR_BUFF_LEN)
    fn = zxmlGetFunctionEntry("ZxmlGetDevSn")

    ret = fn(c_idx, c_sn)
    zxmlError(ret)
    return c_sn.value

def zxmlGetDevPn(idx):
    """
    Get DTU device PN info(Part Number)

    parameters:
              idx (int): selected device index

    return:
          device PN in string

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_pn = create_string_buffer(ZXML_MAX_CHAR_BUFF_LEN)
    fn = zxmlGetFunctionEntry("ZxmlGetDevPn")

    ret = fn(c_idx, c_pn)
    zxmlError(ret)
    return c_pn.value

def zxmlGetFwVersion(idx):
    """
    Get DTU firmware version

    parameters:
              idx (int): selected device index

    return:
          DTU firmware version in string

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_fw_ver = create_string_buffer(ZXML_MAX_CHAR_BUFF_LEN)
    fn = zxmlGetFunctionEntry("ZxmlGetFwVersion")

    ret = fn(c_idx, c_fw_ver)
    zxmlError(ret)
    return c_fw_ver.value


## device
#def zxmlGetDevFanSpeed(idx):
#    """
#    Get DTU Fan speed
#
#    parameters:
#              idx (int): selected device index
#
#    return:
#          DTU Fan speed in int
#
#    error:
#          | ZXML_ERROR_UNINITIALIZED: library not initialized
#          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
#    """
#    c_idx = c_uint(idx)
#    c_fan_speed = c_uint()
#    fn = zxmlGetFunctionEntry("ZxmlGetDevFanSpeed")
#    ret = fn(c_idx, byref(c_fan_speed))
#
#    zxmlError(ret)
#    return c_fan_speed.value
#
def zxmlGetDevTemp(idx):
    """
    Get DTU/MEM temperature

    parameters:
              idx (int): selected device index

    return:
          | zxmlDevThermalInfo_t:cur_dev_temp(float): DTU temperature,[1,95] celsius
          | zxmlDevThermalInfo_t:cur_hbm0_temp(float): MEM0 temperature,[1,95] celsius
          | zxmlDevThermalInfo_t:cur_hbm1_temp(float): MEM1 temperature,[1,95] celsius

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_ther = zxmlDevThermalInfo_t()
    fn = zxmlGetFunctionEntry("ZxmlGetDevTemp")
    ret = fn(c_idx, byref(c_ther))

    zxmlError(ret)
    return c_ther

def zxmlGetDevTempV2(idx):
    """
    Get DTU/MEM temperature
    """
    c_idx = c_uint(idx)
    c_ther = zxmlDevThermalInfoV2_t()
    fn = zxmlGetFunctionEntry("ZxmlGetDevTempV2")
    ret = fn(c_idx, byref(c_ther))

    zxmlError(ret)
    return c_ther

def zxmlGetDevVolt(idx):
    """
    Get DTU voltage

    parameters:
              idx (int): selected device index

    return:
          | zxmlDevVoltInfo_t:vdd_dtu(float): DTU voltage
          | zxmlDevVoltInfo_t:vdd_soc(float): soc voltage
          | zxmlDevVoltInfo_t:vdd_hbmqc(float): HBMQC voltage
          | zxmlDevVoltInfo_t:vdd_1v8(float): VDD 1V8 voltage
          | zxmlDevVoltInfo_t:vdd_vddp(float): VDD VDDP voltage

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_ther = zxmlDevVoltInfo_t()
    fn = zxmlGetFunctionEntry("ZxmlGetDevVolt")
    ret = fn(c_idx, byref(c_ther))

    zxmlError(ret)
    return c_ther

def zxmlGetDevPwr(idx):
    """
    Get DTU power consumption

    parameters:
              idx (int): selected device index

    return:
          | zxmlDevPowerInfo_t:pwr_capability(float): DTU power capability,225 watt
          | zxmlDevPowerInfo_t:cur_pwr_consumption(float): DTU current power consumption,[1,225] watt

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_pwr = zxmlDevPowerInfo_t()
    fn = zxmlGetFunctionEntry("ZxmlGetDevPwr")
    ret = fn(c_idx, byref(c_pwr))

    zxmlError(ret)
    return c_pwr

def zxmlGetDevDpmLevel(idx):
    """
    Get DTU DPM(Dynamic Power Managerment) level

    parameters:
              idx (int): selected device index

    return:
          DPM level in int

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_dpm = c_uint()
    fn = zxmlGetFunctionEntry("ZxmlGetDevDpmLevel")
    ret = fn(c_idx, byref(c_dpm))

    zxmlError(ret)
    return c_dpm.value

def zxmlGetDevDtuUsage(idx):
    """
    Get DTU usage

    parameters:
              idx (int): selected device index

    return:
          DTU usage value in float

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_dtu_usage = c_float()
    fn = zxmlGetFunctionEntry("ZxmlGetDevDtuUsage")
    ret = fn(c_idx, byref(c_dtu_usage))

    zxmlError(ret)
    return c_dtu_usage.value

def zxmlGetDevDtuUsageAsync(idx):
    """
    Get DTU usage Async

    parameters:
              idx (int): selected device index

    return:
          DTU usage value in float

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_dtu_usage = c_float()
    fn = zxmlGetFunctionEntry("ZxmlGetDevDtuUsageAsync")
    ret = fn(c_idx, byref(c_dtu_usage))

    zxmlError(ret)
    return c_dtu_usage.value

def zxmlGetDevClk(idx):
    """
    Get DTU/Mem clock frequency

    parameters:
              idx (int): selected device index

    return:
          zxmlDevClkInfo_t:cur_hbm_clock (int): memory clock frequency
          zxmlDevClkInfo_t:cur_dtu_clock (int): DTU clock frequency

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_clk = zxmlDevClkInfo_t()
    fn = zxmlGetFunctionEntry("ZxmlGetDevClk")
    ret = fn(c_idx, byref(c_clk))

    zxmlError(ret)
    return c_clk

def zxmlDumpDevList():
    """
    Dump device list in system

    parameters:
              None

    return:
          None

    error:
          ZXML_ERROR_UNINITIALIZED: library not initialized
    """
    fn = zxmlGetFunctionEntry("ZxmlDumpDevList")
    ret = fn()

    zxmlError(ret)

def zxmlGetDevInfo(idx):
    """
    Get detailed DTU information

    parameters:
              idx (int): selected device index

    return:
          | zxmlDeviceInfo_t:name (char []): device name
          | zxmlDeviceInfo_t:vendor_id (c_uint): PCIe Vendor ID
          | zxmlDeviceInfo_t:device_id (c_uint): PCIe Device ID
          | zxmlDeviceInfo_t:domain_id (c_uint): PCIe Domain ID
          | zxmlDeviceInfo_t:bus_id (c_uint): PCIe Bus number
          | zxmlDeviceInfo_t:dev_id (c_uint): PCIe Device number
          | zxmlDeviceInfo_t:func_id (c_uint): PCIe Function number
          | zxmlDeviceInfo_t:logic_id (c_uint): device logic id

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_dev_info = zxmlDeviceInfo_t()
    fn = zxmlGetFunctionEntry("ZxmlGetDevInfo")
    ret = fn(c_idx, byref(c_dev_info))

    zxmlError(ret)
    return c_dev_info


## memory info
def zxmlGetDevMem(idx):
    """
    Get device memory information

    parameters:
              idx (int): selected device index

    return:
          | zxmlDevMemInfo_t:mem_total_size (c_uint): memory size
          | zxmlDevMemInfo_t:mem_used (c_uint): memory usage

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_mem_info = zxmlDevMemInfo_t()
    fn = zxmlGetFunctionEntry("ZxmlGetDevMem")
    ret = fn(c_idx, byref(c_mem_info))

    zxmlError(ret)
    return c_mem_info


## cluster memory info
def zxmlGetClusterMem(idx, cluster_idx):
    """
    Get device memory information

    parameters:
              idx (int): selected device index
              cluster_idx (int): selected cluster index

    return:
          | zxmlClusterHbmMemInfo_t:mem_total_size (c_uint): memory size
          | zxmlClusterHbmMemInfo_t:mem_used (c_uint): memory usage

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_cluster_idx = c_uint(cluster_idx)
    c_mem_info = zxmlClusterHbmMemInfo_t()
    fn = zxmlGetFunctionEntry("ZxmlGetClusterMem")
    ret = fn(c_idx, c_cluster_idx, byref(c_mem_info))

    zxmlError(ret)
    return c_mem_info

def zxmlGetEccStatus(idx):
    """
    Get device memory ECC status

    parameters:
              idx (int): selected device index

    return:
          ECC enablement status in int

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_idx = c_uint(idx)
    c_ecc = c_uint()
    fn = zxmlGetFunctionEntry("ZxmlGetEccStatus")
    ret = fn(c_idx, byref(c_ecc))

    zxmlError(ret)
    return c_ecc.value

## PCIe
def zxmlGetPcieLinkSpeed(idx):
    """
    Get device PCIe link speed

    parameters:
              idx (int): selected device index

    return:
          link speed info in zxmlPcieSpeed_t

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_link_speed = zxmlLinkSpeed_t(idx)
    fn = zxmlGetFunctionEntry("ZxmlGetPcieLinkSpeed")

    ret = fn(c_dev_idx, byref(c_link_speed))
    zxmlError(ret)

    return c_link_speed.value

def zxmlGetPcieLinkWidth(idx):
    """
    Get device PCIe link width

    parameters:
              idx (int): selected device index

    return:
          link width info in zxmlPcieWidth_t

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_link_width = zxmlLinkWidth_t(idx)
    fn = zxmlGetFunctionEntry("ZxmlGetPcieLinkWidth")

    ret = fn(c_dev_idx, byref(c_link_width))
    zxmlError(ret)

    return c_link_width.value

def zxmlGetPcieLinkInfo(idx):
    """
    Get device PCIe link information

    parameters:
              idx (int): selected device index

    return:
          | zxmlPcieLinkInfo_t:link_speed : PCIe link speed
          | zxmlPcieLinkInfo_t:max_link_speed : PCIe supported max link speed
          | zxmlPcieLinkInfo_t:link_width : PCIe link width
          | zxmlPcieLinkInfo_t:max_link_width : PCIe supported max link width

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_link_info = zxmlPcieLinkInfo_t(0, 0, 0, 0)

    fn = zxmlGetFunctionEntry("ZxmlGetPcieLinkInfo")

    ret = fn(c_dev_idx, byref(c_link_info))
    zxmlError(ret)

    return c_link_info

def zxmlGetPcieThroughput(idx):
    """
    Get device PCIe link throughput info. It will collect information in 10ms

    parameters:
              idx (int): selected device index

    return:
          | zxmlPcieThroughputInfo_t:tx_throughput(float) : PCIe link Tx throughput
          | zxmlPcieThroughputInfo_t:rx_throughput(float) : PCIe link Rx throughput
          | zxmlPcieThroughputInfo_t:tx_nak(uint64) : PCIe link Tx NAK counts
          | zxmlPcieThroughputInfo_t:rx_nak(uint64) : PCIe link Rx NAK counts

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_throughtput = zxmlPcieThroughputInfo_t()

    fn = zxmlGetFunctionEntry("ZxmlGetPcieThroughput")

    ret = fn(c_dev_idx, byref(c_throughtput))
    zxmlError(ret)

    return c_throughtput

## ESL
def zxmlGetEslPortNum(idx):
    """
    Get device ESL port number

    parameters:
              idx (int): selected device index

    return:
          ESL port number in int

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_port_num = c_uint()

    fn = zxmlGetFunctionEntry("ZxmlGetEslPortNum")

    ret = fn(c_dev_idx, byref(c_port_num))
    zxmlError(ret)

    return c_port_num.value

def zxmlGetEslPortInfo(idx, port_id):
    """
    Get device ESL port info

    parameters:
              | idx (int): selected device index
              | port_id (int): selected ESL port ID

    return:
          | zxmlEslPortInfo_t:connected(c_uint) : port connected status
          | zxmlEslPortInfo_t:vendor_id(char [16]) : port vendor id
          | zxmlEslPortInfo_t:device_id(c_uint) : port device id
          | zxmlEslPortInfo_t:domain_id(c_uint) : port domain id
          | zxmlEslPortInfo_t:bus_id(char [16]) : port bus id
          | zxmlEslPortInfo_t:dev_id(c_uint) : port device id
          | zxmlEslPortInfo_t:func_id(c_uint) : port function id
          | zxmlEslPortInfo_t:port_id(c_uint) : port id
          | zxmlEslPortInfo_t:port_type(zxmlEslPortType_t) : port type
          | zxmlEslPortInfo_t:remote_card_id(c_uint) : remote port card id
          | zxmlEslPortInfo_t:remote_vendor_id(char [16]) :remote port vendor id
          | zxmlEslPortInfo_t:remote_device_id(c_uint) :remote port device id
          | zxmlEslPortInfo_t:remote_domain_id(c_uint) :remote port domain id
          | zxmlEslPortInfo_t:remote_bus_id(char [16]) :remote port bus id
          | zxmlEslPortInfo_t:remote_dev_id(c_uint) :remote port device id
          | zxmlEslPortInfo_t:remote_func_id(c_uint) :remote port function id
          | zxmlEslPortInfo_t:remote_port_id(c_uint) :remote port id
          | zxmlEslPortInfo_t:remote_port_type(zxmlEslPortType_t) :remote port type

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_port_id = c_uint(port_id)
    c_port_info = zxmlEslPortInfo_t()

    fn = zxmlGetFunctionEntry("ZxmlGetEslPortInfo")

    ret = fn(c_dev_idx, c_port_id, byref(c_port_info))
    zxmlError(ret)

    return c_port_info

def zxmlGetEslLinkInfo(idx, port_id):
    """
    Get device ESL port link info

    parameters:
              | idx (int): selected device index
              | port_id (int): selected ESL port ID

    return:
          | zxmlEslLinkInfo_t:link_speed(zxmlEslSpeed_t) : port link speed
          | zxmlEslLinkInfo_t:max_link_speed(zxmlEslSpeed_t) : port max supported link speed
          | zxmlEslLinkInfo_t:link_width(zxmlEslWidth_t) : port link width
          | zxmlEslLinkInfo_t:max_link_width(zxmlEslWidth_t) : port max supported link width

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_port_id = c_uint(port_id)
    c_link_info = zxmlEslLinkInfo_t()

    fn = zxmlGetFunctionEntry("ZxmlGetEslLinkInfo")

    ret = fn(c_dev_idx, c_port_id, byref(c_link_info))
    zxmlError(ret)

    return c_link_info

def zxmlGetEslThroughput(idx, port_id):
    """
    Get device ESL port throughput info

    parameters:
              | idx (int): selected device index
              | port_id (int): selected ESL port ID

    return:
          | zxmlEslThroughputInfo_t:tx_throughput(float) : port tx throughput
          | zxmlEslThroughputInfo_t:rx_throughput(float) : port rx throughput
          | zxmlEslThroughputInfo_t:tx_nak(uint64) : port tx total NAK counts
          | zxmlEslThroughputInfo_t:rx_nak(uint64) : port rx total NAK counts

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
          | ZXML_ERROR_ESL_PORT_NUMBER_ERR: ESL port number error
    """
    c_dev_idx = c_uint(idx)
    c_port_id = c_uint(port_id)
    c_throughput = zxmlEslThroughputInfo_t()

    fn = zxmlGetFunctionEntry("ZxmlGetEslThroughput")

    ret = fn(c_dev_idx, c_port_id, byref(c_throughput))
    zxmlError(ret)

    return c_throughput

def zxmlGetDevClusterCount(idx):
    """
    Get total DTU device cluster numbers in the dtu

    parameters:
              | idx (int): selected device index

    return:
          total device cluster numbers

    error:
          ZXML_ERROR_UNINITIALIZED: library not initialized
    """
    cnt = c_uint()
    c_dev_idx = c_uint(idx)
    fn = zxmlGetFunctionEntry("ZxmlGetClusterCount")
    ret = fn(c_dev_idx, byref(cnt))
    zxmlError(ret)
    return cnt.value

def zxmlGetDevClusterUsage(idx, cluster_idx):
    """
    Get DTU usage

    parameters:
              idx (int): selected device index

    return:
          DTU usage value in float

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_cluster_idx = c_uint(cluster_idx)
    c_cluster_usage = c_float()
    fn = zxmlGetFunctionEntry("ZxmlGetDevClusterUsage")
    ret = fn(c_dev_idx, c_cluster_idx, byref(c_cluster_usage))

    zxmlError(ret)
    return c_cluster_usage.value

def zxmlGetDevHealth(idx):
    """
    Get DTU usage

    parameters:
              idx (int): selected device index

    return:
          DTU usage value in float

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_dev_health = c_bool()
    fn = zxmlGetFunctionEntry("ZxmlGetDevHealth")
    ret = fn(c_dev_idx, byref(c_dev_health))

    zxmlError(ret)
    return c_dev_health.value

## vGCU numbers per GCU
def zxmlGetVdevCount(idx):
    """
    Get virtual GCU numbers in the GCU.

    parameters:
              idx (int): selected device index

    return:
          total virtual GCU per GCU.

    error:
          ZXML_ERROR_UNINITIALIZED: library not initialized
    """
    cnt = c_uint()
    c_dev_idx = c_uint(idx)
    fn = zxmlGetFunctionEntry("ZxmlGetVdevCount")
    ret = fn(c_dev_idx, byref(cnt))
    zxmlError(ret)
    return cnt.value

## vGCU memory info
def zxmlGetVdevDtuMem(idx, vdev_idx):
    """
    Get vGCU mem info.

    parameters:
              idx (int): selected device index
              vdev_idx (int): selected vGCU index

    return:
          | zxmlDevMemInfo_t:mem_total_size (c_uint): memory size
          | zxmlDevMemInfo_t:mem_used (c_uint): memory usage

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_vdev_idx = c_uint(vdev_idx)
    c_vdev_mem_info = zxmlDevMemInfo_t()
    fn = zxmlGetFunctionEntry("ZxmlGetVdevMem")
    ret = fn(c_dev_idx, c_vdev_idx, byref(c_vdev_mem_info))

    zxmlError(ret)
    return c_vdev_mem_info

## vGCU usage info
def zxmlGetVdevDtuUsage(idx, vdev_idx):
    """
    Get vGCU usage

    parameters:
              idx (int): selected device index
              vdev_idx (int): selected vGCU index

    return:
          vGCU usage value in float

    error:
          | ZXML_ERROR_UNINITIALIZED: library not initialized
          | ZXML_ERROR_INVALID_ARGUMENT: invalid input parameters
    """
    c_dev_idx = c_uint(idx)
    c_vdev_idx = c_uint(vdev_idx)
    c_vdev_usage = c_float()
    fn = zxmlGetFunctionEntry("ZxmlGetVdevDtuUsage")
    ret = fn(c_dev_idx, c_vdev_idx, byref(c_vdev_usage))

    zxmlError(ret)
    return c_vdev_usage.value