linux/arch/arm64/kernel/acpi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  ARM64 Specific Low-Level ACPI Boot Support
   4 *
   5 *  Copyright (C) 2013-2014, Linaro Ltd.
   6 *      Author: Al Stone <al.stone@linaro.org>
   7 *      Author: Graeme Gregory <graeme.gregory@linaro.org>
   8 *      Author: Hanjun Guo <hanjun.guo@linaro.org>
   9 *      Author: Tomasz Nowicki <tomasz.nowicki@linaro.org>
  10 *      Author: Naresh Bhat <naresh.bhat@linaro.org>
  11 */
  12
  13#define pr_fmt(fmt) "ACPI: " fmt
  14
  15#include <linux/acpi.h>
  16#include <linux/cpumask.h>
  17#include <linux/efi.h>
  18#include <linux/efi-bgrt.h>
  19#include <linux/init.h>
  20#include <linux/irq.h>
  21#include <linux/irqdomain.h>
  22#include <linux/irq_work.h>
  23#include <linux/memblock.h>
  24#include <linux/of_fdt.h>
  25#include <linux/smp.h>
  26#include <linux/serial_core.h>
  27#include <linux/pgtable.h>
  28
  29#include <acpi/ghes.h>
  30#include <asm/cputype.h>
  31#include <asm/cpu_ops.h>
  32#include <asm/daifflags.h>
  33#include <asm/smp_plat.h>
  34
  35int acpi_noirq = 1;             /* skip ACPI IRQ initialization */
  36int acpi_disabled = 1;
  37EXPORT_SYMBOL(acpi_disabled);
  38
  39int acpi_pci_disabled = 1;      /* skip ACPI PCI scan and IRQ initialization */
  40EXPORT_SYMBOL(acpi_pci_disabled);
  41
  42static bool param_acpi_off __initdata;
  43static bool param_acpi_on __initdata;
  44static bool param_acpi_force __initdata;
  45
  46static int __init parse_acpi(char *arg)
  47{
  48        if (!arg)
  49                return -EINVAL;
  50
  51        /* "acpi=off" disables both ACPI table parsing and interpreter */
  52        if (strcmp(arg, "off") == 0)
  53                param_acpi_off = true;
  54        else if (strcmp(arg, "on") == 0) /* prefer ACPI over DT */
  55                param_acpi_on = true;
  56        else if (strcmp(arg, "force") == 0) /* force ACPI to be enabled */
  57                param_acpi_force = true;
  58        else
  59                return -EINVAL; /* Core will print when we return error */
  60
  61        return 0;
  62}
  63early_param("acpi", parse_acpi);
  64
  65static int __init dt_scan_depth1_nodes(unsigned long node,
  66                                       const char *uname, int depth,
  67                                       void *data)
  68{
  69        /*
  70         * Ignore anything not directly under the root node; we'll
  71         * catch its parent instead.
  72         */
  73        if (depth != 1)
  74                return 0;
  75
  76        if (strcmp(uname, "chosen") == 0)
  77                return 0;
  78
  79        if (strcmp(uname, "hypervisor") == 0 &&
  80            of_flat_dt_is_compatible(node, "xen,xen"))
  81                return 0;
  82
  83        /*
  84         * This node at depth 1 is neither a chosen node nor a xen node,
  85         * which we do not expect.
  86         */
  87        return 1;
  88}
  89
  90/*
  91 * __acpi_map_table() will be called before page_init(), so early_ioremap()
  92 * or early_memremap() should be called here to for ACPI table mapping.
  93 */
  94void __init __iomem *__acpi_map_table(unsigned long phys, unsigned long size)
  95{
  96        if (!size)
  97                return NULL;
  98
  99        return early_memremap(phys, size);
 100}
 101
 102void __init __acpi_unmap_table(void __iomem *map, unsigned long size)
 103{
 104        if (!map || !size)
 105                return;
 106
 107        early_memunmap(map, size);
 108}
 109
 110bool __init acpi_psci_present(void)
 111{
 112        return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_COMPLIANT;
 113}
 114
 115/* Whether HVC must be used instead of SMC as the PSCI conduit */
 116bool acpi_psci_use_hvc(void)
 117{
 118        return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC;
 119}
 120
 121/*
 122 * acpi_fadt_sanity_check() - Check FADT presence and carry out sanity
 123 *                            checks on it
 124 *
 125 * Return 0 on success,  <0 on failure
 126 */
 127static int __init acpi_fadt_sanity_check(void)
 128{
 129        struct acpi_table_header *table;
 130        struct acpi_table_fadt *fadt;
 131        acpi_status status;
 132        int ret = 0;
 133
 134        /*
 135         * FADT is required on arm64; retrieve it to check its presence
 136         * and carry out revision and ACPI HW reduced compliancy tests
 137         */
 138        status = acpi_get_table(ACPI_SIG_FADT, 0, &table);
 139        if (ACPI_FAILURE(status)) {
 140                const char *msg = acpi_format_exception(status);
 141
 142                pr_err("Failed to get FADT table, %s\n", msg);
 143                return -ENODEV;
 144        }
 145
 146        fadt = (struct acpi_table_fadt *)table;
 147
 148        /*
 149         * Revision in table header is the FADT Major revision, and there
 150         * is a minor revision of FADT which was introduced by ACPI 5.1,
 151         * we only deal with ACPI 5.1 or newer revision to get GIC and SMP
 152         * boot protocol configuration data.
 153         */
 154        if (table->revision < 5 ||
 155           (table->revision == 5 && fadt->minor_revision < 1)) {
 156                pr_err(FW_BUG "Unsupported FADT revision %d.%d, should be 5.1+\n",
 157                       table->revision, fadt->minor_revision);
 158
 159                if (!fadt->arm_boot_flags) {
 160                        ret = -EINVAL;
 161                        goto out;
 162                }
 163                pr_err("FADT has ARM boot flags set, assuming 5.1\n");
 164        }
 165
 166        if (!(fadt->flags & ACPI_FADT_HW_REDUCED)) {
 167                pr_err("FADT not ACPI hardware reduced compliant\n");
 168                ret = -EINVAL;
 169        }
 170
 171out:
 172        /*
 173         * acpi_get_table() creates FADT table mapping that
 174         * should be released after parsing and before resuming boot
 175         */
 176        acpi_put_table(table);
 177        return ret;
 178}
 179
 180/*
 181 * acpi_boot_table_init() called from setup_arch(), always.
 182 *      1. find RSDP and get its address, and then find XSDT
 183 *      2. extract all tables and checksums them all
 184 *      3. check ACPI FADT revision
 185 *      4. check ACPI FADT HW reduced flag
 186 *
 187 * We can parse ACPI boot-time tables such as MADT after
 188 * this function is called.
 189 *
 190 * On return ACPI is enabled if either:
 191 *
 192 * - ACPI tables are initialized and sanity checks passed
 193 * - acpi=force was passed in the command line and ACPI was not disabled
 194 *   explicitly through acpi=off command line parameter
 195 *
 196 * ACPI is disabled on function return otherwise
 197 */
 198void __init acpi_boot_table_init(void)
 199{
 200        /*
 201         * Enable ACPI instead of device tree unless
 202         * - ACPI has been disabled explicitly (acpi=off), or
 203         * - the device tree is not empty (it has more than just a /chosen node,
 204         *   and a /hypervisor node when running on Xen)
 205         *   and ACPI has not been [force] enabled (acpi=on|force)
 206         */
 207        if (param_acpi_off ||
 208            (!param_acpi_on && !param_acpi_force &&
 209             of_scan_flat_dt(dt_scan_depth1_nodes, NULL)))
 210                goto done;
 211
 212        /*
 213         * ACPI is disabled at this point. Enable it in order to parse
 214         * the ACPI tables and carry out sanity checks
 215         */
 216        enable_acpi();
 217
 218        /*
 219         * If ACPI tables are initialized and FADT sanity checks passed,
 220         * leave ACPI enabled and carry on booting; otherwise disable ACPI
 221         * on initialization error.
 222         * If acpi=force was passed on the command line it forces ACPI
 223         * to be enabled even if its initialization failed.
 224         */
 225        if (acpi_table_init() || acpi_fadt_sanity_check()) {
 226                pr_err("Failed to init ACPI tables\n");
 227                if (!param_acpi_force)
 228                        disable_acpi();
 229        }
 230
 231done:
 232        if (acpi_disabled) {
 233                if (earlycon_acpi_spcr_enable)
 234                        early_init_dt_scan_chosen_stdout();
 235        } else {
 236                acpi_parse_spcr(earlycon_acpi_spcr_enable, true);
 237                if (IS_ENABLED(CONFIG_ACPI_BGRT))
 238                        acpi_table_parse(ACPI_SIG_BGRT, acpi_parse_bgrt);
 239        }
 240}
 241
 242static pgprot_t __acpi_get_writethrough_mem_attribute(void)
 243{
 244        /*
 245         * Although UEFI specifies the use of Normal Write-through for
 246         * EFI_MEMORY_WT, it is seldom used in practice and not implemented
 247         * by most (all?) CPUs. Rather than allocate a MAIR just for this
 248         * purpose, emit a warning and use Normal Non-cacheable instead.
 249         */
 250        pr_warn_once("No MAIR allocation for EFI_MEMORY_WT; treating as Normal Non-cacheable\n");
 251        return __pgprot(PROT_NORMAL_NC);
 252}
 253
 254pgprot_t __acpi_get_mem_attribute(phys_addr_t addr)
 255{
 256        /*
 257         * According to "Table 8 Map: EFI memory types to AArch64 memory
 258         * types" of UEFI 2.5 section 2.3.6.1, each EFI memory type is
 259         * mapped to a corresponding MAIR attribute encoding.
 260         * The EFI memory attribute advises all possible capabilities
 261         * of a memory region.
 262         */
 263
 264        u64 attr;
 265
 266        attr = efi_mem_attributes(addr);
 267        if (attr & EFI_MEMORY_WB)
 268                return PAGE_KERNEL;
 269        if (attr & EFI_MEMORY_WC)
 270                return __pgprot(PROT_NORMAL_NC);
 271        if (attr & EFI_MEMORY_WT)
 272                return __acpi_get_writethrough_mem_attribute();
 273        return __pgprot(PROT_DEVICE_nGnRnE);
 274}
 275
 276void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
 277{
 278        efi_memory_desc_t *md, *region = NULL;
 279        pgprot_t prot;
 280
 281        if (WARN_ON_ONCE(!efi_enabled(EFI_MEMMAP)))
 282                return NULL;
 283
 284        for_each_efi_memory_desc(md) {
 285                u64 end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT);
 286
 287                if (phys < md->phys_addr || phys >= end)
 288                        continue;
 289
 290                if (phys + size > end) {
 291                        pr_warn(FW_BUG "requested region covers multiple EFI memory regions\n");
 292                        return NULL;
 293                }
 294                region = md;
 295                break;
 296        }
 297
 298        /*
 299         * It is fine for AML to remap regions that are not represented in the
 300         * EFI memory map at all, as it only describes normal memory, and MMIO
 301         * regions that require a virtual mapping to make them accessible to
 302         * the EFI runtime services.
 303         */
 304        prot = __pgprot(PROT_DEVICE_nGnRnE);
 305        if (region) {
 306                switch (region->type) {
 307                case EFI_LOADER_CODE:
 308                case EFI_LOADER_DATA:
 309                case EFI_BOOT_SERVICES_CODE:
 310                case EFI_BOOT_SERVICES_DATA:
 311                case EFI_CONVENTIONAL_MEMORY:
 312                case EFI_PERSISTENT_MEMORY:
 313                        if (memblock_is_map_memory(phys) ||
 314                            !memblock_is_region_memory(phys, size)) {
 315                                pr_warn(FW_BUG "requested region covers kernel memory @ %pa\n", &phys);
 316                                return NULL;
 317                        }
 318                        /*
 319                         * Mapping kernel memory is permitted if the region in
 320                         * question is covered by a single memblock with the
 321                         * NOMAP attribute set: this enables the use of ACPI
 322                         * table overrides passed via initramfs, which are
 323                         * reserved in memory using arch_reserve_mem_area()
 324                         * below. As this particular use case only requires
 325                         * read access, fall through to the R/O mapping case.
 326                         */
 327                        fallthrough;
 328
 329                case EFI_RUNTIME_SERVICES_CODE:
 330                        /*
 331                         * This would be unusual, but not problematic per se,
 332                         * as long as we take care not to create a writable
 333                         * mapping for executable code.
 334                         */
 335                        prot = PAGE_KERNEL_RO;
 336                        break;
 337
 338                case EFI_ACPI_RECLAIM_MEMORY:
 339                        /*
 340                         * ACPI reclaim memory is used to pass firmware tables
 341                         * and other data that is intended for consumption by
 342                         * the OS only, which may decide it wants to reclaim
 343                         * that memory and use it for something else. We never
 344                         * do that, but we usually add it to the linear map
 345                         * anyway, in which case we should use the existing
 346                         * mapping.
 347                         */
 348                        if (memblock_is_map_memory(phys))
 349                                return (void __iomem *)__phys_to_virt(phys);
 350                        fallthrough;
 351
 352                default:
 353                        if (region->attribute & EFI_MEMORY_WB)
 354                                prot = PAGE_KERNEL;
 355                        else if (region->attribute & EFI_MEMORY_WC)
 356                                prot = __pgprot(PROT_NORMAL_NC);
 357                        else if (region->attribute & EFI_MEMORY_WT)
 358                                prot = __acpi_get_writethrough_mem_attribute();
 359                }
 360        }
 361        return __ioremap(phys, size, prot);
 362}
 363
 364/*
 365 * Claim Synchronous External Aborts as a firmware first notification.
 366 *
 367 * Used by KVM and the arch do_sea handler.
 368 * @regs may be NULL when called from process context.
 369 */
 370int apei_claim_sea(struct pt_regs *regs)
 371{
 372        int err = -ENOENT;
 373        bool return_to_irqs_enabled;
 374        unsigned long current_flags;
 375
 376        if (!IS_ENABLED(CONFIG_ACPI_APEI_GHES))
 377                return err;
 378
 379        current_flags = local_daif_save_flags();
 380
 381        /* current_flags isn't useful here as daif doesn't tell us about pNMI */
 382        return_to_irqs_enabled = !irqs_disabled_flags(arch_local_save_flags());
 383
 384        if (regs)
 385                return_to_irqs_enabled = interrupts_enabled(regs);
 386
 387        /*
 388         * SEA can interrupt SError, mask it and describe this as an NMI so
 389         * that APEI defers the handling.
 390         */
 391        local_daif_restore(DAIF_ERRCTX);
 392        nmi_enter();
 393        err = ghes_notify_sea();
 394        nmi_exit();
 395
 396        /*
 397         * APEI NMI-like notifications are deferred to irq_work. Unless
 398         * we interrupted irqs-masked code, we can do that now.
 399         */
 400        if (!err) {
 401                if (return_to_irqs_enabled) {
 402                        local_daif_restore(DAIF_PROCCTX_NOIRQ);
 403                        __irq_enter();
 404                        irq_work_run();
 405                        __irq_exit();
 406                } else {
 407                        pr_warn_ratelimited("APEI work queued but not completed");
 408                        err = -EINPROGRESS;
 409                }
 410        }
 411
 412        local_daif_restore(current_flags);
 413
 414        return err;
 415}
 416
 417void arch_reserve_mem_area(acpi_physical_address addr, size_t size)
 418{
 419        memblock_mark_nomap(addr, size);
 420}
 421