xref: /OK3568_Linux_fs/kernel/arch/arm64/include/asm/acpi.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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