LCOV - code coverage report
Current view: top level - arch/x86/kernel/acpi - boot.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 326 624 52.2 %
Date: 2022-03-28 15:32:58 Functions: 34 62 54.8 %
Branches: 114 335 34.0 %

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

Generated by: LCOV version 1.14