aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Chiang <achiang@hp.com>2009-12-20 14:19:19 -0500
committerLen Brown <len.brown@intel.com>2009-12-22 03:24:11 -0500
commit407cd87c54e76c266245e8faef8dd4a84b7254fe (patch)
treee07067c0d51317a4dc93144f1d16c050a0f5ca89
parent1d9cb470a755409ce97c3376174b1e234bd20371 (diff)
ACPI: processor: unify arch_acpi_processor_init_pdc
The x86 and ia64 implementations of arch_acpi_processor_init_pdc() are almost exactly the same. The only difference is in what bits they set in obj_list buffer. Combine the boilerplate memory management code, and leave the arch-specific bit twiddling in separate implementations. 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/kernel/acpi-processor.c34
-rw-r--r--arch/x86/kernel/acpi/processor.c34
-rw-r--r--drivers/acpi/processor_pdc.c45
3 files changed, 46 insertions, 67 deletions
diff --git a/arch/ia64/kernel/acpi-processor.c b/arch/ia64/kernel/acpi-processor.c
index dbda7bde6112..ab72d46f52c6 100644
--- a/arch/ia64/kernel/acpi-processor.c
+++ b/arch/ia64/kernel/acpi-processor.c
@@ -16,31 +16,7 @@
16 16
17static void init_intel_pdc(struct acpi_processor *pr) 17static void init_intel_pdc(struct acpi_processor *pr)
18{ 18{
19 struct acpi_object_list *obj_list; 19 u32 *buf = (u32 *)pr->pdc->pointer->buffer.pointer;
20 union acpi_object *obj;
21 u32 *buf;
22
23 /* allocate and initialize pdc. It will be used later. */
24 obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
25 if (!obj_list) {
26 printk(KERN_ERR "Memory allocation error\n");
27 return;
28 }
29
30 obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
31 if (!obj) {
32 printk(KERN_ERR "Memory allocation error\n");
33 kfree(obj_list);
34 return;
35 }
36
37 buf = kmalloc(12, GFP_KERNEL);
38 if (!buf) {
39 printk(KERN_ERR "Memory allocation error\n");
40 kfree(obj);
41 kfree(obj_list);
42 return;
43 }
44 20
45 buf[0] = ACPI_PDC_REVISION_ID; 21 buf[0] = ACPI_PDC_REVISION_ID;
46 buf[1] = 1; 22 buf[1] = 1;
@@ -52,20 +28,12 @@ static void init_intel_pdc(struct acpi_processor *pr)
52 */ 28 */
53 buf[2] |= ACPI_PDC_SMP_T_SWCOORD; 29 buf[2] |= ACPI_PDC_SMP_T_SWCOORD;
54 30
55 obj->type = ACPI_TYPE_BUFFER;
56 obj->buffer.length = 12;
57 obj->buffer.pointer = (u8 *) buf;
58 obj_list->count = 1;
59 obj_list->pointer = obj;
60 pr->pdc = obj_list;
61
62 return; 31 return;
63} 32}
64 33
65/* Initialize _PDC data based on the CPU vendor */ 34/* Initialize _PDC data based on the CPU vendor */
66void arch_acpi_processor_init_pdc(struct acpi_processor *pr) 35void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
67{ 36{
68 pr->pdc = NULL;
69 init_intel_pdc(pr); 37 init_intel_pdc(pr);
70 return; 38 return;
71} 39}
diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c
index bcb6efe08c5d..967860b43f2a 100644
--- a/arch/x86/kernel/acpi/processor.c
+++ b/arch/x86/kernel/acpi/processor.c
@@ -14,31 +14,7 @@
14 14
15static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c) 15static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
16{ 16{
17 struct acpi_object_list *obj_list; 17 u32 *buf = (u32 *)pr->pdc->pointer->buffer.pointer;
18 union acpi_object *obj;
19 u32 *buf;
20
21 /* allocate and initialize pdc. It will be used later. */
22 obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
23 if (!obj_list) {
24 printk(KERN_ERR "Memory allocation error\n");
25 return;
26 }
27
28 obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
29 if (!obj) {
30 printk(KERN_ERR "Memory allocation error\n");
31 kfree(obj_list);
32 return;
33 }
34
35 buf = kmalloc(12, GFP_KERNEL);
36 if (!buf) {
37 printk(KERN_ERR "Memory allocation error\n");
38 kfree(obj);
39 kfree(obj_list);
40 return;
41 }
42 18
43 buf[0] = ACPI_PDC_REVISION_ID; 19 buf[0] = ACPI_PDC_REVISION_ID;
44 buf[1] = 1; 20 buf[1] = 1;
@@ -62,13 +38,6 @@ static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
62 if (!cpu_has(c, X86_FEATURE_MWAIT)) 38 if (!cpu_has(c, X86_FEATURE_MWAIT))
63 buf[2] &= ~(ACPI_PDC_C_C2C3_FFH); 39 buf[2] &= ~(ACPI_PDC_C_C2C3_FFH);
64 40
65 obj->type = ACPI_TYPE_BUFFER;
66 obj->buffer.length = 12;
67 obj->buffer.pointer = (u8 *) buf;
68 obj_list->count = 1;
69 obj_list->pointer = obj;
70 pr->pdc = obj_list;
71
72 return; 41 return;
73} 42}
74 43
@@ -78,7 +47,6 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
78{ 47{
79 struct cpuinfo_x86 *c = &cpu_data(pr->id); 48 struct cpuinfo_x86 *c = &cpu_data(pr->id);
80 49
81 pr->pdc = NULL;
82 init_intel_pdc(pr, c); 50 init_intel_pdc(pr, c);
83 51
84 return; 52 return;
diff --git a/drivers/acpi/processor_pdc.c b/drivers/acpi/processor_pdc.c
index 931e735e9e37..87946b6da765 100644
--- a/drivers/acpi/processor_pdc.c
+++ b/drivers/acpi/processor_pdc.c
@@ -33,6 +33,49 @@ static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = {
33 {}, 33 {},
34}; 34};
35 35
36static void acpi_processor_init_pdc(struct acpi_processor *pr)
37{
38 struct acpi_object_list *obj_list;
39 union acpi_object *obj;
40 u32 *buf;
41
42 pr->pdc = NULL;
43
44 /* allocate and initialize pdc. It will be used later. */
45 obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
46 if (!obj_list) {
47 printk(KERN_ERR "Memory allocation error\n");
48 return;
49 }
50
51 obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
52 if (!obj) {
53 printk(KERN_ERR "Memory allocation error\n");
54 kfree(obj_list);
55 return;
56 }
57
58 buf = kmalloc(12, GFP_KERNEL);
59 if (!buf) {
60 printk(KERN_ERR "Memory allocation error\n");
61 kfree(obj);
62 kfree(obj_list);
63 return;
64 }
65
66 obj->type = ACPI_TYPE_BUFFER;
67 obj->buffer.length = 12;
68 obj->buffer.pointer = (u8 *) buf;
69 obj_list->count = 1;
70 obj_list->pointer = obj;
71 pr->pdc = obj_list;
72
73 /* Now let the arch do the bit-twiddling to buf[] */
74 arch_acpi_processor_init_pdc(pr);
75
76 return;
77}
78
36/* 79/*
37 * _PDC is required for a BIOS-OS handshake for most of the newer 80 * _PDC is required for a BIOS-OS handshake for most of the newer
38 * ACPI processor features. 81 * ACPI processor features.
@@ -72,7 +115,7 @@ void acpi_processor_set_pdc(struct acpi_processor *pr)
72 if (arch_has_acpi_pdc() == false) 115 if (arch_has_acpi_pdc() == false)
73 return; 116 return;
74 117
75 arch_acpi_processor_init_pdc(pr); 118 acpi_processor_init_pdc(pr);
76 acpi_processor_eval_pdc(pr); 119 acpi_processor_eval_pdc(pr);
77 arch_acpi_processor_cleanup_pdc(pr); 120 arch_acpi_processor_cleanup_pdc(pr);
78} 121}