Lines Matching +full:processor +full:- +full:b +full:- +full:side
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>
75 * Hotplug side:
76 * ->device_hotplug_lock
77 * ->acpi_ioapic_lock
78 * ->ioapic_lock
79 * Interrupt mapping side:
80 * ->acpi_ioapic_lock
81 * ->ioapic_mutex
82 * ->ioapic_lock
87 /* --------------------------------------------------------------------------
88 Boot-time Configuration
89 -------------------------------------------------------------------------- */
133 return -EINVAL; in acpi_parse_madt()
138 return -ENODEV; in acpi_parse_madt()
141 if (madt->address) { in acpi_parse_madt()
142 acpi_lapic_addr = (u64) madt->address; in acpi_parse_madt()
144 pr_debug("Local APIC address 0x%08x\n", madt->address); in acpi_parse_madt()
147 if (madt->flags & ACPI_MADT_PCAT_COMPAT) in acpi_parse_madt()
156 default_acpi_madt_oem_check(madt->header.oem_id, in acpi_parse_madt()
157 madt->header.oem_table_id); in acpi_parse_madt()
177 struct acpi_madt_local_x2apic *processor = NULL; in acpi_parse_x2apic() local
183 processor = (struct acpi_madt_local_x2apic *)header; in acpi_parse_x2apic()
185 if (BAD_MADT_ENTRY(processor, end)) in acpi_parse_x2apic()
186 return -EINVAL; in acpi_parse_x2apic()
188 acpi_table_print_madt_entry(&header->common); in acpi_parse_x2apic()
191 apic_id = processor->local_apic_id; in acpi_parse_x2apic()
192 enabled = processor->lapic_flags & ACPI_MADT_ENABLED; in acpi_parse_x2apic()
199 if (!acpi_is_processor_usable(processor->lapic_flags)) in acpi_parse_x2apic()
203 …://uefi.org/specs/ACPI/6.5/05_ACPI_Software_Programming_Model.html#processor-local-x2apic-structure in acpi_parse_x2apic()
223 topology_register_apic(apic_id, processor->uid, enabled); in acpi_parse_x2apic()
234 struct acpi_madt_local_apic *processor = NULL; in acpi_check_lapic() local
236 processor = (struct acpi_madt_local_apic *)header; in acpi_check_lapic()
238 if (BAD_MADT_ENTRY(processor, end)) in acpi_check_lapic()
239 return -EINVAL; in acpi_check_lapic()
242 if (processor->id == 0xff) in acpi_check_lapic()
246 if (!acpi_is_processor_usable(processor->lapic_flags)) in acpi_check_lapic()
256 struct acpi_madt_local_apic *processor = NULL; in acpi_parse_lapic() local
258 processor = (struct acpi_madt_local_apic *)header; in acpi_parse_lapic()
260 if (BAD_MADT_ENTRY(processor, end)) in acpi_parse_lapic()
261 return -EINVAL; in acpi_parse_lapic()
263 acpi_table_print_madt_entry(&header->common); in acpi_parse_lapic()
266 if (processor->id == 0xff) in acpi_parse_lapic()
270 if (!acpi_is_processor_usable(processor->lapic_flags)) in acpi_parse_lapic()
280 topology_register_apic(processor->id, /* APIC ID */ in acpi_parse_lapic()
281 processor->processor_id, /* ACPI ID */ in acpi_parse_lapic()
282 processor->lapic_flags & ACPI_MADT_ENABLED); in acpi_parse_lapic()
290 struct acpi_madt_local_sapic *processor = NULL; in acpi_parse_sapic() local
292 processor = (struct acpi_madt_local_sapic *)header; in acpi_parse_sapic()
294 if (BAD_MADT_ENTRY(processor, end)) in acpi_parse_sapic()
295 return -EINVAL; in acpi_parse_sapic()
297 acpi_table_print_madt_entry(&header->common); in acpi_parse_sapic()
299 topology_register_apic((processor->id << 8) | processor->eid,/* APIC ID */ in acpi_parse_sapic()
300 processor->processor_id, /* ACPI ID */ in acpi_parse_sapic()
301 processor->lapic_flags & ACPI_MADT_ENABLED); in acpi_parse_sapic()
315 return -EINVAL; in acpi_parse_lapic_addr_ovr()
317 acpi_table_print_madt_entry(&header->common); in acpi_parse_lapic_addr_ovr()
319 acpi_lapic_addr = lapic_addr_ovr->address; in acpi_parse_lapic_addr_ovr()
333 return -EINVAL; in acpi_parse_x2apic_nmi()
335 acpi_table_print_madt_entry(&header->common); in acpi_parse_x2apic_nmi()
337 if (x2apic_nmi->lint != 1) in acpi_parse_x2apic_nmi()
351 return -EINVAL; in acpi_parse_lapic_nmi()
353 acpi_table_print_madt_entry(&header->common); in acpi_parse_lapic_nmi()
355 if (lapic_nmi->lint != 1) in acpi_parse_lapic_nmi()
416 number = pdev->bus->number; in mp_config_acpi_gsi()
417 devfn = pdev->devfn; in mp_config_acpi_gsi()
418 pin = pdev->pin; in mp_config_acpi_gsi()
425 mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); in mp_config_acpi_gsi()
474 return -EINVAL; in acpi_parse_ioapic()
476 acpi_table_print_madt_entry(&header->common); in acpi_parse_ioapic()
479 if (ioapic->global_irq_base < nr_legacy_irqs()) in acpi_parse_ioapic()
482 mp_register_ioapic(ioapic->id, ioapic->address, ioapic->global_irq_base, in acpi_parse_ioapic()
499 /* Command-line over-ride via acpi_sci= */ in acpi_sci_ioapic_setup()
514 * stash over-ride to indicate we've been here in acpi_sci_ioapic_setup()
530 return -EINVAL; in acpi_parse_int_src_ovr()
532 acpi_table_print_madt_entry(&header->common); in acpi_parse_int_src_ovr()
534 if (intsrc->source_irq < NR_IRQS_LEGACY) in acpi_parse_int_src_ovr()
535 acpi_int_src_ovr[intsrc->source_irq] = true; in acpi_parse_int_src_ovr()
537 if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) { in acpi_parse_int_src_ovr()
538 acpi_sci_ioapic_setup(intsrc->source_irq, in acpi_parse_int_src_ovr()
539 intsrc->inti_flags & ACPI_MADT_POLARITY_MASK, in acpi_parse_int_src_ovr()
540 (intsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2, in acpi_parse_int_src_ovr()
541 intsrc->global_irq); in acpi_parse_int_src_ovr()
545 if (intsrc->source_irq == 0) { in acpi_parse_int_src_ovr()
551 if ((intsrc->global_irq == 2) && acpi_fix_pin2_polarity in acpi_parse_int_src_ovr()
552 && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) { in acpi_parse_int_src_ovr()
553 intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK; in acpi_parse_int_src_ovr()
558 mp_override_legacy_irq(intsrc->source_irq, in acpi_parse_int_src_ovr()
559 intsrc->inti_flags & ACPI_MADT_POLARITY_MASK, in acpi_parse_int_src_ovr()
560 (intsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2, in acpi_parse_int_src_ovr()
561 intsrc->global_irq); in acpi_parse_int_src_ovr()
574 return -EINVAL; in acpi_parse_nmi_src()
576 acpi_table_print_madt_entry(&header->common); in acpi_parse_nmi_src()
588 * use ELCR to set PIC-mode trigger type for SCI
590 * If a PIC-mode SCI is not recognized or gives spurious IRQ7's
591 * it may require Edge Trigger -- use "acpi_sci=edge"
593 * Port 0x4d0-4d1 are ELCR1 and ELCR2, the Edge/Level Control Registers
595 * ELCR1 is IRQs 0-7 (IRQ 0, 1, 2 must be 0)
596 * ELCR2 is IRQs 8-15 (IRQ 8, 13 must be 0)
619 case 1: /* Edge - clear */ in acpi_pic_sci_set_trigger()
622 case 3: /* Level - set */ in acpi_pic_sci_set_trigger()
667 return -1; in acpi_isa_irq_to_gsi()
675 * Make sure all (legacy) PCI IRQs are set as level-triggered. in acpi_register_gsi_pic()
764 #include <acpi/processor.h>
810 int ret = -ENOSYS; in acpi_register_ioapic()
828 return -EINVAL; in acpi_register_ioapic()
844 int ret = -ENOSYS; in acpi_unregister_ioapic()
857 * acpi_ioapic_registered - Check whether IOAPIC associated with @gsi_base
882 sbf_port = sb->cmos_index; /* Save CMOS port */ in acpi_parse_sbf()
896 if (hpet_tbl->address.space_id != ACPI_SPACE_MEM) { in acpi_parse_hpet()
898 return -1; in acpi_parse_hpet()
901 hpet_address = hpet_tbl->address.address; in acpi_parse_hpet()
902 hpet_blockid = hpet_tbl->sequence; in acpi_parse_hpet()
909 pr_warn("HPET id: %#x base: %#lx is invalid\n", hpet_tbl->id, hpet_address); in acpi_parse_hpet()
921 hpet_tbl->id); in acpi_parse_hpet()
926 hpet_tbl->id); in acpi_parse_hpet()
930 pr_info("HPET id: %#x base: %#lx\n", hpet_tbl->id, hpet_address); in acpi_parse_hpet()
940 hpet_res->name = (void *)&hpet_res[1]; in acpi_parse_hpet()
941 hpet_res->flags = IORESOURCE_MEM; in acpi_parse_hpet()
942 snprintf((char *)hpet_res->name, HPET_RESOURCE_NAME_SIZE, "HPET %u", in acpi_parse_hpet()
943 hpet_tbl->sequence); in acpi_parse_hpet()
945 hpet_res->start = hpet_address; in acpi_parse_hpet()
946 hpet_res->end = hpet_address + (1 * 1024) - 1; in acpi_parse_hpet()
1014 pr_info("PM-Timer IO Port: %#x\n", pmtmr_ioport); in acpi_parse_fadt()
1030 return -ENODEV; in early_acpi_parse_madt_lapic_addr_ovr()
1033 * Note that the LAPIC address is obtained from the MADT (32-bit value) in early_acpi_parse_madt_lapic_addr_ovr()
1034 * and (optionally) overridden by a LAPIC_ADDR_OVR entry (64-bit value). in early_acpi_parse_madt_lapic_addr_ovr()
1056 return -ENODEV; in acpi_parse_madt_lapic_entries()
1087 return -ENODEV; in acpi_parse_madt_lapic_entries()
1123 * Use the default configuration for the IRQs 0-15. Unless in mp_config_acpi_legacy_irqs()
1149 if (irq->srcbus == MP_ISA_BUS && irq->srcbusirq == i) in mp_config_acpi_legacy_irqs()
1153 if (irq->dstapic == dstapic && irq->dstirq == pin) in mp_config_acpi_legacy_irqs()
1184 * so if it is off, don't enumerate the io-apics with ACPI. in acpi_parse_madt_ioapic_entries()
1189 return -ENODEV; in acpi_parse_madt_ioapic_entries()
1192 return -ENODEV; in acpi_parse_madt_ioapic_entries()
1195 * if "noapic" boot option, don't look for IO-APICs in acpi_parse_madt_ioapic_entries()
1199 return -ENODEV; in acpi_parse_madt_ioapic_entries()
1206 return -ENODEV; in acpi_parse_madt_ioapic_entries()
1247 return -1; in acpi_parse_madt_ioapic_entries()
1266 if (error == -EINVAL) { in early_acpi_process_madt()
1292 * Parse MADT IO-APIC entries in acpi_process_madt()
1311 if (error == -EINVAL) { in acpi_process_madt()
1325 pr_warn("No APIC-table, disabling MPS\n"); in acpi_process_madt()
1331 * ACPI supports both logical (e.g. Hyper-Threading) and physical in acpi_process_madt()
1337 pr_info("Using ACPI for processor (LAPIC) configuration information\n"); in acpi_process_madt()
1345 pr_notice("%s detected: force use of acpi=noirq\n", d->ident); in disable_acpi_irq()
1354 pr_notice("%s detected: force use of pci=noacpi\n", d->ident); in disable_acpi_pci()
1363 pr_notice("%s detected: force use of acpi=rsdt\n", d->ident); in disable_acpi_xsdt()
1374 pr_notice("%s detected: acpi off\n", d->ident); in dmi_disable_acpi()
1389 d->ident); in dmi_ignore_irq0_timer_override()
1400 * We initialize the Hardware-reduced ACPI model here:
1421 * works for you, please contact linux-[email protected]
1477 .ident = "ASUS PR-DLS",
1480 DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"),
1482 "ASUS PR-DLS ACPI BIOS Revision 1010"),
1499 .ident = "Advantech DAC-BJ01",
1510 /* second table for DMI checks that should run after early-quirks */
1526 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1534 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1542 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1548 .ident = "HP 6715b laptop",
1550 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1551 DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"),
1570 * 3. enumerates io-apics
1573 * other side effects.
1575 * side effects of acpi_boot_init:
1595 * Initialize the ACPI boot-time table parser. in acpi_boot_table_init()
1631 * Hardware-reduced ACPI mode initialization: in early_acpi_boot_init()
1640 /* those are executed after early-quirks are executed */ in acpi_boot_init()
1676 return -EINVAL; in parse_acpi()
1682 /* acpi=force to over-ride black-list */ in parse_acpi()
1687 /* acpi=strict disables out-of-spec workarounds */ in parse_acpi()
1708 return -EINVAL; in parse_acpi()
1733 /* mptable code is not built-in*/ in acpi_mps_check()
1744 …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()
1770 return -EINVAL; in setup_acpi_sci()
1784 return -EINVAL; in setup_acpi_sci()
1802 return -1; in __acpi_acquire_global_lock()