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( 193 struct acpi_processor_performance **performance); 194 195 extern int acpi_processor_register_performance(struct acpi_processor_performance 196 *performance, unsigned int cpu); 197 extern void acpi_processor_unregister_performance(struct 198 acpi_processor_performance 199 *performance, 200 unsigned int cpu); 201 202 /* note: this locks both the calling module and the processor module 203 if a _PPC object exists, rmmod is disallowed then */ 204 int acpi_processor_notify_smm(struct module *calling_module); 205 206 /* for communication between multiple parts of the processor kernel module */ 207 extern struct acpi_processor *processors[NR_CPUS]; 208 extern struct acpi_processor_errata errata; 209 210 void arch_acpi_processor_init_pdc(struct acpi_processor *pr); 211 212 #ifdef ARCH_HAS_POWER_INIT 213 void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, 214 unsigned int cpu); 215 int acpi_processor_ffh_cstate_probe(unsigned int cpu, 216 struct acpi_processor_cx *cx, struct acpi_power_register *reg); 217 void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cstate); 218 #else 219 static inline void acpi_processor_power_init_bm_check(struct 220 acpi_processor_flags 221 *flags, unsigned int cpu) 222 { 223 flags->bm_check = 1; 224 return; 225 } 226 static inline int acpi_processor_ffh_cstate_probe(unsigned int cpu, 227 struct acpi_processor_cx *cx, struct acpi_power_register *reg) 228 { 229 return -1; 230 } 231 static inline void acpi_processor_ffh_cstate_enter( 232 struct acpi_processor_cx *cstate) 233 { 234 return; 235 } 236 #endif 237 238 /* in processor_perflib.c */ 239 240 #ifdef CONFIG_CPU_FREQ 241 void acpi_processor_ppc_init(void); 242 void acpi_processor_ppc_exit(void); 243 int acpi_processor_ppc_has_changed(struct acpi_processor *pr); 244 #else 245 static inline void acpi_processor_ppc_init(void) 246 { 247 return; 248 } 249 static inline void acpi_processor_ppc_exit(void) 250 { 251 return; 252 } 253 static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr) 254 { 255 static unsigned int printout = 1; 256 if (printout) { 257 printk(KERN_WARNING 258 "Warning: Processor Platform Limit event detected, but not handled.\n"); 259 printk(KERN_WARNING 260 "Consider compiling CPUfreq support into your kernel.\n"); 261 printout = 0; 262 } 263 return 0; 264 } 265 #endif /* CONFIG_CPU_FREQ */ 266 267 /* in processor_throttling.c */ 268 int acpi_processor_get_throttling_info(struct acpi_processor *pr); 269 int acpi_processor_set_throttling(struct acpi_processor *pr, int state); 270 extern struct file_operations acpi_processor_throttling_fops; 271 272 /* in processor_idle.c */ 273 int acpi_processor_power_init(struct acpi_processor *pr, 274 struct acpi_device *device); 275 int acpi_processor_cst_has_changed(struct acpi_processor *pr); 276 int acpi_processor_power_exit(struct acpi_processor *pr, 277 struct acpi_device *device); 278 279 /* in processor_thermal.c */ 280 int acpi_processor_get_limit_info(struct acpi_processor *pr); 281 extern struct file_operations acpi_processor_limit_fops; 282 283 #ifdef CONFIG_CPU_FREQ 284 void acpi_thermal_cpufreq_init(void); 285 void acpi_thermal_cpufreq_exit(void); 286 #else 287 static inline void acpi_thermal_cpufreq_init(void) 288 { 289 return; 290 } 291 static inline void acpi_thermal_cpufreq_exit(void) 292 { 293 return; 294 } 295 #endif 296 297 #endif 298