1 #ifndef _ASM_EFI_H 2 #define _ASM_EFI_H 3 4 #include <asm/io.h> 5 #include <asm/neon.h> 6 7 #ifdef CONFIG_EFI 8 extern void efi_init(void); 9 #else 10 #define efi_init() 11 #endif 12 13 #define efi_call_virt(f, ...) \ 14 ({ \ 15 efi_##f##_t *__f; \ 16 efi_status_t __s; \ 17 \ 18 kernel_neon_begin(); \ 19 efi_virtmap_load(); \ 20 __f = efi.systab->runtime->f; \ 21 __s = __f(__VA_ARGS__); \ 22 efi_virtmap_unload(); \ 23 kernel_neon_end(); \ 24 __s; \ 25 }) 26 27 #define __efi_call_virt(f, ...) \ 28 ({ \ 29 efi_##f##_t *__f; \ 30 \ 31 kernel_neon_begin(); \ 32 efi_virtmap_load(); \ 33 __f = efi.systab->runtime->f; \ 34 __f(__VA_ARGS__); \ 35 efi_virtmap_unload(); \ 36 kernel_neon_end(); \ 37 }) 38 39 /* arch specific definitions used by the stub code */ 40 41 /* 42 * AArch64 requires the DTB to be 8-byte aligned in the first 512MiB from 43 * start of kernel and may not cross a 2MiB boundary. We set alignment to 44 * 2MiB so we know it won't cross a 2MiB boundary. 45 */ 46 #define EFI_FDT_ALIGN SZ_2M /* used by allocate_new_fdt_and_exit_boot() */ 47 #define MAX_FDT_OFFSET SZ_512M 48 49 #define efi_call_early(f, ...) sys_table_arg->boottime->f(__VA_ARGS__) 50 51 #define EFI_ALLOC_ALIGN SZ_64K 52 53 /* 54 * On ARM systems, virtually remapped UEFI runtime services are set up in two 55 * distinct stages: 56 * - The stub retrieves the final version of the memory map from UEFI, populates 57 * the virt_addr fields and calls the SetVirtualAddressMap() [SVAM] runtime 58 * service to communicate the new mapping to the firmware (Note that the new 59 * mapping is not live at this time) 60 * - During an early initcall(), the EFI system table is permanently remapped 61 * and the virtual remapping of the UEFI Runtime Services regions is loaded 62 * into a private set of page tables. If this all succeeds, the Runtime 63 * Services are enabled and the EFI_RUNTIME_SERVICES bit set. 64 */ 65 66 void efi_virtmap_load(void); 67 void efi_virtmap_unload(void); 68 69 #endif /* _ASM_EFI_H */ 70