1 #ifndef __ACPI_PROCESSOR_H 2 #define __ACPI_PROCESSOR_H 3 4 #include <linux/kernel.h> 5 #include <linux/cpu.h> 6 #include <linux/thermal.h> 7 #include <asm/acpi.h> 8 9 #define ACPI_PROCESSOR_CLASS "processor" 10 #define ACPI_PROCESSOR_DEVICE_NAME "Processor" 11 #define ACPI_PROCESSOR_DEVICE_HID "ACPI0007" 12 13 #define ACPI_PROCESSOR_BUSY_METRIC 10 14 15 #define ACPI_PROCESSOR_MAX_POWER 8 16 #define ACPI_PROCESSOR_MAX_C2_LATENCY 100 17 #define ACPI_PROCESSOR_MAX_C3_LATENCY 1000 18 19 #define ACPI_PROCESSOR_MAX_THROTTLING 16 20 #define ACPI_PROCESSOR_MAX_THROTTLE 250 /* 25% */ 21 #define ACPI_PROCESSOR_MAX_DUTY_WIDTH 4 22 23 #define ACPI_PDC_REVISION_ID 0x1 24 25 #define ACPI_PSD_REV0_REVISION 0 /* Support for _PSD as in ACPI 3.0 */ 26 #define ACPI_PSD_REV0_ENTRIES 5 27 28 #define ACPI_TSD_REV0_REVISION 0 /* Support for _PSD as in ACPI 3.0 */ 29 #define ACPI_TSD_REV0_ENTRIES 5 30 /* 31 * Types of coordination defined in ACPI 3.0. Same macros can be used across 32 * P, C and T states 33 */ 34 #define DOMAIN_COORD_TYPE_SW_ALL 0xfc 35 #define DOMAIN_COORD_TYPE_SW_ANY 0xfd 36 #define DOMAIN_COORD_TYPE_HW_ALL 0xfe 37 38 #define ACPI_CSTATE_SYSTEMIO 0 39 #define ACPI_CSTATE_FFH 1 40 #define ACPI_CSTATE_HALT 2 41 42 #define ACPI_CX_DESC_LEN 32 43 44 /* Power Management */ 45 46 struct acpi_processor_cx; 47 48 struct acpi_power_register { 49 u8 descriptor; 50 u16 length; 51 u8 space_id; 52 u8 bit_width; 53 u8 bit_offset; 54 u8 access_size; 55 u64 address; 56 } __attribute__ ((packed)); 57 58 struct acpi_processor_cx { 59 u8 valid; 60 u8 type; 61 u32 address; 62 u8 entry_method; 63 u8 index; 64 u32 latency; 65 u8 bm_sts_skip; 66 char desc[ACPI_CX_DESC_LEN]; 67 }; 68 69 struct acpi_processor_power { 70 struct acpi_processor_cx *state; 71 unsigned long bm_check_timestamp; 72 u32 default_state; 73 int count; 74 struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER]; 75 int timer_broadcast_on_state; 76 }; 77 78 /* Performance Management */ 79 80 struct acpi_psd_package { 81 u64 num_entries; 82 u64 revision; 83 u64 domain; 84 u64 coord_type; 85 u64 num_processors; 86 } __attribute__ ((packed)); 87 88 struct acpi_pct_register { 89 u8 descriptor; 90 u16 length; 91 u8 space_id; 92 u8 bit_width; 93 u8 bit_offset; 94 u8 reserved; 95 u64 address; 96 } __attribute__ ((packed)); 97 98 struct acpi_processor_px { 99 u64 core_frequency; /* megahertz */ 100 u64 power; /* milliWatts */ 101 u64 transition_latency; /* microseconds */ 102 u64 bus_master_latency; /* microseconds */ 103 u64 control; /* control value */ 104 u64 status; /* success indicator */ 105 }; 106 107 struct acpi_processor_performance { 108 unsigned int state; 109 unsigned int platform_limit; 110 struct acpi_pct_register control_register; 111 struct acpi_pct_register status_register; 112 unsigned int state_count; 113 struct acpi_processor_px *states; 114 struct acpi_psd_package domain_info; 115 cpumask_var_t shared_cpu_map; 116 unsigned int shared_type; 117 }; 118 119 /* Throttling Control */ 120 121 struct acpi_tsd_package { 122 u64 num_entries; 123 u64 revision; 124 u64 domain; 125 u64 coord_type; 126 u64 num_processors; 127 } __attribute__ ((packed)); 128 129 struct acpi_ptc_register { 130 u8 descriptor; 131 u16 length; 132 u8 space_id; 133 u8 bit_width; 134 u8 bit_offset; 135 u8 reserved; 136 u64 address; 137 } __attribute__ ((packed)); 138 139 struct acpi_processor_tx_tss { 140 u64 freqpercentage; /* */ 141 u64 power; /* milliWatts */ 142 u64 transition_latency; /* microseconds */ 143 u64 control; /* control value */ 144 u64 status; /* success indicator */ 145 }; 146 struct acpi_processor_tx { 147 u16 power; 148 u16 performance; 149 }; 150 151 struct acpi_processor; 152 struct acpi_processor_throttling { 153 unsigned int state; 154 unsigned int platform_limit; 155 struct acpi_pct_register control_register; 156 struct acpi_pct_register status_register; 157 unsigned int state_count; 158 struct acpi_processor_tx_tss *states_tss; 159 struct acpi_tsd_package domain_info; 160 cpumask_var_t shared_cpu_map; 161 int (*acpi_processor_get_throttling) (struct acpi_processor * pr); 162 int (*acpi_processor_set_throttling) (struct acpi_processor * pr, 163 int state, bool force); 164 165 u32 address; 166 u8 duty_offset; 167 u8 duty_width; 168 u8 tsd_valid_flag; 169 unsigned int shared_type; 170 struct acpi_processor_tx states[ACPI_PROCESSOR_MAX_THROTTLING]; 171 }; 172 173 /* Limit Interface */ 174 175 struct acpi_processor_lx { 176 int px; /* performance state */ 177 int tx; /* throttle level */ 178 }; 179 180 struct acpi_processor_limit { 181 struct acpi_processor_lx state; /* current limit */ 182 struct acpi_processor_lx thermal; /* thermal limit */ 183 struct acpi_processor_lx user; /* user limit */ 184 }; 185 186 struct acpi_processor_flags { 187 u8 power:1; 188 u8 performance:1; 189 u8 throttling:1; 190 u8 limit:1; 191 u8 bm_control:1; 192 u8 bm_check:1; 193 u8 has_cst:1; 194 u8 power_setup_done:1; 195 u8 bm_rld_set:1; 196 u8 need_hotplug_init:1; 197 }; 198 199 struct acpi_processor { 200 acpi_handle handle; 201 u32 acpi_id; 202 u32 apic_id; 203 u32 id; 204 u32 pblk; 205 int performance_platform_limit; 206 int throttling_platform_limit; 207 /* 0 - states 0..n-th state available */ 208 209 struct acpi_processor_flags flags; 210 struct acpi_processor_power power; 211 struct acpi_processor_performance *performance; 212 struct acpi_processor_throttling throttling; 213 struct acpi_processor_limit limit; 214 struct thermal_cooling_device *cdev; 215 struct device *dev; /* Processor device. */ 216 }; 217 218 struct acpi_processor_errata { 219 u8 smp; 220 struct { 221 u8 throttle:1; 222 u8 fdma:1; 223 u8 reserved:6; 224 u32 bmisx; 225 } piix4; 226 }; 227 228 extern int acpi_processor_preregister_performance(struct 229 acpi_processor_performance 230 __percpu *performance); 231 232 extern int acpi_processor_register_performance(struct acpi_processor_performance 233 *performance, unsigned int cpu); 234 extern void acpi_processor_unregister_performance(struct 235 acpi_processor_performance 236 *performance, 237 unsigned int cpu); 238 239 /* note: this locks both the calling module and the processor module 240 if a _PPC object exists, rmmod is disallowed then */ 241 int acpi_processor_notify_smm(struct module *calling_module); 242 243 /* parsing the _P* objects. */ 244 extern int acpi_processor_get_performance_info(struct acpi_processor *pr); 245 246 /* for communication between multiple parts of the processor kernel module */ 247 DECLARE_PER_CPU(struct acpi_processor *, processors); 248 extern struct acpi_processor_errata errata; 249 250 #ifdef ARCH_HAS_POWER_INIT 251 void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, 252 unsigned int cpu); 253 int acpi_processor_ffh_cstate_probe(unsigned int cpu, 254 struct acpi_processor_cx *cx, 255 struct acpi_power_register *reg); 256 void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cstate); 257 #else 258 static inline void acpi_processor_power_init_bm_check(struct 259 acpi_processor_flags 260 *flags, unsigned int cpu) 261 { 262 flags->bm_check = 1; 263 return; 264 } 265 static inline int acpi_processor_ffh_cstate_probe(unsigned int cpu, 266 struct acpi_processor_cx *cx, 267 struct acpi_power_register 268 *reg) 269 { 270 return -1; 271 } 272 static inline void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx 273 *cstate) 274 { 275 return; 276 } 277 #endif 278 279 /* in processor_perflib.c */ 280 281 #ifdef CONFIG_CPU_FREQ 282 void acpi_processor_ppc_init(void); 283 void acpi_processor_ppc_exit(void); 284 int acpi_processor_ppc_has_changed(struct acpi_processor *pr, int event_flag); 285 extern int acpi_processor_get_bios_limit(int cpu, unsigned int *limit); 286 #else 287 static inline void acpi_processor_ppc_init(void) 288 { 289 return; 290 } 291 static inline void acpi_processor_ppc_exit(void) 292 { 293 return; 294 } 295 static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr, 296 int event_flag) 297 { 298 static unsigned int printout = 1; 299 if (printout) { 300 printk(KERN_WARNING 301 "Warning: Processor Platform Limit event detected, but not handled.\n"); 302 printk(KERN_WARNING 303 "Consider compiling CPUfreq support into your kernel.\n"); 304 printout = 0; 305 } 306 return 0; 307 } 308 static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit) 309 { 310 return -ENODEV; 311 } 312 313 #endif /* CONFIG_CPU_FREQ */ 314 315 /* in processor_core.c */ 316 void acpi_processor_set_pdc(acpi_handle handle); 317 int acpi_get_apicid(acpi_handle, int type, u32 acpi_id); 318 int acpi_map_cpuid(int apic_id, u32 acpi_id); 319 int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id); 320 321 /* in processor_throttling.c */ 322 int acpi_processor_tstate_has_changed(struct acpi_processor *pr); 323 int acpi_processor_get_throttling_info(struct acpi_processor *pr); 324 extern int acpi_processor_set_throttling(struct acpi_processor *pr, 325 int state, bool force); 326 /* 327 * Reevaluate whether the T-state is invalid after one cpu is 328 * onlined/offlined. In such case the flags.throttling will be updated. 329 */ 330 extern void acpi_processor_reevaluate_tstate(struct acpi_processor *pr, 331 unsigned long action); 332 extern const struct file_operations acpi_processor_throttling_fops; 333 extern void acpi_processor_throttling_init(void); 334 /* in processor_idle.c */ 335 int acpi_processor_power_init(struct acpi_processor *pr); 336 int acpi_processor_power_exit(struct acpi_processor *pr); 337 int acpi_processor_cst_has_changed(struct acpi_processor *pr); 338 int acpi_processor_hotplug(struct acpi_processor *pr); 339 extern struct cpuidle_driver acpi_idle_driver; 340 341 #ifdef CONFIG_PM_SLEEP 342 void acpi_processor_syscore_init(void); 343 void acpi_processor_syscore_exit(void); 344 #else 345 static inline void acpi_processor_syscore_init(void) {} 346 static inline void acpi_processor_syscore_exit(void) {} 347 #endif 348 349 /* in processor_thermal.c */ 350 int acpi_processor_get_limit_info(struct acpi_processor *pr); 351 extern const struct thermal_cooling_device_ops processor_cooling_ops; 352 #ifdef CONFIG_CPU_FREQ 353 void acpi_thermal_cpufreq_init(void); 354 void acpi_thermal_cpufreq_exit(void); 355 #else 356 static inline void acpi_thermal_cpufreq_init(void) 357 { 358 return; 359 } 360 static inline void acpi_thermal_cpufreq_exit(void) 361 { 362 return; 363 } 364 #endif 365 366 #endif 367