Lines Matching +full:timer +full:- +full:cannot +full:- +full:wake +full:- +full:cpu

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * boot.c - Architecture-Specific Low-Level ACPI Boot Support
22 #include <linux/efi-bgrt.h>
81 * ->device_hotplug_lock
82 * ->acpi_ioapic_lock
83 * ->ioapic_lock
85 * ->acpi_ioapic_lock
86 * ->ioapic_mutex
87 * ->ioapic_lock
92 /* --------------------------------------------------------------------------
93 Boot-time Configuration
94 -------------------------------------------------------------------------- */
138 return -EINVAL; in acpi_parse_madt()
143 return -ENODEV; in acpi_parse_madt()
146 if (madt->address) { in acpi_parse_madt()
147 acpi_lapic_addr = (u64) madt->address; in acpi_parse_madt()
149 pr_debug("Local APIC address 0x%08x\n", madt->address); in acpi_parse_madt()
152 if (madt->flags & ACPI_MADT_PCAT_COMPAT) in acpi_parse_madt()
161 default_acpi_madt_oem_check(madt->header.oem_id, in acpi_parse_madt()
162 madt->header.oem_table_id); in acpi_parse_madt()
168 * acpi_register_lapic - register a local apic and generates a logic cpu number
171 * @enabled: this cpu is enabled or not
173 * Returns the logic cpu number which maps to the local apic
177 int cpu; in acpi_register_lapic() local
181 return -EINVAL; in acpi_register_lapic()
186 return -EINVAL; in acpi_register_lapic()
189 cpu = generic_processor_info(id); in acpi_register_lapic()
190 if (cpu >= 0) in acpi_register_lapic()
191 early_per_cpu(x86_cpu_to_acpiid, cpu) = acpiid; in acpi_register_lapic()
193 return cpu; in acpi_register_lapic()
220 return -EINVAL; in acpi_parse_x2apic()
222 acpi_table_print_madt_entry(&header->common); in acpi_parse_x2apic()
225 apic_id = processor->local_apic_id; in acpi_parse_x2apic()
226 enabled = processor->lapic_flags & ACPI_MADT_ENABLED; in acpi_parse_x2apic()
232 /* don't register processors that cannot be onlined */ in acpi_parse_x2apic()
233 if (!acpi_is_processor_usable(processor->lapic_flags)) in acpi_parse_x2apic()
237 …://uefi.org/specs/ACPI/6.5/05_ACPI_Software_Programming_Model.html#processor-local-x2apic-structure in acpi_parse_x2apic()
245 * We need to register disabled CPU as well to permit in acpi_parse_x2apic()
249 * when we use CPU hotplug. in acpi_parse_x2apic()
257 acpi_register_lapic(apic_id, processor->uid, enabled); in acpi_parse_x2apic()
273 return -EINVAL; in acpi_parse_lapic()
275 acpi_table_print_madt_entry(&header->common); in acpi_parse_lapic()
278 if (processor->id == 0xff) in acpi_parse_lapic()
282 if (!acpi_is_processor_usable(processor->lapic_flags)) in acpi_parse_lapic()
286 * We need to register disabled CPU as well to permit in acpi_parse_lapic()
290 * when we use CPU hotplug. in acpi_parse_lapic()
292 acpi_register_lapic(processor->id, /* APIC ID */ in acpi_parse_lapic()
293 processor->processor_id, /* ACPI ID */ in acpi_parse_lapic()
294 processor->lapic_flags & ACPI_MADT_ENABLED); in acpi_parse_lapic()
308 return -EINVAL; in acpi_parse_sapic()
310 acpi_table_print_madt_entry(&header->common); in acpi_parse_sapic()
312 acpi_register_lapic((processor->id << 8) | processor->eid,/* APIC ID */ in acpi_parse_sapic()
313 processor->processor_id, /* ACPI ID */ in acpi_parse_sapic()
314 processor->lapic_flags & ACPI_MADT_ENABLED); in acpi_parse_sapic()
328 return -EINVAL; in acpi_parse_lapic_addr_ovr()
330 acpi_table_print_madt_entry(&header->common); in acpi_parse_lapic_addr_ovr()
332 acpi_lapic_addr = lapic_addr_ovr->address; in acpi_parse_lapic_addr_ovr()
346 return -EINVAL; in acpi_parse_x2apic_nmi()
348 acpi_table_print_madt_entry(&header->common); in acpi_parse_x2apic_nmi()
350 if (x2apic_nmi->lint != 1) in acpi_parse_x2apic_nmi()
364 return -EINVAL; in acpi_parse_lapic_nmi()
366 acpi_table_print_madt_entry(&header->common); in acpi_parse_lapic_nmi()
368 if (lapic_nmi->lint != 1) in acpi_parse_lapic_nmi()
392 * command, the CPU associated with the given apicid will be booted. in acpi_wakeup_cpu()
398 acpi_mp_wake_mailbox->apic_id = apicid; in acpi_wakeup_cpu()
399 acpi_mp_wake_mailbox->wakeup_vector = start_ip; in acpi_wakeup_cpu()
400 smp_store_release(&acpi_mp_wake_mailbox->command, in acpi_wakeup_cpu()
404 * Wait for the CPU to wake up. in acpi_wakeup_cpu()
406 * The CPU being woken up is essentially in a spin loop waiting to be in acpi_wakeup_cpu()
407 * woken up. It should not take long for it wake up and acknowledge by in acpi_wakeup_cpu()
408 * zeroing out ->command. in acpi_wakeup_cpu()
411 * has to wait for a wake up acknowledgement. It also doesn't provide in acpi_wakeup_cpu()
412 * a way to cancel a wake up request if it takes too long. in acpi_wakeup_cpu()
415 * wake up secondary. It can postpone scheduling secondary vCPU in acpi_wakeup_cpu()
416 * indefinitely. Giving up on wake up request and reporting error opens in acpi_wakeup_cpu()
417 * possible attack vector for VMM: it can wake up a secondary CPU when in acpi_wakeup_cpu()
418 * kernel doesn't expect it. Wait until positive result of the wake up in acpi_wakeup_cpu()
421 while (READ_ONCE(acpi_mp_wake_mailbox->command)) in acpi_wakeup_cpu()
447 * TBD: This check is for faulty timer entries, where the override in mp_override_legacy_irq()
449 * increase of timer interrupts! in mp_override_legacy_irq()
483 number = pdev->bus->number; in mp_config_acpi_gsi()
484 devfn = pdev->devfn; in mp_config_acpi_gsi()
485 pin = pdev->pin; in mp_config_acpi_gsi()
492 mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); in mp_config_acpi_gsi()
541 return -EINVAL; in acpi_parse_ioapic()
543 acpi_table_print_madt_entry(&header->common); in acpi_parse_ioapic()
546 if (ioapic->global_irq_base < nr_legacy_irqs()) in acpi_parse_ioapic()
549 mp_register_ioapic(ioapic->id, ioapic->address, ioapic->global_irq_base, in acpi_parse_ioapic()
566 /* Command-line over-ride via acpi_sci= */ in acpi_sci_ioapic_setup()
581 * stash over-ride to indicate we've been here in acpi_sci_ioapic_setup()
597 return -EINVAL; in acpi_parse_int_src_ovr()
599 acpi_table_print_madt_entry(&header->common); in acpi_parse_int_src_ovr()
601 if (intsrc->source_irq < NR_IRQS_LEGACY) in acpi_parse_int_src_ovr()
602 acpi_int_src_ovr[intsrc->source_irq] = true; in acpi_parse_int_src_ovr()
604 if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) { in acpi_parse_int_src_ovr()
605 acpi_sci_ioapic_setup(intsrc->source_irq, in acpi_parse_int_src_ovr()
606 intsrc->inti_flags & ACPI_MADT_POLARITY_MASK, in acpi_parse_int_src_ovr()
607 (intsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2, in acpi_parse_int_src_ovr()
608 intsrc->global_irq); in acpi_parse_int_src_ovr()
612 if (intsrc->source_irq == 0) { in acpi_parse_int_src_ovr()
618 if ((intsrc->global_irq == 2) && acpi_fix_pin2_polarity in acpi_parse_int_src_ovr()
619 && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) { in acpi_parse_int_src_ovr()
620 intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK; in acpi_parse_int_src_ovr()
625 mp_override_legacy_irq(intsrc->source_irq, in acpi_parse_int_src_ovr()
626 intsrc->inti_flags & ACPI_MADT_POLARITY_MASK, in acpi_parse_int_src_ovr()
627 (intsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2, in acpi_parse_int_src_ovr()
628 intsrc->global_irq); in acpi_parse_int_src_ovr()
641 return -EINVAL; in acpi_parse_nmi_src()
643 acpi_table_print_madt_entry(&header->common); in acpi_parse_nmi_src()
655 * use ELCR to set PIC-mode trigger type for SCI
657 * If a PIC-mode SCI is not recognized or gives spurious IRQ7's
658 * it may require Edge Trigger -- use "acpi_sci=edge"
660 * Port 0x4d0-4d1 are ELCR1 and ELCR2, the Edge/Level Control Registers
662 * ELCR1 is IRQs 0-7 (IRQ 0, 1, 2 must be 0)
663 * ELCR2 is IRQs 8-15 (IRQ 8, 13 must be 0)
686 case 1: /* Edge - clear */ in acpi_pic_sci_set_trigger()
689 case 3: /* Level - set */ in acpi_pic_sci_set_trigger()
734 return -1; in acpi_isa_irq_to_gsi()
742 * Make sure all (legacy) PCI IRQs are set as level-triggered. in acpi_register_gsi_pic()
828 * ACPI based hotplug support for CPU
833 static int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) in acpi_map_cpu2node() argument
841 numa_set_node(cpu, nid); in acpi_map_cpu2node()
850 int cpu; in acpi_map_cpu() local
852 cpu = acpi_register_lapic(physid, acpi_id, ACPI_MADT_ENABLED); in acpi_map_cpu()
853 if (cpu < 0) { in acpi_map_cpu()
854 pr_info("Unable to map lapic to logical cpu number\n"); in acpi_map_cpu()
855 return cpu; in acpi_map_cpu()
859 acpi_map_cpu2node(handle, cpu, physid); in acpi_map_cpu()
861 *pcpu = cpu; in acpi_map_cpu()
866 int acpi_unmap_cpu(int cpu) in acpi_unmap_cpu() argument
869 set_apicid_to_node(per_cpu(x86_cpu_to_apicid, cpu), NUMA_NO_NODE); in acpi_unmap_cpu()
872 per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID; in acpi_unmap_cpu()
873 set_cpu_present(cpu, false); in acpi_unmap_cpu()
874 num_processors--; in acpi_unmap_cpu()
883 int ret = -ENOSYS; in acpi_register_ioapic()
901 return -EINVAL; in acpi_register_ioapic()
917 int ret = -ENOSYS; in acpi_unregister_ioapic()
930 * acpi_ioapic_registered - Check whether IOAPIC associated with @gsi_base
955 sbf_port = sb->cmos_index; /* Save CMOS port */ in acpi_parse_sbf()
969 if (hpet_tbl->address.space_id != ACPI_SPACE_MEM) { in acpi_parse_hpet()
971 return -1; in acpi_parse_hpet()
974 hpet_address = hpet_tbl->address.address; in acpi_parse_hpet()
975 hpet_blockid = hpet_tbl->sequence; in acpi_parse_hpet()
982 pr_warn("HPET id: %#x base: %#lx is invalid\n", hpet_tbl->id, hpet_address); in acpi_parse_hpet()
994 hpet_tbl->id); in acpi_parse_hpet()
999 hpet_tbl->id); in acpi_parse_hpet()
1003 pr_info("HPET id: %#x base: %#lx\n", hpet_tbl->id, hpet_address); in acpi_parse_hpet()
1016 hpet_res->name = (void *)&hpet_res[1]; in acpi_parse_hpet()
1017 hpet_res->flags = IORESOURCE_MEM; in acpi_parse_hpet()
1018 snprintf((char *)hpet_res->name, HPET_RESOURCE_NAME_SIZE, "HPET %u", in acpi_parse_hpet()
1019 hpet_tbl->sequence); in acpi_parse_hpet()
1021 hpet_res->start = hpet_address; in acpi_parse_hpet()
1022 hpet_res->end = hpet_address + (1 * 1024) - 1; in acpi_parse_hpet()
1070 /* detect the location of the ACPI PM Timer */ in acpi_parse_fadt()
1090 pr_info("PM-Timer IO Port: %#x\n", pmtmr_ioport); in acpi_parse_fadt()
1106 return -ENODEV; in early_acpi_parse_madt_lapic_addr_ovr()
1109 * Note that the LAPIC address is obtained from the MADT (32-bit value) in early_acpi_parse_madt_lapic_addr_ovr()
1110 * and (optionally) overridden by a LAPIC_ADDR_OVR entry (64-bit value). in early_acpi_parse_madt_lapic_addr_ovr()
1130 return -ENODEV; in acpi_parse_madt_lapic_entries()
1144 return -ENODEV; in acpi_parse_madt_lapic_entries()
1170 return -ENODEV; in acpi_parse_mp_wake()
1174 return -EINVAL; in acpi_parse_mp_wake()
1176 acpi_table_print_madt_entry(&header->common); in acpi_parse_mp_wake()
1178 acpi_mp_wake_mailbox_paddr = mp_wake->base_address; in acpi_parse_mp_wake()
1203 * Use the default configuration for the IRQs 0-15. Unless in mp_config_acpi_legacy_irqs()
1229 if (irq->srcbus == MP_ISA_BUS && irq->srcbusirq == i) in mp_config_acpi_legacy_irqs()
1233 if (irq->dstapic == dstapic && irq->dstirq == pin) in mp_config_acpi_legacy_irqs()
1264 * so if it is off, don't enumerate the io-apics with ACPI. in acpi_parse_madt_ioapic_entries()
1269 return -ENODEV; in acpi_parse_madt_ioapic_entries()
1272 return -ENODEV; in acpi_parse_madt_ioapic_entries()
1275 * if "noapic" boot option, don't look for IO-APICs in acpi_parse_madt_ioapic_entries()
1279 return -ENODEV; in acpi_parse_madt_ioapic_entries()
1286 return -ENODEV; in acpi_parse_madt_ioapic_entries()
1325 return -1; in acpi_parse_madt_ioapic_entries()
1344 if (error == -EINVAL) { in early_acpi_process_madt()
1370 * Parse MADT IO-APIC entries in acpi_process_madt()
1383 * Parse MADT MP Wake entry. in acpi_process_madt()
1389 if (error == -EINVAL) { in acpi_process_madt()
1403 pr_warn("No APIC-table, disabling MPS\n"); in acpi_process_madt()
1409 * ACPI supports both logical (e.g. Hyper-Threading) and physical in acpi_process_madt()
1423 pr_notice("%s detected: force use of acpi=noirq\n", d->ident); in disable_acpi_irq()
1432 pr_notice("%s detected: force use of pci=noacpi\n", d->ident); in disable_acpi_pci()
1441 pr_notice("%s detected: force use of acpi=rsdt\n", d->ident); in disable_acpi_xsdt()
1452 pr_notice("%s detected: acpi off\n", d->ident); in dmi_disable_acpi()
1467 d->ident); in dmi_ignore_irq0_timer_override()
1478 * We initialize the Hardware-reduced ACPI model here:
1499 * works for you, please contact linux-acpi@vger.kernel.org
1555 .ident = "ASUS PR-DLS",
1558 DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"),
1560 "ASUS PR-DLS ACPI BIOS Revision 1010"),
1577 .ident = "Advantech DAC-BJ01",
1588 /* second table for DMI checks that should run after early-quirks */
1604 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1612 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1620 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1628 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1648 * 3. enumerates io-apics
1673 * Initialize the ACPI boot-time table parser. in acpi_boot_table_init()
1709 * Hardware-reduced ACPI mode initialization: in early_acpi_boot_init()
1718 /* those are executed after early-quirks are executed */ in acpi_boot_init()
1730 * set sci_int and PM timer address in acpi_boot_init()
1754 return -EINVAL; in parse_acpi()
1760 /* acpi=force to over-ride black-list */ in parse_acpi()
1765 /* acpi=strict disables out-of-spec workarounds */ in parse_acpi()
1786 return -EINVAL; in parse_acpi()
1811 /* mptable code is not built-in*/ in acpi_mps_check()
1813 …pr_warn("MPS support code is not built-in, using acpi=off or acpi=noirq or pci=noacpi may have pro… in acpi_mps_check()
1839 return -EINVAL; in setup_acpi_sci()
1853 return -EINVAL; in setup_acpi_sci()
1871 return -1; in __acpi_acquire_global_lock()