processor.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/init.h>
  11. #include <linux/acpi.h>
  12. #include <acpi/processor.h>
  13. #include <asm/acpi.h>
  14. static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
  15. {
  16. struct acpi_object_list *obj_list;
  17. union acpi_object *obj;
  18. u32 *buf;
  19. /* allocate and initialize pdc. It will be used later. */
  20. obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
  21. if (!obj_list) {
  22. printk(KERN_ERR "Memory allocation error\n");
  23. return;
  24. }
  25. obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
  26. if (!obj) {
  27. printk(KERN_ERR "Memory allocation error\n");
  28. kfree(obj_list);
  29. return;
  30. }
  31. buf = kmalloc(12, GFP_KERNEL);
  32. if (!buf) {
  33. printk(KERN_ERR "Memory allocation error\n");
  34. kfree(obj);
  35. kfree(obj_list);
  36. return;
  37. }
  38. buf[0] = ACPI_PDC_REVISION_ID;
  39. buf[1] = 1;
  40. buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
  41. /*
  42. * The default of PDC_SMP_T_SWCOORD bit is set for intel x86 cpu so
  43. * that OSPM is capable of native ACPI throttling software
  44. * coordination using BIOS supplied _TSD info.
  45. */
  46. buf[2] |= ACPI_PDC_SMP_T_SWCOORD;
  47. if (cpu_has(c, X86_FEATURE_EST))
  48. buf[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP;
  49. if (cpu_has(c, X86_FEATURE_ACPI))
  50. buf[2] |= ACPI_PDC_T_FFH;
  51. obj->type = ACPI_TYPE_BUFFER;
  52. obj->buffer.length = 12;
  53. obj->buffer.pointer = (u8 *) buf;
  54. obj_list->count = 1;
  55. obj_list->pointer = obj;
  56. pr->pdc = obj_list;
  57. return;
  58. }
  59. /* Initialize _PDC data based on the CPU vendor */
  60. void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
  61. {
  62. struct cpuinfo_x86 *c = &cpu_data(pr->id);
  63. pr->pdc = NULL;
  64. if (c->x86_vendor == X86_VENDOR_INTEL)
  65. init_intel_pdc(pr, c);
  66. return;
  67. }
  68. EXPORT_SYMBOL(arch_acpi_processor_init_pdc);