11965aae3SH. Peter Anvin #ifndef _ASM_X86_EFI_H 21965aae3SH. Peter Anvin #define _ASM_X86_EFI_H 3bb898558SAl Viro 4*de05764eSRicardo Neri #include <asm/i387.h> 5d2f7cbe7SBorislav Petkov /* 6d2f7cbe7SBorislav Petkov * We map the EFI regions needed for runtime services non-contiguously, 7d2f7cbe7SBorislav Petkov * with preserved alignment on virtual addresses starting from -4G down 8d2f7cbe7SBorislav Petkov * for a total max space of 64G. This way, we provide for stable runtime 9d2f7cbe7SBorislav Petkov * services addresses across kernels so that a kexec'd kernel can still 10d2f7cbe7SBorislav Petkov * use them. 11d2f7cbe7SBorislav Petkov * 12d2f7cbe7SBorislav Petkov * This is the main reason why we're doing stable VA mappings for RT 13d2f7cbe7SBorislav Petkov * services. 14d2f7cbe7SBorislav Petkov * 15d2f7cbe7SBorislav Petkov * This flag is used in conjuction with a chicken bit called 16d2f7cbe7SBorislav Petkov * "efi=old_map" which can be used as a fallback to the old runtime 17d2f7cbe7SBorislav Petkov * services mapping method in case there's some b0rkage with a 18d2f7cbe7SBorislav Petkov * particular EFI implementation (haha, it is hard to hold up the 19d2f7cbe7SBorislav Petkov * sarcasm here...). 20d2f7cbe7SBorislav Petkov */ 21d2f7cbe7SBorislav Petkov #define EFI_OLD_MEMMAP EFI_ARCH_1 22d2f7cbe7SBorislav Petkov 23b8ff87a6SMatt Fleming #define EFI32_LOADER_SIGNATURE "EL32" 24b8ff87a6SMatt Fleming #define EFI64_LOADER_SIGNATURE "EL64" 25b8ff87a6SMatt Fleming 26bb898558SAl Viro #ifdef CONFIG_X86_32 27bb898558SAl Viro 28f7d7d01bSMatt Fleming 29bb898558SAl Viro extern unsigned long asmlinkage efi_call_phys(void *, ...); 30bb898558SAl Viro 31bb898558SAl Viro /* 32bb898558SAl Viro * Wrap all the virtual calls in a way that forces the parameters on the stack. 33bb898558SAl Viro */ 34bb898558SAl Viro 35982e239cSRicardo Neri /* Use this macro if your virtual returns a non-void value */ 36bb898558SAl Viro #define efi_call_virt(f, args...) \ 37bb898558SAl Viro ((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->f)(args) 38bb898558SAl Viro 39982e239cSRicardo Neri /* Use this macro if your virtual call does not return any value */ 40982e239cSRicardo Neri #define __efi_call_virt(f, args...) efi_call_virt(f, args) 41982e239cSRicardo Neri 423e8fa263SMatt Fleming #define efi_ioremap(addr, size, type, attr) ioremap_cache(addr, size) 43e1ad783bSKeith Packard 44bb898558SAl Viro #else /* !CONFIG_X86_32 */ 45bb898558SAl Viro 4662fa6e69SMatt Fleming #define EFI_LOADER_SIGNATURE "EL64" 47bb898558SAl Viro 4862fa6e69SMatt Fleming extern u64 asmlinkage efi_call(void *fp, ...); 49bb898558SAl Viro 5062fa6e69SMatt Fleming #define efi_call_phys(f, args...) efi_call((f), args) 5162fa6e69SMatt Fleming 5262fa6e69SMatt Fleming #define efi_call_virt(f, ...) \ 53d2f7cbe7SBorislav Petkov ({ \ 54d2f7cbe7SBorislav Petkov efi_status_t __s; \ 55d2f7cbe7SBorislav Petkov \ 56d2f7cbe7SBorislav Petkov efi_sync_low_kernel_mappings(); \ 57d2f7cbe7SBorislav Petkov preempt_disable(); \ 58*de05764eSRicardo Neri __kernel_fpu_begin(); \ 5962fa6e69SMatt Fleming __s = efi_call((void *)efi.systab->runtime->f, __VA_ARGS__); \ 60*de05764eSRicardo Neri __kernel_fpu_end(); \ 61d2f7cbe7SBorislav Petkov preempt_enable(); \ 62d2f7cbe7SBorislav Petkov __s; \ 63d2f7cbe7SBorislav Petkov }) 64d2f7cbe7SBorislav Petkov 65982e239cSRicardo Neri /* 66982e239cSRicardo Neri * All X86_64 virt calls return non-void values. Thus, use non-void call for 67982e239cSRicardo Neri * virt calls that would be void on X86_32. 68982e239cSRicardo Neri */ 69982e239cSRicardo Neri #define __efi_call_virt(f, args...) efi_call_virt(f, args) 70982e239cSRicardo Neri 71e1ad783bSKeith Packard extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, 723e8fa263SMatt Fleming u32 type, u64 attribute); 73e1ad783bSKeith Packard 74bb898558SAl Viro #endif /* CONFIG_X86_32 */ 75bb898558SAl Viro 76cbafbc82SJaswinder Singh Rajput extern int add_efi_memmap; 77d2f7cbe7SBorislav Petkov extern struct efi_scratch efi_scratch; 789cd2b07cSMatthew Garrett extern void efi_set_executable(efi_memory_desc_t *md, bool executable); 791adbfa35SOlof Johansson extern int efi_memblock_x86_reserve_range(void); 80bb898558SAl Viro extern void efi_call_phys_prelog(void); 81bb898558SAl Viro extern void efi_call_phys_epilog(void); 825189c2a7SOlof Johansson extern void efi_unmap_memmap(void); 833e8fa263SMatt Fleming extern void efi_memory_uc(u64 addr, unsigned long size); 84d2f7cbe7SBorislav Petkov extern void __init efi_map_region(efi_memory_desc_t *md); 853b266496SDave Young extern void __init efi_map_region_fixed(efi_memory_desc_t *md); 86d2f7cbe7SBorislav Petkov extern void efi_sync_low_kernel_mappings(void); 87b7b898aeSBorislav Petkov extern int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages); 88b7b898aeSBorislav Petkov extern void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages); 89d2f7cbe7SBorislav Petkov extern void __init old_map_region(efi_memory_desc_t *md); 90c55d016fSBorislav Petkov extern void __init runtime_code_page_mkexec(void); 91c55d016fSBorislav Petkov extern void __init efi_runtime_mkexec(void); 9211cc8512SBorislav Petkov extern void __init efi_dump_pagetable(void); 93a5d90c92SBorislav Petkov extern void __init efi_apply_memmap_quirks(void); 94bb898558SAl Viro 951fec0533SDave Young struct efi_setup_data { 961fec0533SDave Young u64 fw_vendor; 971fec0533SDave Young u64 runtime; 981fec0533SDave Young u64 tables; 991fec0533SDave Young u64 smbios; 1001fec0533SDave Young u64 reserved[8]; 1011fec0533SDave Young }; 1021fec0533SDave Young 1031fec0533SDave Young extern u64 efi_setup; 1041fec0533SDave Young 1056b59e366SSatoru Takeuchi #ifdef CONFIG_EFI 1066b59e366SSatoru Takeuchi 1076b59e366SSatoru Takeuchi static inline bool efi_is_native(void) 1086b59e366SSatoru Takeuchi { 1096b59e366SSatoru Takeuchi return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT); 1106b59e366SSatoru Takeuchi } 1116b59e366SSatoru Takeuchi 1127d453eeeSMatt Fleming static inline bool efi_runtime_supported(void) 1137d453eeeSMatt Fleming { 1147d453eeeSMatt Fleming if (efi_is_native()) 1157d453eeeSMatt Fleming return true; 1167d453eeeSMatt Fleming 1177d453eeeSMatt Fleming if (IS_ENABLED(CONFIG_EFI_MIXED) && !efi_enabled(EFI_OLD_MEMMAP)) 1187d453eeeSMatt Fleming return true; 1197d453eeeSMatt Fleming 1207d453eeeSMatt Fleming return false; 1217d453eeeSMatt Fleming } 1227d453eeeSMatt Fleming 12372548e83SMatt Fleming extern struct console early_efi_console; 1245c12af0cSDave Young extern void parse_efi_setup(u64 phys_addr, u32 data_len); 1254f9dbcfcSMatt Fleming 1264f9dbcfcSMatt Fleming #ifdef CONFIG_EFI_MIXED 1274f9dbcfcSMatt Fleming extern void efi_thunk_runtime_setup(void); 1284f9dbcfcSMatt Fleming extern efi_status_t efi_thunk_set_virtual_address_map( 1294f9dbcfcSMatt Fleming void *phys_set_virtual_address_map, 1304f9dbcfcSMatt Fleming unsigned long memory_map_size, 1314f9dbcfcSMatt Fleming unsigned long descriptor_size, 1324f9dbcfcSMatt Fleming u32 descriptor_version, 1334f9dbcfcSMatt Fleming efi_memory_desc_t *virtual_map); 1344f9dbcfcSMatt Fleming #else 1354f9dbcfcSMatt Fleming static inline void efi_thunk_runtime_setup(void) {} 1364f9dbcfcSMatt Fleming static inline efi_status_t efi_thunk_set_virtual_address_map( 1374f9dbcfcSMatt Fleming void *phys_set_virtual_address_map, 1384f9dbcfcSMatt Fleming unsigned long memory_map_size, 1394f9dbcfcSMatt Fleming unsigned long descriptor_size, 1404f9dbcfcSMatt Fleming u32 descriptor_version, 1414f9dbcfcSMatt Fleming efi_memory_desc_t *virtual_map) 1424f9dbcfcSMatt Fleming { 1434f9dbcfcSMatt Fleming return EFI_SUCCESS; 1444f9dbcfcSMatt Fleming } 1454f9dbcfcSMatt Fleming #endif /* CONFIG_EFI_MIXED */ 1466b59e366SSatoru Takeuchi #else 147bb898558SAl Viro /* 148bb898558SAl Viro * IF EFI is not configured, have the EFI calls return -ENOSYS. 149bb898558SAl Viro */ 150bb898558SAl Viro #define efi_call0(_f) (-ENOSYS) 151bb898558SAl Viro #define efi_call1(_f, _a1) (-ENOSYS) 152bb898558SAl Viro #define efi_call2(_f, _a1, _a2) (-ENOSYS) 153bb898558SAl Viro #define efi_call3(_f, _a1, _a2, _a3) (-ENOSYS) 154bb898558SAl Viro #define efi_call4(_f, _a1, _a2, _a3, _a4) (-ENOSYS) 155bb898558SAl Viro #define efi_call5(_f, _a1, _a2, _a3, _a4, _a5) (-ENOSYS) 156bb898558SAl Viro #define efi_call6(_f, _a1, _a2, _a3, _a4, _a5, _a6) (-ENOSYS) 1575c12af0cSDave Young static inline void parse_efi_setup(u64 phys_addr, u32 data_len) {} 158bb898558SAl Viro #endif /* CONFIG_EFI */ 159bb898558SAl Viro 1601965aae3SH. Peter Anvin #endif /* _ASM_X86_EFI_H */ 161