xref: /openbmc/linux/include/acpi/processor.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1 #ifndef __ACPI_PROCESSOR_H
2 #define __ACPI_PROCESSOR_H
3 
4 #include <linux/kernel.h>
5 #include <linux/config.h>
6 
7 #define ACPI_PROCESSOR_BUSY_METRIC	10
8 
9 #define ACPI_PROCESSOR_MAX_POWER	8
10 #define ACPI_PROCESSOR_MAX_C2_LATENCY	100
11 #define ACPI_PROCESSOR_MAX_C3_LATENCY	1000
12 
13 #define ACPI_PROCESSOR_MAX_THROTTLING	16
14 #define ACPI_PROCESSOR_MAX_THROTTLE	250	/* 25% */
15 #define ACPI_PROCESSOR_MAX_DUTY_WIDTH	4
16 
17 /* Power Management */
18 
19 struct acpi_processor_cx;
20 
21 struct acpi_power_register {
22 	u8			descriptor;
23 	u16			length;
24 	u8			space_id;
25 	u8			bit_width;
26 	u8			bit_offset;
27 	u8			reserved;
28 	u64			address;
29 } __attribute__ ((packed));
30 
31 
32 struct acpi_processor_cx_policy {
33 	u32			count;
34 	struct acpi_processor_cx *state;
35 	struct {
36 		u32			time;
37 		u32			ticks;
38 		u32			count;
39 		u32			bm;
40 	}			threshold;
41 };
42 
43 struct acpi_processor_cx {
44 	u8			valid;
45 	u8			type;
46 	u32			address;
47 	u32			latency;
48 	u32			latency_ticks;
49 	u32			power;
50 	u32			usage;
51 	struct acpi_processor_cx_policy promotion;
52 	struct acpi_processor_cx_policy demotion;
53 };
54 
55 struct acpi_processor_power {
56 	struct acpi_processor_cx *state;
57 	unsigned long		bm_check_timestamp;
58 	u32			default_state;
59 	u32			bm_activity;
60 	int			count;
61 	struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];
62 };
63 
64 /* Performance Management */
65 
66 struct acpi_pct_register {
67 	u8			descriptor;
68 	u16			length;
69 	u8			space_id;
70 	u8			bit_width;
71 	u8			bit_offset;
72 	u8			reserved;
73 	u64			address;
74 } __attribute__ ((packed));
75 
76 struct acpi_processor_px {
77 	acpi_integer		core_frequency;		/* megahertz */
78 	acpi_integer		power;			/* milliWatts */
79 	acpi_integer		transition_latency;	/* microseconds */
80 	acpi_integer		bus_master_latency;	/* microseconds */
81 	acpi_integer		control;		/* control value */
82 	acpi_integer		status;			/* success indicator */
83 };
84 
85 #define ACPI_PDC_REVISION_ID                   0x1
86 
87 struct acpi_processor_performance {
88 	unsigned int		 state;
89 	unsigned int		 platform_limit;
90 	struct acpi_pct_register control_register;
91 	struct acpi_pct_register status_register;
92 	unsigned int		 state_count;
93 	struct acpi_processor_px *states;
94 
95 	/* the _PDC objects passed by the driver, if any */
96 	struct acpi_object_list *pdc;
97 };
98 
99 
100 
101 /* Throttling Control */
102 
103 struct acpi_processor_tx {
104 	u16			power;
105 	u16			performance;
106 };
107 
108 struct acpi_processor_throttling {
109 	int			state;
110 	u32			address;
111 	u8			duty_offset;
112 	u8			duty_width;
113 	int			state_count;
114 	struct acpi_processor_tx states[ACPI_PROCESSOR_MAX_THROTTLING];
115 };
116 
117 /* Limit Interface */
118 
119 struct acpi_processor_lx {
120 	int			px;		/* performace state */
121 	int			tx;		/* throttle level */
122 };
123 
124 struct acpi_processor_limit {
125 	struct acpi_processor_lx state;		/* current limit */
126 	struct acpi_processor_lx thermal;	/* thermal limit */
127 	struct acpi_processor_lx user;		/* user limit */
128 };
129 
130 
131 struct acpi_processor_flags {
132 	u8			power:1;
133 	u8			performance:1;
134 	u8			throttling:1;
135 	u8			limit:1;
136 	u8			bm_control:1;
137 	u8			bm_check:1;
138 	u8			has_cst:1;
139 	u8			power_setup_done:1;
140 };
141 
142 struct acpi_processor {
143 	acpi_handle		handle;
144 	u32			acpi_id;
145 	u32			id;
146 	u32			pblk;
147 	int			performance_platform_limit;
148 	struct acpi_processor_flags flags;
149 	struct acpi_processor_power power;
150 	struct acpi_processor_performance *performance;
151 	struct acpi_processor_throttling throttling;
152 	struct acpi_processor_limit limit;
153 };
154 
155 struct acpi_processor_errata {
156 	u8			smp;
157 	struct {
158 		u8			throttle:1;
159 		u8			fdma:1;
160 		u8			reserved:6;
161 		u32			bmisx;
162 	}			piix4;
163 };
164 
165 extern int acpi_processor_register_performance (
166 	struct acpi_processor_performance * performance,
167 	unsigned int cpu);
168 extern void acpi_processor_unregister_performance (
169 	struct acpi_processor_performance * performance,
170 	unsigned int cpu);
171 
172 /* note: this locks both the calling module and the processor module
173          if a _PPC object exists, rmmod is disallowed then */
174 int acpi_processor_notify_smm(struct module *calling_module);
175 
176 
177 
178 /* for communication between multiple parts of the processor kernel module */
179 extern struct acpi_processor	*processors[NR_CPUS];
180 extern struct acpi_processor_errata errata;
181 
182 /* in processor_perflib.c */
183 #ifdef CONFIG_CPU_FREQ
184 void acpi_processor_ppc_init(void);
185 void acpi_processor_ppc_exit(void);
186 int acpi_processor_ppc_has_changed(struct acpi_processor *pr);
187 #else
188 static inline void acpi_processor_ppc_init(void) { return; }
189 static inline void acpi_processor_ppc_exit(void) { return; }
190 static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr) {
191 	static unsigned int printout = 1;
192 	if (printout) {
193 		printk(KERN_WARNING "Warning: Processor Platform Limit event detected, but not handled.\n");
194 		printk(KERN_WARNING "Consider compiling CPUfreq support into your kernel.\n");
195 		printout = 0;
196 	}
197 	return 0;
198 }
199 #endif /* CONFIG_CPU_FREQ */
200 
201 /* in processor_throttling.c */
202 int acpi_processor_get_throttling_info (struct acpi_processor *pr);
203 int acpi_processor_set_throttling (struct acpi_processor *pr, int state);
204 ssize_t acpi_processor_write_throttling (
205         struct file		*file,
206         const char		__user *buffer,
207         size_t			count,
208         loff_t			*data);
209 extern struct file_operations acpi_processor_throttling_fops;
210 
211 /* in processor_idle.c */
212 int acpi_processor_power_init(struct acpi_processor *pr, struct acpi_device *device);
213 int acpi_processor_cst_has_changed (struct acpi_processor *pr);
214 int acpi_processor_power_exit(struct acpi_processor *pr, struct acpi_device *device);
215 
216 
217 /* in processor_thermal.c */
218 int acpi_processor_get_limit_info (struct acpi_processor *pr);
219 ssize_t acpi_processor_write_limit (
220 	struct file		*file,
221 	const char		__user *buffer,
222 	size_t			count,
223 	loff_t			*data);
224 extern struct file_operations acpi_processor_limit_fops;
225 
226 #ifdef CONFIG_CPU_FREQ
227 void acpi_thermal_cpufreq_init(void);
228 void acpi_thermal_cpufreq_exit(void);
229 #else
230 static inline void acpi_thermal_cpufreq_init(void) { return; }
231 static inline void acpi_thermal_cpufreq_exit(void) { return; }
232 #endif
233 
234 
235 #endif
236