1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/*
* BSD LICENSE
*
* Copyright(c) 2014-2026 Intel Corporation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/**
* @brief CPU sockets and cores enumeration module.
*/
#ifndef __PQOS_CPUINFO_H__
#define __PQOS_CPUINFO_H__
#include "pqos.h"
#include "types.h"
#include <errno.h>
#ifdef __cplusplus
extern "C" {
#endif
#define CPU_MODEL_SKX 0x55
#define CPU_MODEL_HSX 0x3f
#define CPU_FAMILY_06 0x06
/* No MBA 4.0 support family */
#define CPU_FAMILY_4F 0x4F
/* No MBA 4.0 support model */
#define CPU_MODEL_01 0x01
/**
* CPU vendor configuration value
*/
struct cpuinfo_config {
int cpuid_cache_leaf; /**< Cache mask leaf */
unsigned mba_max; /**< default memory bandwidth */
unsigned mba_default_val; /**< Memory bandwidth reset value */
uint32_t mba_msr_reg; /**< MBA mask base register */
uint32_t smba_msr_reg; /**< SMBA mask base register */
};
/**
* @brief Initializes CPU information module
*
* CPU topology detection method is OS dependent.
*
* @param[in] interface option, MSR or OS
* @param [out] topology place to store pointer to CPU topology data
*
* @return Operation status
* @retval 0 success
* @retval -EINVAL invalid argument
* @retval -EPERM cpuinfo already initialized
* @retval -EFAULT error building & discovering the topology
*/
PQOS_LOCAL int cpuinfo_init(enum pqos_interface interface,
struct pqos_cpuinfo **topology);
/**
* @brief Shuts down CPU information module
*
* @return Operation status
* @retval 0 success
* @retval -EPERM cpuinfo not initialized
*/
PQOS_LOCAL int cpuinfo_fini(void);
/**
* @brief Internal API to retrieve PQoS vendor specific data
*
* @param [out] config location to store PQoS vendor specific information at
*/
PQOS_LOCAL void cpuinfo_get_config(const struct cpuinfo_config **config);
/**
* @brief Helper function to get number of numa nodes in the system
*
* @param [in] cpu CPU topology structure
*
* @return Number of numa nodes in the system
* @retval 0 if not successful
*/
PQOS_LOCAL int cpuinfo_get_numa_num(const struct pqos_cpuinfo *cpu);
/**
* @brief Helper function to get number of sockets in the system
*
* @param [in] cpu CPU topology structure
*
* @return Number of sockets in the system
* @retval 0 if not successful
*/
PQOS_LOCAL int cpuinfo_get_socket_num(const struct pqos_cpuinfo *cpu);
/**
* @brief Detect cpu model
*
* @return detected cpu model
*/
uint32_t cpuinfo_get_cpu_model(void);
/**
* @brief Detect cpu family
*
* @return detected cpu family
*/
uint32_t cpuinfo_get_cpu_family(void);
#ifdef __cplusplus
}
#endif
#endif /* __PQOS_CPUINFO_H__ */
|