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 23 struct acpi_processor_cx; 24 25 struct 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 35 struct 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 46 struct 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 58 struct 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 69 struct 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 79 struct 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 88 struct 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 100 struct acpi_processor_tx { 101 u16 power; 102 u16 performance; 103 }; 104 105 struct 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 116 struct acpi_processor_lx { 117 int px; /* performace state */ 118 int tx; /* throttle level */ 119 }; 120 121 struct 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 127 struct 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 138 struct 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 154 struct 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 164 extern int acpi_processor_register_performance(struct acpi_processor_performance 165 *performance, unsigned int cpu); 166 extern 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 */ 173 int acpi_processor_notify_smm(struct module *calling_module); 174 175 /* for communication between multiple parts of the processor kernel module */ 176 extern struct acpi_processor *processors[NR_CPUS]; 177 extern struct acpi_processor_errata errata; 178 179 void arch_acpi_processor_init_pdc(struct acpi_processor *pr); 180 181 #ifdef ARCH_HAS_POWER_INIT 182 void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, 183 unsigned int cpu); 184 #else 185 static 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 197 void acpi_processor_ppc_init(void); 198 void acpi_processor_ppc_exit(void); 199 int acpi_processor_ppc_has_changed(struct acpi_processor *pr); 200 #else 201 static inline void acpi_processor_ppc_init(void) 202 { 203 return; 204 } 205 static inline void acpi_processor_ppc_exit(void) 206 { 207 return; 208 } 209 static 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 */ 224 int acpi_processor_get_throttling_info(struct acpi_processor *pr); 225 int acpi_processor_set_throttling(struct acpi_processor *pr, int state); 226 extern struct file_operations acpi_processor_throttling_fops; 227 228 /* in processor_idle.c */ 229 int acpi_processor_power_init(struct acpi_processor *pr, 230 struct acpi_device *device); 231 int acpi_processor_cst_has_changed(struct acpi_processor *pr); 232 int acpi_processor_power_exit(struct acpi_processor *pr, 233 struct acpi_device *device); 234 235 /* in processor_thermal.c */ 236 int acpi_processor_get_limit_info(struct acpi_processor *pr); 237 extern struct file_operations acpi_processor_limit_fops; 238 239 #ifdef CONFIG_CPU_FREQ 240 void acpi_thermal_cpufreq_init(void); 241 void acpi_thermal_cpufreq_exit(void); 242 #else 243 static inline void acpi_thermal_cpufreq_init(void) 244 { 245 return; 246 } 247 static inline void acpi_thermal_cpufreq_exit(void) 248 { 249 return; 250 } 251 #endif 252 253 #endif 254