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(struct 193 acpi_processor_performance 194 **performance); 195 196extern int acpi_processor_register_performance(struct acpi_processor_performance 197 *performance, unsigned int cpu); 198extern 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 */ 205int acpi_processor_notify_smm(struct module *calling_module); 206 207/* for communication between multiple parts of the processor kernel module */ 208extern struct acpi_processor *processors[NR_CPUS]; 209extern struct acpi_processor_errata errata; 210 211void arch_acpi_processor_init_pdc(struct acpi_processor *pr); 212 213#ifdef ARCH_HAS_POWER_INIT 214void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, 215 unsigned int cpu); 216int acpi_processor_ffh_cstate_probe(unsigned int cpu, 217 struct acpi_processor_cx *cx, 218 struct acpi_power_register *reg); 219void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cstate); 220#else 221static 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} 228static 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} 235static 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 245void acpi_processor_ppc_init(void); 246void acpi_processor_ppc_exit(void); 247int acpi_processor_ppc_has_changed(struct acpi_processor *pr); 248#else 249static inline void acpi_processor_ppc_init(void) 250{ 251 return; 252} 253static inline void acpi_processor_ppc_exit(void) 254{ 255 return; 256} 257static 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 */ 272int acpi_processor_get_throttling_info(struct acpi_processor *pr); 273int acpi_processor_set_throttling(struct acpi_processor *pr, int state); 274extern struct file_operations acpi_processor_throttling_fops; 275 276/* in processor_idle.c */ 277int acpi_processor_power_init(struct acpi_processor *pr, 278 struct acpi_device *device); 279int acpi_processor_cst_has_changed(struct acpi_processor *pr); 280int acpi_processor_power_exit(struct acpi_processor *pr, 281 struct acpi_device *device); 282 283/* in processor_thermal.c */ 284int acpi_processor_get_limit_info(struct acpi_processor *pr); 285extern struct file_operations acpi_processor_limit_fops; 286 287#ifdef CONFIG_CPU_FREQ 288void acpi_thermal_cpufreq_init(void); 289void acpi_thermal_cpufreq_exit(void); 290#else 291static inline void acpi_thermal_cpufreq_init(void) 292{ 293 return; 294} 295static inline void acpi_thermal_cpufreq_exit(void) 296{ 297 return; 298} 299#endif 300 301#endif 302