1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * CPPC (Collaborative Processor Performance Control) methods used 4 * by CPUfreq drivers. 5 * 6 * (C) Copyright 2014, 2015 Linaro Ltd. 7 * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org> 8 */ 9 10 #ifndef _CPPC_ACPI_H 11 #define _CPPC_ACPI_H 12 13 #include <linux/acpi.h> 14 #include <linux/cpufreq.h> 15 #include <linux/types.h> 16 17 #include <acpi/pcc.h> 18 #include <acpi/processor.h> 19 20 /* CPPCv2, CPPCv3 and CPPCv4 support */ 21 #define CPPC_V2_REV 2 22 #define CPPC_V3_REV 3 23 #define CPPC_V4_REV 4 24 #define CPPC_V2_NUM_ENT 21 25 #define CPPC_V3_NUM_ENT 23 26 #define CPPC_V4_NUM_ENT 25 27 28 #define PCC_CMD_COMPLETE_MASK (1 << 0) 29 #define PCC_ERROR_MASK (1 << 2) 30 31 #define MAX_CPC_REG_ENT 23 32 33 /* CPPC specific PCC commands. */ 34 #define CMD_READ 0 35 #define CMD_WRITE 1 36 37 #define CPPC_AUTO_ACT_WINDOW_SIG_BIT_SIZE (7) 38 #define CPPC_AUTO_ACT_WINDOW_EXP_BIT_SIZE (3) 39 #define CPPC_AUTO_ACT_WINDOW_MAX_SIG ((1 << CPPC_AUTO_ACT_WINDOW_SIG_BIT_SIZE) - 1) 40 #define CPPC_AUTO_ACT_WINDOW_MAX_EXP ((1 << CPPC_AUTO_ACT_WINDOW_EXP_BIT_SIZE) - 1) 41 /* CPPC_AUTO_ACT_WINDOW_MAX_SIG is 127, so 128 and 129 will decay to 127 when writing */ 42 #define CPPC_AUTO_ACT_WINDOW_SIG_CARRY_THRESH 129 43 44 #define CPPC_EPP_PERFORMANCE_PREF 0x00 45 #define CPPC_EPP_ENERGY_EFFICIENCY_PREF 0xFF 46 47 #define CPPC_PERF_LIMITED_DESIRED_EXCURSION BIT(0) 48 #define CPPC_PERF_LIMITED_MINIMUM_EXCURSION BIT(1) 49 #define CPPC_PERF_LIMITED_MASK (CPPC_PERF_LIMITED_DESIRED_EXCURSION | \ 50 CPPC_PERF_LIMITED_MINIMUM_EXCURSION) 51 52 /* Each register has the folowing format. */ 53 struct cpc_reg { 54 u8 descriptor; 55 u16 length; 56 u8 space_id; 57 u8 bit_width; 58 u8 bit_offset; 59 u8 access_width; 60 u64 address; 61 } __packed; 62 63 /* 64 * Each entry in the CPC table is either 65 * of type ACPI_TYPE_BUFFER or 66 * ACPI_TYPE_INTEGER. 67 */ 68 struct cpc_register_resource { 69 acpi_object_type type; 70 u64 __iomem *sys_mem_vaddr; 71 union { 72 struct { 73 struct cpc_reg reg; 74 bool use_rmw_lock; 75 }; 76 u64 int_value; 77 } cpc_entry; 78 }; 79 80 /* Container to hold the CPC details for each CPU */ 81 struct cpc_desc { 82 int num_entries; 83 int version; 84 int cpu_id; 85 int write_cmd_status; 86 int write_cmd_id; 87 /* Lock used for RMW operations in cpc_write() */ 88 raw_spinlock_t rmw_lock; 89 struct cpc_register_resource cpc_regs[MAX_CPC_REG_ENT]; 90 struct acpi_psd_package domain_info; 91 struct kobject kobj; 92 }; 93 94 /* These are indexes into the per-cpu cpc_regs[]. Order is important. */ 95 enum cppc_regs { 96 HIGHEST_PERF, 97 NOMINAL_PERF, 98 LOW_NON_LINEAR_PERF, 99 LOWEST_PERF, 100 GUARANTEED_PERF, 101 DESIRED_PERF, 102 MIN_PERF, 103 MAX_PERF, 104 PERF_REDUC_TOLERANCE, 105 TIME_WINDOW, 106 CTR_WRAP_TIME, 107 REFERENCE_CTR, 108 DELIVERED_CTR, 109 PERF_LIMITED, 110 ENABLE, 111 AUTO_SEL_ENABLE, 112 AUTO_ACT_WINDOW, 113 ENERGY_PERF, 114 REFERENCE_PERF, 115 LOWEST_FREQ, 116 NOMINAL_FREQ, 117 OSPM_NOMINAL_PERF, 118 RESOURCE_PRIORITY, 119 }; 120 121 /* 122 * Categorization of registers as described 123 * in the ACPI v.5.1 spec. 124 * XXX: Only filling up ones which are used by governors 125 * today. 126 */ 127 struct cppc_perf_caps { 128 u32 guaranteed_perf; 129 u32 highest_perf; 130 u32 nominal_perf; 131 u32 reference_perf; 132 u32 lowest_perf; 133 u32 lowest_nonlinear_perf; 134 u32 lowest_freq; 135 u32 nominal_freq; 136 }; 137 138 struct cppc_perf_ctrls { 139 u32 max_perf; 140 u32 min_perf; 141 u32 desired_perf; 142 u32 energy_perf; 143 bool auto_sel; 144 }; 145 146 struct cppc_perf_fb_ctrs { 147 u64 reference; 148 u64 delivered; 149 u64 wraparound_time; 150 }; 151 152 /* Per CPU container for runtime CPPC management. */ 153 struct cppc_cpudata { 154 struct cppc_perf_caps perf_caps; 155 struct cppc_perf_ctrls perf_ctrls; 156 struct cppc_perf_fb_ctrs perf_fb_ctrs; 157 unsigned int shared_type; 158 cpumask_var_t shared_cpu_map; 159 }; 160 161 #ifdef CONFIG_ACPI_CPPC_LIB 162 extern int cppc_get_desired_perf(int cpunum, u64 *desired_perf); 163 extern int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf); 164 extern int cppc_get_highest_perf(int cpunum, u64 *highest_perf); 165 extern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs); 166 extern int cppc_get_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls); 167 extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls); 168 extern int cppc_set_enable(int cpu, bool enable); 169 extern int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps); 170 extern bool cppc_perf_ctrs_in_pcc_cpu(unsigned int cpu); 171 extern bool cppc_perf_ctrs_in_pcc(void); 172 extern u64 cppc_get_dmi_max_khz(void); 173 extern unsigned int cppc_perf_to_khz(struct cppc_perf_caps *caps, unsigned int perf); 174 extern unsigned int cppc_khz_to_perf(struct cppc_perf_caps *caps, unsigned int freq); 175 extern bool acpi_cpc_valid(void); 176 bool cppc_allow_fast_switch(const struct cpumask *cpus); 177 extern int acpi_get_psd_map(unsigned int cpu, struct cppc_cpudata *cpu_data); 178 extern int cppc_get_transition_latency(int cpu); 179 extern bool cpc_ffh_supported(void); 180 extern bool cpc_supported_by_cpu(void); 181 extern int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val); 182 extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val); 183 extern int cppc_get_epp_perf(int cpunum, u64 *epp_perf); 184 extern int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable); 185 extern int cppc_set_epp(int cpu, u64 epp_val); 186 extern int cppc_get_auto_act_window(int cpu, u64 *auto_act_window); 187 extern int cppc_set_auto_act_window(int cpu, u64 auto_act_window); 188 extern int cppc_get_auto_sel(int cpu, bool *enable); 189 extern int cppc_set_auto_sel(int cpu, bool enable); 190 extern int cppc_get_perf_limited(int cpu, u64 *perf_limited); 191 extern int cppc_set_perf_limited(int cpu, u64 bits_to_clear); 192 extern int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf); 193 extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator); 194 extern int amd_detect_prefcore(bool *detected); 195 #else /* !CONFIG_ACPI_CPPC_LIB */ 196 static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf) 197 { 198 return -EOPNOTSUPP; 199 } 200 static inline int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf) 201 { 202 return -EOPNOTSUPP; 203 } 204 static inline int cppc_get_highest_perf(int cpunum, u64 *highest_perf) 205 { 206 return -EOPNOTSUPP; 207 } 208 static inline int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs) 209 { 210 return -EOPNOTSUPP; 211 } 212 static inline int cppc_get_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls) 213 { 214 return -EOPNOTSUPP; 215 } 216 static inline int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls) 217 { 218 return -EOPNOTSUPP; 219 } 220 static inline int cppc_set_enable(int cpu, bool enable) 221 { 222 return -EOPNOTSUPP; 223 } 224 static inline int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps) 225 { 226 return -EOPNOTSUPP; 227 } 228 static inline bool cppc_perf_ctrs_in_pcc_cpu(unsigned int cpu) 229 { 230 return false; 231 } 232 static inline bool cppc_perf_ctrs_in_pcc(void) 233 { 234 return false; 235 } 236 static inline bool acpi_cpc_valid(void) 237 { 238 return false; 239 } 240 241 static inline bool cppc_allow_fast_switch(const struct cpumask *cpus) 242 { 243 return false; 244 } 245 static inline int cppc_get_transition_latency(int cpu) 246 { 247 return -ENODATA; 248 } 249 static inline bool cpc_ffh_supported(void) 250 { 251 return false; 252 } 253 static inline int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val) 254 { 255 return -EOPNOTSUPP; 256 } 257 static inline int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val) 258 { 259 return -EOPNOTSUPP; 260 } 261 static inline int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable) 262 { 263 return -EOPNOTSUPP; 264 } 265 static inline int cppc_get_epp_perf(int cpunum, u64 *epp_perf) 266 { 267 return -EOPNOTSUPP; 268 } 269 static inline int cppc_set_epp(int cpu, u64 epp_val) 270 { 271 return -EOPNOTSUPP; 272 } 273 static inline int cppc_get_auto_act_window(int cpu, u64 *auto_act_window) 274 { 275 return -EOPNOTSUPP; 276 } 277 static inline int cppc_set_auto_act_window(int cpu, u64 auto_act_window) 278 { 279 return -EOPNOTSUPP; 280 } 281 static inline int cppc_get_auto_sel(int cpu, bool *enable) 282 { 283 return -EOPNOTSUPP; 284 } 285 static inline int cppc_set_auto_sel(int cpu, bool enable) 286 { 287 return -EOPNOTSUPP; 288 } 289 static inline int cppc_get_perf_limited(int cpu, u64 *perf_limited) 290 { 291 return -EOPNOTSUPP; 292 } 293 static inline int cppc_set_perf_limited(int cpu, u64 bits_to_clear) 294 { 295 return -EOPNOTSUPP; 296 } 297 static inline int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf) 298 { 299 return -ENODEV; 300 } 301 static inline int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator) 302 { 303 return -EOPNOTSUPP; 304 } 305 static inline int amd_detect_prefcore(bool *detected) 306 { 307 return -ENODEV; 308 } 309 #endif /* !CONFIG_ACPI_CPPC_LIB */ 310 311 #endif /* _CPPC_ACPI_H*/ 312