at v2.6.21 7.2 kB view raw
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 37struct acpi_processor_cx; 38 39struct 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 49struct 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 60struct 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 75struct 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 87struct 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 95struct 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 105struct 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 114struct 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 128struct acpi_processor_tx { 129 u16 power; 130 u16 performance; 131}; 132 133struct 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 144struct acpi_processor_lx { 145 int px; /* performace state */ 146 int tx; /* throttle level */ 147}; 148 149struct 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 155struct 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 166struct 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 182struct 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 192extern int acpi_processor_preregister_performance( 193 struct acpi_processor_performance **performance); 194 195extern int acpi_processor_register_performance(struct acpi_processor_performance 196 *performance, unsigned int cpu); 197extern 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 */ 204int acpi_processor_notify_smm(struct module *calling_module); 205 206/* for communication between multiple parts of the processor kernel module */ 207extern struct acpi_processor *processors[NR_CPUS]; 208extern struct acpi_processor_errata errata; 209 210void arch_acpi_processor_init_pdc(struct acpi_processor *pr); 211 212#ifdef ARCH_HAS_POWER_INIT 213void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, 214 unsigned int cpu); 215int acpi_processor_ffh_cstate_probe(unsigned int cpu, 216 struct acpi_processor_cx *cx, struct acpi_power_register *reg); 217void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cstate); 218#else 219static 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} 226static 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} 231static 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 241void acpi_processor_ppc_init(void); 242void acpi_processor_ppc_exit(void); 243int acpi_processor_ppc_has_changed(struct acpi_processor *pr); 244#else 245static inline void acpi_processor_ppc_init(void) 246{ 247 return; 248} 249static inline void acpi_processor_ppc_exit(void) 250{ 251 return; 252} 253static 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 */ 268int acpi_processor_get_throttling_info(struct acpi_processor *pr); 269int acpi_processor_set_throttling(struct acpi_processor *pr, int state); 270extern struct file_operations acpi_processor_throttling_fops; 271 272/* in processor_idle.c */ 273int acpi_processor_power_init(struct acpi_processor *pr, 274 struct acpi_device *device); 275int acpi_processor_cst_has_changed(struct acpi_processor *pr); 276int acpi_processor_power_exit(struct acpi_processor *pr, 277 struct acpi_device *device); 278 279/* in processor_thermal.c */ 280int acpi_processor_get_limit_info(struct acpi_processor *pr); 281extern struct file_operations acpi_processor_limit_fops; 282 283#ifdef CONFIG_CPU_FREQ 284void acpi_thermal_cpufreq_init(void); 285void acpi_thermal_cpufreq_exit(void); 286#else 287static inline void acpi_thermal_cpufreq_init(void) 288{ 289 return; 290} 291static inline void acpi_thermal_cpufreq_exit(void) 292{ 293 return; 294} 295#endif 296 297#endif