diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-03-21 11:53:28 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-03-21 11:53:28 -0400 |
commit | 884411d9a580814910bc21dc08e2495efc4b1491 (patch) | |
tree | 2201bf0c3d2b14f7e6505001300604e6a0164b5c /drivers/acpi | |
parent | 5a2d853ffcf961d6b7d491858946878676aeae3e (diff) | |
parent | 38953d3945aedf8e198b75ff09b22e369f14566f (diff) |
Merge branch 'acpi-processor'
* acpi-processor:
ACPI: Move BAD_MADT_ENTRY() to linux/acpi.h
ACPI / processor: Make it possible to get APIC ID via GIC
ACPI / processor: Build idle_boot_override on x86 and ia64
ACPI / processor: Use ACPI_PROCESSOR_DEVICE_HID instead of "ACPI0007"
ACPI / processor: Fix acpi_processor_eval_pdc() return value type
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/processor_core.c | 78 |
1 files changed, 57 insertions, 21 deletions
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 57e0769656c6..86d73d5d503f 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
@@ -18,24 +18,6 @@ | |||
18 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT | 18 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT |
19 | ACPI_MODULE_NAME("processor_core"); | 19 | ACPI_MODULE_NAME("processor_core"); |
20 | 20 | ||
21 | static int __init set_no_mwait(const struct dmi_system_id *id) | ||
22 | { | ||
23 | printk(KERN_NOTICE PREFIX "%s detected - " | ||
24 | "disabling mwait for CPU C-states\n", id->ident); | ||
25 | boot_option_idle_override = IDLE_NOMWAIT; | ||
26 | return 0; | ||
27 | } | ||
28 | |||
29 | static struct dmi_system_id processor_idle_dmi_table[] __initdata = { | ||
30 | { | ||
31 | set_no_mwait, "Extensa 5220", { | ||
32 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), | ||
33 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
34 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), | ||
35 | DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, | ||
36 | {}, | ||
37 | }; | ||
38 | |||
39 | static int map_lapic_id(struct acpi_subtable_header *entry, | 21 | static int map_lapic_id(struct acpi_subtable_header *entry, |
40 | u32 acpi_id, int *apic_id) | 22 | u32 acpi_id, int *apic_id) |
41 | { | 23 | { |
@@ -88,6 +70,28 @@ static int map_lsapic_id(struct acpi_subtable_header *entry, | |||
88 | return 0; | 70 | return 0; |
89 | } | 71 | } |
90 | 72 | ||
73 | static int map_gic_id(struct acpi_subtable_header *entry, | ||
74 | int device_declaration, u32 acpi_id, int *apic_id) | ||
75 | { | ||
76 | struct acpi_madt_generic_interrupt *gic = | ||
77 | (struct acpi_madt_generic_interrupt *)entry; | ||
78 | |||
79 | if (!(gic->flags & ACPI_MADT_ENABLED)) | ||
80 | return -ENODEV; | ||
81 | |||
82 | /* | ||
83 | * In the GIC interrupt model, logical processors are | ||
84 | * required to have a Processor Device object in the DSDT, | ||
85 | * so we should check device_declaration here | ||
86 | */ | ||
87 | if (device_declaration && (gic->uid == acpi_id)) { | ||
88 | *apic_id = gic->gic_id; | ||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | return -EINVAL; | ||
93 | } | ||
94 | |||
91 | static int map_madt_entry(int type, u32 acpi_id) | 95 | static int map_madt_entry(int type, u32 acpi_id) |
92 | { | 96 | { |
93 | unsigned long madt_end, entry; | 97 | unsigned long madt_end, entry; |
@@ -123,6 +127,9 @@ static int map_madt_entry(int type, u32 acpi_id) | |||
123 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { | 127 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { |
124 | if (!map_lsapic_id(header, type, acpi_id, &apic_id)) | 128 | if (!map_lsapic_id(header, type, acpi_id, &apic_id)) |
125 | break; | 129 | break; |
130 | } else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT) { | ||
131 | if (!map_gic_id(header, type, acpi_id, &apic_id)) | ||
132 | break; | ||
126 | } | 133 | } |
127 | entry += header->length; | 134 | entry += header->length; |
128 | } | 135 | } |
@@ -153,6 +160,8 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) | |||
153 | map_lapic_id(header, acpi_id, &apic_id); | 160 | map_lapic_id(header, acpi_id, &apic_id); |
154 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { | 161 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { |
155 | map_lsapic_id(header, type, acpi_id, &apic_id); | 162 | map_lsapic_id(header, type, acpi_id, &apic_id); |
163 | } else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT) { | ||
164 | map_gic_id(header, type, acpi_id, &apic_id); | ||
156 | } | 165 | } |
157 | 166 | ||
158 | exit: | 167 | exit: |
@@ -322,7 +331,7 @@ static struct acpi_object_list *acpi_processor_alloc_pdc(void) | |||
322 | * _PDC is required for a BIOS-OS handshake for most of the newer | 331 | * _PDC is required for a BIOS-OS handshake for most of the newer |
323 | * ACPI processor features. | 332 | * ACPI processor features. |
324 | */ | 333 | */ |
325 | static int | 334 | static acpi_status |
326 | acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list *pdc_in) | 335 | acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list *pdc_in) |
327 | { | 336 | { |
328 | acpi_status status = AE_OK; | 337 | acpi_status status = AE_OK; |
@@ -378,16 +387,43 @@ early_init_pdc(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
378 | return AE_OK; | 387 | return AE_OK; |
379 | } | 388 | } |
380 | 389 | ||
381 | void __init acpi_early_processor_set_pdc(void) | 390 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) |
391 | static int __init set_no_mwait(const struct dmi_system_id *id) | ||
392 | { | ||
393 | pr_notice(PREFIX "%s detected - disabling mwait for CPU C-states\n", | ||
394 | id->ident); | ||
395 | boot_option_idle_override = IDLE_NOMWAIT; | ||
396 | return 0; | ||
397 | } | ||
398 | |||
399 | static struct dmi_system_id processor_idle_dmi_table[] __initdata = { | ||
400 | { | ||
401 | set_no_mwait, "Extensa 5220", { | ||
402 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), | ||
403 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
404 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), | ||
405 | DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, | ||
406 | {}, | ||
407 | }; | ||
408 | |||
409 | static void __init processor_dmi_check(void) | ||
382 | { | 410 | { |
383 | /* | 411 | /* |
384 | * Check whether the system is DMI table. If yes, OSPM | 412 | * Check whether the system is DMI table. If yes, OSPM |
385 | * should not use mwait for CPU-states. | 413 | * should not use mwait for CPU-states. |
386 | */ | 414 | */ |
387 | dmi_check_system(processor_idle_dmi_table); | 415 | dmi_check_system(processor_idle_dmi_table); |
416 | } | ||
417 | #else | ||
418 | static inline void processor_dmi_check(void) {} | ||
419 | #endif | ||
420 | |||
421 | void __init acpi_early_processor_set_pdc(void) | ||
422 | { | ||
423 | processor_dmi_check(); | ||
388 | 424 | ||
389 | acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, | 425 | acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, |
390 | ACPI_UINT32_MAX, | 426 | ACPI_UINT32_MAX, |
391 | early_init_pdc, NULL, NULL, NULL); | 427 | early_init_pdc, NULL, NULL, NULL); |
392 | acpi_get_devices("ACPI0007", early_init_pdc, NULL, NULL); | 428 | acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, early_init_pdc, NULL, NULL); |
393 | } | 429 | } |