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