Loading...
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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | /* SPDX-License-Identifier: GPL-2.0 */ /* * Intel Speed Select -- Enumerate and control features * Copyright (c) 2019 Intel Corporation. */ #ifndef _ISST_H_ #define _ISST_H_ #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sched.h> #include <sys/stat.h> #include <sys/resource.h> #include <getopt.h> #include <err.h> #include <fcntl.h> #include <signal.h> #include <sys/time.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <cpuid.h> #include <dirent.h> #include <errno.h> #include <stdarg.h> #include <sys/ioctl.h> #define BIT(x) (1 << (x)) #define BIT_ULL(nr) (1ULL << (nr)) #define GENMASK(h, l) (((~0UL) << (l)) & (~0UL >> (sizeof(long) * 8 - 1 - (h)))) #define GENMASK_ULL(h, l) \ (((~0ULL) << (l)) & (~0ULL >> (sizeof(long long) * 8 - 1 - (h)))) #define CONFIG_TDP 0x7f #define CONFIG_TDP_GET_LEVELS_INFO 0x00 #define CONFIG_TDP_GET_TDP_CONTROL 0x01 #define CONFIG_TDP_SET_TDP_CONTROL 0x02 #define CONFIG_TDP_GET_TDP_INFO 0x03 #define CONFIG_TDP_GET_PWR_INFO 0x04 #define CONFIG_TDP_GET_TJMAX_INFO 0x05 #define CONFIG_TDP_GET_CORE_MASK 0x06 #define CONFIG_TDP_GET_TURBO_LIMIT_RATIOS 0x07 #define CONFIG_TDP_SET_LEVEL 0x08 #define CONFIG_TDP_GET_UNCORE_P0_P1_INFO 0X09 #define CONFIG_TDP_GET_P1_INFO 0x0a #define CONFIG_TDP_GET_MEM_FREQ 0x0b #define CONFIG_TDP_GET_FACT_HP_TURBO_LIMIT_NUMCORES 0x10 #define CONFIG_TDP_GET_FACT_HP_TURBO_LIMIT_RATIOS 0x11 #define CONFIG_TDP_GET_FACT_LP_CLIPPING_RATIO 0x12 #define CONFIG_TDP_PBF_GET_CORE_MASK_INFO 0x20 #define CONFIG_TDP_PBF_GET_P1HI_P1LO_INFO 0x21 #define CONFIG_TDP_PBF_GET_TJ_MAX_INFO 0x22 #define CONFIG_TDP_PBF_GET_TDP_INFO 0X23 #define CONFIG_CLOS 0xd0 #define CLOS_PQR_ASSOC 0x00 #define CLOS_PM_CLOS 0x01 #define CLOS_PM_QOS_CONFIG 0x02 #define CLOS_STATUS 0x03 #define MBOX_CMD_WRITE_BIT 0x08 #define PM_QOS_INFO_OFFSET 0x00 #define PM_QOS_CONFIG_OFFSET 0x04 #define PM_CLOS_OFFSET 0x08 #define PQR_ASSOC_OFFSET 0x20 #define READ_PM_CONFIG 0x94 #define WRITE_PM_CONFIG 0x95 #define PM_FEATURE 0x03 #define DISP_FREQ_MULTIPLIER 100 #define MAX_PACKAGE_COUNT 8 #define MAX_DIE_PER_PACKAGE 2 /* Unified structure to specific a CPU or a Power Domain */ struct isst_id { int cpu; int pkg; int die; }; struct isst_clos_config { unsigned char epp; unsigned char clos_prop_prio; unsigned char clos_min; unsigned char clos_max; unsigned char clos_desired; }; struct isst_fact_bucket_info { int high_priority_cores_count; int sse_trl; int avx_trl; int avx512_trl; }; struct isst_pbf_info { int pbf_acticated; int pbf_available; size_t core_cpumask_size; cpu_set_t *core_cpumask; int p1_high; int p1_low; int t_control; int t_prochot; int tdp; }; #define ISST_TRL_MAX_ACTIVE_CORES 8 #define ISST_FACT_MAX_BUCKETS 8 struct isst_fact_info { int lp_clipping_ratio_license_sse; int lp_clipping_ratio_license_avx2; int lp_clipping_ratio_license_avx512; struct isst_fact_bucket_info bucket_info[ISST_FACT_MAX_BUCKETS]; }; struct isst_pkg_ctdp_level_info { int processed; int control_cpu; int pkg_id; int die_id; int level; int fact_support; int pbf_support; int fact_enabled; int pbf_enabled; int sst_cp_support; int sst_cp_enabled; int tdp_ratio; int active; int tdp_control; int pkg_tdp; int pkg_min_power; int pkg_max_power; int fact; int t_proc_hot; int uncore_p0; int uncore_p1; int sse_p1; int avx2_p1; int avx512_p1; int mem_freq; size_t core_cpumask_size; cpu_set_t *core_cpumask; int cpu_count; unsigned long long buckets_info; int trl_sse_active_cores[ISST_TRL_MAX_ACTIVE_CORES]; int trl_avx_active_cores[ISST_TRL_MAX_ACTIVE_CORES]; int trl_avx_512_active_cores[ISST_TRL_MAX_ACTIVE_CORES]; int kobj_bucket_index; int active_bucket; int fact_max_index; int fact_max_config; int pbf_found; int pbf_active; struct isst_pbf_info pbf_info; struct isst_fact_info fact_info; }; #define ISST_MAX_TDP_LEVELS (4 + 1) /* +1 for base config */ struct isst_pkg_ctdp { int locked; int version; int processed; int levels; int current_level; int enabled; struct isst_pkg_ctdp_level_info ctdp_level[ISST_MAX_TDP_LEVELS]; }; extern int is_cpu_in_power_domain(int cpu, struct isst_id *id); extern int get_topo_max_cpus(void); extern int get_cpu_count(struct isst_id *id); extern int get_max_punit_core_id(struct isst_id *id); /* Common interfaces */ FILE *get_output_file(void); extern void debug_printf(const char *format, ...); extern int out_format_is_json(void); extern void set_isst_id(struct isst_id *id, int cpu); extern size_t alloc_cpu_set(cpu_set_t **cpu_set); extern void free_cpu_set(cpu_set_t *cpu_set); extern int find_phy_core_num(int logical_cpu); extern void set_cpu_mask_from_punit_coremask(struct isst_id *id, unsigned long long core_mask, size_t core_cpumask_size, cpu_set_t *core_cpumask, int *cpu_cnt); extern int isst_send_mbox_command(unsigned int cpu, unsigned char command, unsigned char sub_command, unsigned int write, unsigned int req_data, unsigned int *resp); extern int isst_send_msr_command(unsigned int cpu, unsigned int command, int write, unsigned long long *req_resp); extern int isst_get_ctdp_levels(struct isst_id *id, struct isst_pkg_ctdp *pkg_dev); extern int isst_get_ctdp_control(struct isst_id *id, int config_index, struct isst_pkg_ctdp_level_info *ctdp_level); extern int isst_get_coremask_info(struct isst_id *id, int config_index, struct isst_pkg_ctdp_level_info *ctdp_level); extern int isst_get_process_ctdp(struct isst_id *id, int tdp_level, struct isst_pkg_ctdp *pkg_dev); extern void isst_get_process_ctdp_complete(struct isst_id *id, struct isst_pkg_ctdp *pkg_dev); extern void isst_ctdp_display_information(struct isst_id *id, FILE *outf, int tdp_level, struct isst_pkg_ctdp *pkg_dev); extern void isst_ctdp_display_core_info(struct isst_id *id, FILE *outf, char *prefix, unsigned int val, char *str0, char *str1); extern void isst_ctdp_display_information_start(FILE *outf); extern void isst_ctdp_display_information_end(FILE *outf); extern void isst_pbf_display_information(struct isst_id *id, FILE *outf, int level, struct isst_pbf_info *info); extern int isst_set_tdp_level(struct isst_id *id, int tdp_level); extern int isst_set_pbf_fact_status(struct isst_id *id, int pbf, int enable); extern int isst_get_pbf_info(struct isst_id *id, int level, struct isst_pbf_info *pbf_info); extern void isst_get_pbf_info_complete(struct isst_pbf_info *pbf_info); extern int isst_get_fact_info(struct isst_id *id, int level, int fact_bucket, struct isst_fact_info *fact_info); extern int isst_get_fact_bucket_info(struct isst_id *id, int level, struct isst_fact_bucket_info *bucket_info); extern void isst_fact_display_information(struct isst_id *id, FILE *outf, int level, int fact_bucket, int fact_avx, struct isst_fact_info *fact_info); extern int isst_set_trl(struct isst_id *id, unsigned long long trl); extern int isst_get_trl(struct isst_id *id, unsigned long long *trl); extern int isst_set_trl_from_current_tdp(struct isst_id *id, unsigned long long trl); extern int isst_get_config_tdp_lock_status(struct isst_id *id); extern int isst_pm_qos_config(struct isst_id *id, int enable_clos, int priority_type); extern int isst_pm_get_clos(struct isst_id *id, int clos, struct isst_clos_config *clos_config); extern int isst_set_clos(struct isst_id *id, int clos, struct isst_clos_config *clos_config); extern int isst_clos_associate(struct isst_id *id, int clos); extern int isst_clos_get_assoc_status(struct isst_id *id, int *clos_id); extern void isst_clos_display_information(struct isst_id *id, FILE *outf, int clos, struct isst_clos_config *clos_config); extern void isst_clos_display_assoc_information(struct isst_id *id, FILE *outf, int clos); extern void isst_display_result(struct isst_id *id, FILE *outf, char *feature, char *cmd, int result); extern int isst_clos_get_clos_information(struct isst_id *id, int *enable, int *type); extern void isst_clos_display_clos_information(struct isst_id *id, FILE *outf, int clos_enable, int type, int state, int cap); extern int is_clx_n_platform(void); extern int get_cpufreq_base_freq(int cpu); extern int isst_read_pm_config(struct isst_id *id, int *cp_state, int *cp_cap); extern void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg); extern int is_skx_based_platform(void); extern int is_spr_platform(void); extern int is_icx_platform(void); extern void isst_trl_display_information(struct isst_id *id, FILE *outf, unsigned long long trl); extern void set_cpu_online_offline(int cpu, int state); extern void for_each_online_package_in_set(void (*callback)(struct isst_id *, void *, void *, void *, void *), void *arg1, void *arg2, void *arg3, void *arg4); extern int isst_daemon(int debug_mode, int poll_interval, int no_daemon); extern void process_level_change(struct isst_id *id); extern int hfi_main(void); extern void hfi_exit(void); #endif |