xref: /linux/include/acpi/processor.h (revision d8327c784b51b57dac2c26cfad87dce0d68dfd98)
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