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