Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'pm+acpi-3.19-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

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

+75 -61
+4 -5
arch/ia64/kernel/acpi.c
··· 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 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
+4 -5
arch/x86/kernel/acpi/boot.c
··· 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 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)
+14 -11
drivers/acpi/acpi_processor.c
··· 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 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 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 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 } ··· 461 458 462 459 /* Remove the CPU. */ 463 460 arch_unregister_cpu(pr->id); 464 - acpi_unmap_lsapic(pr->id); 461 + acpi_unmap_cpu(pr->id); 465 462 466 463 cpu_hotplug_done(); 467 464 cpu_maps_update_done();
+1 -1
drivers/acpi/device_pm.c
··· 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)
+28 -28
drivers/acpi/processor_core.c
··· 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 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 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 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 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 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 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);
+8 -5
drivers/acpi/scan.c
··· 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 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) ··· 2369 2371 /* Skip devices that are not present. */ 2370 2372 if (!acpi_device_is_present(device)) { 2371 2373 device->flags.visited = false; 2374 + device->flags.power_manageable = 0; 2372 2375 return; 2373 2376 } 2374 2377 if (device->handler) 2375 2378 goto ok; 2376 2379 2377 2380 if (!device->flags.initialized) { 2378 - acpi_bus_update_power(device, NULL); 2381 + device->flags.power_manageable = 2382 + device->power.states[ACPI_STATE_D0].flags.valid; 2383 + if (acpi_bus_init_power(device)) 2384 + device->flags.power_manageable = 0; 2385 + 2379 2386 device->flags.initialized = true; 2380 2387 } 2381 2388 device->flags.visited = false;
+10
drivers/acpi/video.c
··· 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
+4 -4
include/acpi/processor.h
··· 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 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 */
+2 -2
include/linux/acpi.h
··· 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);