linux/drivers/acpi/tables.c
<<
>>
Prefs
   1/*
   2 *  acpi_tables.c - ACPI Boot-Time Table Parsing
   3 *
   4 *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   5 *
   6 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   7 *
   8 *  This program is free software; you can redistribute it and/or modify
   9 *  it under the terms of the GNU General Public License as published by
  10 *  the Free Software Foundation; either version 2 of the License, or
  11 *  (at your option) any later version.
  12 *
  13 *  This program is distributed in the hope that it will be useful,
  14 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 *  GNU General Public License for more details.
  17 *
  18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19 *
  20 */
  21
  22/* Uncomment next line to get verbose printout */
  23/* #define DEBUG */
  24#define pr_fmt(fmt) "ACPI: " fmt
  25
  26#include <linux/init.h>
  27#include <linux/kernel.h>
  28#include <linux/smp.h>
  29#include <linux/string.h>
  30#include <linux/types.h>
  31#include <linux/irq.h>
  32#include <linux/errno.h>
  33#include <linux/acpi.h>
  34#include <linux/bootmem.h>
  35#include <linux/earlycpio.h>
  36#include <linux/memblock.h>
  37#include <linux/initrd.h>
  38#include "internal.h"
  39
  40#ifdef CONFIG_ACPI_CUSTOM_DSDT
  41#include CONFIG_ACPI_CUSTOM_DSDT_FILE
  42#endif
  43
  44#define ACPI_MAX_TABLES         128
  45
  46static char *mps_inti_flags_polarity[] = { "dfl", "high", "res", "low" };
  47static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" };
  48
  49static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata;
  50
  51static int acpi_apic_instance __initdata;
  52
  53/*
  54 * Disable table checksum verification for the early stage due to the size
  55 * limitation of the current x86 early mapping implementation.
  56 */
  57static bool acpi_verify_table_checksum __initdata = false;
  58
  59void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
  60{
  61        if (!header)
  62                return;
  63
  64        switch (header->type) {
  65
  66        case ACPI_MADT_TYPE_LOCAL_APIC:
  67                {
  68                        struct acpi_madt_local_apic *p =
  69                            (struct acpi_madt_local_apic *)header;
  70                        pr_debug("LAPIC (acpi_id[0x%02x] lapic_id[0x%02x] %s)\n",
  71                                 p->processor_id, p->id,
  72                                 (p->lapic_flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled");
  73                }
  74                break;
  75
  76        case ACPI_MADT_TYPE_LOCAL_X2APIC:
  77                {
  78                        struct acpi_madt_local_x2apic *p =
  79                            (struct acpi_madt_local_x2apic *)header;
  80                        pr_debug("X2APIC (apic_id[0x%02x] uid[0x%02x] %s)\n",
  81                                 p->local_apic_id, p->uid,
  82                                 (p->lapic_flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled");
  83                }
  84                break;
  85
  86        case ACPI_MADT_TYPE_IO_APIC:
  87                {
  88                        struct acpi_madt_io_apic *p =
  89                            (struct acpi_madt_io_apic *)header;
  90                        pr_debug("IOAPIC (id[0x%02x] address[0x%08x] gsi_base[%d])\n",
  91                                 p->id, p->address, p->global_irq_base);
  92                }
  93                break;
  94
  95        case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
  96                {
  97                        struct acpi_madt_interrupt_override *p =
  98                            (struct acpi_madt_interrupt_override *)header;
  99                        pr_info("INT_SRC_OVR (bus %d bus_irq %d global_irq %d %s %s)\n",
 100                                p->bus, p->source_irq, p->global_irq,
 101                                mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK],
 102                                mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2]);
 103                        if (p->inti_flags  &
 104                            ~(ACPI_MADT_POLARITY_MASK | ACPI_MADT_TRIGGER_MASK))
 105                                pr_info("INT_SRC_OVR unexpected reserved flags: 0x%x\n",
 106                                        p->inti_flags  &
 107                                        ~(ACPI_MADT_POLARITY_MASK | ACPI_MADT_TRIGGER_MASK));
 108                }
 109                break;
 110
 111        case ACPI_MADT_TYPE_NMI_SOURCE:
 112                {
 113                        struct acpi_madt_nmi_source *p =
 114                            (struct acpi_madt_nmi_source *)header;
 115                        pr_info("NMI_SRC (%s %s global_irq %d)\n",
 116                                mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK],
 117                                mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2],
 118                                p->global_irq);
 119                }
 120                break;
 121
 122        case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
 123                {
 124                        struct acpi_madt_local_apic_nmi *p =
 125                            (struct acpi_madt_local_apic_nmi *)header;
 126                        pr_info("LAPIC_NMI (acpi_id[0x%02x] %s %s lint[0x%x])\n",
 127                                p->processor_id,
 128                                mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK ],
 129                                mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2],
 130                                p->lint);
 131                }
 132                break;
 133
 134        case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
 135                {
 136                        u16 polarity, trigger;
 137                        struct acpi_madt_local_x2apic_nmi *p =
 138                            (struct acpi_madt_local_x2apic_nmi *)header;
 139
 140                        polarity = p->inti_flags & ACPI_MADT_POLARITY_MASK;
 141                        trigger = (p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2;
 142
 143                        pr_info("X2APIC_NMI (uid[0x%02x] %s %s lint[0x%x])\n",
 144                                p->uid,
 145                                mps_inti_flags_polarity[polarity],
 146                                mps_inti_flags_trigger[trigger],
 147                                p->lint);
 148                }
 149                break;
 150
 151        case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
 152                {
 153                        struct acpi_madt_local_apic_override *p =
 154                            (struct acpi_madt_local_apic_override *)header;
 155                        pr_info("LAPIC_ADDR_OVR (address[%p])\n",
 156                                (void *)(unsigned long)p->address);
 157                }
 158                break;
 159
 160        case ACPI_MADT_TYPE_IO_SAPIC:
 161                {
 162                        struct acpi_madt_io_sapic *p =
 163                            (struct acpi_madt_io_sapic *)header;
 164                        pr_debug("IOSAPIC (id[0x%x] address[%p] gsi_base[%d])\n",
 165                                 p->id, (void *)(unsigned long)p->address,
 166                                 p->global_irq_base);
 167                }
 168                break;
 169
 170        case ACPI_MADT_TYPE_LOCAL_SAPIC:
 171                {
 172                        struct acpi_madt_local_sapic *p =
 173                            (struct acpi_madt_local_sapic *)header;
 174                        pr_debug("LSAPIC (acpi_id[0x%02x] lsapic_id[0x%02x] lsapic_eid[0x%02x] %s)\n",
 175                                 p->processor_id, p->id, p->eid,
 176                                 (p->lapic_flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled");
 177                }
 178                break;
 179
 180        case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
 181                {
 182                        struct acpi_madt_interrupt_source *p =
 183                            (struct acpi_madt_interrupt_source *)header;
 184                        pr_info("PLAT_INT_SRC (%s %s type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n",
 185                                mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK],
 186                                mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2],
 187                                p->type, p->id, p->eid, p->io_sapic_vector,
 188                                p->global_irq);
 189                }
 190                break;
 191
 192        case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
 193                {
 194                        struct acpi_madt_generic_interrupt *p =
 195                                (struct acpi_madt_generic_interrupt *)header;
 196                        pr_debug("GICC (acpi_id[0x%04x] address[%llx] MPIDR[0x%llx] %s)\n",
 197                                 p->uid, p->base_address,
 198                                 p->arm_mpidr,
 199                                 (p->flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled");
 200
 201                }
 202                break;
 203
 204        case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
 205                {
 206                        struct acpi_madt_generic_distributor *p =
 207                                (struct acpi_madt_generic_distributor *)header;
 208                        pr_debug("GIC Distributor (gic_id[0x%04x] address[%llx] gsi_base[%d])\n",
 209                                 p->gic_id, p->base_address,
 210                                 p->global_irq_base);
 211                }
 212                break;
 213
 214        default:
 215                pr_warn("Found unsupported MADT entry (type = 0x%x)\n",
 216                        header->type);
 217                break;
 218        }
 219}
 220
 221/**
 222 * acpi_parse_entries_array - for each proc_num find a suitable subtable
 223 *
 224 * @id: table id (for debugging purposes)
 225 * @table_size: single entry size
 226 * @table_header: where does the table start?
 227 * @proc: array of acpi_subtable_proc struct containing entry id
 228 *        and associated handler with it
 229 * @proc_num: how big proc is?
 230 * @max_entries: how many entries can we process?
 231 *
 232 * For each proc_num find a subtable with proc->id and run proc->handler
 233 * on it. Assumption is that there's only single handler for particular
 234 * entry id.
 235 *
 236 * On success returns sum of all matching entries for all proc handlers.
 237 * Otherwise, -ENODEV or -EINVAL is returned.
 238 */
 239static int __init
 240acpi_parse_entries_array(char *id, unsigned long table_size,
 241                struct acpi_table_header *table_header,
 242                struct acpi_subtable_proc *proc, int proc_num,
 243                unsigned int max_entries)
 244{
 245        struct acpi_subtable_header *entry;
 246        unsigned long table_end;
 247        int count = 0;
 248        int errs = 0;
 249        int i;
 250
 251        if (acpi_disabled)
 252                return -ENODEV;
 253
 254        if (!id)
 255                return -EINVAL;
 256
 257        if (!table_size)
 258                return -EINVAL;
 259
 260        if (!table_header) {
 261                pr_warn("%4.4s not present\n", id);
 262                return -ENODEV;
 263        }
 264
 265        table_end = (unsigned long)table_header + table_header->length;
 266
 267        /* Parse all entries looking for a match. */
 268
 269        entry = (struct acpi_subtable_header *)
 270            ((unsigned long)table_header + table_size);
 271
 272        while (((unsigned long)entry) + sizeof(struct acpi_subtable_header) <
 273               table_end) {
 274                if (max_entries && count >= max_entries)
 275                        break;
 276
 277                for (i = 0; i < proc_num; i++) {
 278                        if (entry->type != proc[i].id)
 279                                continue;
 280                        if (!proc[i].handler ||
 281                             (!errs && proc[i].handler(entry, table_end))) {
 282                                errs++;
 283                                continue;
 284                        }
 285
 286                        proc[i].count++;
 287                        break;
 288                }
 289                if (i != proc_num)
 290                        count++;
 291
 292                /*
 293                 * If entry->length is 0, break from this loop to avoid
 294                 * infinite loop.
 295                 */
 296                if (entry->length == 0) {
 297                        pr_err("[%4.4s:0x%02x] Invalid zero length\n", id, proc->id);
 298                        return -EINVAL;
 299                }
 300
 301                entry = (struct acpi_subtable_header *)
 302                    ((unsigned long)entry + entry->length);
 303        }
 304
 305        if (max_entries && count > max_entries) {
 306                pr_warn("[%4.4s:0x%02x] found the maximum %i entries\n",
 307                        id, proc->id, count);
 308        }
 309
 310        return errs ? -EINVAL : count;
 311}
 312
 313int __init
 314acpi_parse_entries(char *id,
 315                        unsigned long table_size,
 316                        acpi_tbl_entry_handler handler,
 317                        struct acpi_table_header *table_header,
 318                        int entry_id, unsigned int max_entries)
 319{
 320        struct acpi_subtable_proc proc = {
 321                .id             = entry_id,
 322                .handler        = handler,
 323        };
 324
 325        return acpi_parse_entries_array(id, table_size, table_header,
 326                        &proc, 1, max_entries);
 327}
 328
 329int __init
 330acpi_table_parse_entries_array(char *id,
 331                         unsigned long table_size,
 332                         struct acpi_subtable_proc *proc, int proc_num,
 333                         unsigned int max_entries)
 334{
 335        struct acpi_table_header *table_header = NULL;
 336        acpi_size tbl_size;
 337        int count;
 338        u32 instance = 0;
 339
 340        if (acpi_disabled)
 341                return -ENODEV;
 342
 343        if (!id)
 344                return -EINVAL;
 345
 346        if (!strncmp(id, ACPI_SIG_MADT, 4))
 347                instance = acpi_apic_instance;
 348
 349        acpi_get_table_with_size(id, instance, &table_header, &tbl_size);
 350        if (!table_header) {
 351                pr_warn("%4.4s not present\n", id);
 352                return -ENODEV;
 353        }
 354
 355        count = acpi_parse_entries_array(id, table_size, table_header,
 356                        proc, proc_num, max_entries);
 357
 358        early_acpi_os_unmap_memory((char *)table_header, tbl_size);
 359        return count;
 360}
 361
 362int __init
 363acpi_table_parse_entries(char *id,
 364                        unsigned long table_size,
 365                        int entry_id,
 366                        acpi_tbl_entry_handler handler,
 367                        unsigned int max_entries)
 368{
 369        struct acpi_subtable_proc proc = {
 370                .id             = entry_id,
 371                .handler        = handler,
 372        };
 373
 374        return acpi_table_parse_entries_array(id, table_size, &proc, 1,
 375                                                max_entries);
 376}
 377
 378int __init
 379acpi_table_parse_madt(enum acpi_madt_type id,
 380                      acpi_tbl_entry_handler handler, unsigned int max_entries)
 381{
 382        return acpi_table_parse_entries(ACPI_SIG_MADT,
 383                                            sizeof(struct acpi_table_madt), id,
 384                                            handler, max_entries);
 385}
 386
 387/**
 388 * acpi_table_parse - find table with @id, run @handler on it
 389 * @id: table id to find
 390 * @handler: handler to run
 391 *
 392 * Scan the ACPI System Descriptor Table (STD) for a table matching @id,
 393 * run @handler on it.
 394 *
 395 * Return 0 if table found, -errno if not.
 396 */
 397int __init acpi_table_parse(char *id, acpi_tbl_table_handler handler)
 398{
 399        struct acpi_table_header *table = NULL;
 400        acpi_size tbl_size;
 401
 402        if (acpi_disabled)
 403                return -ENODEV;
 404
 405        if (!id || !handler)
 406                return -EINVAL;
 407
 408        if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
 409                acpi_get_table_with_size(id, acpi_apic_instance, &table, &tbl_size);
 410        else
 411                acpi_get_table_with_size(id, 0, &table, &tbl_size);
 412
 413        if (table) {
 414                handler(table);
 415                early_acpi_os_unmap_memory(table, tbl_size);
 416                return 0;
 417        } else
 418                return -ENODEV;
 419}
 420
 421/* 
 422 * The BIOS is supposed to supply a single APIC/MADT,
 423 * but some report two.  Provide a knob to use either.
 424 * (don't you wish instance 0 and 1 were not the same?)
 425 */
 426static void __init check_multiple_madt(void)
 427{
 428        struct acpi_table_header *table = NULL;
 429        acpi_size tbl_size;
 430
 431        acpi_get_table_with_size(ACPI_SIG_MADT, 2, &table, &tbl_size);
 432        if (table) {
 433                pr_warn("BIOS bug: multiple APIC/MADT found, using %d\n",
 434                        acpi_apic_instance);
 435                pr_warn("If \"acpi_apic_instance=%d\" works better, "
 436                        "notify linux-acpi@vger.kernel.org\n",
 437                        acpi_apic_instance ? 0 : 2);
 438                early_acpi_os_unmap_memory(table, tbl_size);
 439
 440        } else
 441                acpi_apic_instance = 0;
 442
 443        return;
 444}
 445
 446static void acpi_table_taint(struct acpi_table_header *table)
 447{
 448        pr_warn("Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n",
 449                table->signature, table->oem_table_id);
 450        add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
 451}
 452
 453#ifdef CONFIG_ACPI_TABLE_UPGRADE
 454static u64 acpi_tables_addr;
 455static int all_tables_size;
 456
 457/* Copied from acpica/tbutils.c:acpi_tb_checksum() */
 458static u8 __init acpi_table_checksum(u8 *buffer, u32 length)
 459{
 460        u8 sum = 0;
 461        u8 *end = buffer + length;
 462
 463        while (buffer < end)
 464                sum = (u8) (sum + *(buffer++));
 465        return sum;
 466}
 467
 468/* All but ACPI_SIG_RSDP and ACPI_SIG_FACS: */
 469static const char * const table_sigs[] = {
 470        ACPI_SIG_BERT, ACPI_SIG_CPEP, ACPI_SIG_ECDT, ACPI_SIG_EINJ,
 471        ACPI_SIG_ERST, ACPI_SIG_HEST, ACPI_SIG_MADT, ACPI_SIG_MSCT,
 472        ACPI_SIG_SBST, ACPI_SIG_SLIT, ACPI_SIG_SRAT, ACPI_SIG_ASF,
 473        ACPI_SIG_BOOT, ACPI_SIG_DBGP, ACPI_SIG_DMAR, ACPI_SIG_HPET,
 474        ACPI_SIG_IBFT, ACPI_SIG_IVRS, ACPI_SIG_MCFG, ACPI_SIG_MCHI,
 475        ACPI_SIG_SLIC, ACPI_SIG_SPCR, ACPI_SIG_SPMI, ACPI_SIG_TCPA,
 476        ACPI_SIG_UEFI, ACPI_SIG_WAET, ACPI_SIG_WDAT, ACPI_SIG_WDDT,
 477        ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT, ACPI_SIG_PSDT,
 478        ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT, NULL };
 479
 480#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
 481
 482#define NR_ACPI_INITRD_TABLES 64
 483static struct cpio_data __initdata acpi_initrd_files[NR_ACPI_INITRD_TABLES];
 484static DECLARE_BITMAP(acpi_initrd_installed, NR_ACPI_INITRD_TABLES);
 485
 486#define MAP_CHUNK_SIZE   (NR_FIX_BTMAPS << PAGE_SHIFT)
 487
 488void __init acpi_table_upgrade(void)
 489{
 490        void *data = (void *)initrd_start;
 491        size_t size = initrd_end - initrd_start;
 492        int sig, no, table_nr = 0, total_offset = 0;
 493        long offset = 0;
 494        struct acpi_table_header *table;
 495        char cpio_path[32] = "kernel/firmware/acpi/";
 496        struct cpio_data file;
 497
 498        if (data == NULL || size == 0)
 499                return;
 500
 501        for (no = 0; no < NR_ACPI_INITRD_TABLES; no++) {
 502                file = find_cpio_data(cpio_path, data, size, &offset);
 503                if (!file.data)
 504                        break;
 505
 506                data += offset;
 507                size -= offset;
 508
 509                if (file.size < sizeof(struct acpi_table_header)) {
 510                        pr_err("ACPI OVERRIDE: Table smaller than ACPI header [%s%s]\n",
 511                                cpio_path, file.name);
 512                        continue;
 513                }
 514
 515                table = file.data;
 516
 517                for (sig = 0; table_sigs[sig]; sig++)
 518                        if (!memcmp(table->signature, table_sigs[sig], 4))
 519                                break;
 520
 521                if (!table_sigs[sig]) {
 522                        pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n",
 523                                cpio_path, file.name);
 524                        continue;
 525                }
 526                if (file.size != table->length) {
 527                        pr_err("ACPI OVERRIDE: File length does not match table length [%s%s]\n",
 528                                cpio_path, file.name);
 529                        continue;
 530                }
 531                if (acpi_table_checksum(file.data, table->length)) {
 532                        pr_err("ACPI OVERRIDE: Bad table checksum [%s%s]\n",
 533                                cpio_path, file.name);
 534                        continue;
 535                }
 536
 537                pr_info("%4.4s ACPI table found in initrd [%s%s][0x%x]\n",
 538                        table->signature, cpio_path, file.name, table->length);
 539
 540                all_tables_size += table->length;
 541                acpi_initrd_files[table_nr].data = file.data;
 542                acpi_initrd_files[table_nr].size = file.size;
 543                table_nr++;
 544        }
 545        if (table_nr == 0)
 546                return;
 547
 548        acpi_tables_addr =
 549                memblock_find_in_range(0, ACPI_TABLE_UPGRADE_MAX_PHYS,
 550                                       all_tables_size, PAGE_SIZE);
 551        if (!acpi_tables_addr) {
 552                WARN_ON(1);
 553                return;
 554        }
 555        /*
 556         * Only calling e820_add_reserve does not work and the
 557         * tables are invalid (memory got used) later.
 558         * memblock_reserve works as expected and the tables won't get modified.
 559         * But it's not enough on X86 because ioremap will
 560         * complain later (used by acpi_os_map_memory) that the pages
 561         * that should get mapped are not marked "reserved".
 562         * Both memblock_reserve and e820_add_region (via arch_reserve_mem_area)
 563         * works fine.
 564         */
 565        memblock_reserve(acpi_tables_addr, all_tables_size);
 566        arch_reserve_mem_area(acpi_tables_addr, all_tables_size);
 567
 568        /*
 569         * early_ioremap only can remap 256k one time. If we map all
 570         * tables one time, we will hit the limit. Need to map chunks
 571         * one by one during copying the same as that in relocate_initrd().
 572         */
 573        for (no = 0; no < table_nr; no++) {
 574                unsigned char *src_p = acpi_initrd_files[no].data;
 575                phys_addr_t size = acpi_initrd_files[no].size;
 576                phys_addr_t dest_addr = acpi_tables_addr + total_offset;
 577                phys_addr_t slop, clen;
 578                char *dest_p;
 579
 580                total_offset += size;
 581
 582                while (size) {
 583                        slop = dest_addr & ~PAGE_MASK;
 584                        clen = size;
 585                        if (clen > MAP_CHUNK_SIZE - slop)
 586                                clen = MAP_CHUNK_SIZE - slop;
 587                        dest_p = early_memremap(dest_addr & PAGE_MASK,
 588                                                clen + slop);
 589                        memcpy(dest_p + slop, src_p, clen);
 590                        early_memunmap(dest_p, clen + slop);
 591                        src_p += clen;
 592                        dest_addr += clen;
 593                        size -= clen;
 594                }
 595        }
 596}
 597
 598static acpi_status
 599acpi_table_initrd_override(struct acpi_table_header *existing_table,
 600                           acpi_physical_address *address, u32 *length)
 601{
 602        int table_offset = 0;
 603        int table_index = 0;
 604        struct acpi_table_header *table;
 605        u32 table_length;
 606
 607        *length = 0;
 608        *address = 0;
 609        if (!acpi_tables_addr)
 610                return AE_OK;
 611
 612        while (table_offset + ACPI_HEADER_SIZE <= all_tables_size) {
 613                table = acpi_os_map_memory(acpi_tables_addr + table_offset,
 614                                           ACPI_HEADER_SIZE);
 615                if (table_offset + table->length > all_tables_size) {
 616                        acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
 617                        WARN_ON(1);
 618                        return AE_OK;
 619                }
 620
 621                table_length = table->length;
 622
 623                /* Only override tables matched */
 624                if (memcmp(existing_table->signature, table->signature, 4) ||
 625                    memcmp(table->oem_id, existing_table->oem_id,
 626                           ACPI_OEM_ID_SIZE) ||
 627                    memcmp(table->oem_table_id, existing_table->oem_table_id,
 628                           ACPI_OEM_TABLE_ID_SIZE)) {
 629                        acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
 630                        goto next_table;
 631                }
 632                /*
 633                 * Mark the table to avoid being used in
 634                 * acpi_table_initrd_scan() and check the revision.
 635                 */
 636                if (test_and_set_bit(table_index, acpi_initrd_installed) ||
 637                    existing_table->oem_revision >= table->oem_revision) {
 638                        acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
 639                        goto next_table;
 640                }
 641
 642                *length = table_length;
 643                *address = acpi_tables_addr + table_offset;
 644                pr_info("Table Upgrade: override [%4.4s-%6.6s-%8.8s]\n",
 645                        table->signature, table->oem_id,
 646                        table->oem_table_id);
 647                acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
 648                break;
 649
 650next_table:
 651                table_offset += table_length;
 652                table_index++;
 653        }
 654        return AE_OK;
 655}
 656
 657static void __init acpi_table_initrd_scan(void)
 658{
 659        int table_offset = 0;
 660        int table_index = 0;
 661        u32 table_length;
 662        struct acpi_table_header *table;
 663
 664        if (!acpi_tables_addr)
 665                return;
 666
 667        while (table_offset + ACPI_HEADER_SIZE <= all_tables_size) {
 668                table = acpi_os_map_memory(acpi_tables_addr + table_offset,
 669                                           ACPI_HEADER_SIZE);
 670                if (table_offset + table->length > all_tables_size) {
 671                        acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
 672                        WARN_ON(1);
 673                        return;
 674                }
 675
 676                table_length = table->length;
 677
 678                /* Skip RSDT/XSDT which should only be used for override */
 679                if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_RSDT) ||
 680                    ACPI_COMPARE_NAME(table->signature, ACPI_SIG_XSDT)) {
 681                        acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
 682                        goto next_table;
 683                }
 684                /*
 685                 * Mark the table to avoid being used in
 686                 * acpi_table_initrd_override(). Though this is not possible
 687                 * because override is disabled in acpi_install_table().
 688                 */
 689                if (test_and_set_bit(table_index, acpi_initrd_installed)) {
 690                        acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
 691                        goto next_table;
 692                }
 693
 694                pr_info("Table Upgrade: install [%4.4s-%6.6s-%8.8s]\n",
 695                        table->signature, table->oem_id,
 696                        table->oem_table_id);
 697                acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
 698                acpi_install_table(acpi_tables_addr + table_offset, TRUE);
 699next_table:
 700                table_offset += table_length;
 701                table_index++;
 702        }
 703}
 704#else
 705static acpi_status
 706acpi_table_initrd_override(struct acpi_table_header *existing_table,
 707                           acpi_physical_address *address,
 708                           u32 *table_length)
 709{
 710        *table_length = 0;
 711        *address = 0;
 712        return AE_OK;
 713}
 714
 715static void __init acpi_table_initrd_scan(void)
 716{
 717}
 718#endif /* CONFIG_ACPI_TABLE_UPGRADE */
 719
 720acpi_status
 721acpi_os_physical_table_override(struct acpi_table_header *existing_table,
 722                                acpi_physical_address *address,
 723                                u32 *table_length)
 724{
 725        return acpi_table_initrd_override(existing_table, address,
 726                                          table_length);
 727}
 728
 729acpi_status
 730acpi_os_table_override(struct acpi_table_header *existing_table,
 731                       struct acpi_table_header **new_table)
 732{
 733        if (!existing_table || !new_table)
 734                return AE_BAD_PARAMETER;
 735
 736        *new_table = NULL;
 737
 738#ifdef CONFIG_ACPI_CUSTOM_DSDT
 739        if (strncmp(existing_table->signature, "DSDT", 4) == 0)
 740                *new_table = (struct acpi_table_header *)AmlCode;
 741#endif
 742        if (*new_table != NULL)
 743                acpi_table_taint(existing_table);
 744        return AE_OK;
 745}
 746
 747/*
 748 * acpi_table_init()
 749 *
 750 * find RSDP, find and checksum SDT/XSDT.
 751 * checksum all tables, print SDT/XSDT
 752 *
 753 * result: sdt_entry[] is initialized
 754 */
 755
 756int __init acpi_table_init(void)
 757{
 758        acpi_status status;
 759
 760        if (acpi_verify_table_checksum) {
 761                pr_info("Early table checksum verification enabled\n");
 762                acpi_gbl_verify_table_checksum = TRUE;
 763        } else {
 764                pr_info("Early table checksum verification disabled\n");
 765                acpi_gbl_verify_table_checksum = FALSE;
 766        }
 767
 768        status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
 769        if (ACPI_FAILURE(status))
 770                return -EINVAL;
 771        acpi_table_initrd_scan();
 772
 773        check_multiple_madt();
 774        return 0;
 775}
 776
 777static int __init acpi_parse_apic_instance(char *str)
 778{
 779        if (!str)
 780                return -EINVAL;
 781
 782        if (kstrtoint(str, 0, &acpi_apic_instance))
 783                return -EINVAL;
 784
 785        pr_notice("Shall use APIC/MADT table %d\n", acpi_apic_instance);
 786
 787        return 0;
 788}
 789
 790early_param("acpi_apic_instance", acpi_parse_apic_instance);
 791
 792static int __init acpi_force_table_verification_setup(char *s)
 793{
 794        acpi_verify_table_checksum = true;
 795
 796        return 0;
 797}
 798
 799early_param("acpi_force_table_verification", acpi_force_table_verification_setup);
 800
 801static int __init acpi_force_32bit_fadt_addr(char *s)
 802{
 803        pr_info("Forcing 32 Bit FADT addresses\n");
 804        acpi_gbl_use32_bit_fadt_addresses = TRUE;
 805
 806        return 0;
 807}
 808
 809early_param("acpi_force_32bit_fadt_addr", acpi_force_32bit_fadt_addr);
 810