diff options
author | Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> | 2006-09-25 19:28:13 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2006-10-14 00:35:39 -0400 |
commit | 991528d7348667924176f3e29addea0675298944 (patch) | |
tree | ed8552bd4c696700a95ae37b26c4197923207ae7 /include | |
parent | b4bd8c66435a8cdf8c90334fb3b517a23ff2ab95 (diff) |
ACPI: Processor native C-states using MWAIT
Intel processors starting with the Core Duo support
support processor native C-state using the MWAIT instruction.
Refer: Intel Architecture Software Developer's Manual
http://www.intel.com/design/Pentium4/manuals/253668.htm
Platform firmware exports the support for Native C-state to OS using
ACPI _PDC and _CST methods.
Refer: Intel Processor Vendor-Specific ACPI: Interface Specification
http://www.intel.com/technology/iapc/acpi/downloads/302223.htm
With Processor Native C-state, we use 'MWAIT' instruction on the processor
to enter different C-states (C1, C2, C3). We won't use the special IO
ports to enter C-state and no SMM mode etc required to enter C-state.
Overall this will mean better C-state support.
One major advantage of using MWAIT for all C-states is, with this and
"treat interrupt as break event" feature of MWAIT, we can now get accurate
timing for the time spent in C1, C2, .. states.
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/acpi/pdc_intel.h | 9 | ||||
-rw-r--r-- | include/acpi/processor.h | 18 | ||||
-rw-r--r-- | include/asm-i386/processor.h | 2 | ||||
-rw-r--r-- | include/asm-x86_64/processor.h | 2 |
4 files changed, 28 insertions, 3 deletions
diff --git a/include/acpi/pdc_intel.h b/include/acpi/pdc_intel.h index c5472be6f3a2..e72bfdd887f9 100644 --- a/include/acpi/pdc_intel.h +++ b/include/acpi/pdc_intel.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define ACPI_PDC_SMP_C_SWCOORD (0x0040) | 13 | #define ACPI_PDC_SMP_C_SWCOORD (0x0040) |
14 | #define ACPI_PDC_SMP_T_SWCOORD (0x0080) | 14 | #define ACPI_PDC_SMP_T_SWCOORD (0x0080) |
15 | #define ACPI_PDC_C_C1_FFH (0x0100) | 15 | #define ACPI_PDC_C_C1_FFH (0x0100) |
16 | #define ACPI_PDC_C_C2C3_FFH (0x0200) | ||
16 | 17 | ||
17 | #define ACPI_PDC_EST_CAPABILITY_SMP (ACPI_PDC_SMP_C1PT | \ | 18 | #define ACPI_PDC_EST_CAPABILITY_SMP (ACPI_PDC_SMP_C1PT | \ |
18 | ACPI_PDC_C_C1_HALT | \ | 19 | ACPI_PDC_C_C1_HALT | \ |
@@ -23,8 +24,10 @@ | |||
23 | ACPI_PDC_SMP_P_SWCOORD | \ | 24 | ACPI_PDC_SMP_P_SWCOORD | \ |
24 | ACPI_PDC_P_FFH) | 25 | ACPI_PDC_P_FFH) |
25 | 26 | ||
26 | #define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \ | 27 | #define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \ |
27 | ACPI_PDC_SMP_C1PT | \ | 28 | ACPI_PDC_SMP_C1PT | \ |
28 | ACPI_PDC_C_C1_HALT) | 29 | ACPI_PDC_C_C1_HALT | \ |
30 | ACPI_PDC_C_C1_FFH | \ | ||
31 | ACPI_PDC_C_C2C3_FFH) | ||
29 | 32 | ||
30 | #endif /* __PDC_INTEL_H__ */ | 33 | #endif /* __PDC_INTEL_H__ */ |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 9dd5b75961f8..7798d2a9f793 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
@@ -29,6 +29,9 @@ | |||
29 | #define DOMAIN_COORD_TYPE_SW_ANY 0xfd | 29 | #define DOMAIN_COORD_TYPE_SW_ANY 0xfd |
30 | #define DOMAIN_COORD_TYPE_HW_ALL 0xfe | 30 | #define DOMAIN_COORD_TYPE_HW_ALL 0xfe |
31 | 31 | ||
32 | #define ACPI_CSTATE_SYSTEMIO (0) | ||
33 | #define ACPI_CSTATE_FFH (1) | ||
34 | |||
32 | /* Power Management */ | 35 | /* Power Management */ |
33 | 36 | ||
34 | struct acpi_processor_cx; | 37 | struct acpi_processor_cx; |
@@ -58,6 +61,8 @@ struct acpi_processor_cx { | |||
58 | u8 valid; | 61 | u8 valid; |
59 | u8 type; | 62 | u8 type; |
60 | u32 address; | 63 | u32 address; |
64 | u8 space_id; | ||
65 | u8 index; | ||
61 | u32 latency; | 66 | u32 latency; |
62 | u32 latency_ticks; | 67 | u32 latency_ticks; |
63 | u32 power; | 68 | u32 power; |
@@ -206,6 +211,9 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr); | |||
206 | #ifdef ARCH_HAS_POWER_INIT | 211 | #ifdef ARCH_HAS_POWER_INIT |
207 | void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, | 212 | void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, |
208 | unsigned int cpu); | 213 | unsigned int cpu); |
214 | int acpi_processor_ffh_cstate_probe(unsigned int cpu, | ||
215 | struct acpi_processor_cx *cx, struct acpi_power_register *reg); | ||
216 | void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cstate); | ||
209 | #else | 217 | #else |
210 | static inline void acpi_processor_power_init_bm_check(struct | 218 | static inline void acpi_processor_power_init_bm_check(struct |
211 | acpi_processor_flags | 219 | acpi_processor_flags |
@@ -214,6 +222,16 @@ static inline void acpi_processor_power_init_bm_check(struct | |||
214 | flags->bm_check = 1; | 222 | flags->bm_check = 1; |
215 | return; | 223 | return; |
216 | } | 224 | } |
225 | static inline int acpi_processor_ffh_cstate_probe(unsigned int cpu, | ||
226 | struct acpi_processor_cx *cx, struct acpi_power_register *reg) | ||
227 | { | ||
228 | return -1; | ||
229 | } | ||
230 | static inline void acpi_processor_ffh_cstate_enter( | ||
231 | struct acpi_processor_cx *cstate) | ||
232 | { | ||
233 | return; | ||
234 | } | ||
217 | #endif | 235 | #endif |
218 | 236 | ||
219 | /* in processor_perflib.c */ | 237 | /* in processor_perflib.c */ |
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index 2277127696d2..e0ddca94d50c 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h | |||
@@ -306,6 +306,8 @@ static inline void __mwait(unsigned long eax, unsigned long ecx) | |||
306 | : :"a" (eax), "c" (ecx)); | 306 | : :"a" (eax), "c" (ecx)); |
307 | } | 307 | } |
308 | 308 | ||
309 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); | ||
310 | |||
309 | /* from system description table in BIOS. Mostly for MCA use, but | 311 | /* from system description table in BIOS. Mostly for MCA use, but |
310 | others may find it useful. */ | 312 | others may find it useful. */ |
311 | extern unsigned int machine_id; | 313 | extern unsigned int machine_id; |
diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h index de9c3147ee4c..cef17e0f828c 100644 --- a/include/asm-x86_64/processor.h +++ b/include/asm-x86_64/processor.h | |||
@@ -475,6 +475,8 @@ static inline void __mwait(unsigned long eax, unsigned long ecx) | |||
475 | : :"a" (eax), "c" (ecx)); | 475 | : :"a" (eax), "c" (ecx)); |
476 | } | 476 | } |
477 | 477 | ||
478 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); | ||
479 | |||
478 | #define stack_current() \ | 480 | #define stack_current() \ |
479 | ({ \ | 481 | ({ \ |
480 | struct thread_info *ti; \ | 482 | struct thread_info *ti; \ |