aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Chiang <achiang@hp.com>2009-12-20 14:19:29 -0500
committerLen Brown <len.brown@intel.com>2009-12-22 03:24:13 -0500
commit6c5807d7bc7d051fce00863ffb98d36325501eb2 (patch)
treeeceda659786e5e6ff659fca0b0382ec52ea13871
parent08ea48a326d8030ef5b7fb02292faf5a53c95e0a (diff)
ACPI: processor: finish unifying arch_acpi_processor_init_pdc()
The only thing arch-specific about calling _PDC is what bits get set in the input obj_list buffer. There's no need for several levels of indirection to twiddle those bits. Additionally, since we're just messing around with a buffer, we can simplify the interface; no need to pass around the entire struct acpi_processor * just to get at the buffer. Cc: Tony Luck <tony.luck@intel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Signed-off-by: Alex Chiang <achiang@hp.com> Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--arch/ia64/include/asm/acpi.h4
-rw-r--r--arch/ia64/kernel/acpi-processor.c18
-rw-r--r--arch/x86/include/asm/acpi.h19
-rw-r--r--arch/x86/kernel/acpi/processor.c34
-rw-r--r--drivers/acpi/processor_pdc.c6
-rw-r--r--include/acpi/processor.h1
6 files changed, 26 insertions, 56 deletions
diff --git a/arch/ia64/include/asm/acpi.h b/arch/ia64/include/asm/acpi.h
index 3b7888294648..7ae58892ba8d 100644
--- a/arch/ia64/include/asm/acpi.h
+++ b/arch/ia64/include/asm/acpi.h
@@ -133,6 +133,10 @@ extern int __initdata nid_to_pxm_map[MAX_NUMNODES];
133#endif 133#endif
134 134
135static inline bool arch_has_acpi_pdc(void) { return true; } 135static inline bool arch_has_acpi_pdc(void) { return true; }
136static inline void arch_acpi_set_pdc_bits(u32 *buf)
137{
138 buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP;
139}
136 140
137#define acpi_unlazy_tlb(x) 141#define acpi_unlazy_tlb(x)
138 142
diff --git a/arch/ia64/kernel/acpi-processor.c b/arch/ia64/kernel/acpi-processor.c
index ebe23f58bd6e..7ba5accebf66 100644
--- a/arch/ia64/kernel/acpi-processor.c
+++ b/arch/ia64/kernel/acpi-processor.c
@@ -14,24 +14,6 @@
14#include <acpi/processor.h> 14#include <acpi/processor.h>
15#include <asm/acpi.h> 15#include <asm/acpi.h>
16 16
17static void init_intel_pdc(struct acpi_processor *pr)
18{
19 u32 *buf = (u32 *)pr->pdc->pointer->buffer.pointer;
20
21 buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP;
22
23 return;
24}
25
26/* Initialize _PDC data based on the CPU vendor */
27void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
28{
29 init_intel_pdc(pr);
30 return;
31}
32
33EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
34
35void arch_acpi_processor_cleanup_pdc(struct acpi_processor *pr) 17void arch_acpi_processor_cleanup_pdc(struct acpi_processor *pr)
36{ 18{
37 if (pr->pdc) { 19 if (pr->pdc) {
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
index d787e6e92bd1..56f462cf22d2 100644
--- a/arch/x86/include/asm/acpi.h
+++ b/arch/x86/include/asm/acpi.h
@@ -149,6 +149,25 @@ static inline bool arch_has_acpi_pdc(void)
149 c->x86_vendor == X86_VENDOR_CENTAUR); 149 c->x86_vendor == X86_VENDOR_CENTAUR);
150} 150}
151 151
152static inline void arch_acpi_set_pdc_bits(u32 *buf)
153{
154 struct cpuinfo_x86 *c = &cpu_data(0);
155
156 buf[2] |= ACPI_PDC_C_CAPABILITY_SMP;
157
158 if (cpu_has(c, X86_FEATURE_EST))
159 buf[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP;
160
161 if (cpu_has(c, X86_FEATURE_ACPI))
162 buf[2] |= ACPI_PDC_T_FFH;
163
164 /*
165 * If mwait/monitor is unsupported, C2/C3_FFH will be disabled
166 */
167 if (!cpu_has(c, X86_FEATURE_MWAIT))
168 buf[2] &= ~(ACPI_PDC_C_C2C3_FFH);
169}
170
152#else /* !CONFIG_ACPI */ 171#else /* !CONFIG_ACPI */
153 172
154#define acpi_lapic 0 173#define acpi_lapic 0
diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c
index d722ca8cb4c7..0f57307f8224 100644
--- a/arch/x86/kernel/acpi/processor.c
+++ b/arch/x86/kernel/acpi/processor.c
@@ -12,40 +12,6 @@
12#include <acpi/processor.h> 12#include <acpi/processor.h>
13#include <asm/acpi.h> 13#include <asm/acpi.h>
14 14
15static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
16{
17 u32 *buf = (u32 *)pr->pdc->pointer->buffer.pointer;
18
19 buf[2] |= ACPI_PDC_C_CAPABILITY_SMP;
20
21 if (cpu_has(c, X86_FEATURE_EST))
22 buf[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP;
23
24 if (cpu_has(c, X86_FEATURE_ACPI))
25 buf[2] |= ACPI_PDC_T_FFH;
26
27 /*
28 * If mwait/monitor is unsupported, C2/C3_FFH will be disabled
29 */
30 if (!cpu_has(c, X86_FEATURE_MWAIT))
31 buf[2] &= ~(ACPI_PDC_C_C2C3_FFH);
32
33 return;
34}
35
36
37/* Initialize _PDC data based on the CPU vendor */
38void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
39{
40 struct cpuinfo_x86 *c = &cpu_data(pr->id);
41
42 init_intel_pdc(pr, c);
43
44 return;
45}
46
47EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
48
49void arch_acpi_processor_cleanup_pdc(struct acpi_processor *pr) 15void arch_acpi_processor_cleanup_pdc(struct acpi_processor *pr)
50{ 16{
51 if (pr->pdc) { 17 if (pr->pdc) {
diff --git a/drivers/acpi/processor_pdc.c b/drivers/acpi/processor_pdc.c
index ccda7c95d073..48df08ebcec4 100644
--- a/drivers/acpi/processor_pdc.c
+++ b/drivers/acpi/processor_pdc.c
@@ -40,6 +40,9 @@ static void acpi_set_pdc_bits(u32 *buf)
40 40
41 /* Enable coordination with firmware's _TSD info */ 41 /* Enable coordination with firmware's _TSD info */
42 buf[2] = ACPI_PDC_SMP_T_SWCOORD; 42 buf[2] = ACPI_PDC_SMP_T_SWCOORD;
43
44 /* Twiddle arch-specific bits needed for _PDC */
45 arch_acpi_set_pdc_bits(buf);
43} 46}
44 47
45static void acpi_processor_init_pdc(struct acpi_processor *pr) 48static void acpi_processor_init_pdc(struct acpi_processor *pr)
@@ -81,9 +84,6 @@ static void acpi_processor_init_pdc(struct acpi_processor *pr)
81 obj_list->pointer = obj; 84 obj_list->pointer = obj;
82 pr->pdc = obj_list; 85 pr->pdc = obj_list;
83 86
84 /* Now let the arch do the bit-twiddling to buf[] */
85 arch_acpi_processor_init_pdc(pr);
86
87 return; 87 return;
88} 88}
89 89
diff --git a/include/acpi/processor.h b/include/acpi/processor.h
index a1b748a7a766..50edd734aec6 100644
--- a/include/acpi/processor.h
+++ b/include/acpi/processor.h
@@ -257,7 +257,6 @@ int acpi_processor_notify_smm(struct module *calling_module);
257DECLARE_PER_CPU(struct acpi_processor *, processors); 257DECLARE_PER_CPU(struct acpi_processor *, processors);
258extern struct acpi_processor_errata errata; 258extern struct acpi_processor_errata errata;
259 259
260void arch_acpi_processor_init_pdc(struct acpi_processor *pr);
261void arch_acpi_processor_cleanup_pdc(struct acpi_processor *pr); 260void arch_acpi_processor_cleanup_pdc(struct acpi_processor *pr);
262 261
263#ifdef ARCH_HAS_POWER_INIT 262#ifdef ARCH_HAS_POWER_INIT