11965aae3SH. Peter Anvin #ifndef _ASM_X86_EFI_H 21965aae3SH. Peter Anvin #define _ASM_X86_EFI_H 3bb898558SAl Viro 4d2f7cbe7SBorislav Petkov /* 5d2f7cbe7SBorislav Petkov * We map the EFI regions needed for runtime services non-contiguously, 6d2f7cbe7SBorislav Petkov * with preserved alignment on virtual addresses starting from -4G down 7d2f7cbe7SBorislav Petkov * for a total max space of 64G. This way, we provide for stable runtime 8d2f7cbe7SBorislav Petkov * services addresses across kernels so that a kexec'd kernel can still 9d2f7cbe7SBorislav Petkov * use them. 10d2f7cbe7SBorislav Petkov * 11d2f7cbe7SBorislav Petkov * This is the main reason why we're doing stable VA mappings for RT 12d2f7cbe7SBorislav Petkov * services. 13d2f7cbe7SBorislav Petkov * 14d2f7cbe7SBorislav Petkov * This flag is used in conjuction with a chicken bit called 15d2f7cbe7SBorislav Petkov * "efi=old_map" which can be used as a fallback to the old runtime 16d2f7cbe7SBorislav Petkov * services mapping method in case there's some b0rkage with a 17d2f7cbe7SBorislav Petkov * particular EFI implementation (haha, it is hard to hold up the 18d2f7cbe7SBorislav Petkov * sarcasm here...). 19d2f7cbe7SBorislav Petkov */ 20d2f7cbe7SBorislav Petkov #define EFI_OLD_MEMMAP EFI_ARCH_1 21d2f7cbe7SBorislav Petkov 22b8ff87a6SMatt Fleming #define EFI32_LOADER_SIGNATURE "EL32" 23b8ff87a6SMatt Fleming #define EFI64_LOADER_SIGNATURE "EL64" 24b8ff87a6SMatt Fleming 25bb898558SAl Viro #ifdef CONFIG_X86_32 26bb898558SAl Viro 27f7d7d01bSMatt Fleming 28bb898558SAl Viro extern unsigned long asmlinkage efi_call_phys(void *, ...); 29bb898558SAl Viro 30bb898558SAl Viro /* 31bb898558SAl Viro * Wrap all the virtual calls in a way that forces the parameters on the stack. 32bb898558SAl Viro */ 33bb898558SAl Viro 34*982e239cSRicardo Neri /* Use this macro if your virtual returns a non-void value */ 35bb898558SAl Viro #define efi_call_virt(f, args...) \ 36bb898558SAl Viro ((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->f)(args) 37bb898558SAl Viro 38*982e239cSRicardo Neri /* Use this macro if your virtual call does not return any value */ 39*982e239cSRicardo Neri #define __efi_call_virt(f, args...) efi_call_virt(f, args) 40*982e239cSRicardo Neri 413e8fa263SMatt Fleming #define efi_ioremap(addr, size, type, attr) ioremap_cache(addr, size) 42e1ad783bSKeith Packard 43bb898558SAl Viro #else /* !CONFIG_X86_32 */ 44bb898558SAl Viro 4562fa6e69SMatt Fleming #define EFI_LOADER_SIGNATURE "EL64" 46bb898558SAl Viro 4762fa6e69SMatt Fleming extern u64 asmlinkage efi_call(void *fp, ...); 48bb898558SAl Viro 4962fa6e69SMatt Fleming #define efi_call_phys(f, args...) efi_call((f), args) 5062fa6e69SMatt Fleming 5162fa6e69SMatt Fleming #define efi_call_virt(f, ...) \ 52d2f7cbe7SBorislav Petkov ({ \ 53d2f7cbe7SBorislav Petkov efi_status_t __s; \ 54d2f7cbe7SBorislav Petkov \ 55d2f7cbe7SBorislav Petkov efi_sync_low_kernel_mappings(); \ 56d2f7cbe7SBorislav Petkov preempt_disable(); \ 5762fa6e69SMatt Fleming __s = efi_call((void *)efi.systab->runtime->f, __VA_ARGS__); \ 58d2f7cbe7SBorislav Petkov preempt_enable(); \ 59d2f7cbe7SBorislav Petkov __s; \ 60d2f7cbe7SBorislav Petkov }) 61d2f7cbe7SBorislav Petkov 62*982e239cSRicardo Neri /* 63*982e239cSRicardo Neri * All X86_64 virt calls return non-void values. Thus, use non-void call for 64*982e239cSRicardo Neri * virt calls that would be void on X86_32. 65*982e239cSRicardo Neri */ 66*982e239cSRicardo Neri #define __efi_call_virt(f, args...) efi_call_virt(f, args) 67*982e239cSRicardo Neri 68e1ad783bSKeith Packard extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, 693e8fa263SMatt Fleming u32 type, u64 attribute); 70e1ad783bSKeith Packard 71bb898558SAl Viro #endif /* CONFIG_X86_32 */ 72bb898558SAl Viro 73cbafbc82SJaswinder Singh Rajput extern int add_efi_memmap; 74d2f7cbe7SBorislav Petkov extern struct efi_scratch efi_scratch; 759cd2b07cSMatthew Garrett extern void efi_set_executable(efi_memory_desc_t *md, bool executable); 761adbfa35SOlof Johansson extern int efi_memblock_x86_reserve_range(void); 77bb898558SAl Viro extern void efi_call_phys_prelog(void); 78bb898558SAl Viro extern void efi_call_phys_epilog(void); 795189c2a7SOlof Johansson extern void efi_unmap_memmap(void); 803e8fa263SMatt Fleming extern void efi_memory_uc(u64 addr, unsigned long size); 81d2f7cbe7SBorislav Petkov extern void __init efi_map_region(efi_memory_desc_t *md); 823b266496SDave Young extern void __init efi_map_region_fixed(efi_memory_desc_t *md); 83d2f7cbe7SBorislav Petkov extern void efi_sync_low_kernel_mappings(void); 84b7b898aeSBorislav Petkov extern int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages); 85b7b898aeSBorislav Petkov extern void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages); 86d2f7cbe7SBorislav Petkov extern void __init old_map_region(efi_memory_desc_t *md); 87c55d016fSBorislav Petkov extern void __init runtime_code_page_mkexec(void); 88c55d016fSBorislav Petkov extern void __init efi_runtime_mkexec(void); 8911cc8512SBorislav Petkov extern void __init efi_dump_pagetable(void); 90a5d90c92SBorislav Petkov extern void __init efi_apply_memmap_quirks(void); 91bb898558SAl Viro 921fec0533SDave Young struct efi_setup_data { 931fec0533SDave Young u64 fw_vendor; 941fec0533SDave Young u64 runtime; 951fec0533SDave Young u64 tables; 961fec0533SDave Young u64 smbios; 971fec0533SDave Young u64 reserved[8]; 981fec0533SDave Young }; 991fec0533SDave Young 1001fec0533SDave Young extern u64 efi_setup; 1011fec0533SDave Young 1026b59e366SSatoru Takeuchi #ifdef CONFIG_EFI 1036b59e366SSatoru Takeuchi 1046b59e366SSatoru Takeuchi static inline bool efi_is_native(void) 1056b59e366SSatoru Takeuchi { 1066b59e366SSatoru Takeuchi return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT); 1076b59e366SSatoru Takeuchi } 1086b59e366SSatoru Takeuchi 1097d453eeeSMatt Fleming static inline bool efi_runtime_supported(void) 1107d453eeeSMatt Fleming { 1117d453eeeSMatt Fleming if (efi_is_native()) 1127d453eeeSMatt Fleming return true; 1137d453eeeSMatt Fleming 1147d453eeeSMatt Fleming if (IS_ENABLED(CONFIG_EFI_MIXED) && !efi_enabled(EFI_OLD_MEMMAP)) 1157d453eeeSMatt Fleming return true; 1167d453eeeSMatt Fleming 1177d453eeeSMatt Fleming return false; 1187d453eeeSMatt Fleming } 1197d453eeeSMatt Fleming 12072548e83SMatt Fleming extern struct console early_efi_console; 1215c12af0cSDave Young extern void parse_efi_setup(u64 phys_addr, u32 data_len); 1224f9dbcfcSMatt Fleming 1234f9dbcfcSMatt Fleming #ifdef CONFIG_EFI_MIXED 1244f9dbcfcSMatt Fleming extern void efi_thunk_runtime_setup(void); 1254f9dbcfcSMatt Fleming extern efi_status_t efi_thunk_set_virtual_address_map( 1264f9dbcfcSMatt Fleming void *phys_set_virtual_address_map, 1274f9dbcfcSMatt Fleming unsigned long memory_map_size, 1284f9dbcfcSMatt Fleming unsigned long descriptor_size, 1294f9dbcfcSMatt Fleming u32 descriptor_version, 1304f9dbcfcSMatt Fleming efi_memory_desc_t *virtual_map); 1314f9dbcfcSMatt Fleming #else 1324f9dbcfcSMatt Fleming static inline void efi_thunk_runtime_setup(void) {} 1334f9dbcfcSMatt Fleming static inline efi_status_t efi_thunk_set_virtual_address_map( 1344f9dbcfcSMatt Fleming void *phys_set_virtual_address_map, 1354f9dbcfcSMatt Fleming unsigned long memory_map_size, 1364f9dbcfcSMatt Fleming unsigned long descriptor_size, 1374f9dbcfcSMatt Fleming u32 descriptor_version, 1384f9dbcfcSMatt Fleming efi_memory_desc_t *virtual_map) 1394f9dbcfcSMatt Fleming { 1404f9dbcfcSMatt Fleming return EFI_SUCCESS; 1414f9dbcfcSMatt Fleming } 1424f9dbcfcSMatt Fleming #endif /* CONFIG_EFI_MIXED */ 1436b59e366SSatoru Takeuchi #else 144bb898558SAl Viro /* 145bb898558SAl Viro * IF EFI is not configured, have the EFI calls return -ENOSYS. 146bb898558SAl Viro */ 147bb898558SAl Viro #define efi_call0(_f) (-ENOSYS) 148bb898558SAl Viro #define efi_call1(_f, _a1) (-ENOSYS) 149bb898558SAl Viro #define efi_call2(_f, _a1, _a2) (-ENOSYS) 150bb898558SAl Viro #define efi_call3(_f, _a1, _a2, _a3) (-ENOSYS) 151bb898558SAl Viro #define efi_call4(_f, _a1, _a2, _a3, _a4) (-ENOSYS) 152bb898558SAl Viro #define efi_call5(_f, _a1, _a2, _a3, _a4, _a5) (-ENOSYS) 153bb898558SAl Viro #define efi_call6(_f, _a1, _a2, _a3, _a4, _a5, _a6) (-ENOSYS) 1545c12af0cSDave Young static inline void parse_efi_setup(u64 phys_addr, u32 data_len) {} 155bb898558SAl Viro #endif /* CONFIG_EFI */ 156bb898558SAl Viro 1571965aae3SH. Peter Anvin #endif /* _ASM_X86_EFI_H */ 158