1/* 2 * arch/i386/kernel/acpi/processor.c 3 * 4 * Copyright (C) 2005 Intel Corporation 5 * Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> 6 * - Added _PDC for platforms with Intel CPUs 7 */ 8 9#include <linux/kernel.h> 10#include <linux/module.h> 11#include <linux/init.h> 12#include <linux/acpi.h> 13 14#include <acpi/processor.h> 15#include <asm/acpi.h> 16 17static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c) 18{ 19 struct acpi_object_list *obj_list; 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 45 buf[0] = ACPI_PDC_REVISION_ID; 46 buf[1] = 1; 47 buf[2] = ACPI_PDC_C_CAPABILITY_SMP; 48 49 if (cpu_has(c, X86_FEATURE_EST)) 50 buf[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP; 51 52 obj->type = ACPI_TYPE_BUFFER; 53 obj->buffer.length = 12; 54 obj->buffer.pointer = (u8 *) buf; 55 obj_list->count = 1; 56 obj_list->pointer = obj; 57 pr->pdc = obj_list; 58 59 return; 60} 61 62/* Initialize _PDC data based on the CPU vendor */ 63void arch_acpi_processor_init_pdc(struct acpi_processor *pr) 64{ 65 unsigned int cpu = pr->id; 66 struct cpuinfo_x86 *c = cpu_data + cpu; 67 68 pr->pdc = NULL; 69 if (c->x86_vendor == X86_VENDOR_INTEL) 70 init_intel_pdc(pr, c); 71 72 return; 73} 74 75EXPORT_SYMBOL(arch_acpi_processor_init_pdc); 76