Commit | Line | Data |
---|---|---|
3fb4f7cd SP |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* | |
3 | * Intel Speed Select -- Enumerate and control features | |
4 | * Copyright (c) 2019 Intel Corporation. | |
5 | */ | |
6 | ||
7 | #ifndef _ISST_H_ | |
8 | #define _ISST_H_ | |
9 | ||
10 | #include <stdio.h> | |
11 | #include <unistd.h> | |
12 | #include <sys/types.h> | |
13 | #include <sched.h> | |
14 | #include <sys/stat.h> | |
15 | #include <sys/resource.h> | |
16 | #include <getopt.h> | |
17 | #include <err.h> | |
18 | #include <fcntl.h> | |
19 | #include <signal.h> | |
20 | #include <sys/time.h> | |
21 | #include <limits.h> | |
22 | #include <stdlib.h> | |
23 | #include <string.h> | |
24 | #include <cpuid.h> | |
25 | #include <dirent.h> | |
26 | #include <errno.h> | |
27 | ||
28 | #include <stdarg.h> | |
29 | #include <sys/ioctl.h> | |
30 | ||
7c7e7c0d ZR |
31 | #include <linux/isst_if.h> |
32 | ||
3fb4f7cd | 33 | #define BIT(x) (1 << (x)) |
873e391f | 34 | #define BIT_ULL(nr) (1ULL << (nr)) |
3fb4f7cd SP |
35 | #define GENMASK(h, l) (((~0UL) << (l)) & (~0UL >> (sizeof(long) * 8 - 1 - (h)))) |
36 | #define GENMASK_ULL(h, l) \ | |
37 | (((~0ULL) << (l)) & (~0ULL >> (sizeof(long long) * 8 - 1 - (h)))) | |
38 | ||
39 | #define CONFIG_TDP 0x7f | |
40 | #define CONFIG_TDP_GET_LEVELS_INFO 0x00 | |
41 | #define CONFIG_TDP_GET_TDP_CONTROL 0x01 | |
42 | #define CONFIG_TDP_SET_TDP_CONTROL 0x02 | |
43 | #define CONFIG_TDP_GET_TDP_INFO 0x03 | |
44 | #define CONFIG_TDP_GET_PWR_INFO 0x04 | |
45 | #define CONFIG_TDP_GET_TJMAX_INFO 0x05 | |
46 | #define CONFIG_TDP_GET_CORE_MASK 0x06 | |
47 | #define CONFIG_TDP_GET_TURBO_LIMIT_RATIOS 0x07 | |
48 | #define CONFIG_TDP_SET_LEVEL 0x08 | |
49 | #define CONFIG_TDP_GET_UNCORE_P0_P1_INFO 0X09 | |
50 | #define CONFIG_TDP_GET_P1_INFO 0x0a | |
51 | #define CONFIG_TDP_GET_MEM_FREQ 0x0b | |
0d5eea35 | 52 | #define CONFIG_TDP_GET_RATIO_INFO 0x0c |
3fb4f7cd SP |
53 | |
54 | #define CONFIG_TDP_GET_FACT_HP_TURBO_LIMIT_NUMCORES 0x10 | |
55 | #define CONFIG_TDP_GET_FACT_HP_TURBO_LIMIT_RATIOS 0x11 | |
56 | #define CONFIG_TDP_GET_FACT_LP_CLIPPING_RATIO 0x12 | |
57 | ||
58 | #define CONFIG_TDP_PBF_GET_CORE_MASK_INFO 0x20 | |
59 | #define CONFIG_TDP_PBF_GET_P1HI_P1LO_INFO 0x21 | |
60 | #define CONFIG_TDP_PBF_GET_TJ_MAX_INFO 0x22 | |
61 | #define CONFIG_TDP_PBF_GET_TDP_INFO 0X23 | |
62 | ||
63 | #define CONFIG_CLOS 0xd0 | |
64 | #define CLOS_PQR_ASSOC 0x00 | |
65 | #define CLOS_PM_CLOS 0x01 | |
66 | #define CLOS_PM_QOS_CONFIG 0x02 | |
67 | #define CLOS_STATUS 0x03 | |
68 | ||
69 | #define MBOX_CMD_WRITE_BIT 0x08 | |
70 | ||
71 | #define PM_QOS_INFO_OFFSET 0x00 | |
72 | #define PM_QOS_CONFIG_OFFSET 0x04 | |
73 | #define PM_CLOS_OFFSET 0x08 | |
74 | #define PQR_ASSOC_OFFSET 0x20 | |
75 | ||
645feeb2 SP |
76 | #define READ_PM_CONFIG 0x94 |
77 | #define WRITE_PM_CONFIG 0x95 | |
78 | #define PM_FEATURE 0x03 | |
79 | ||
062e4aac PB |
80 | #define DISP_FREQ_MULTIPLIER 100 |
81 | ||
06bbebdb | 82 | #define MAX_PACKAGE_COUNT 32 |
e157c847 ZR |
83 | #define MAX_DIE_PER_PACKAGE 2 |
84 | #define MAX_PUNIT_PER_DIE 8 | |
7fd786df | 85 | |
850337ec ZR |
86 | /* Unified structure to specific a CPU or a Power Domain */ |
87 | struct isst_id { | |
88 | int cpu; | |
32d6ab45 ZR |
89 | int pkg; |
90 | int die; | |
e157c847 | 91 | int punit; |
850337ec ZR |
92 | }; |
93 | ||
3fb4f7cd | 94 | struct isst_clos_config { |
20f06c9d ZR |
95 | unsigned int clos_min; |
96 | unsigned int clos_max; | |
3fb4f7cd SP |
97 | unsigned char epp; |
98 | unsigned char clos_prop_prio; | |
3fb4f7cd SP |
99 | unsigned char clos_desired; |
100 | }; | |
101 | ||
102 | struct isst_fact_bucket_info { | |
16c18920 ZR |
103 | int hp_cores; |
104 | int hp_ratios[TRL_MAX_LEVELS]; | |
3fb4f7cd SP |
105 | }; |
106 | ||
107 | struct isst_pbf_info { | |
108 | int pbf_acticated; | |
109 | int pbf_available; | |
110 | size_t core_cpumask_size; | |
111 | cpu_set_t *core_cpumask; | |
112 | int p1_high; | |
113 | int p1_low; | |
114 | int t_control; | |
115 | int t_prochot; | |
116 | int tdp; | |
117 | }; | |
118 | ||
119 | #define ISST_TRL_MAX_ACTIVE_CORES 8 | |
120 | #define ISST_FACT_MAX_BUCKETS 8 | |
121 | struct isst_fact_info { | |
16c18920 | 122 | int lp_ratios[TRL_MAX_LEVELS]; |
3fb4f7cd SP |
123 | struct isst_fact_bucket_info bucket_info[ISST_FACT_MAX_BUCKETS]; |
124 | }; | |
125 | ||
126 | struct isst_pkg_ctdp_level_info { | |
127 | int processed; | |
128 | int control_cpu; | |
129 | int pkg_id; | |
130 | int die_id; | |
131 | int level; | |
132 | int fact_support; | |
133 | int pbf_support; | |
134 | int fact_enabled; | |
135 | int pbf_enabled; | |
645feeb2 SP |
136 | int sst_cp_support; |
137 | int sst_cp_enabled; | |
3fb4f7cd SP |
138 | int tdp_ratio; |
139 | int active; | |
140 | int tdp_control; | |
141 | int pkg_tdp; | |
142 | int pkg_min_power; | |
143 | int pkg_max_power; | |
144 | int fact; | |
145 | int t_proc_hot; | |
79554aaa | 146 | int cooling_type; |
3fb4f7cd SP |
147 | int uncore_p0; |
148 | int uncore_p1; | |
0d5eea35 | 149 | int uncore_pm; |
3fb4f7cd SP |
150 | int sse_p1; |
151 | int avx2_p1; | |
152 | int avx512_p1; | |
79554aaa | 153 | int amx_p1; |
3fb4f7cd SP |
154 | int mem_freq; |
155 | size_t core_cpumask_size; | |
156 | cpu_set_t *core_cpumask; | |
157 | int cpu_count; | |
7c7e7c0d ZR |
158 | unsigned long long trl_cores; /* Buckets info */ |
159 | int trl_ratios[TRL_MAX_LEVELS][ISST_TRL_MAX_ACTIVE_CORES]; | |
3fb4f7cd SP |
160 | int kobj_bucket_index; |
161 | int active_bucket; | |
162 | int fact_max_index; | |
163 | int fact_max_config; | |
164 | int pbf_found; | |
165 | int pbf_active; | |
166 | struct isst_pbf_info pbf_info; | |
167 | struct isst_fact_info fact_info; | |
168 | }; | |
169 | ||
170 | #define ISST_MAX_TDP_LEVELS (4 + 1) /* +1 for base config */ | |
171 | struct isst_pkg_ctdp { | |
172 | int locked; | |
173 | int version; | |
174 | int processed; | |
175 | int levels; | |
176 | int current_level; | |
177 | int enabled; | |
178 | struct isst_pkg_ctdp_level_info ctdp_level[ISST_MAX_TDP_LEVELS]; | |
179 | }; | |
180 | ||
2042c0ab ZR |
181 | enum isst_platform_param { |
182 | ISST_PARAM_MBOX_DELAY, | |
183 | ISST_PARAM_MBOX_RETRIES, | |
184 | }; | |
185 | ||
d0d1a603 ZR |
186 | struct isst_platform_ops { |
187 | int (*get_disp_freq_multiplier)(void); | |
188 | int (*get_trl_max_levels)(void); | |
189 | char *(*get_trl_level_name)(int level); | |
05aab5b8 | 190 | void (*update_platform_param)(enum isst_platform_param param, int value); |
143584e8 | 191 | int (*is_punit_valid)(struct isst_id *id); |
8f54104f | 192 | int (*read_pm_config)(struct isst_id *id, int *cp_state, int *cp_cap); |
72438744 | 193 | int (*get_config_levels)(struct isst_id *id, struct isst_pkg_ctdp *pkg_ctdp); |
bbe32d87 | 194 | int (*get_ctdp_control)(struct isst_id *id, int config_index, struct isst_pkg_ctdp_level_info *ctdp_level); |
645b6605 | 195 | int (*get_tdp_info)(struct isst_id *id, int config_index, struct isst_pkg_ctdp_level_info *ctdp_level); |
e107dec9 | 196 | int (*get_pwr_info)(struct isst_id *id, int config_index, struct isst_pkg_ctdp_level_info *ctdp_level); |
668cc16c | 197 | int (*get_coremask_info)(struct isst_id *id, int config_index, struct isst_pkg_ctdp_level_info *ctdp_level); |
39f768c3 | 198 | int (*get_get_trl)(struct isst_id *id, int level, int avx_level, int *trl); |
4a17b291 | 199 | int (*get_get_trls)(struct isst_id *id, int level, struct isst_pkg_ctdp_level_info *ctdp_level); |
1e37f1b2 | 200 | int (*get_trl_bucket_info)(struct isst_id *id, int level, unsigned long long *buckets_info); |
f88c3c4b | 201 | int (*set_tdp_level)(struct isst_id *id, int tdp_level); |
7a196290 | 202 | int (*get_pbf_info)(struct isst_id *id, int level, struct isst_pbf_info *pbf_info); |
5843f217 | 203 | int (*set_pbf_fact_status)(struct isst_id *id, int pbf, int enable); |
7b5f586d | 204 | int (*get_fact_info)(struct isst_id *id, int level, int fact_bucket, struct isst_fact_info *fact_info); |
73452ccc | 205 | void (*adjust_uncore_freq)(struct isst_id *id, int config_index, struct isst_pkg_ctdp_level_info *ctdp_level); |
a07bdb81 | 206 | int (*get_clos_information)(struct isst_id *id, int *enable, int *type); |
904d2baa | 207 | int (*pm_qos_config)(struct isst_id *id, int enable_clos, int priority_type); |
43314e79 | 208 | int (*pm_get_clos)(struct isst_id *id, int clos, struct isst_clos_config *clos_config); |
33dbf360 | 209 | int (*set_clos)(struct isst_id *id, int clos, struct isst_clos_config *clos_config); |
b161bbad | 210 | int (*clos_get_assoc_status)(struct isst_id *id, int *clos_id); |
a59a6c0c | 211 | int (*clos_associate)(struct isst_id *id, int clos_id); |
d0d1a603 ZR |
212 | }; |
213 | ||
00bb07db | 214 | extern int is_cpu_in_power_domain(int cpu, struct isst_id *id); |
3fb4f7cd | 215 | extern int get_topo_max_cpus(void); |
30e0600e ZR |
216 | extern int get_cpu_count(struct isst_id *id); |
217 | extern int get_max_punit_core_id(struct isst_id *id); | |
887e5be9 | 218 | extern int api_version(void); |
3fb4f7cd SP |
219 | |
220 | /* Common interfaces */ | |
87e115b3 | 221 | FILE *get_output_file(void); |
9798768c | 222 | extern int is_debug_enabled(void); |
3fb4f7cd SP |
223 | extern void debug_printf(const char *format, ...); |
224 | extern int out_format_is_json(void); | |
850337ec | 225 | extern void set_isst_id(struct isst_id *id, int cpu); |
3fb4f7cd SP |
226 | extern size_t alloc_cpu_set(cpu_set_t **cpu_set); |
227 | extern void free_cpu_set(cpu_set_t *cpu_set); | |
3fb4f7cd | 228 | extern int find_phy_core_num(int logical_cpu); |
850337ec | 229 | extern void set_cpu_mask_from_punit_coremask(struct isst_id *id, |
3fb4f7cd SP |
230 | unsigned long long core_mask, |
231 | size_t core_cpumask_size, | |
232 | cpu_set_t *core_cpumask, | |
233 | int *cpu_cnt); | |
3fb4f7cd SP |
234 | extern int isst_send_msr_command(unsigned int cpu, unsigned int command, |
235 | int write, unsigned long long *req_resp); | |
236 | ||
05aab5b8 | 237 | extern int isst_set_platform_ops(int api_version); |
2042c0ab | 238 | extern void isst_update_platform_param(enum isst_platform_param, int vale); |
13b868f8 | 239 | extern int isst_get_disp_freq_multiplier(void); |
7c7e7c0d ZR |
240 | extern int isst_get_trl_max_levels(void); |
241 | extern char *isst_get_trl_level_name(int level); | |
57ef2436 | 242 | extern int isst_is_punit_valid(struct isst_id *id); |
7c7e7c0d | 243 | |
850337ec ZR |
244 | extern int isst_get_ctdp_levels(struct isst_id *id, struct isst_pkg_ctdp *pkg_dev); |
245 | extern int isst_get_ctdp_control(struct isst_id *id, int config_index, | |
1ba148ae | 246 | struct isst_pkg_ctdp_level_info *ctdp_level); |
850337ec | 247 | extern int isst_get_coremask_info(struct isst_id *id, int config_index, |
3c64c81a | 248 | struct isst_pkg_ctdp_level_info *ctdp_level); |
73452ccc | 249 | extern void isst_adjust_uncore_freq(struct isst_id *id, int config_index, |
0d5eea35 | 250 | struct isst_pkg_ctdp_level_info *ctdp_level); |
850337ec | 251 | extern int isst_get_process_ctdp(struct isst_id *id, int tdp_level, |
3fb4f7cd | 252 | struct isst_pkg_ctdp *pkg_dev); |
850337ec | 253 | extern void isst_get_process_ctdp_complete(struct isst_id *id, |
3fb4f7cd | 254 | struct isst_pkg_ctdp *pkg_dev); |
850337ec | 255 | extern void isst_ctdp_display_information(struct isst_id *id, FILE *outf, int tdp_level, |
3fb4f7cd | 256 | struct isst_pkg_ctdp *pkg_dev); |
850337ec | 257 | extern void isst_ctdp_display_core_info(struct isst_id *id, FILE *outf, char *prefix, |
3d1a8579 | 258 | unsigned int val, char *str0, char *str1); |
3fb4f7cd SP |
259 | extern void isst_ctdp_display_information_start(FILE *outf); |
260 | extern void isst_ctdp_display_information_end(FILE *outf); | |
850337ec | 261 | extern void isst_pbf_display_information(struct isst_id *id, FILE *outf, int level, |
3fb4f7cd | 262 | struct isst_pbf_info *info); |
850337ec ZR |
263 | extern int isst_set_tdp_level(struct isst_id *id, int tdp_level); |
264 | extern int isst_set_pbf_fact_status(struct isst_id *id, int pbf, int enable); | |
265 | extern int isst_get_pbf_info(struct isst_id *id, int level, | |
3fb4f7cd | 266 | struct isst_pbf_info *pbf_info); |
850337ec | 267 | extern int isst_get_fact_info(struct isst_id *id, int level, int fact_bucket, |
3fb4f7cd | 268 | struct isst_fact_info *fact_info); |
850337ec | 269 | extern void isst_fact_display_information(struct isst_id *id, FILE *outf, int level, |
3fb4f7cd SP |
270 | int fact_bucket, int fact_avx, |
271 | struct isst_fact_info *fact_info); | |
850337ec ZR |
272 | extern int isst_set_trl(struct isst_id *id, unsigned long long trl); |
273 | extern int isst_get_trl(struct isst_id *id, unsigned long long *trl); | |
274 | extern int isst_set_trl_from_current_tdp(struct isst_id *id, unsigned long long trl); | |
275 | extern int isst_get_config_tdp_lock_status(struct isst_id *id); | |
3fb4f7cd | 276 | |
850337ec ZR |
277 | extern int isst_pm_qos_config(struct isst_id *id, int enable_clos, int priority_type); |
278 | extern int isst_pm_get_clos(struct isst_id *id, int clos, | |
3fb4f7cd | 279 | struct isst_clos_config *clos_config); |
850337ec | 280 | extern int isst_set_clos(struct isst_id *id, int clos, |
3fb4f7cd | 281 | struct isst_clos_config *clos_config); |
850337ec ZR |
282 | extern int isst_clos_associate(struct isst_id *id, int clos); |
283 | extern int isst_clos_get_assoc_status(struct isst_id *id, int *clos_id); | |
284 | extern void isst_clos_display_information(struct isst_id *id, FILE *outf, int clos, | |
3fb4f7cd | 285 | struct isst_clos_config *clos_config); |
850337ec | 286 | extern void isst_clos_display_assoc_information(struct isst_id *id, FILE *outf, int clos); |
3fb4f7cd | 287 | |
850337ec | 288 | extern void isst_display_result(struct isst_id *id, FILE *outf, char *feature, char *cmd, |
3fb4f7cd | 289 | int result); |
188afed9 | 290 | |
850337ec ZR |
291 | extern int isst_clos_get_clos_information(struct isst_id *id, int *enable, int *type); |
292 | extern void isst_clos_display_clos_information(struct isst_id *id, FILE *outf, | |
143ad322 SP |
293 | int clos_enable, int type, |
294 | int state, int cap); | |
062e4aac | 295 | extern int is_clx_n_platform(void); |
7af5a95b | 296 | extern int get_cpufreq_base_freq(int cpu); |
850337ec | 297 | extern int isst_read_pm_config(struct isst_id *id, int *cp_state, int *cp_cap); |
87e115b3 | 298 | extern void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg); |
07f262d8 | 299 | extern int is_skx_based_platform(void); |
159f130f | 300 | extern int is_spr_platform(void); |
1d54b139 | 301 | extern int is_emr_platform(void); |
159f130f | 302 | extern int is_icx_platform(void); |
850337ec | 303 | extern void isst_trl_display_information(struct isst_id *id, FILE *outf, unsigned long long trl); |
7fd786df SP |
304 | |
305 | extern void set_cpu_online_offline(int cpu, int state); | |
c77a8d4a | 306 | extern void for_each_online_power_domain_in_set(void (*callback)(struct isst_id *, void *, void *, |
7fd786df SP |
307 | void *, void *), |
308 | void *arg1, void *arg2, void *arg3, | |
309 | void *arg4); | |
310 | extern int isst_daemon(int debug_mode, int poll_interval, int no_daemon); | |
850337ec | 311 | extern void process_level_change(struct isst_id *id); |
7d440da0 SP |
312 | extern int hfi_main(void); |
313 | extern void hfi_exit(void); | |
d0d1a603 ZR |
314 | |
315 | /* Interface specific callbacks */ | |
316 | extern struct isst_platform_ops *mbox_get_platform_ops(void); | |
79554aaa | 317 | extern struct isst_platform_ops *tpmi_get_platform_ops(void); |
d0d1a603 | 318 | |
997074df SP |
319 | /* Cgroup related interface */ |
320 | extern int enable_cpuset_controller(void); | |
3bc0f20a SP |
321 | extern int isolate_cpus(struct isst_id *id, int mask_size, cpu_set_t *cpu_mask, |
322 | int level, int cpu_0_only); | |
997074df SP |
323 | extern int use_cgroupv2(void); |
324 | ||
3fb4f7cd | 325 | #endif |