esmi library header changes

1. New processor types AMD_CPU_CORE, AMD_APU added to ENUM
2. esmi errorcodes, wrappers for structures and library APIs
3. Macro introduced to enable/disable the esmi library code

Change-Id: Ia64b29303c231d3f17ac6b40fcd09b09b4380903
This commit is contained in:
Deepak Mewar
2023-07-13 10:46:25 -04:00
gecommit door Galantsev, Dmitrii
bovenliggende e0b84c5d1f
commit 0187de61e2
2 gewijzigde bestanden met toevoegingen van 758 en 8 verwijderingen
+1
Bestand weergeven
@@ -95,6 +95,7 @@ set(SHR_MUTEX_DIR "${PROJECT_SOURCE_DIR}/third_party/shared_mutex")
if(ENABLE_ESMI_LIB)
if((EXISTS ${PROJECT_SOURCE_DIR}/e_smi_library/src) AND (EXISTS ${PROJECT_SOURCE_DIR}/e_smi_library/src/e_smi_plat.c))
set(ESMI_AVAILABLE TRUE)
add_definitions("-DENABLE_ESMI_LIB=1")
else()
message("E-smi source not found. Errors will be encountered during compilation!!!")
endif()
+757 -8
Bestand weergeven
@@ -53,6 +53,10 @@
#ifdef __cplusplus
extern "C" {
#include <cstdint>
#ifdef ENABLE_ESMI_LIB
#include <e_smi/e_smi.h>
#endif
#else
#include <stdint.h>
#endif // __cplusplus
@@ -122,16 +126,24 @@ typedef enum {
//! opaque handler point to underlying implementation
typedef void *amdsmi_processor_handle;
typedef void *amdsmi_socket_handle;
#ifdef ENABLE_ESMI_LIB
typedef void *amdsmi_cpusocket_handle;
#endif
/**
* @brief Device types detectable by AMD SMI
* @brief Processor types detectable by AMD SMI
* AMD_CPU - CPU Socket is a physical component that holds the CPU.
* AMD_CPU_CORE - CPU Cores are number of individual processing units within the CPU.
* AMD_APU - Combination of AMD_CPU and integrated GPU on single die
*/
typedef enum {
UNKNOWN = 0,
AMD_GPU,
AMD_CPU,
NON_AMD_GPU,
NON_AMD_CPU
NON_AMD_CPU,
AMD_CPU_CORE,
AMD_APU
} processor_type_t;
/**
@@ -171,6 +183,17 @@ typedef enum {
AMDSMI_STATUS_INSUFFICIENT_SIZE = 41, //!< Not enough resources were available for the operation
AMDSMI_STATUS_UNEXPECTED_SIZE = 42, //!< An unexpected amount of data was read
AMDSMI_STATUS_UNEXPECTED_DATA = 43, //!< The data read or provided to function is not what was expected
//esmi errors
AMDSMI_STATUS_NON_AMD_CPU = 44, //!< System has different cpu than AMD
AMDSMI_NO_ENERGY_DRV = 45, //!< Energy driver not found
AMDSMI_NO_MSR_DRV = 46, //!< MSR driver not found
AMDSMI_NO_HSMP_DRV = 47, //!< HSMP driver not found
AMDSMI_NO_HSMP_SUP = 48, //!< HSMP not supported
AMDSMI_NO_HSMP_MSG_SUP = 49, //!< HSMP message/feature not supported
AMDSMI_HSMP_TIMEOUT = 50, //!< HSMP message is timedout
AMDSMI_NO_DRV = 51, //!< No Energy and HSMP driver present
AMDSMI_FILE_NOT_FOUND = 52, //!< file or directory not found
AMDSMI_ARG_PTR_NULL = 53, //!< Parsed argument is invalid
// General errors
AMDSMI_STATUS_MAP_ERROR = 0xFFFFFFFE, //!< The internal library error did not map to a status code
AMDSMI_STATUS_UNKNOWN_ERROR = 0xFFFFFFFF, //!< An unknown error occurred
@@ -1099,6 +1122,76 @@ typedef struct {
//! but do have monitors or sensors.
#define AMDSMI_DEFAULT_VARIANT 0xFFFFFFFFFFFFFFFF
#ifdef ENABLE_ESMI_LIB
/**
* @brief This structure holds SMU Firmware version information.
*/
typedef struct {
uint8_t debug; //!< SMU fw Debug version number
uint8_t minor; //!< SMU fw Minor version number
uint8_t major; //!< SMU fw Major version number
uint8_t unused; //!< reserved fields
} amdsmi_smu_fw_version_t;
/**
* @brief DDR bandwidth metrics.
*/
typedef struct {
uint32_t max_bw; //!< DDR Maximum theoritical bandwidth in GB/s
uint32_t utilized_bw; //!< DDR bandwidth utilization in GB/s
uint32_t utilized_pct; //!< DDR bandwidth utilization in % of theoritical max
} amdsmi_ddr_bw_metrics_t;
/**
* @brief temperature range and refresh rate metrics of a DIMM
*/
typedef struct {
uint8_t range : 3; //!< temp range[2:0](3 bit data)
uint8_t ref_rate : 1; //!< DDR refresh rate mode[3](1 bit data)
} amdsmi_temp_range_refresh_rate_t;
/**
* @brief DIMM Power(mW), power update rate(ms) and dimm address
*/
typedef struct {
uint16_t power : 15; //!< Dimm power consumption[31:17](15 bits data)
uint16_t update_rate : 9; //!< Time since last update[16:8](9 bit data)
uint8_t dimm_addr; //!< Dimm address[7:0](8 bit data)
} amdsmi_dimm_power_t;
/**
* @brief DIMM temperature(°C) and update rate(ms) and dimm address
*/
typedef struct {
uint16_t sensor : 11; //!< Dimm thermal sensor[31:21](11 bit data)
uint16_t update_rate : 9; //!< Time since last update[16:8](9 bit data)
uint8_t dimm_addr; //!< Dimm address[7:0](8 bit data)
float temp; //!< temperature in degree celcius
} amdsmi_dimm_thermal_t;
/**
* @brief LINK name and Bandwidth type Information.It contains
* link names i.e valid link names are
* "P0", "P1", "P2", "P3", "P4", "G0", "G1", "G2", "G3", "G4"
* "G5", "G6", "G7"
* Valid bandwidth types 1(Aggregate_BW), 2 (Read BW), 4 (Write BW).
*/
typedef struct {
io_bw_encoding bw_type; //!< Bandwidth Type Information [1, 2, 4]
char *link_name; //!< Link name [P0, P1, G0, G1 etc]
} amdsmi_link_id_bw_type_t;
/**
* @brief max and min LCLK DPM level on a given NBIO ID.
* Valid max and min DPM level values are 0 - 1.
*/
typedef struct {
uint8_t max_dpm_level; //!< Max LCLK DPM level[15:8](8 bit data)
uint8_t min_dpm_level; //!< Min LCLK DPM level[7:0](8 bit data)
} amdsmi_dpm_level_t;
#endif
/*****************************************************************************/
/** @defgroup InitShutAdmin Initialization and Shutdown
* These functions are used for initialization of AMD SMI and clean up when done.
@@ -1108,7 +1201,7 @@ typedef struct {
/**
* @brief Initialize the AMD SMI library
*
* @details This function initializes the library and the internal data structures,
* @details This function initializes the library and the internal data structures,
* including those corresponding to sources of information that SMI provides.
*
* The @p init_flags decides which type of processor
@@ -1128,7 +1221,7 @@ amdsmi_status_t amdsmi_init(uint64_t init_flags);
/**
* @brief Shutdown the AMD SMI library
*
* @details This function shuts down the library and internal data structures and
* @details This function shuts down the library and internal data structures and
* performs any necessary clean ups.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
@@ -1172,10 +1265,39 @@ amdsmi_status_t amdsmi_shut_down(void);
amdsmi_status_t amdsmi_get_socket_handles(uint32_t *socket_count,
amdsmi_socket_handle* socket_handles);
#ifdef ENABLE_ESMI_LIB
/**
* @brief Get the list of cpu socket handles in the system.
*
* @details Depends on AMDSMI_INIT_AMD_CPUS flag passed to ::amdsmi_init.
* The socket handles can be used to query the processor handles in that socket, which
* will be used in other APIs to get processor detail information.
*
* @param[in,out] socket_count As input, the value passed
* through this parameter is the number of ::amdsmi_cpusocket_handle that
* may be safely written to the memory pointed to by @p socket_handles. This is the
* limit on how many socket handles will be written to @p socket_handles. On return, @p
* socket_count will contain the number of socket handles written to @p socket_handles,
* or the number of socket handles that could have been written if enough memory had been
* provided.
* If @p socket_handles is NULL, as output, @p socket_count will contain
* how many sockets are available to read in the system.
*
* @param[in,out] socket_handles A pointer to a block of memory to which the
* ::amdsmi_cpusocket_handle values will be written. This value may be NULL.
* In this case, this function can be used to query how many sockets are
* available to read in the system.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpusocket_handles(uint32_t *socket_count,
amdsmi_cpusocket_handle* socket_handles);
#endif
/**
* @brief Get information about the given socket
*
* @details This function retrieves socket information. The @p socket_handle must
* @details This function retrieves socket information. The @p socket_handle must
* be provided to retrieve the Socket ID.
*
* @param[in] socket_handle a socket handle
@@ -1190,6 +1312,22 @@ amdsmi_status_t amdsmi_get_socket_info(
amdsmi_socket_handle socket_handle,
size_t len, char *name);
#ifdef ENABLE_ESMI_LIB
/**
* @brief Get information about the given cpu socket
*
* @details This function retrieves cpu socket information. The @p socket_handle must
* be provided to retrieve the Socket ID.
*
* @param[in] socket_handle a socket handle
*
* @param[out] sockid The id of the socket.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpusocket_info(amdsmi_cpusocket_handle socket_handle, uint32_t sockid);
#endif
/**
* @brief Get the list of the processor handles associated to a socket.
*
@@ -1225,6 +1363,34 @@ amdsmi_status_t amdsmi_get_processor_handles(amdsmi_socket_handle socket_handle,
uint32_t *processor_count,
amdsmi_processor_handle* processor_handles);
#ifdef ENABLE_ESMI_LIB
/**
* @brief Get the list of the cpu core handles associated to a cpu socket.
*
* @details This function retrieves the cpu core handles of a cpu socket.
* @param[in] socket_handle The cpu socket to query
* @param[in,out] processor_count As input, the value passed
* through this parameter is the number of ::amdsmi_processor_handle's that
* may be safely written to the memory pointed to by @p processor_handles. This is the
* limit on how many processor handles will be written to @p processor_handles. On return, @p
* processor_count will contain the number of processor handles written to @p processor_handles,
* or the number of processor handles that could have been written if enough memory had been
* provided.
* If @p processor_handles is NULL, as output, @p processor_count will contain
* how many cpu cores are available to read for the cpu socket.
*
* @param[in,out] processor_handles A pointer to a block of memory to which the
* ::amdsmi_processor_handle values will be written. This value may be NULL.
* In this case, this function can be used to query how many processors are
* available to read.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpucore_handles(amdsmi_cpusocket_handle socket_handle,
uint32_t *processor_count,
amdsmi_processor_handle* processor_handles);
#endif
/**
* @brief Get the processor type of the processor_handle
*
@@ -1729,7 +1895,7 @@ amdsmi_get_gpu_memory_usage(amdsmi_processor_handle processor_handle, amdsmi_mem
* records.
* @param[in] processor_handle a processor handle
* @param[out] num_pages Number of bad page records.
* @param[out] info The results will be written to the
* @param[out] info The results will be written to the
* amdsmi_retired_page_record_t pointer.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
@@ -2063,7 +2229,7 @@ amdsmi_status_t amdsmi_get_pcie_link_caps(amdsmi_processor_handle processor_hand
*
* @details This function will write the ::amdsmi_dev_perf_level_t to the uint32_t
* pointed to by @p perf, for a given processor handle @p processor_handle and a pointer
* to a uint32_t @p perf.
* to a uint32_t @p perf.
*
* @param[in] processor_handle a processor handle
*
@@ -3227,7 +3393,7 @@ amdsmi_get_gpu_driver_info(amdsmi_processor_handle processor_handle, amdsmi_driv
/**
* @brief Returns the ASIC information for the device
*
*
* @details This function returns ASIC information such as the product name,
* the vendor ID, the subvendor ID, the device ID,
* the revision ID and the serial number.
@@ -3461,6 +3627,589 @@ amdsmi_get_gpu_total_ecc_count(amdsmi_processor_handle processor_handle, amdsmi_
/** @} End eccinfo */
#ifdef ENABLE_ESMI_LIB
/*---------------------------------------------------------------------------*/
/** @defgroup energyinfo Energy information (RAPL MSR) */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get the core energy for a given core.
*
* @param[in] processor_handle Cpu core which to query
* @param[in] core_ind - cpu core index
*
* @param[in,out] penergy - Input buffer to return the core energy
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_core_energy(amdsmi_processor_handle processor_handle,
uint32_t core_ind, uint64_t *penergy);
/**
* @brief Get the socket energy for a given socket.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] penergy - Input buffer to return the socket energy
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_energy(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint64_t *penergy);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup systemstatistics HSMP system statistics */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get SMU Firmware Version.
*
* @param[in,out] amdsmi_smu_fw - Input buffer to return the firmware version
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_smu_fw_version(amdsmi_smu_fw_version_t *amdsmi_smu_fw);
/**
* @brief Get HSMP protocol Version.
*
* @param[in,out] proto_ver - Input buffer to return the protocol version
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_hsmp_proto_ver(uint32_t *proto_ver);
/**
* @brief Get normalized status of the processor's PROCHOT status.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] prochot - Input buffer to return the procohot status.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_prochot_status(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *prochot);
/**
* @brief Get Data fabric clock and Memory clock in MHz.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] fclk - Input buffer to return fclk
*
* @param[in,out] mclk - Input buffer to return mclk
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_fclk_mclk(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *fclk, uint32_t *mclk);
/**
* @brief Get core clock in MHz.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] cclk - Input buffer to return core clock
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_cclk_limit(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *cclk);
/**
* @brief Get current active frequency limit of the socket.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] freq - Input buffer to return frequency value in MHz
*
* @param[in,out] src_type - Input buffer to return frequency source name
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_current_active_freq_limit(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint16_t *freq, char **src_type);
/**
* @brief Get socket frequency range.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] fmax - Input buffer to return maximum frequency
*
* @param[in,out] fmin - Input buffer to return minimum frequency
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_freq_range(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint16_t *fmax, uint16_t *fmin);
/**
* @brief Get socket frequency limit of the core.
*
* @param[in] processor_handle Cpu core which to query
* @param[in] core_ind - core index
*
* @param[in,out] freq - Input buffer to return frequency.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_core_current_freq_limit(amdsmi_processor_handle processor_handle,
uint32_t core_ind, uint32_t *freq);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup powercont Power Control */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get the socket power.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] ppower - Input buffer to return socket power
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_power(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *ppower);
/**
* @brief Get the socket power cap.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] pcap - Input buffer to return power cap.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_power_cap(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *pcap);
/**
* @brief Get the maximum power cap value for a given socket.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] pmax - Input buffer to return maximum power limit value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_power_cap_max(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *pmax);
/**
* @brief Get the SVI based power telemetry for all rails.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] power - Input buffer to return svi based power value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_pwr_svi_telemetry_all_rails(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *power);
/**
* @brief Set the power cap value for a given socket.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in] power - Input power limit value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_socket_power_cap(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t pcap);
/**
* @brief Set the power efficiency profile policy.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in] mode - mode to be set
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_pwr_efficiency_mode(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, uint8_t mode);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup perfcont Performance (Boost limit) Control */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get the core boost limit.
*
* @param[in] processor_handle Cpu core which to query
* @param[in] core_ind - core index
*
* @param[in,out] pboostlimit - Input buffer to fill the boostlimit value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_core_boostlimit(amdsmi_processor_handle processor_handle,
uint32_t core_ind, uint32_t *pboostlimit);
/**
* @brief Get the socket c0 residency.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] pc0_residency - Input buffer to fill the c0 residency value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_c0_residency(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *pc0_residency);
/**
* @brief Set the core boostlimit value.
*
* @param[in] processor_handle Cpu core which to query
* @param[in] core_ind - core index
*
* @param[in] boostlimit - boostlimit value to be set
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_core_boostlimit(amdsmi_processor_handle processor_handle,
uint32_t core_ind, uint32_t boostlimit);
/**
* @brief Set the socket boostlimit value.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in] boostlimit - boostlimit value to be set
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_socket_boostlimit(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t boostlimit);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup ddrquer DDR bandwidth monitor */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get the DDR bandwidth data.
*
* @param[in,out] ddr_bw - Input buffer to fill ddr bandwidth data
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_ddr_bw(amdsmi_ddr_bw_metrics_t *ddr_bw);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup tempquer Temperature Query */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get socket temperature.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in,out] ptmon - Input buffer to fill temperature value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_temperature(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint32_t *ptmon);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup dimmstatistics Dimm statistics */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get DIMM temperature range and refresh rate.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] dimm_addr - DIMM address
* @param[in,out] rate - Input buffer to fill temperature range and refresh rate value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_dimm_temp_range_and_refresh_rate(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, uint8_t dimm_addr, amdsmi_temp_range_refresh_rate_t *rate);
/**
* @brief Get DIMM power consumption.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] dimm_addr - DIMM address
* @param[in,out] rate - Input buffer to fill power consumption value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_dimm_power_consumption(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, uint8_t dimm_addr, amdsmi_dimm_power_t *dimm_pow);
/**
* @brief Get DIMM thermal sensor value.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] dimm_addr - DIMM address
* @param[in,out] dimm_temp - Input buffer to fill temperature value
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_dimm_thermal_sensor(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, uint8_t dimm_addr, amdsmi_dimm_thermal_t *dimm_temp);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup xgmibwcont xGMI bandwidth control */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Set xgmi width.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] min - Minimum xgmi width to be set
* @param[in] max - maximum xgmi width to be set
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_xgmi_width(amdsmi_cpusocket_handle socket_handle,
uint8_t min, uint8_t max);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup gmi3widthcont GMI3 width control */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Set gmi3 link width range.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] min_link_width - minimum link width to be set.
* @param[in] max_link_width - maximum link width to be set.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_gmi3_link_width_range(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, uint8_t min_link_width, uint8_t max_link_width);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup pstatecnt Pstate selection */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Enable APB.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_cpu_apb_enable(amdsmi_cpusocket_handle socket_handle, uint32_t sock_ind);
/**
* @brief Disable APB.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
*
* @param[in] pstate - pstate value to be set
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_cpu_apb_disable(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint8_t pstate);
/**
* @brief Set NBIO lclk dpm level value.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] nbio_id - nbio index
* @param[in] min - minimum value to be set
* @param[in] max - maximum value to be set
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_socket_lclk_dpm_level(amdsmi_cpusocket_handle socket_handle,
uint32_t sock_ind, uint8_t nbio_id, uint8_t min, uint8_t max);
/**
* @brief Get NBIO LCLK dpm level.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] nbio_id - nbio index
* @param[in,out] nbio - Input buffer to fill lclk dpm level
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_socket_lclk_dpm_level(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, uint8_t nbio_id, amdsmi_dpm_level_t *nbio);
/**
* @brief Set pcie link rate.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] rate_ctrl - rate control value to be set.
* @param[in,out] prev_mode - Input buffer to fill previous rate control value.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_pcie_link_rate(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, uint8_t rate_ctrl, uint8_t *prev_mode);
/**
* @brief Set df pstate range.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] max_pstate - maximum pstate value to be set
* @param[in] min_pstate - minimum pstate value to be set
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_set_cpu_df_pstate_range(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, uint8_t max_pstate, uint8_t min_pstate);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup bwquer Bandwidth monitor */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get current input output bandwidth.
*
* @param[in] socket_handle Cpu socket which to query
* @param[in] sock_ind - socket index
* @param[in] link - link id and bw type to which io bandwidth to be obtained
* @param[in,out] io_bw - Input buffer to fill bandwidth data
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_current_io_bandwidth(amdsmi_cpusocket_handle socket_handle,
uint8_t sock_ind, amdsmi_link_id_bw_type_t link, uint32_t *io_bw);
/**
* @brief Get current input output bandwidth.
*
* @param[in] link - link id and bw type to which xgmi bandwidth to be obtained
* @param[in,out] xgmi_bw - Input buffer to fill bandwidth data
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_current_xgmi_bw(amdsmi_link_id_bw_type_t link, uint32_t *xgmi_bw);
/** @} */
/*---------------------------------------------------------------------------*/
/** @defgroup auxiquer Auxillary functions */
/*---------------------------------------------------------------------------*/
/** @{ */
/**
* @brief Get cpu family.
*
* @param[in,out] family - Input buffer to fill family
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_family(uint32_t family);
/**
* @brief Get cpu model.
*
* @param[in,out] family - Input buffer to fill family
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_model(uint32_t model);
/**
* @brief Get threads per core.
*
* @param[in,out] threads - Input buffer to fill threads count.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_cpu_threads_per_core(uint32_t threads);
/**
* @brief Get number of cpus.
*
* @param[in,out] cpus - Input buffer to fill number of cpus.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_number_of_cpu_cores(uint32_t cpus);
/**
* @brief Get number of sockets
*
* @param[in,out] sockets - Input buffer to fill number of sockets.
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_get_number_of_cpu_sockets(uint32_t sockets);
/**
* @brief Get first online core on socket.
*
* @param[in] sock_ind - socket index.
*
* @param[in,out] sockets - Input buffer to fill first online core on socket data
*
* @return ::amdsmi_status_t | ::AMDSMI_STATUS_SUCCESS on success, non-zero on fail
*/
amdsmi_status_t amdsmi_first_online_core_on_cpu_socket(uint32_t sock_ind, uint32_t *pcore_ind);
#endif
/** @} */
#ifdef __cplusplus
}
#endif // __cplusplus