Pull power management and ACPI fixes from Rafael Wysocki: "These are an ACPI device power management initialization fix (-stable material), two commits renaming stuff in the ACPI processor driver to make it more suitable for ARM64 processors and a new ACPI backlight blacklist entry. Specifics: - Fix ACPI power management intialization for device objects corresponding to devices that are not present at the init time (the _STA control method returns 0 for them) and therefore should not be regarded as power manageable (Rafael J Wysocki). - Rename a structure field and two functions used by the ACPI processor driver to make them less tied to architectures that use APICs (both x86 and ia64) and more suitable for ARM64 processors (Hanjun Guo). - Add a disable_native_backlight quirk for Dell XPS15 L521X designed in an unusual way preventing native backlight from working on that machine (Hans de Goede)" * tag 'pm+acpi-3.19-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPI / video: Add disable_native_backlight quirk for Dell XPS15 L521X ACPI / processor: Rename acpi_(un)map_lsapic() to acpi_(un)map_cpu() ACPI / processor: Convert apic_id to phys_id to make it arch agnostic ACPI / PM: Fix PM initialization for devices that are not present
Unified · Split
| @@ -893,13 +893,13 @@ static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) · 892 unmodified lines | ||
| 893 | 893 | } |
| 894 | 894 | |
| 895 | 895 | /* wrapper to silence section mismatch warning */ |
| 896 | −int __ref acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) | |
| 896 | +int __ref acpi_map_cpu(acpi_handle handle, int physid, int *pcpu) | |
| 897 | 897 | { |
| 898 | 898 | return _acpi_map_lsapic(handle, physid, pcpu); |
| 899 | 899 | } |
| 900 | −EXPORT_SYMBOL(acpi_map_lsapic); | |
| 900 | +EXPORT_SYMBOL(acpi_map_cpu); | |
| 901 | 901 | |
| 902 | −int acpi_unmap_lsapic(int cpu) | |
| 902 | +int acpi_unmap_cpu(int cpu) | |
| 903 | 903 | { |
| 904 | 904 | ia64_cpu_to_sapicid[cpu] = -1; |
| 905 | 905 | set_cpu_present(cpu, false); |
| @@ -910,8 +910,7 @@ int acpi_unmap_lsapic(int cpu) · 4 unmodified lines | ||
| 910 | 910 | |
| 911 | 911 | return (0); |
| 912 | 912 | } |
| 913 | − | |
| 914 | −EXPORT_SYMBOL(acpi_unmap_lsapic); | |
| 913 | +EXPORT_SYMBOL(acpi_unmap_cpu); | |
| 915 | 914 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ |
| 916 | 915 | |
| 917 | 916 | #ifdef CONFIG_ACPI_NUMA |
| @@ -750,13 +750,13 @@ static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) · 749 unmodified lines | ||
| 750 | 750 | } |
| 751 | 751 | |
| 752 | 752 | /* wrapper to silence section mismatch warning */ |
| 753 | −int __ref acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) | |
| 753 | +int __ref acpi_map_cpu(acpi_handle handle, int physid, int *pcpu) | |
| 754 | 754 | { |
| 755 | 755 | return _acpi_map_lsapic(handle, physid, pcpu); |
| 756 | 756 | } |
| 757 | −EXPORT_SYMBOL(acpi_map_lsapic); | |
| 757 | +EXPORT_SYMBOL(acpi_map_cpu); | |
| 758 | 758 | |
| 759 | −int acpi_unmap_lsapic(int cpu) | |
| 759 | +int acpi_unmap_cpu(int cpu) | |
| 760 | 760 | { |
| 761 | 761 | #ifdef CONFIG_ACPI_NUMA |
| 762 | 762 | set_apicid_to_node(per_cpu(x86_cpu_to_apicid, cpu), NUMA_NO_NODE); |
| @@ -768,8 +768,7 @@ int acpi_unmap_lsapic(int cpu) · 5 unmodified lines | ||
| 768 | 768 | |
| 769 | 769 | return (0); |
| 770 | 770 | } |
| 771 | − | |
| 772 | −EXPORT_SYMBOL(acpi_unmap_lsapic); | |
| 771 | +EXPORT_SYMBOL(acpi_unmap_cpu); | |
| 773 | 772 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ |
| 774 | 773 | |
| 775 | 774 | int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base) |
| @@ -170,7 +170,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr) · 169 unmodified lines | ||
| 170 | 170 | acpi_status status; |
| 171 | 171 | int ret; |
| 172 | 172 | |
| 173 | − if (pr->apic_id == -1) | |
| 173 | + if (pr->phys_id == -1) | |
| 174 | 174 | return -ENODEV; |
| 175 | 175 | |
| 176 | 176 | status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta); |
| @@ -180,13 +180,13 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr) · 3 unmodified lines | ||
| 180 | 180 | cpu_maps_update_begin(); |
| 181 | 181 | cpu_hotplug_begin(); |
| 182 | 182 | |
| 183 | − ret = acpi_map_lsapic(pr->handle, pr->apic_id, &pr->id); | |
| 183 | + ret = acpi_map_cpu(pr->handle, pr->phys_id, &pr->id); | |
| 184 | 184 | if (ret) |
| 185 | 185 | goto out; |
| 186 | 186 | |
| 187 | 187 | ret = arch_register_cpu(pr->id); |
| 188 | 188 | if (ret) { |
| 189 | − acpi_unmap_lsapic(pr->id); | |
| 189 | + acpi_unmap_cpu(pr->id); | |
| 190 | 190 | goto out; |
| 191 | 191 | } |
| 192 | 192 | |
| @@ -215,7 +215,7 @@ static int acpi_processor_get_info(struct acpi_device *device) · 22 unmodified lines | ||
| 215 | 215 | union acpi_object object = { 0 }; |
| 216 | 216 | struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; |
| 217 | 217 | struct acpi_processor *pr = acpi_driver_data(device); |
| 218 | − int apic_id, cpu_index, device_declaration = 0; | |
| 218 | + int phys_id, cpu_index, device_declaration = 0; | |
| 219 | 219 | acpi_status status = AE_OK; |
| 220 | 220 | static int cpu0_initialized; |
| 221 | 221 | unsigned long long value; |
| @@ -262,15 +262,18 @@ static int acpi_processor_get_info(struct acpi_device *device) · 40 unmodified lines | ||
| 262 | 262 | pr->acpi_id = value; |
| 263 | 263 | } |
| 264 | 264 | |
| 265 | − apic_id = acpi_get_apicid(pr->handle, device_declaration, pr->acpi_id); | |
| 266 | − if (apic_id < 0) | |
| 267 | − acpi_handle_debug(pr->handle, "failed to get CPU APIC ID.\n"); | |
| 268 | − pr->apic_id = apic_id; | |
| 265 | + phys_id = acpi_get_phys_id(pr->handle, device_declaration, pr->acpi_id); | |
| 266 | + if (phys_id < 0) | |
| 267 | + acpi_handle_debug(pr->handle, "failed to get CPU physical ID.\n"); | |
| 268 | + pr->phys_id = phys_id; | |
| 269 | 269 | |
| 270 | − cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id); | |
| 270 | + cpu_index = acpi_map_cpuid(pr->phys_id, pr->acpi_id); | |
| 271 | 271 | if (!cpu0_initialized && !acpi_has_cpu_in_madt()) { |
| 272 | 272 | cpu0_initialized = 1; |
| 273 | − /* Handle UP system running SMP kernel, with no LAPIC in MADT */ | |
| 273 | + /* | |
| 274 | + * Handle UP system running SMP kernel, with no CPU | |
| 275 | + * entry in MADT | |
| 276 | + */ | |
| 274 | 277 | if ((cpu_index == -1) && (num_online_cpus() == 1)) |
| 275 | 278 | cpu_index = 0; |
| 276 | 279 | } |
| @@ -458,7 +461,7 @@ static void acpi_processor_remove(struct acpi_device *device) · 181 unmodified lines | ||
| 458 | 461 | |
| 459 | 462 | /* Remove the CPU. */ |
| 460 | 463 | arch_unregister_cpu(pr->id); |
| 461 | − acpi_unmap_lsapic(pr->id); | |
| 464 | + acpi_unmap_cpu(pr->id); | |
| 462 | 465 | |
| 463 | 466 | cpu_hotplug_done(); |
| 464 | 467 | cpu_maps_update_done(); |
| @@ -257,7 +257,7 @@ int acpi_bus_init_power(struct acpi_device *device) · 256 unmodified lines | ||
| 257 | 257 | |
| 258 | 258 | device->power.state = ACPI_STATE_UNKNOWN; |
| 259 | 259 | if (!acpi_device_is_present(device)) |
| 260 | − return 0; | |
| 260 | + return -ENXIO; | |
| 261 | 261 | |
| 262 | 262 | result = acpi_device_get_power(device, &state); |
| 263 | 263 | if (result) |
| @@ -69,7 +69,7 @@ static int map_madt_entry(int type, u32 acpi_id) · 68 unmodified lines | ||
| 69 | 69 | unsigned long madt_end, entry; |
| 70 | 70 | static struct acpi_table_madt *madt; |
| 71 | 71 | static int read_madt; |
| 72 | − int apic_id = -1; | |
| 72 | + int phys_id = -1; /* CPU hardware ID */ | |
| 73 | 73 | |
| 74 | 74 | if (!read_madt) { |
| 75 | 75 | if (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0, |
| @@ -79,7 +79,7 @@ static int map_madt_entry(int type, u32 acpi_id) · 3 unmodified lines | ||
| 79 | 79 | } |
| 80 | 80 | |
| 81 | 81 | if (!madt) |
| 82 | − return apic_id; | |
| 82 | + return phys_id; | |
| 83 | 83 | |
| 84 | 84 | entry = (unsigned long)madt; |
| 85 | 85 | madt_end = entry + madt->header.length; |
| @@ -91,18 +91,18 @@ static int map_madt_entry(int type, u32 acpi_id) · 5 unmodified lines | ||
| 91 | 91 | struct acpi_subtable_header *header = |
| 92 | 92 | (struct acpi_subtable_header *)entry; |
| 93 | 93 | if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) { |
| 94 | − if (!map_lapic_id(header, acpi_id, &apic_id)) | |
| 94 | + if (!map_lapic_id(header, acpi_id, &phys_id)) | |
| 95 | 95 | break; |
| 96 | 96 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) { |
| 97 | − if (!map_x2apic_id(header, type, acpi_id, &apic_id)) | |
| 97 | + if (!map_x2apic_id(header, type, acpi_id, &phys_id)) | |
| 98 | 98 | break; |
| 99 | 99 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { |
| 100 | − if (!map_lsapic_id(header, type, acpi_id, &apic_id)) | |
| 100 | + if (!map_lsapic_id(header, type, acpi_id, &phys_id)) | |
| 101 | 101 | break; |
| 102 | 102 | } |
| 103 | 103 | entry += header->length; |
| 104 | 104 | } |
| 105 | − return apic_id; | |
| 105 | + return phys_id; | |
| 106 | 106 | } |
| 107 | 107 | |
| 108 | 108 | static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) |
| @@ -110,7 +110,7 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) · 1 unmodified line | ||
| 110 | 110 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 111 | 111 | union acpi_object *obj; |
| 112 | 112 | struct acpi_subtable_header *header; |
| 113 | − int apic_id = -1; | |
| 113 | + int phys_id = -1; | |
| 114 | 114 | |
| 115 | 115 | if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) |
| 116 | 116 | goto exit; |
| @@ -126,38 +126,38 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) · 9 unmodified lines | ||
| 126 | 126 | |
| 127 | 127 | header = (struct acpi_subtable_header *)obj->buffer.pointer; |
| 128 | 128 | if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) |
| 129 | − map_lapic_id(header, acpi_id, &apic_id); | |
| 129 | + map_lapic_id(header, acpi_id, &phys_id); | |
| 130 | 130 | else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) |
| 131 | − map_lsapic_id(header, type, acpi_id, &apic_id); | |
| 131 | + map_lsapic_id(header, type, acpi_id, &phys_id); | |
| 132 | 132 | else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) |
| 133 | − map_x2apic_id(header, type, acpi_id, &apic_id); | |
| 133 | + map_x2apic_id(header, type, acpi_id, &phys_id); | |
| 134 | 134 | |
| 135 | 135 | exit: |
| 136 | 136 | kfree(buffer.pointer); |
| 137 | − return apic_id; | |
| 137 | + return phys_id; | |
| 138 | 138 | } |
| 139 | 139 | |
| 140 | −int acpi_get_apicid(acpi_handle handle, int type, u32 acpi_id) | |
| 140 | +int acpi_get_phys_id(acpi_handle handle, int type, u32 acpi_id) | |
| 141 | 141 | { |
| 142 | − int apic_id; | |
| 142 | + int phys_id; | |
| 143 | 143 | |
| 144 | − apic_id = map_mat_entry(handle, type, acpi_id); | |
| 145 | − if (apic_id == -1) | |
| 146 | − apic_id = map_madt_entry(type, acpi_id); | |
| 144 | + phys_id = map_mat_entry(handle, type, acpi_id); | |
| 145 | + if (phys_id == -1) | |
| 146 | + phys_id = map_madt_entry(type, acpi_id); | |
| 147 | 147 | |
| 148 | − return apic_id; | |
| 148 | + return phys_id; | |
| 149 | 149 | } |
| 150 | 150 | |
| 151 | −int acpi_map_cpuid(int apic_id, u32 acpi_id) | |
| 151 | +int acpi_map_cpuid(int phys_id, u32 acpi_id) | |
| 152 | 152 | { |
| 153 | 153 | #ifdef CONFIG_SMP |
| 154 | 154 | int i; |
| 155 | 155 | #endif |
| 156 | 156 | |
| 157 | − if (apic_id == -1) { | |
| 157 | + if (phys_id == -1) { | |
| 158 | 158 | /* |
| 159 | 159 | * On UP processor, there is no _MAT or MADT table. |
| 160 | − * So above apic_id is always set to -1. | |
| 160 | + * So above phys_id is always set to -1. | |
| 161 | 161 | * |
| 162 | 162 | * BIOS may define multiple CPU handles even for UP processor. |
| 163 | 163 | * For example, |
| @@ -170,7 +170,7 @@ int acpi_map_cpuid(int apic_id, u32 acpi_id) · 6 unmodified lines | ||
| 170 | 170 | * Processor (CPU3, 0x03, 0x00000410, 0x06) {} |
| 171 | 171 | * } |
| 172 | 172 | * |
| 173 | − * Ignores apic_id and always returns 0 for the processor | |
| 173 | + * Ignores phys_id and always returns 0 for the processor | |
| 174 | 174 | * handle with acpi id 0 if nr_cpu_ids is 1. |
| 175 | 175 | * This should be the case if SMP tables are not found. |
| 176 | 176 | * Return -1 for other CPU's handle. |
| @@ -178,28 +178,28 @@ int acpi_map_cpuid(int apic_id, u32 acpi_id) · 1 unmodified line | ||
| 178 | 178 | if (nr_cpu_ids <= 1 && acpi_id == 0) |
| 179 | 179 | return acpi_id; |
| 180 | 180 | else |
| 181 | − return apic_id; | |
| 181 | + return phys_id; | |
| 182 | 182 | } |
| 183 | 183 | |
| 184 | 184 | #ifdef CONFIG_SMP |
| 185 | 185 | for_each_possible_cpu(i) { |
| 186 | − if (cpu_physical_id(i) == apic_id) | |
| 186 | + if (cpu_physical_id(i) == phys_id) | |
| 187 | 187 | return i; |
| 188 | 188 | } |
| 189 | 189 | #else |
| 190 | 190 | /* In UP kernel, only processor 0 is valid */ |
| 191 | − if (apic_id == 0) | |
| 192 | − return apic_id; | |
| 191 | + if (phys_id == 0) | |
| 192 | + return phys_id; | |
| 193 | 193 | #endif |
| 194 | 194 | return -1; |
| 195 | 195 | } |
| 196 | 196 | |
| 197 | 197 | int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) |
| 198 | 198 | { |
| 199 | − int apic_id; | |
| 199 | + int phys_id; | |
| 200 | 200 | |
| 201 | − apic_id = acpi_get_apicid(handle, type, acpi_id); | |
| 201 | + phys_id = acpi_get_phys_id(handle, type, acpi_id); | |
| 202 | 202 | |
| 203 | − return acpi_map_cpuid(apic_id, acpi_id); | |
| 203 | + return acpi_map_cpuid(phys_id, acpi_id); | |
| 204 | 204 | } |
| 205 | 205 | EXPORT_SYMBOL_GPL(acpi_get_cpuid); |
| @@ -1001,7 +1001,7 @@ static void acpi_free_power_resources_lists(struct acpi_device *device) · 1000 unmodified lines | ||
| 1001 | 1001 | if (device->wakeup.flags.valid) |
| 1002 | 1002 | acpi_power_resources_list_free(&device->wakeup.resources); |
| 1003 | 1003 | |
| 1004 | − if (!device->flags.power_manageable) | |
| 1004 | + if (!device->power.flags.power_resources) | |
| 1005 | 1005 | return; |
| 1006 | 1006 | |
| 1007 | 1007 | for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) { |
| @@ -1744,10 +1744,8 @@ static void acpi_bus_get_power_flags(struct acpi_device *device) · 736 unmodified lines | ||
| 1744 | 1744 | device->power.flags.power_resources) |
| 1745 | 1745 | device->power.states[ACPI_STATE_D3_COLD].flags.os_accessible = 1; |
| 1746 | 1746 | |
| 1747 | − if (acpi_bus_init_power(device)) { | |
| 1748 | − acpi_free_power_resources_lists(device); | |
| 1747 | + if (acpi_bus_init_power(device)) | |
| 1749 | 1748 | device->flags.power_manageable = 0; |
| 1750 | − } | |
| 1751 | 1749 | } |
| 1752 | 1750 | |
| 1753 | 1751 | static void acpi_bus_get_flags(struct acpi_device *device) |
| @@ -2371,13 +2369,18 @@ static void acpi_bus_attach(struct acpi_device *device) · 617 unmodified lines | ||
| 2371 | 2369 | /* Skip devices that are not present. */ |
| 2372 | 2370 | if (!acpi_device_is_present(device)) { |
| 2373 | 2371 | device->flags.visited = false; |
| 2372 | + device->flags.power_manageable = 0; | |
| 2374 | 2373 | return; |
| 2375 | 2374 | } |
| 2376 | 2375 | if (device->handler) |
| 2377 | 2376 | goto ok; |
| 2378 | 2377 | |
| 2379 | 2378 | if (!device->flags.initialized) { |
| 2380 | − acpi_bus_update_power(device, NULL); | |
| 2379 | + device->flags.power_manageable = | |
| 2380 | + device->power.states[ACPI_STATE_D0].flags.valid; | |
| 2381 | + if (acpi_bus_init_power(device)) | |
| 2382 | + device->flags.power_manageable = 0; | |
| 2383 | + | |
| 2381 | 2384 | device->flags.initialized = true; |
| 2382 | 2385 | } |
| 2383 | 2386 | device->flags.visited = false; |
| @@ -522,6 +522,16 @@ static struct dmi_system_id video_dmi_table[] __initdata = { · 521 unmodified lines | ||
| 522 | 522 | DMI_MATCH(DMI_PRODUCT_NAME, "370R4E/370R4V/370R5E/3570RE/370R5V"), |
| 523 | 523 | }, |
| 524 | 524 | }, |
| 525 | + | |
| 526 | + { | |
| 527 | + /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */ | |
| 528 | + .callback = video_disable_native_backlight, | |
| 529 | + .ident = "Dell XPS15 L521X", | |
| 530 | + .matches = { | |
| 531 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | |
| 532 | + DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"), | |
| 533 | + }, | |
| 534 | + }, | |
| 525 | 535 | {} |
| 526 | 536 | }; |
| 527 | 537 | |
| @@ -196,8 +196,8 @@ struct acpi_processor_flags { · 195 unmodified lines | ||
| 196 | 196 | struct acpi_processor { |
| 197 | 197 | acpi_handle handle; |
| 198 | 198 | u32 acpi_id; |
| 199 | − u32 apic_id; | |
| 200 | − u32 id; | |
| 199 | + u32 phys_id; /* CPU hardware ID such as APIC ID for x86 */ | |
| 200 | + u32 id; /* CPU logical ID allocated by OS */ | |
| 201 | 201 | u32 pblk; |
| 202 | 202 | int performance_platform_limit; |
| 203 | 203 | int throttling_platform_limit; |
| @@ -310,8 +310,8 @@ static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit) · 106 unmodified lines | ||
| 310 | 310 | #endif /* CONFIG_CPU_FREQ */ |
| 311 | 311 | |
| 312 | 312 | /* in processor_core.c */ |
| 313 | −int acpi_get_apicid(acpi_handle, int type, u32 acpi_id); | |
| 314 | −int acpi_map_cpuid(int apic_id, u32 acpi_id); | |
| 313 | +int acpi_get_phys_id(acpi_handle, int type, u32 acpi_id); | |
| 314 | +int acpi_map_cpuid(int phys_id, u32 acpi_id); | |
| 315 | 315 | int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id); |
| 316 | 316 | |
| 317 | 317 | /* in processor_pdc.c */ |
| @@ -147,8 +147,8 @@ void acpi_numa_arch_fixup(void); · 146 unmodified lines | ||
| 147 | 147 | |
| 148 | 148 | #ifdef CONFIG_ACPI_HOTPLUG_CPU |
| 149 | 149 | /* Arch dependent functions for cpu hotplug support */ |
| 150 | −int acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu); | |
| 151 | −int acpi_unmap_lsapic(int cpu); | |
| 150 | +int acpi_map_cpu(acpi_handle handle, int physid, int *pcpu); | |
| 151 | +int acpi_unmap_cpu(int cpu); | |
| 152 | 152 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ |
| 153 | 153 | |
| 154 | 154 | int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base); |