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