Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (C) 2013-2014, Linaro Ltd. * Author: Al Stone <al.stone@linaro.org> * Author: Graeme Gregory <graeme.gregory@linaro.org> * Author: Hanjun Guo <hanjun.guo@linaro.org> */ #ifndef _ASM_ACPI_H #define _ASM_ACPI_H #include <linux/cpuidle.h> #include <linux/efi.h> #include <linux/memblock.h> #include <linux/psci.h> #include <linux/stddef.h> #include <asm/cputype.h> #include <asm/io.h> #include <asm/ptrace.h> #include <asm/smp_plat.h> #include <asm/tlbflush.h> /* Macros for consistency checks of the GICC subtable of MADT */ /* * MADT GICC minimum length refers to the MADT GICC structure table length as * defined in the earliest ACPI version supported on arm64, ie ACPI 5.1. * * The efficiency_class member was added to the * struct acpi_madt_generic_interrupt to represent the MADT GICC structure * "Processor Power Efficiency Class" field, added in ACPI 6.0 whose offset * is therefore used to delimit the MADT GICC structure minimum length * appropriately. */ #define ACPI_MADT_GICC_MIN_LENGTH offsetof( \ struct acpi_madt_generic_interrupt, efficiency_class) #define BAD_MADT_GICC_ENTRY(entry, end) \ (!(entry) || (entry)->header.length < ACPI_MADT_GICC_MIN_LENGTH || \ (unsigned long)(entry) + (entry)->header.length > (end)) #define ACPI_MADT_GICC_SPE (offsetof(struct acpi_madt_generic_interrupt, \ spe_interrupt) + sizeof(u16)) #define ACPI_MADT_GICC_TRBE (offsetof(struct acpi_madt_generic_interrupt, \ trbe_interrupt) + sizeof(u16)) /* * ArmĀ® Functional Fixed Hardware Specification Version 1.2. * Table 2: Arm Architecture context loss flags */ #define CPUIDLE_CORE_CTXT BIT(0) /* Core context Lost */ static inline unsigned int arch_get_idle_state_flags(u32 arch_flags) { if (arch_flags & CPUIDLE_CORE_CTXT) return CPUIDLE_FLAG_TIMER_STOP; return 0; } #define arch_get_idle_state_flags arch_get_idle_state_flags #define CPUIDLE_TRACE_CTXT BIT(1) /* Trace context loss */ #define CPUIDLE_GICR_CTXT BIT(2) /* GICR */ #define CPUIDLE_GICD_CTXT BIT(3) /* GICD */ /* Basic configuration for ACPI */ #ifdef CONFIG_ACPI pgprot_t __acpi_get_mem_attribute(phys_addr_t addr); /* ACPI table mapping after acpi_permanent_mmap is set */ void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size); #define acpi_os_ioremap acpi_os_ioremap typedef u64 phys_cpuid_t; #define PHYS_CPUID_INVALID INVALID_HWID #define acpi_strict 1 /* No out-of-spec workarounds on ARM64 */ extern int acpi_disabled; extern int acpi_noirq; extern int acpi_pci_disabled; static inline void disable_acpi(void) { acpi_disabled = 1; acpi_pci_disabled = 1; acpi_noirq = 1; } static inline void enable_acpi(void) { acpi_disabled = 0; acpi_pci_disabled = 0; acpi_noirq = 0; } /* * The ACPI processor driver for ACPI core code needs this macro * to find out this cpu was already mapped (mapping from CPU hardware * ID to CPU logical ID) or not. */ #define cpu_physical_id(cpu) cpu_logical_map(cpu) /* * It's used from ACPI core in kdump to boot UP system with SMP kernel, * with this check the ACPI core will not override the CPU index * obtained from GICC with 0 and not print some error message as well. * Since MADT must provide at least one GICC structure for GIC * initialization, CPU will be always available in MADT on ARM64. */ static inline bool acpi_has_cpu_in_madt(void) { return true; } struct acpi_madt_generic_interrupt *acpi_cpu_get_madt_gicc(int cpu); static inline u32 get_acpi_id_for_cpu(unsigned int cpu) { return acpi_cpu_get_madt_gicc(cpu)->uid; } static inline void arch_fix_phys_package_id(int num, u32 slot) { } void __init acpi_init_cpus(void); int apei_claim_sea(struct pt_regs *regs); #else static inline void acpi_init_cpus(void) { } static inline int apei_claim_sea(struct pt_regs *regs) { return -ENOENT; } #endif /* CONFIG_ACPI */ #ifdef CONFIG_ARM64_ACPI_PARKING_PROTOCOL bool acpi_parking_protocol_valid(int cpu); void __init acpi_set_mailbox_entry(int cpu, struct acpi_madt_generic_interrupt *processor); #else static inline bool acpi_parking_protocol_valid(int cpu) { return false; } static inline void acpi_set_mailbox_entry(int cpu, struct acpi_madt_generic_interrupt *processor) {} #endif static inline const char *acpi_get_enable_method(int cpu) { if (acpi_psci_present()) return "psci"; if (acpi_parking_protocol_valid(cpu)) return "parking-protocol"; return NULL; } #ifdef CONFIG_ACPI_APEI /* * acpi_disable_cmcff is used in drivers/acpi/apei/hest.c for disabling * IA-32 Architecture Corrected Machine Check (CMC) Firmware-First mode * with a kernel command line parameter "acpi=nocmcoff". But we don't * have this IA-32 specific feature on ARM64, this definition is only * for compatibility. */ #define acpi_disable_cmcff 1 static inline pgprot_t arch_apei_get_mem_attribute(phys_addr_t addr) { return __acpi_get_mem_attribute(addr); } #endif /* CONFIG_ACPI_APEI */ #ifdef CONFIG_ACPI_NUMA int arm64_acpi_numa_init(void); int acpi_numa_get_nid(unsigned int cpu); void acpi_map_cpus_to_nodes(void); #else static inline int arm64_acpi_numa_init(void) { return -ENOSYS; } static inline int acpi_numa_get_nid(unsigned int cpu) { return NUMA_NO_NODE; } static inline void acpi_map_cpus_to_nodes(void) { } #endif /* CONFIG_ACPI_NUMA */ #define ACPI_TABLE_UPGRADE_MAX_PHYS MEMBLOCK_ALLOC_ACCESSIBLE #endif /*_ASM_ACPI_H*/ |