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