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
 242pgprot_t __acpi_get_mem_attribute(phys_addr_t addr)
 243{
 244        /*
 245         * According to "Table 8 Map: EFI memory types to AArch64 memory
 246         * types" of UEFI 2.5 section 2.3.6.1, each EFI memory type is
 247         * mapped to a corresponding MAIR attribute encoding.
 248         * The EFI memory attribute advises all possible capabilities
 249         * of a memory region. We use the most efficient capability.
 250         */
 251
 252        u64 attr;
 253
 254        attr = efi_mem_attributes(addr);
 255        if (attr & EFI_MEMORY_WB)
 256                return PAGE_KERNEL;
 257        if (attr & EFI_MEMORY_WT)
 258                return __pgprot(PROT_NORMAL_WT);
 259        if (attr & EFI_MEMORY_WC)
 260                return __pgprot(PROT_NORMAL_NC);
 261        return __pgprot(PROT_DEVICE_nGnRnE);
 262}
 263
 264void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
 265{
 266        efi_memory_desc_t *md, *region = NULL;
 267        pgprot_t prot;
 268
 269        if (WARN_ON_ONCE(!efi_enabled(EFI_MEMMAP)))
 270                return NULL;
 271
 272        for_each_efi_memory_desc(md) {
 273                u64 end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT);
 274
 275                if (phys < md->phys_addr || phys >= end)
 276                        continue;
 277
 278                if (phys + size > end) {
 279                        pr_warn(FW_BUG "requested region covers multiple EFI memory regions\n");
 280                        return NULL;
 281                }
 282                region = md;
 283                break;
 284        }
 285
 286        /*
 287         * It is fine for AML to remap regions that are not represented in the
 288         * EFI memory map at all, as it only describes normal memory, and MMIO
 289         * regions that require a virtual mapping to make them accessible to
 290         * the EFI runtime services.
 291         */
 292        prot = __pgprot(PROT_DEVICE_nGnRnE);
 293        if (region) {
 294                switch (region->type) {
 295                case EFI_LOADER_CODE:
 296                case EFI_LOADER_DATA:
 297                case EFI_BOOT_SERVICES_CODE:
 298                case EFI_BOOT_SERVICES_DATA:
 299                case EFI_CONVENTIONAL_MEMORY:
 300                case EFI_PERSISTENT_MEMORY:
 301                        if (memblock_is_map_memory(phys) ||
 302                            !memblock_is_region_memory(phys, size)) {
 303                                pr_warn(FW_BUG "requested region covers kernel memory @ %pa\n", &phys);
 304                                return NULL;
 305                        }
 306                        /*
 307                         * Mapping kernel memory is permitted if the region in
 308                         * question is covered by a single memblock with the
 309                         * NOMAP attribute set: this enables the use of ACPI
 310                         * table overrides passed via initramfs, which are
 311                         * reserved in memory using arch_reserve_mem_area()
 312                         * below. As this particular use case only requires
 313                         * read access, fall through to the R/O mapping case.
 314                         */
 315                        fallthrough;
 316
 317                case EFI_RUNTIME_SERVICES_CODE:
 318                        /*
 319                         * This would be unusual, but not problematic per se,
 320                         * as long as we take care not to create a writable
 321                         * mapping for executable code.
 322                         */
 323                        prot = PAGE_KERNEL_RO;
 324                        break;
 325
 326                case EFI_ACPI_RECLAIM_MEMORY:
 327                        /*
 328                         * ACPI reclaim memory is used to pass firmware tables
 329                         * and other data that is intended for consumption by
 330                         * the OS only, which may decide it wants to reclaim
 331                         * that memory and use it for something else. We never
 332                         * do that, but we usually add it to the linear map
 333                         * anyway, in which case we should use the existing
 334                         * mapping.
 335                         */
 336                        if (memblock_is_map_memory(phys))
 337                                return (void __iomem *)__phys_to_virt(phys);
 338                        fallthrough;
 339
 340                default:
 341                        if (region->attribute & EFI_MEMORY_WB)
 342                                prot = PAGE_KERNEL;
 343                        else if (region->attribute & EFI_MEMORY_WT)
 344                                prot = __pgprot(PROT_NORMAL_WT);
 345                        else if (region->attribute & EFI_MEMORY_WC)
 346                                prot = __pgprot(PROT_NORMAL_NC);
 347                }
 348        }
 349        return __ioremap(phys, size, prot);
 350}
 351
 352/*
 353 * Claim Synchronous External Aborts as a firmware first notification.
 354 *
 355 * Used by KVM and the arch do_sea handler.
 356 * @regs may be NULL when called from process context.
 357 */
 358int apei_claim_sea(struct pt_regs *regs)
 359{
 360        int err = -ENOENT;
 361        bool return_to_irqs_enabled;
 362        unsigned long current_flags;
 363
 364        if (!IS_ENABLED(CONFIG_ACPI_APEI_GHES))
 365                return err;
 366
 367        current_flags = local_daif_save_flags();
 368
 369        /* current_flags isn't useful here as daif doesn't tell us about pNMI */
 370        return_to_irqs_enabled = !irqs_disabled_flags(arch_local_save_flags());
 371
 372        if (regs)
 373                return_to_irqs_enabled = interrupts_enabled(regs);
 374
 375        /*
 376         * SEA can interrupt SError, mask it and describe this as an NMI so
 377         * that APEI defers the handling.
 378         */
 379        local_daif_restore(DAIF_ERRCTX);
 380        nmi_enter();
 381        err = ghes_notify_sea();
 382        nmi_exit();
 383
 384        /*
 385         * APEI NMI-like notifications are deferred to irq_work. Unless
 386         * we interrupted irqs-masked code, we can do that now.
 387         */
 388        if (!err) {
 389                if (return_to_irqs_enabled) {
 390                        local_daif_restore(DAIF_PROCCTX_NOIRQ);
 391                        __irq_enter();
 392                        irq_work_run();
 393                        __irq_exit();
 394                } else {
 395                        pr_warn_ratelimited("APEI work queued but not completed");
 396                        err = -EINPROGRESS;
 397                }
 398        }
 399
 400        local_daif_restore(current_flags);
 401
 402        return err;
 403}
 404
 405void arch_reserve_mem_area(acpi_physical_address addr, size_t size)
 406{
 407        memblock_mark_nomap(addr, size);
 408}
 409