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