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