^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * boot.c - Architecture-Specific Low-Level ACPI Boot Support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/acpi_pmtmr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/efi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/cpumask.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/memblock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/ioport.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/efi-bgrt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/serial_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/pgtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <asm/e820/api.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <asm/irqdomain.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <asm/pci_x86.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <asm/io_apic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <asm/apic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <asm/mpspec.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <asm/smp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <asm/i8259.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <asm/setup.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "sleep.h" /* To include x86_acpi_suspend_lowlevel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static int __initdata acpi_force = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) int acpi_disabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) EXPORT_SYMBOL(acpi_disabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #ifdef CONFIG_X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) # include <asm/proto.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #endif /* X86 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define PREFIX "ACPI: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int acpi_noirq; /* skip ACPI IRQ initialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) static int acpi_nobgrt; /* skip ACPI BGRT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int acpi_pci_disabled; /* skip ACPI PCI scan and IRQ initialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) EXPORT_SYMBOL(acpi_pci_disabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) int acpi_lapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) int acpi_ioapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) int acpi_strict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int acpi_disable_cmcff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /* ACPI SCI override configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) u8 acpi_sci_flags __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) u32 acpi_sci_override_gsi __initdata = INVALID_ACPI_IRQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) int acpi_skip_timer_override __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) int acpi_use_timer_override __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) int acpi_fix_pin2_polarity __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #ifdef CONFIG_X86_LOCAL_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #ifdef CONFIG_X86_IO_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * Locks related to IOAPIC hotplug
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * Hotplug side:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * ->device_hotplug_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * ->acpi_ioapic_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * ->ioapic_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * Interrupt mapping side:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * ->acpi_ioapic_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * ->ioapic_mutex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) * ->ioapic_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static DEFINE_MUTEX(acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* --------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) Boot-time Configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) -------------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * The default interrupt routing model is PIC (8259). This gets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * overridden if IOAPICs are enumerated (below).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * ISA irqs by default are the first 16 gsis but can be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * any gsi as specified by an interrupt source override.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static u32 isa_irq_to_gsi[NR_IRQS_LEGACY] __read_mostly = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) * This is just a simple wrapper around early_memremap(),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) * with sanity checks for phys == 0 and size == 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) void __init __iomem *__acpi_map_table(unsigned long phys, unsigned long size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) if (!phys || !size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) return early_memremap(phys, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) void __init __acpi_unmap_table(void __iomem *map, unsigned long size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (!map || !size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) early_memunmap(map, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #ifdef CONFIG_X86_LOCAL_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static int __init acpi_parse_madt(struct acpi_table_header *table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct acpi_table_madt *madt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) if (!boot_cpu_has(X86_FEATURE_APIC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) madt = (struct acpi_table_madt *)table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) if (!madt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) printk(KERN_WARNING PREFIX "Unable to map MADT\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) if (madt->address) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) acpi_lapic_addr = (u64) madt->address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) printk(KERN_DEBUG PREFIX "Local APIC address 0x%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) madt->address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) default_acpi_madt_oem_check(madt->header.oem_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) madt->header.oem_table_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * acpi_register_lapic - register a local apic and generates a logic cpu number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * @id: local apic id to register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) * @acpiid: ACPI id to register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) * @enabled: this cpu is enabled or not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * Returns the logic cpu number which maps to the local apic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static int acpi_register_lapic(int id, u32 acpiid, u8 enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) unsigned int ver = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) int cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) if (id >= MAX_LOCAL_APIC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) printk(KERN_INFO PREFIX "skipped apicid that is too big\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) if (!enabled) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) ++disabled_cpus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) if (boot_cpu_physical_apicid != -1U)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) ver = boot_cpu_apic_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) cpu = generic_processor_info(id, ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if (cpu >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) early_per_cpu(x86_cpu_to_acpiid, cpu) = acpiid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) return cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) acpi_parse_x2apic(union acpi_subtable_headers *header, const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct acpi_madt_local_x2apic *processor = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #ifdef CONFIG_X86_X2APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) u32 apic_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) u8 enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) processor = (struct acpi_madt_local_x2apic *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (BAD_MADT_ENTRY(processor, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #ifdef CONFIG_X86_X2APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) apic_id = processor->local_apic_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) enabled = processor->lapic_flags & ACPI_MADT_ENABLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /* Ignore invalid ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (apic_id == 0xffffffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) * We need to register disabled CPU as well to permit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) * counting disabled CPUs. This allows us to size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * cpus_possible_map more accurately, to permit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) * to not preallocating memory for all NR_CPUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) * when we use CPU hotplug.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) if (!apic->apic_id_valid(apic_id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) pr_warn(PREFIX "x2apic entry ignored\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) acpi_register_lapic(apic_id, processor->uid, enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) printk(KERN_WARNING PREFIX "x2apic entry ignored\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) acpi_parse_lapic(union acpi_subtable_headers * header, const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct acpi_madt_local_apic *processor = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) processor = (struct acpi_madt_local_apic *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (BAD_MADT_ENTRY(processor, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) /* Ignore invalid ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) if (processor->id == 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) * We need to register disabled CPU as well to permit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) * counting disabled CPUs. This allows us to size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * cpus_possible_map more accurately, to permit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) * to not preallocating memory for all NR_CPUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) * when we use CPU hotplug.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) acpi_register_lapic(processor->id, /* APIC ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) processor->processor_id, /* ACPI ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) processor->lapic_flags & ACPI_MADT_ENABLED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) acpi_parse_sapic(union acpi_subtable_headers *header, const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) struct acpi_madt_local_sapic *processor = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) processor = (struct acpi_madt_local_sapic *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (BAD_MADT_ENTRY(processor, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) acpi_register_lapic((processor->id << 8) | processor->eid,/* APIC ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) processor->processor_id, /* ACPI ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) processor->lapic_flags & ACPI_MADT_ENABLED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) acpi_parse_lapic_addr_ovr(union acpi_subtable_headers * header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) struct acpi_madt_local_apic_override *lapic_addr_ovr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) lapic_addr_ovr = (struct acpi_madt_local_apic_override *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (BAD_MADT_ENTRY(lapic_addr_ovr, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) acpi_lapic_addr = lapic_addr_ovr->address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) acpi_parse_x2apic_nmi(union acpi_subtable_headers *header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) struct acpi_madt_local_x2apic_nmi *x2apic_nmi = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) x2apic_nmi = (struct acpi_madt_local_x2apic_nmi *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if (BAD_MADT_ENTRY(x2apic_nmi, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) if (x2apic_nmi->lint != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) acpi_parse_lapic_nmi(union acpi_subtable_headers * header, const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) struct acpi_madt_local_apic_nmi *lapic_nmi = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) lapic_nmi = (struct acpi_madt_local_apic_nmi *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (BAD_MADT_ENTRY(lapic_nmi, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) if (lapic_nmi->lint != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) #endif /*CONFIG_X86_LOCAL_APIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #ifdef CONFIG_X86_IO_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #define MP_ISA_BUS 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) static int __init mp_register_ioapic_irq(u8 bus_irq, u8 polarity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) u8 trigger, u32 gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) static void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) u32 gsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) * Check bus_irq boundary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if (bus_irq >= NR_IRQS_LEGACY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) pr_warn("Invalid bus_irq %u for legacy override\n", bus_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) * TBD: This check is for faulty timer entries, where the override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) * erroneously sets the trigger to level, resulting in a HUGE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) * increase of timer interrupts!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if ((bus_irq == 0) && (trigger == 3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) trigger = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) if (mp_register_ioapic_irq(bus_irq, polarity, trigger, gsi) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * Reset default identity mapping if gsi is also an legacy IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * otherwise there will be more than one entry with the same GSI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * and acpi_isa_irq_to_gsi() may give wrong result.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) if (gsi < nr_legacy_irqs() && isa_irq_to_gsi[gsi] == gsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) isa_irq_to_gsi[gsi] = INVALID_ACPI_IRQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) isa_irq_to_gsi[bus_irq] = gsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) int polarity)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) #ifdef CONFIG_X86_MPPARSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) struct mpc_intsrc mp_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) struct pci_dev *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) unsigned char number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) unsigned int devfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) int ioapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) u8 pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) if (!acpi_ioapic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) if (!dev || !dev_is_pci(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) pdev = to_pci_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) number = pdev->bus->number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) devfn = pdev->devfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) pin = pdev->pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) /* print the entry should happen on mptable identically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) mp_irq.type = MP_INTSRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) mp_irq.irqtype = mp_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) mp_irq.irqflag = (trigger == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) (polarity == ACPI_ACTIVE_HIGH ? 1 : 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) mp_irq.srcbus = number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) ioapic = mp_find_ioapic(gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) mp_irq.dstapic = mpc_ioapic_id(ioapic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) mp_save_irq(&mp_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) static int __init mp_register_ioapic_irq(u8 bus_irq, u8 polarity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) u8 trigger, u32 gsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) struct mpc_intsrc mp_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) int ioapic, pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) /* Convert 'gsi' to 'ioapic.pin'(INTIN#) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) ioapic = mp_find_ioapic(gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (ioapic < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) pr_warn("Failed to find ioapic for gsi : %u\n", gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) return ioapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) pin = mp_find_ioapic_pin(ioapic, gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) mp_irq.type = MP_INTSRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) mp_irq.irqtype = mp_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) mp_irq.irqflag = (trigger << 2) | polarity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) mp_irq.srcbus = MP_ISA_BUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) mp_irq.srcbusirq = bus_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) mp_irq.dstapic = mpc_ioapic_id(ioapic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) mp_irq.dstirq = pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) mp_save_irq(&mp_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) acpi_parse_ioapic(union acpi_subtable_headers * header, const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) struct acpi_madt_io_apic *ioapic = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) struct ioapic_domain_cfg cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .type = IOAPIC_DOMAIN_DYNAMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) .ops = &mp_ioapic_irqdomain_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) ioapic = (struct acpi_madt_io_apic *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (BAD_MADT_ENTRY(ioapic, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /* Statically assign IRQ numbers for IOAPICs hosting legacy IRQs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if (ioapic->global_irq_base < nr_legacy_irqs())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) cfg.type = IOAPIC_DOMAIN_LEGACY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) mp_register_ioapic(ioapic->id, ioapic->address, ioapic->global_irq_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) * Parse Interrupt Source Override for the ACPI SCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static void __init acpi_sci_ioapic_setup(u8 bus_irq, u16 polarity, u16 trigger, u32 gsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (trigger == 0) /* compatible SCI trigger is level */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) trigger = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (polarity == 0) /* compatible SCI polarity is low */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) polarity = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) /* Command-line over-ride via acpi_sci= */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (acpi_sci_flags & ACPI_MADT_TRIGGER_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) trigger = (acpi_sci_flags & ACPI_MADT_TRIGGER_MASK) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (acpi_sci_flags & ACPI_MADT_POLARITY_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) polarity = acpi_sci_flags & ACPI_MADT_POLARITY_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (bus_irq < NR_IRQS_LEGACY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) mp_override_legacy_irq(bus_irq, polarity, trigger, gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) mp_register_ioapic_irq(bus_irq, polarity, trigger, gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) acpi_penalize_sci_irq(bus_irq, trigger, polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) * stash over-ride to indicate we've been here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) * and for later update of acpi_gbl_FADT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) acpi_sci_override_gsi = gsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) acpi_parse_int_src_ovr(union acpi_subtable_headers * header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) struct acpi_madt_interrupt_override *intsrc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) intsrc = (struct acpi_madt_interrupt_override *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) if (BAD_MADT_ENTRY(intsrc, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) acpi_sci_ioapic_setup(intsrc->source_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) intsrc->inti_flags & ACPI_MADT_POLARITY_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) (intsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) intsrc->global_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) if (intsrc->source_irq == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) if (acpi_skip_timer_override) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) printk(PREFIX "BIOS IRQ0 override ignored.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) if ((intsrc->global_irq == 2) && acpi_fix_pin2_polarity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) printk(PREFIX "BIOS IRQ0 pin2 override: forcing polarity to high active.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) mp_override_legacy_irq(intsrc->source_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) intsrc->inti_flags & ACPI_MADT_POLARITY_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) (intsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) intsrc->global_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) acpi_parse_nmi_src(union acpi_subtable_headers * header, const unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) struct acpi_madt_nmi_source *nmi_src = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) nmi_src = (struct acpi_madt_nmi_source *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) if (BAD_MADT_ENTRY(nmi_src, end))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) acpi_table_print_madt_entry(&header->common);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) /* TBD: Support nimsrc entries? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) #endif /* CONFIG_X86_IO_APIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) * acpi_pic_sci_set_trigger()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) * use ELCR to set PIC-mode trigger type for SCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) * If a PIC-mode SCI is not recognized or gives spurious IRQ7's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * it may require Edge Trigger -- use "acpi_sci=edge"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) * for the 8259 PIC. bit[n] = 1 means irq[n] is Level, otherwise Edge.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) * ECLR1 is IRQs 0-7 (IRQ 0, 1, 2 must be 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) * ECLR2 is IRQs 8-15 (IRQ 8, 13 must be 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) unsigned int mask = 1 << irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) unsigned int old, new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) /* Real old ELCR mask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) old = inb(0x4d0) | (inb(0x4d1) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) * If we use ACPI to set PCI IRQs, then we should clear ELCR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) * since we will set it correctly as we enable the PCI irq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) * routing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) new = acpi_noirq ? old : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) * Update SCI information in the ELCR, it isn't in the PCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) * routing tables..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) switch (trigger) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) case 1: /* Edge - clear */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) new &= ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) case 3: /* Level - set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) new |= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) if (old == new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) printk(PREFIX "setting ELCR to %04x (from %04x)\n", new, old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) outb(new, 0x4d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) outb(new >> 8, 0x4d1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) int rc, irq, trigger, polarity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) *irqp = gsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) rc = acpi_get_override_irq(gsi, &trigger, &polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) irq = acpi_register_gsi(NULL, gsi, trigger, polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) if (irq < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) return irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) *irqp = irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) if (isa_irq < nr_legacy_irqs() &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) isa_irq_to_gsi[isa_irq] != INVALID_ACPI_IRQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) *gsi = isa_irq_to_gsi[isa_irq];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) static int acpi_register_gsi_pic(struct device *dev, u32 gsi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) int trigger, int polarity)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) #ifdef CONFIG_PCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) * Make sure all (legacy) PCI IRQs are set as level-triggered.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) if (trigger == ACPI_LEVEL_SENSITIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) elcr_set_level_irq(gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) return gsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) #ifdef CONFIG_X86_LOCAL_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) int trigger, int polarity)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) int irq = gsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) #ifdef CONFIG_X86_IO_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) int node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) struct irq_alloc_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) node = dev ? dev_to_node(dev) : NUMA_NO_NODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) trigger = trigger == ACPI_EDGE_SENSITIVE ? 0 : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) polarity = polarity == ACPI_ACTIVE_HIGH ? 0 : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) ioapic_set_alloc_attr(&info, node, trigger, polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) mutex_lock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) irq = mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) /* Don't set up the ACPI SCI because it's already set up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) if (irq >= 0 && enable_update_mptable && gsi != acpi_gbl_FADT.sci_interrupt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) mp_config_acpi_gsi(dev, gsi, trigger, polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) mutex_unlock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) return irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) static void acpi_unregister_gsi_ioapic(u32 gsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) #ifdef CONFIG_X86_IO_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) mutex_lock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) irq = mp_map_gsi_to_irq(gsi, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) if (irq > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) mp_unmap_irq(irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) mutex_unlock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) int (*__acpi_register_gsi)(struct device *dev, u32 gsi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) int trigger, int polarity) = acpi_register_gsi_pic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) void (*__acpi_unregister_gsi)(u32 gsi) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) #ifdef CONFIG_ACPI_SLEEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) int (*acpi_suspend_lowlevel)(void) = x86_acpi_suspend_lowlevel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) int (*acpi_suspend_lowlevel)(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) * success: return IRQ number (>=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) * failure: return < 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) return __acpi_register_gsi(dev, gsi, trigger, polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) EXPORT_SYMBOL_GPL(acpi_register_gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) void acpi_unregister_gsi(u32 gsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) if (__acpi_unregister_gsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) __acpi_unregister_gsi(gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) EXPORT_SYMBOL_GPL(acpi_unregister_gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) #ifdef CONFIG_X86_LOCAL_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) static void __init acpi_set_irq_model_ioapic(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) __acpi_register_gsi = acpi_register_gsi_ioapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) __acpi_unregister_gsi = acpi_unregister_gsi_ioapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) acpi_ioapic = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) * ACPI based hotplug support for CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) #ifdef CONFIG_ACPI_HOTPLUG_CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) #include <acpi/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) static int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) #ifdef CONFIG_ACPI_NUMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) int nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) nid = acpi_get_node(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) if (nid != NUMA_NO_NODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) set_apicid_to_node(physid, nid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) numa_set_node(cpu, nid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) int *pcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) int cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) cpu = acpi_register_lapic(physid, acpi_id, ACPI_MADT_ENABLED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) if (cpu < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) pr_info(PREFIX "Unable to map lapic to logical cpu number\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) return cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) acpi_processor_set_pdc(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) acpi_map_cpu2node(handle, cpu, physid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) *pcpu = cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) EXPORT_SYMBOL(acpi_map_cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) int acpi_unmap_cpu(int cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) #ifdef CONFIG_ACPI_NUMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) set_apicid_to_node(per_cpu(x86_cpu_to_apicid, cpu), NUMA_NO_NODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) per_cpu(x86_cpu_to_apicid, cpu) = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) set_cpu_present(cpu, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) num_processors--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) return (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) EXPORT_SYMBOL(acpi_unmap_cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) #endif /* CONFIG_ACPI_HOTPLUG_CPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) int ret = -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) int ioapic_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) u64 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) struct ioapic_domain_cfg cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) .type = IOAPIC_DOMAIN_DYNAMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) .ops = &mp_ioapic_irqdomain_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) ioapic_id = acpi_get_ioapic_id(handle, gsi_base, &addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) if (ioapic_id < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) unsigned long long uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) status = acpi_evaluate_integer(handle, METHOD_NAME__UID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) NULL, &uid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) acpi_handle_warn(handle, "failed to get IOAPIC ID.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) ioapic_id = (int)uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) mutex_lock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) ret = mp_register_ioapic(ioapic_id, phys_addr, gsi_base, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) mutex_unlock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) EXPORT_SYMBOL(acpi_register_ioapic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) int ret = -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) mutex_lock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) ret = mp_unregister_ioapic(gsi_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) mutex_unlock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) EXPORT_SYMBOL(acpi_unregister_ioapic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) * acpi_ioapic_registered - Check whether IOAPIC assoicatied with @gsi_base
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) * has been registered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) * @handle: ACPI handle of the IOAPIC device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) * @gsi_base: GSI base associated with the IOAPIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) * Assume caller holds some type of lock to serialize acpi_ioapic_registered()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) * with acpi_register_ioapic()/acpi_unregister_ioapic().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) int acpi_ioapic_registered(acpi_handle handle, u32 gsi_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) mutex_lock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) ret = mp_ioapic_registered(gsi_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) mutex_unlock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) static int __init acpi_parse_sbf(struct acpi_table_header *table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) struct acpi_table_boot *sb = (struct acpi_table_boot *)table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) sbf_port = sb->cmos_index; /* Save CMOS port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) #ifdef CONFIG_HPET_TIMER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) #include <asm/hpet.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) static struct resource *hpet_res __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) static int __init acpi_parse_hpet(struct acpi_table_header *table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) struct acpi_table_hpet *hpet_tbl = (struct acpi_table_hpet *)table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) if (hpet_tbl->address.space_id != ACPI_SPACE_MEM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) printk(KERN_WARNING PREFIX "HPET timers must be located in "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) "memory.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) hpet_address = hpet_tbl->address.address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) hpet_blockid = hpet_tbl->sequence;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) * Some broken BIOSes advertise HPET at 0x0. We really do not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) * want to allocate a resource there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) if (!hpet_address) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) printk(KERN_WARNING PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) "HPET id: %#x base: %#lx is invalid\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) hpet_tbl->id, hpet_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) #ifdef CONFIG_X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) * Some even more broken BIOSes advertise HPET at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) * 0xfed0000000000000 instead of 0xfed00000. Fix it up and add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) * some noise:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) if (hpet_address == 0xfed0000000000000UL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) if (!hpet_force_user) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) printk(KERN_WARNING PREFIX "HPET id: %#x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) "base: 0xfed0000000000000 is bogus\n "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) "try hpet=force on the kernel command line to "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) "fix it up to 0xfed00000.\n", hpet_tbl->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) hpet_address = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) printk(KERN_WARNING PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) "HPET id: %#x base: 0xfed0000000000000 fixed up "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) "to 0xfed00000.\n", hpet_tbl->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) hpet_address >>= 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) hpet_tbl->id, hpet_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) * Allocate and initialize the HPET firmware resource for adding into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) * the resource tree during the lateinit timeframe.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) #define HPET_RESOURCE_NAME_SIZE 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) hpet_res = memblock_alloc(sizeof(*hpet_res) + HPET_RESOURCE_NAME_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) SMP_CACHE_BYTES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) if (!hpet_res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) panic("%s: Failed to allocate %zu bytes\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) sizeof(*hpet_res) + HPET_RESOURCE_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) hpet_res->name = (void *)&hpet_res[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) hpet_res->flags = IORESOURCE_MEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) snprintf((char *)hpet_res->name, HPET_RESOURCE_NAME_SIZE, "HPET %u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) hpet_tbl->sequence);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) hpet_res->start = hpet_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) hpet_res->end = hpet_address + (1 * 1024) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) * hpet_insert_resource inserts the HPET resources used into the resource
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) * tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) static __init int hpet_insert_resource(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) if (!hpet_res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) return insert_resource(&iomem_resource, hpet_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) late_initcall(hpet_insert_resource);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) #define acpi_parse_hpet NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) static int __init acpi_parse_fadt(struct acpi_table_header *table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) if (!(acpi_gbl_FADT.boot_flags & ACPI_FADT_LEGACY_DEVICES)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) pr_debug("ACPI: no legacy devices present\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) x86_platform.legacy.devices.pnpbios = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) !(acpi_gbl_FADT.boot_flags & ACPI_FADT_8042) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) x86_platform.legacy.i8042 != X86_LEGACY_I8042_PLATFORM_ABSENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) pr_debug("ACPI: i8042 controller is absent\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) x86_platform.legacy.i8042 = X86_LEGACY_I8042_FIRMWARE_ABSENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_CMOS_RTC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) pr_debug("ACPI: not registering RTC platform device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) x86_platform.legacy.rtc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_VGA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) pr_debug("ACPI: probing for VGA not safe\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) x86_platform.legacy.no_vga = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) #ifdef CONFIG_X86_PM_TIMER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) /* detect the location of the ACPI PM Timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) /* FADT rev. 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) if (acpi_gbl_FADT.xpm_timer_block.space_id !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) ACPI_ADR_SPACE_SYSTEM_IO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) pmtmr_ioport = acpi_gbl_FADT.xpm_timer_block.address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) * "X" fields are optional extensions to the original V1.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) * fields, so we must selectively expand V1.0 fields if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) * corresponding X field is zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) if (!pmtmr_ioport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) pmtmr_ioport = acpi_gbl_FADT.pm_timer_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) /* FADT rev. 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) pmtmr_ioport = acpi_gbl_FADT.pm_timer_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (pmtmr_ioport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) printk(KERN_INFO PREFIX "PM-Timer IO Port: %#x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) pmtmr_ioport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) #ifdef CONFIG_X86_LOCAL_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) * Parse LAPIC entries in MADT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) * returns 0 on success, < 0 on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) static int __init early_acpi_parse_madt_lapic_addr_ovr(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) if (!boot_cpu_has(X86_FEATURE_APIC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) * Note that the LAPIC address is obtained from the MADT (32-bit value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) * and (optionally) overridden by a LAPIC_ADDR_OVR entry (64-bit value).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) acpi_parse_lapic_addr_ovr, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) if (count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) printk(KERN_ERR PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) "Error parsing LAPIC address override entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) register_lapic_address(acpi_lapic_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) static int __init acpi_parse_madt_lapic_entries(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) int x2count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) struct acpi_subtable_proc madt_proc[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) if (!boot_cpu_has(X86_FEATURE_APIC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) acpi_parse_sapic, MAX_LOCAL_APIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) if (!count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) memset(madt_proc, 0, sizeof(madt_proc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) madt_proc[0].id = ACPI_MADT_TYPE_LOCAL_APIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) madt_proc[0].handler = acpi_parse_lapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) madt_proc[1].id = ACPI_MADT_TYPE_LOCAL_X2APIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) madt_proc[1].handler = acpi_parse_x2apic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) ret = acpi_table_parse_entries_array(ACPI_SIG_MADT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) sizeof(struct acpi_table_madt),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) madt_proc, ARRAY_SIZE(madt_proc), MAX_LOCAL_APIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) printk(KERN_ERR PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) "Error parsing LAPIC/X2APIC entries\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) count = madt_proc[0].count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) x2count = madt_proc[1].count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) if (!count && !x2count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) printk(KERN_ERR PREFIX "No LAPIC entries present\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) /* TBD: Cleanup to allow fallback to MPS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) } else if (count < 0 || x2count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) printk(KERN_ERR PREFIX "Error parsing LAPIC entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) /* TBD: Cleanup to allow fallback to MPS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) x2count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_X2APIC_NMI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) acpi_parse_x2apic_nmi, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) acpi_parse_lapic_nmi, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) if (count < 0 || x2count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) /* TBD: Cleanup to allow fallback to MPS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) #endif /* CONFIG_X86_LOCAL_APIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) #ifdef CONFIG_X86_IO_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) static void __init mp_config_acpi_legacy_irqs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) struct mpc_intsrc mp_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) #ifdef CONFIG_EISA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) * Fabricate the legacy ISA bus (bus #31).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) set_bit(MP_ISA_BUS, mp_bus_not_pci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) pr_debug("Bus #%d is ISA (nIRQs: %d)\n", MP_ISA_BUS, nr_legacy_irqs());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) * Use the default configuration for the IRQs 0-15. Unless
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) * overridden by (MADT) interrupt source override entries.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) for (i = 0; i < nr_legacy_irqs(); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) int ioapic, pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) unsigned int dstapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) int idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) u32 gsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) /* Locate the gsi that irq i maps to. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) if (acpi_isa_irq_to_gsi(i, &gsi))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) * Locate the IOAPIC that manages the ISA IRQ.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) ioapic = mp_find_ioapic(gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) if (ioapic < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) pin = mp_find_ioapic_pin(ioapic, gsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) dstapic = mpc_ioapic_id(ioapic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) for (idx = 0; idx < mp_irq_entries; idx++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) struct mpc_intsrc *irq = mp_irqs + idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) /* Do we already have a mapping for this ISA IRQ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) if (irq->srcbus == MP_ISA_BUS && irq->srcbusirq == i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) /* Do we already have a mapping for this IOAPIC pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) if (irq->dstapic == dstapic && irq->dstirq == pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) if (idx != mp_irq_entries) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) continue; /* IRQ already used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) mp_irq.type = MP_INTSRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) mp_irq.irqflag = 0; /* Conforming */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) mp_irq.srcbus = MP_ISA_BUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) mp_irq.dstapic = dstapic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) mp_irq.irqtype = mp_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) mp_irq.srcbusirq = i; /* Identity mapped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) mp_irq.dstirq = pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) mp_save_irq(&mp_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) * Parse IOAPIC related entries in MADT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) * returns 0 on success, < 0 on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) static int __init acpi_parse_madt_ioapic_entries(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) * ACPI interpreter is required to complete interrupt setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) * so if it is off, don't enumerate the io-apics with ACPI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) * If MPS is present, it will handle them,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) * otherwise the system will stay in PIC mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) if (acpi_disabled || acpi_noirq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) if (!boot_cpu_has(X86_FEATURE_APIC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) * if "noapic" boot option, don't look for IO-APICs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) if (skip_ioapic_setup) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) printk(KERN_INFO PREFIX "Skipping IOAPIC probe "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) "due to 'noapic' option.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) count = acpi_table_parse_madt(ACPI_MADT_TYPE_IO_APIC, acpi_parse_ioapic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) MAX_IO_APICS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) if (!count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) printk(KERN_ERR PREFIX "No IOAPIC entries present\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) } else if (count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) printk(KERN_ERR PREFIX "Error parsing IOAPIC entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) count = acpi_table_parse_madt(ACPI_MADT_TYPE_INTERRUPT_OVERRIDE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) acpi_parse_int_src_ovr, nr_irqs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) if (count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) printk(KERN_ERR PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) "Error parsing interrupt source overrides entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) /* TBD: Cleanup to allow fallback to MPS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) * If BIOS did not supply an INT_SRC_OVR for the SCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) * pretend we got one so we can set the SCI flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * But ignore setting up SCI on hardware reduced platforms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) if (acpi_sci_override_gsi == INVALID_ACPI_IRQ && !acpi_gbl_reduced_hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) acpi_sci_ioapic_setup(acpi_gbl_FADT.sci_interrupt, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) acpi_gbl_FADT.sci_interrupt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) /* Fill in identity legacy mappings where no override */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) mp_config_acpi_legacy_irqs();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) count = acpi_table_parse_madt(ACPI_MADT_TYPE_NMI_SOURCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) acpi_parse_nmi_src, nr_irqs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) if (count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) /* TBD: Cleanup to allow fallback to MPS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) static inline int acpi_parse_madt_ioapic_entries(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) #endif /* !CONFIG_X86_IO_APIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) static void __init early_acpi_process_madt(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) #ifdef CONFIG_X86_LOCAL_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (!acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) * Parse MADT LAPIC entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) error = early_acpi_parse_madt_lapic_addr_ovr();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) if (!error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) acpi_lapic = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) smp_found_config = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) if (error == -EINVAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) * Dell Precision Workstation 410, 610 come here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) printk(KERN_ERR PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) "Invalid BIOS MADT, disabling ACPI\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) disable_acpi();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) static void __init acpi_process_madt(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) #ifdef CONFIG_X86_LOCAL_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) if (!acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) * Parse MADT LAPIC entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) error = acpi_parse_madt_lapic_entries();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) if (!error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) acpi_lapic = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) * Parse MADT IO-APIC entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) mutex_lock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) error = acpi_parse_madt_ioapic_entries();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) mutex_unlock(&acpi_ioapic_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) if (!error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) acpi_set_irq_model_ioapic();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) smp_found_config = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) if (error == -EINVAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) * Dell Precision Workstation 410, 610 come here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) printk(KERN_ERR PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) "Invalid BIOS MADT, disabling ACPI\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) disable_acpi();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) * ACPI found no MADT, and so ACPI wants UP PIC mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) * In the event an MPS table was found, forget it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) * Boot with "acpi=off" to use MPS on such a system.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) if (smp_found_config) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) printk(KERN_WARNING PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) "No APIC-table, disabling MPS\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) smp_found_config = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) * ACPI supports both logical (e.g. Hyper-Threading) and physical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) * processors, where MPS only supports physical.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) if (acpi_lapic && acpi_ioapic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) printk(KERN_INFO "Using ACPI (MADT) for SMP configuration "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) "information\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) else if (acpi_lapic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) printk(KERN_INFO "Using ACPI for processor (LAPIC) "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) "configuration information\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) static int __init disable_acpi_irq(const struct dmi_system_id *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) if (!acpi_force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) d->ident);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) acpi_noirq_set();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) static int __init disable_acpi_pci(const struct dmi_system_id *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) if (!acpi_force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) d->ident);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) acpi_disable_pci();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) static int __init disable_acpi_xsdt(const struct dmi_system_id *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) if (!acpi_force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) pr_notice("%s detected: force use of acpi=rsdt\n", d->ident);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) acpi_gbl_do_not_use_xsdt = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) pr_notice("Warning: DMI blacklist says broken, but acpi XSDT forced\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) static int __init dmi_disable_acpi(const struct dmi_system_id *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) if (!acpi_force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) printk(KERN_NOTICE "%s detected: acpi off\n", d->ident);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) disable_acpi();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) "Warning: DMI blacklist says broken, but acpi forced\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) * Force ignoring BIOS IRQ0 override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) if (!acpi_skip_timer_override) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) pr_notice("%s detected: Ignoring BIOS IRQ0 override\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) d->ident);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) acpi_skip_timer_override = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) * ACPI offers an alternative platform interface model that removes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) * ACPI hardware requirements for platforms that do not implement
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) * the PC Architecture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) * We initialize the Hardware-reduced ACPI model here:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) void __init acpi_generic_reduced_hw_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) * Override x86_init functions and bypass legacy PIC in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) * hardware reduced ACPI mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) x86_init.timers.timer_init = x86_init_noop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) x86_init.irqs.pre_vector_init = x86_init_noop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) legacy_pic = &null_legacy_pic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) static void __init acpi_reduced_hw_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) if (acpi_gbl_reduced_hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) x86_init.acpi.reduced_hw_early_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) * If your system is blacklisted here, but you find that acpi=force
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) * works for you, please contact linux-acpi@vger.kernel.org
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) static const struct dmi_system_id acpi_dmi_table[] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) * Boxes that need ACPI disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) .callback = dmi_disable_acpi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) .ident = "IBM Thinkpad",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) DMI_MATCH(DMI_BOARD_NAME, "2629H1G"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) * Boxes that need ACPI PCI IRQ routing disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) .callback = disable_acpi_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) .ident = "ASUS A7V",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) DMI_MATCH(DMI_BOARD_NAME, "<A7V>"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) /* newer BIOS, Revision 1011, does work */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) DMI_MATCH(DMI_BIOS_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) "ASUS A7V ACPI BIOS Revision 1007"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) * Latest BIOS for IBM 600E (1.16) has bad pcinum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) * for LPC bridge, which is needed for the PCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) * interrupt links to work. DSDT fix is in bug 5966.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) * 2645, 2646 model numbers are shared with 600/600E/600X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) .callback = disable_acpi_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) .ident = "IBM Thinkpad 600 Series 2645",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) DMI_MATCH(DMI_BOARD_NAME, "2645"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) .callback = disable_acpi_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) .ident = "IBM Thinkpad 600 Series 2646",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) DMI_MATCH(DMI_BOARD_NAME, "2646"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) * Boxes that need ACPI PCI IRQ routing and PCI scan disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) { /* _BBN 0 bug */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) .callback = disable_acpi_pci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) .ident = "ASUS PR-DLS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) DMI_MATCH(DMI_BIOS_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) "ASUS PR-DLS ACPI BIOS Revision 1010"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) DMI_MATCH(DMI_BIOS_DATE, "03/21/2003")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) .callback = disable_acpi_pci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) .ident = "Acer TravelMate 36x Laptop",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) * Boxes that need ACPI XSDT use disabled due to corrupted tables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) .callback = disable_acpi_xsdt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) .ident = "Advantech DAC-BJ01",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) DMI_MATCH(DMI_PRODUCT_NAME, "Bearlake CRB Board"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) DMI_MATCH(DMI_BIOS_VERSION, "V1.12"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) DMI_MATCH(DMI_BIOS_DATE, "02/01/2011"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) /* second table for DMI checks that should run after early-quirks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) static const struct dmi_system_id acpi_dmi_table_late[] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) * HP laptops which use a DSDT reporting as HP/SB400/10000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) * which includes some code which overrides all temperature
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) * trip points to 16C if the INTIN2 input of the I/O APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) * is enabled. This input is incorrectly designated the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) * ISA IRQ 0 via an interrupt source override even though
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) * it is wired to the output of the master 8259A and INTIN0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) * is not connected at all. Force ignoring BIOS IRQ0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) * override in that cases.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) .callback = dmi_ignore_irq0_timer_override,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) .ident = "HP nx6115 laptop",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6115"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) .callback = dmi_ignore_irq0_timer_override,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) .ident = "HP NX6125 laptop",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6125"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) .callback = dmi_ignore_irq0_timer_override,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) .ident = "HP NX6325 laptop",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6325"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) .callback = dmi_ignore_irq0_timer_override,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) .ident = "HP 6715b laptop",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) .callback = dmi_ignore_irq0_timer_override,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) .ident = "FUJITSU SIEMENS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) * acpi_boot_table_init() and acpi_boot_init()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) * called from setup_arch(), always.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) * 1. checksums all tables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) * 2. enumerates lapics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) * 3. enumerates io-apics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) * acpi_table_init() is separate to allow reading SRAT without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) * other side effects.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) * side effects of acpi_boot_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) * acpi_lapic = 1 if LAPIC found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) * acpi_ioapic = 1 if IOAPIC found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) * if (acpi_lapic && acpi_ioapic) smp_found_config = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) * if acpi_blacklisted() acpi_disabled = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) * acpi_irq_model=...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) * ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) void __init acpi_boot_table_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) dmi_check_system(acpi_dmi_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) * If acpi_disabled, bail out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) if (acpi_disabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) * Initialize the ACPI boot-time table parser.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) if (acpi_locate_initial_tables())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) disable_acpi();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) acpi_reserve_initial_tables();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) int __init early_acpi_boot_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) if (acpi_disabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) acpi_table_init_complete();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) * blacklist may disable ACPI entirely
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) if (acpi_blacklisted()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) if (acpi_force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) printk(KERN_WARNING PREFIX "acpi=force override\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) printk(KERN_WARNING PREFIX "Disabling ACPI support\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) disable_acpi();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) * Process the Multiple APIC Description Table (MADT), if present
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) early_acpi_process_madt();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) * Hardware-reduced ACPI mode initialization:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) acpi_reduced_hw_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) int __init acpi_boot_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) /* those are executed after early-quirks are executed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) dmi_check_system(acpi_dmi_table_late);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) * If acpi_disabled, bail out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) if (acpi_disabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) * set sci_int and PM timer address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) * Process the Multiple APIC Description Table (MADT), if present
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) acpi_process_madt();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) if (IS_ENABLED(CONFIG_ACPI_BGRT) && !acpi_nobgrt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) acpi_table_parse(ACPI_SIG_BGRT, acpi_parse_bgrt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) if (!acpi_noirq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) x86_init.pci.init = pci_acpi_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) /* Do not enable ACPI SPCR console by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) acpi_parse_spcr(earlycon_acpi_spcr_enable, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) static int __init parse_acpi(char *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) if (!arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) /* "acpi=off" disables both ACPI table parsing and interpreter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) if (strcmp(arg, "off") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) disable_acpi();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) /* acpi=force to over-ride black-list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) else if (strcmp(arg, "force") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) acpi_force = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) acpi_disabled = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) /* acpi=strict disables out-of-spec workarounds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) else if (strcmp(arg, "strict") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) acpi_strict = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) /* acpi=rsdt use RSDT instead of XSDT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) else if (strcmp(arg, "rsdt") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) acpi_gbl_do_not_use_xsdt = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) /* "acpi=noirq" disables ACPI interrupt routing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) else if (strcmp(arg, "noirq") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) acpi_noirq_set();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) /* "acpi=copy_dsdt" copys DSDT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) else if (strcmp(arg, "copy_dsdt") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) acpi_gbl_copy_dsdt_locally = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) /* "acpi=nocmcff" disables FF mode for corrected errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) else if (strcmp(arg, "nocmcff") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) acpi_disable_cmcff = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) /* Core will printk when we return error. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) early_param("acpi", parse_acpi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) static int __init parse_acpi_bgrt(char *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) acpi_nobgrt = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) early_param("bgrt_disable", parse_acpi_bgrt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) /* FIXME: Using pci= for an ACPI parameter is a travesty. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) static int __init parse_pci(char *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) if (arg && strcmp(arg, "noacpi") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) acpi_disable_pci();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) early_param("pci", parse_pci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) int __init acpi_mps_check(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) #if defined(CONFIG_X86_LOCAL_APIC) && !defined(CONFIG_X86_MPPARSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) /* mptable code is not built-in*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) if (acpi_disabled || acpi_noirq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) printk(KERN_WARNING "MPS support code is not built-in.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) "Using acpi=off or acpi=noirq or pci=noacpi "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) "may have problem\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) #ifdef CONFIG_X86_IO_APIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) static int __init parse_acpi_skip_timer_override(char *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) acpi_skip_timer_override = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) static int __init parse_acpi_use_timer_override(char *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) acpi_use_timer_override = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) early_param("acpi_use_timer_override", parse_acpi_use_timer_override);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) #endif /* CONFIG_X86_IO_APIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) static int __init setup_acpi_sci(char *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) if (!s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) if (!strcmp(s, "edge"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) acpi_sci_flags = ACPI_MADT_TRIGGER_EDGE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) (acpi_sci_flags & ~ACPI_MADT_TRIGGER_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) else if (!strcmp(s, "level"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) acpi_sci_flags = ACPI_MADT_TRIGGER_LEVEL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) (acpi_sci_flags & ~ACPI_MADT_TRIGGER_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) else if (!strcmp(s, "high"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) acpi_sci_flags = ACPI_MADT_POLARITY_ACTIVE_HIGH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) (acpi_sci_flags & ~ACPI_MADT_POLARITY_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) else if (!strcmp(s, "low"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) acpi_sci_flags = ACPI_MADT_POLARITY_ACTIVE_LOW |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) (acpi_sci_flags & ~ACPI_MADT_POLARITY_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) early_param("acpi_sci", setup_acpi_sci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) int __acpi_acquire_global_lock(unsigned int *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) unsigned int old, new, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) old = *lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) val = cmpxchg(lock, old, new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) } while (unlikely (val != old));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) return ((new & 0x3) < 3) ? -1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) int __acpi_release_global_lock(unsigned int *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) unsigned int old, new, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) old = *lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) new = old & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) val = cmpxchg(lock, old, new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) } while (unlikely (val != old));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) return old & 0x1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) e820__range_add(addr, size, E820_TYPE_ACPI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) e820__update_table_print();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) void x86_default_set_root_pointer(u64 addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) boot_params.acpi_rsdp_addr = addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) u64 x86_default_get_root_pointer(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) return boot_params.acpi_rsdp_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) }