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