2 * arch/i386/kernel/acpi/processor.c
4 * Copyright (C) 2005 Intel Corporation
5 * Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
6 * - Added _PDC for platforms with Intel CPUs
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/acpi.h>
14 #include <acpi/processor.h>
17 static void init_intel_pdc(struct acpi_processor
*pr
, struct cpuinfo_x86
*c
)
19 struct acpi_object_list
*obj_list
;
20 union acpi_object
*obj
;
23 /* allocate and initialize pdc. It will be used later. */
24 obj_list
= kmalloc(sizeof(struct acpi_object_list
), GFP_KERNEL
);
26 printk(KERN_ERR
"Memory allocation error\n");
30 obj
= kmalloc(sizeof(union acpi_object
), GFP_KERNEL
);
32 printk(KERN_ERR
"Memory allocation error\n");
37 buf
= kmalloc(12, GFP_KERNEL
);
39 printk(KERN_ERR
"Memory allocation error\n");
45 buf
[0] = ACPI_PDC_REVISION_ID
;
47 buf
[2] = ACPI_PDC_C_CAPABILITY_SMP
;
50 * The default of PDC_SMP_T_SWCOORD bit is set for intel x86 cpu so
51 * that OSPM is capable of native ACPI throttling software
52 * coordination using BIOS supplied _TSD info.
54 buf
[2] |= ACPI_PDC_SMP_T_SWCOORD
;
55 if (cpu_has(c
, X86_FEATURE_EST
))
56 buf
[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP
;
58 if (cpu_has(c
, X86_FEATURE_ACPI
))
59 buf
[2] |= ACPI_PDC_T_FFH
;
61 obj
->type
= ACPI_TYPE_BUFFER
;
62 obj
->buffer
.length
= 12;
63 obj
->buffer
.pointer
= (u8
*) buf
;
65 obj_list
->pointer
= obj
;
71 /* Initialize _PDC data based on the CPU vendor */
72 void arch_acpi_processor_init_pdc(struct acpi_processor
*pr
)
74 struct cpuinfo_x86
*c
= &cpu_data(pr
->id
);
77 if (c
->x86_vendor
== X86_VENDOR_INTEL
)
78 init_intel_pdc(pr
, c
);
83 EXPORT_SYMBOL(arch_acpi_processor_init_pdc
);