Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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) }