1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Intel Speed Select -- Enumerate and control features 4*4882a593Smuzhiyun * Copyright (c) 2019 Intel Corporation. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _ISST_H_ 8*4882a593Smuzhiyun #define _ISST_H_ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <stdio.h> 11*4882a593Smuzhiyun #include <unistd.h> 12*4882a593Smuzhiyun #include <sys/types.h> 13*4882a593Smuzhiyun #include <sched.h> 14*4882a593Smuzhiyun #include <sys/stat.h> 15*4882a593Smuzhiyun #include <sys/resource.h> 16*4882a593Smuzhiyun #include <getopt.h> 17*4882a593Smuzhiyun #include <err.h> 18*4882a593Smuzhiyun #include <fcntl.h> 19*4882a593Smuzhiyun #include <signal.h> 20*4882a593Smuzhiyun #include <sys/time.h> 21*4882a593Smuzhiyun #include <limits.h> 22*4882a593Smuzhiyun #include <stdlib.h> 23*4882a593Smuzhiyun #include <string.h> 24*4882a593Smuzhiyun #include <cpuid.h> 25*4882a593Smuzhiyun #include <dirent.h> 26*4882a593Smuzhiyun #include <errno.h> 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #include <stdarg.h> 29*4882a593Smuzhiyun #include <sys/ioctl.h> 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define BIT(x) (1 << (x)) 32*4882a593Smuzhiyun #define BIT_ULL(nr) (1ULL << (nr)) 33*4882a593Smuzhiyun #define GENMASK(h, l) (((~0UL) << (l)) & (~0UL >> (sizeof(long) * 8 - 1 - (h)))) 34*4882a593Smuzhiyun #define GENMASK_ULL(h, l) \ 35*4882a593Smuzhiyun (((~0ULL) << (l)) & (~0ULL >> (sizeof(long long) * 8 - 1 - (h)))) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define CONFIG_TDP 0x7f 38*4882a593Smuzhiyun #define CONFIG_TDP_GET_LEVELS_INFO 0x00 39*4882a593Smuzhiyun #define CONFIG_TDP_GET_TDP_CONTROL 0x01 40*4882a593Smuzhiyun #define CONFIG_TDP_SET_TDP_CONTROL 0x02 41*4882a593Smuzhiyun #define CONFIG_TDP_GET_TDP_INFO 0x03 42*4882a593Smuzhiyun #define CONFIG_TDP_GET_PWR_INFO 0x04 43*4882a593Smuzhiyun #define CONFIG_TDP_GET_TJMAX_INFO 0x05 44*4882a593Smuzhiyun #define CONFIG_TDP_GET_CORE_MASK 0x06 45*4882a593Smuzhiyun #define CONFIG_TDP_GET_TURBO_LIMIT_RATIOS 0x07 46*4882a593Smuzhiyun #define CONFIG_TDP_SET_LEVEL 0x08 47*4882a593Smuzhiyun #define CONFIG_TDP_GET_UNCORE_P0_P1_INFO 0X09 48*4882a593Smuzhiyun #define CONFIG_TDP_GET_P1_INFO 0x0a 49*4882a593Smuzhiyun #define CONFIG_TDP_GET_MEM_FREQ 0x0b 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define CONFIG_TDP_GET_FACT_HP_TURBO_LIMIT_NUMCORES 0x10 52*4882a593Smuzhiyun #define CONFIG_TDP_GET_FACT_HP_TURBO_LIMIT_RATIOS 0x11 53*4882a593Smuzhiyun #define CONFIG_TDP_GET_FACT_LP_CLIPPING_RATIO 0x12 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define CONFIG_TDP_PBF_GET_CORE_MASK_INFO 0x20 56*4882a593Smuzhiyun #define CONFIG_TDP_PBF_GET_P1HI_P1LO_INFO 0x21 57*4882a593Smuzhiyun #define CONFIG_TDP_PBF_GET_TJ_MAX_INFO 0x22 58*4882a593Smuzhiyun #define CONFIG_TDP_PBF_GET_TDP_INFO 0X23 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define CONFIG_CLOS 0xd0 61*4882a593Smuzhiyun #define CLOS_PQR_ASSOC 0x00 62*4882a593Smuzhiyun #define CLOS_PM_CLOS 0x01 63*4882a593Smuzhiyun #define CLOS_PM_QOS_CONFIG 0x02 64*4882a593Smuzhiyun #define CLOS_STATUS 0x03 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define MBOX_CMD_WRITE_BIT 0x08 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define PM_QOS_INFO_OFFSET 0x00 69*4882a593Smuzhiyun #define PM_QOS_CONFIG_OFFSET 0x04 70*4882a593Smuzhiyun #define PM_CLOS_OFFSET 0x08 71*4882a593Smuzhiyun #define PQR_ASSOC_OFFSET 0x20 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #define READ_PM_CONFIG 0x94 74*4882a593Smuzhiyun #define WRITE_PM_CONFIG 0x95 75*4882a593Smuzhiyun #define PM_FEATURE 0x03 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define DISP_FREQ_MULTIPLIER 100 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct isst_clos_config { 80*4882a593Smuzhiyun int pkg_id; 81*4882a593Smuzhiyun int die_id; 82*4882a593Smuzhiyun unsigned char epp; 83*4882a593Smuzhiyun unsigned char clos_prop_prio; 84*4882a593Smuzhiyun unsigned char clos_min; 85*4882a593Smuzhiyun unsigned char clos_max; 86*4882a593Smuzhiyun unsigned char clos_desired; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct isst_fact_bucket_info { 90*4882a593Smuzhiyun int high_priority_cores_count; 91*4882a593Smuzhiyun int sse_trl; 92*4882a593Smuzhiyun int avx_trl; 93*4882a593Smuzhiyun int avx512_trl; 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct isst_pbf_info { 97*4882a593Smuzhiyun int pbf_acticated; 98*4882a593Smuzhiyun int pbf_available; 99*4882a593Smuzhiyun size_t core_cpumask_size; 100*4882a593Smuzhiyun cpu_set_t *core_cpumask; 101*4882a593Smuzhiyun int p1_high; 102*4882a593Smuzhiyun int p1_low; 103*4882a593Smuzhiyun int t_control; 104*4882a593Smuzhiyun int t_prochot; 105*4882a593Smuzhiyun int tdp; 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define ISST_TRL_MAX_ACTIVE_CORES 8 109*4882a593Smuzhiyun #define ISST_FACT_MAX_BUCKETS 8 110*4882a593Smuzhiyun struct isst_fact_info { 111*4882a593Smuzhiyun int lp_clipping_ratio_license_sse; 112*4882a593Smuzhiyun int lp_clipping_ratio_license_avx2; 113*4882a593Smuzhiyun int lp_clipping_ratio_license_avx512; 114*4882a593Smuzhiyun struct isst_fact_bucket_info bucket_info[ISST_FACT_MAX_BUCKETS]; 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun struct isst_pkg_ctdp_level_info { 118*4882a593Smuzhiyun int processed; 119*4882a593Smuzhiyun int control_cpu; 120*4882a593Smuzhiyun int pkg_id; 121*4882a593Smuzhiyun int die_id; 122*4882a593Smuzhiyun int level; 123*4882a593Smuzhiyun int fact_support; 124*4882a593Smuzhiyun int pbf_support; 125*4882a593Smuzhiyun int fact_enabled; 126*4882a593Smuzhiyun int pbf_enabled; 127*4882a593Smuzhiyun int sst_cp_support; 128*4882a593Smuzhiyun int sst_cp_enabled; 129*4882a593Smuzhiyun int tdp_ratio; 130*4882a593Smuzhiyun int active; 131*4882a593Smuzhiyun int tdp_control; 132*4882a593Smuzhiyun int pkg_tdp; 133*4882a593Smuzhiyun int pkg_min_power; 134*4882a593Smuzhiyun int pkg_max_power; 135*4882a593Smuzhiyun int fact; 136*4882a593Smuzhiyun int t_proc_hot; 137*4882a593Smuzhiyun int uncore_p0; 138*4882a593Smuzhiyun int uncore_p1; 139*4882a593Smuzhiyun int sse_p1; 140*4882a593Smuzhiyun int avx2_p1; 141*4882a593Smuzhiyun int avx512_p1; 142*4882a593Smuzhiyun int mem_freq; 143*4882a593Smuzhiyun size_t core_cpumask_size; 144*4882a593Smuzhiyun cpu_set_t *core_cpumask; 145*4882a593Smuzhiyun int cpu_count; 146*4882a593Smuzhiyun unsigned long long buckets_info; 147*4882a593Smuzhiyun int trl_sse_active_cores[ISST_TRL_MAX_ACTIVE_CORES]; 148*4882a593Smuzhiyun int trl_avx_active_cores[ISST_TRL_MAX_ACTIVE_CORES]; 149*4882a593Smuzhiyun int trl_avx_512_active_cores[ISST_TRL_MAX_ACTIVE_CORES]; 150*4882a593Smuzhiyun int kobj_bucket_index; 151*4882a593Smuzhiyun int active_bucket; 152*4882a593Smuzhiyun int fact_max_index; 153*4882a593Smuzhiyun int fact_max_config; 154*4882a593Smuzhiyun int pbf_found; 155*4882a593Smuzhiyun int pbf_active; 156*4882a593Smuzhiyun struct isst_pbf_info pbf_info; 157*4882a593Smuzhiyun struct isst_fact_info fact_info; 158*4882a593Smuzhiyun }; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define ISST_MAX_TDP_LEVELS (4 + 1) /* +1 for base config */ 161*4882a593Smuzhiyun struct isst_pkg_ctdp { 162*4882a593Smuzhiyun int locked; 163*4882a593Smuzhiyun int version; 164*4882a593Smuzhiyun int processed; 165*4882a593Smuzhiyun int levels; 166*4882a593Smuzhiyun int current_level; 167*4882a593Smuzhiyun int enabled; 168*4882a593Smuzhiyun struct isst_pkg_ctdp_level_info ctdp_level[ISST_MAX_TDP_LEVELS]; 169*4882a593Smuzhiyun }; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun extern int get_topo_max_cpus(void); 172*4882a593Smuzhiyun extern int get_cpu_count(int pkg_id, int die_id); 173*4882a593Smuzhiyun extern int get_max_punit_core_id(int pkg_id, int die_id); 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* Common interfaces */ 176*4882a593Smuzhiyun FILE *get_output_file(void); 177*4882a593Smuzhiyun extern void debug_printf(const char *format, ...); 178*4882a593Smuzhiyun extern int out_format_is_json(void); 179*4882a593Smuzhiyun extern int get_physical_package_id(int cpu); 180*4882a593Smuzhiyun extern int get_physical_die_id(int cpu); 181*4882a593Smuzhiyun extern size_t alloc_cpu_set(cpu_set_t **cpu_set); 182*4882a593Smuzhiyun extern void free_cpu_set(cpu_set_t *cpu_set); 183*4882a593Smuzhiyun extern int find_logical_cpu(int pkg_id, int die_id, int phy_cpu); 184*4882a593Smuzhiyun extern int find_phy_cpu_num(int logical_cpu); 185*4882a593Smuzhiyun extern int find_phy_core_num(int logical_cpu); 186*4882a593Smuzhiyun extern void set_cpu_mask_from_punit_coremask(int cpu, 187*4882a593Smuzhiyun unsigned long long core_mask, 188*4882a593Smuzhiyun size_t core_cpumask_size, 189*4882a593Smuzhiyun cpu_set_t *core_cpumask, 190*4882a593Smuzhiyun int *cpu_cnt); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun extern int isst_send_mbox_command(unsigned int cpu, unsigned char command, 193*4882a593Smuzhiyun unsigned char sub_command, 194*4882a593Smuzhiyun unsigned int write, 195*4882a593Smuzhiyun unsigned int req_data, unsigned int *resp); 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun extern int isst_send_msr_command(unsigned int cpu, unsigned int command, 198*4882a593Smuzhiyun int write, unsigned long long *req_resp); 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun extern int isst_get_ctdp_levels(int cpu, struct isst_pkg_ctdp *pkg_dev); 201*4882a593Smuzhiyun extern int isst_get_ctdp_control(int cpu, int config_index, 202*4882a593Smuzhiyun struct isst_pkg_ctdp_level_info *ctdp_level); 203*4882a593Smuzhiyun extern int isst_get_coremask_info(int cpu, int config_index, 204*4882a593Smuzhiyun struct isst_pkg_ctdp_level_info *ctdp_level); 205*4882a593Smuzhiyun extern int isst_get_process_ctdp(int cpu, int tdp_level, 206*4882a593Smuzhiyun struct isst_pkg_ctdp *pkg_dev); 207*4882a593Smuzhiyun extern void isst_get_process_ctdp_complete(int cpu, 208*4882a593Smuzhiyun struct isst_pkg_ctdp *pkg_dev); 209*4882a593Smuzhiyun extern void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level, 210*4882a593Smuzhiyun struct isst_pkg_ctdp *pkg_dev); 211*4882a593Smuzhiyun extern void isst_ctdp_display_core_info(int cpu, FILE *outf, char *prefix, 212*4882a593Smuzhiyun unsigned int val, char *str0, char *str1); 213*4882a593Smuzhiyun extern void isst_ctdp_display_information_start(FILE *outf); 214*4882a593Smuzhiyun extern void isst_ctdp_display_information_end(FILE *outf); 215*4882a593Smuzhiyun extern void isst_pbf_display_information(int cpu, FILE *outf, int level, 216*4882a593Smuzhiyun struct isst_pbf_info *info); 217*4882a593Smuzhiyun extern int isst_set_tdp_level(int cpu, int tdp_level); 218*4882a593Smuzhiyun extern int isst_set_tdp_level_msr(int cpu, int tdp_level); 219*4882a593Smuzhiyun extern int isst_set_pbf_fact_status(int cpu, int pbf, int enable); 220*4882a593Smuzhiyun extern int isst_get_pbf_info(int cpu, int level, 221*4882a593Smuzhiyun struct isst_pbf_info *pbf_info); 222*4882a593Smuzhiyun extern void isst_get_pbf_info_complete(struct isst_pbf_info *pbf_info); 223*4882a593Smuzhiyun extern int isst_get_fact_info(int cpu, int level, int fact_bucket, 224*4882a593Smuzhiyun struct isst_fact_info *fact_info); 225*4882a593Smuzhiyun extern int isst_get_fact_bucket_info(int cpu, int level, 226*4882a593Smuzhiyun struct isst_fact_bucket_info *bucket_info); 227*4882a593Smuzhiyun extern void isst_fact_display_information(int cpu, FILE *outf, int level, 228*4882a593Smuzhiyun int fact_bucket, int fact_avx, 229*4882a593Smuzhiyun struct isst_fact_info *fact_info); 230*4882a593Smuzhiyun extern int isst_set_trl(int cpu, unsigned long long trl); 231*4882a593Smuzhiyun extern int isst_set_trl_from_current_tdp(int cpu, unsigned long long trl); 232*4882a593Smuzhiyun extern int isst_get_config_tdp_lock_status(int cpu); 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun extern int isst_pm_qos_config(int cpu, int enable_clos, int priority_type); 235*4882a593Smuzhiyun extern int isst_pm_get_clos(int cpu, int clos, 236*4882a593Smuzhiyun struct isst_clos_config *clos_config); 237*4882a593Smuzhiyun extern int isst_set_clos(int cpu, int clos, 238*4882a593Smuzhiyun struct isst_clos_config *clos_config); 239*4882a593Smuzhiyun extern int isst_clos_associate(int cpu, int clos); 240*4882a593Smuzhiyun extern int isst_clos_get_assoc_status(int cpu, int *clos_id); 241*4882a593Smuzhiyun extern void isst_clos_display_information(int cpu, FILE *outf, int clos, 242*4882a593Smuzhiyun struct isst_clos_config *clos_config); 243*4882a593Smuzhiyun extern void isst_clos_display_assoc_information(int cpu, FILE *outf, int clos); 244*4882a593Smuzhiyun extern int isst_read_reg(unsigned short reg, unsigned int *val); 245*4882a593Smuzhiyun extern int isst_write_reg(int reg, unsigned int val); 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun extern void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd, 248*4882a593Smuzhiyun int result); 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun extern int isst_clos_get_clos_information(int cpu, int *enable, int *type); 251*4882a593Smuzhiyun extern void isst_clos_display_clos_information(int cpu, FILE *outf, 252*4882a593Smuzhiyun int clos_enable, int type, 253*4882a593Smuzhiyun int state, int cap); 254*4882a593Smuzhiyun extern int is_clx_n_platform(void); 255*4882a593Smuzhiyun extern int get_cpufreq_base_freq(int cpu); 256*4882a593Smuzhiyun extern int isst_read_pm_config(int cpu, int *cp_state, int *cp_cap); 257*4882a593Smuzhiyun extern void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg); 258*4882a593Smuzhiyun #endif 259