Loading arch/arm/include/asm/efi.h +2 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #ifdef CONFIG_EFI void efi_init(void); void arm_efi_init(void); int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md); int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md); Loading @@ -37,7 +38,7 @@ void efi_virtmap_load(void); void efi_virtmap_unload(void); #else #define efi_init() #define arm_efi_init() #endif /* CONFIG_EFI */ /* arch specific definitions used by the stub code */ Loading arch/arm/kernel/efi.c +79 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ */ #include <linux/efi.h> #include <linux/memblock.h> #include <asm/efi.h> #include <asm/mach/map.h> #include <asm/mmu_context.h> Loading Loading @@ -73,3 +74,81 @@ int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md) return efi_set_mapping_permissions(mm, md); return 0; } static unsigned long __initdata screen_info_table = EFI_INVALID_TABLE_ADDR; static unsigned long __initdata cpu_state_table = EFI_INVALID_TABLE_ADDR; const efi_config_table_type_t efi_arch_tables[] __initconst = { {LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, &screen_info_table}, {LINUX_EFI_ARM_CPU_STATE_TABLE_GUID, &cpu_state_table}, {} }; static void __init load_screen_info_table(void) { struct screen_info *si; if (screen_info_table != EFI_INVALID_TABLE_ADDR) { si = early_memremap_ro(screen_info_table, sizeof(*si)); if (!si) { pr_err("Could not map screen_info config table\n"); return; } screen_info = *si; early_memunmap(si, sizeof(*si)); /* dummycon on ARM needs non-zero values for columns/lines */ screen_info.orig_video_cols = 80; screen_info.orig_video_lines = 25; if (memblock_is_map_memory(screen_info.lfb_base)) memblock_mark_nomap(screen_info.lfb_base, screen_info.lfb_size); } } static void __init load_cpu_state_table(void) { if (cpu_state_table != EFI_INVALID_TABLE_ADDR) { struct efi_arm_entry_state *state; bool dump_state = true; state = early_memremap_ro(cpu_state_table, sizeof(struct efi_arm_entry_state)); if (state == NULL) { pr_warn("Unable to map CPU entry state table.\n"); return; } if ((state->sctlr_before_ebs & 1) == 0) pr_warn(FW_BUG "EFI stub was entered with MMU and Dcache disabled, please fix your firmware!\n"); else if ((state->sctlr_after_ebs & 1) == 0) pr_warn(FW_BUG "ExitBootServices() returned with MMU and Dcache disabled, please fix your firmware!\n"); else dump_state = false; if (dump_state || efi_enabled(EFI_DBG)) { pr_info("CPSR at EFI stub entry : 0x%08x\n", state->cpsr_before_ebs); pr_info("SCTLR at EFI stub entry : 0x%08x\n", state->sctlr_before_ebs); pr_info("CPSR after ExitBootServices() : 0x%08x\n", state->cpsr_after_ebs); pr_info("SCTLR after ExitBootServices(): 0x%08x\n", state->sctlr_after_ebs); } early_memunmap(state, sizeof(struct efi_arm_entry_state)); } } void __init arm_efi_init(void) { efi_init(); load_screen_info_table(); /* ARM does not permit early mappings to persist across paging_init() */ efi_memmap_unmap(); load_cpu_state_table(); } arch/arm/kernel/setup.c +1 −1 Original line number Diff line number Diff line Loading @@ -1141,7 +1141,7 @@ void __init setup_arch(char **cmdline_p) #endif setup_dma_zone(mdesc); xen_early_init(); efi_init(); arm_efi_init(); /* * Make sure the calculation for lowmem/highmem is set appropriately * before reserving/allocating any memory Loading drivers/firmware/efi/efi-init.c +2 −59 Original line number Diff line number Diff line Loading @@ -51,34 +51,10 @@ static phys_addr_t __init efi_to_phys(unsigned long addr) return addr; } static __initdata unsigned long screen_info_table = EFI_INVALID_TABLE_ADDR; static __initdata unsigned long cpu_state_table = EFI_INVALID_TABLE_ADDR; static const efi_config_table_type_t arch_tables[] __initconst = { {LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, &screen_info_table}, {LINUX_EFI_ARM_CPU_STATE_TABLE_GUID, &cpu_state_table}, {} }; extern __weak const efi_config_table_type_t efi_arch_tables[]; static void __init init_screen_info(void) { struct screen_info *si; if (IS_ENABLED(CONFIG_ARM) && screen_info_table != EFI_INVALID_TABLE_ADDR) { si = early_memremap_ro(screen_info_table, sizeof(*si)); if (!si) { pr_err("Could not map screen_info config table\n"); return; } screen_info = *si; early_memunmap(si, sizeof(*si)); /* dummycon on ARM needs non-zero values for columns/lines */ screen_info.orig_video_cols = 80; screen_info.orig_video_lines = 25; } if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI && memblock_is_map_memory(screen_info.lfb_base)) memblock_mark_nomap(screen_info.lfb_base, screen_info.lfb_size); Loading Loading @@ -119,8 +95,7 @@ static int __init uefi_init(u64 efi_system_table) goto out; } retval = efi_config_parse_tables(config_tables, systab->nr_tables, IS_ENABLED(CONFIG_ARM) ? arch_tables : NULL); efi_arch_tables); early_memunmap(config_tables, table_size); out: Loading Loading @@ -248,36 +223,4 @@ void __init efi_init(void) PAGE_ALIGN(data.size + (data.phys_map & ~PAGE_MASK))); init_screen_info(); #ifdef CONFIG_ARM /* ARM does not permit early mappings to persist across paging_init() */ efi_memmap_unmap(); if (cpu_state_table != EFI_INVALID_TABLE_ADDR) { struct efi_arm_entry_state *state; bool dump_state = true; state = early_memremap_ro(cpu_state_table, sizeof(struct efi_arm_entry_state)); if (state == NULL) { pr_warn("Unable to map CPU entry state table.\n"); return; } if ((state->sctlr_before_ebs & 1) == 0) pr_warn(FW_BUG "EFI stub was entered with MMU and Dcache disabled, please fix your firmware!\n"); else if ((state->sctlr_after_ebs & 1) == 0) pr_warn(FW_BUG "ExitBootServices() returned with MMU and Dcache disabled, please fix your firmware!\n"); else dump_state = false; if (dump_state || efi_enabled(EFI_DBG)) { pr_info("CPSR at EFI stub entry : 0x%08x\n", state->cpsr_before_ebs); pr_info("SCTLR at EFI stub entry : 0x%08x\n", state->sctlr_before_ebs); pr_info("CPSR after ExitBootServices() : 0x%08x\n", state->cpsr_after_ebs); pr_info("SCTLR after ExitBootServices(): 0x%08x\n", state->sctlr_after_ebs); } early_memunmap(state, sizeof(struct efi_arm_entry_state)); } #endif } Loading
arch/arm/include/asm/efi.h +2 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #ifdef CONFIG_EFI void efi_init(void); void arm_efi_init(void); int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md); int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md); Loading @@ -37,7 +38,7 @@ void efi_virtmap_load(void); void efi_virtmap_unload(void); #else #define efi_init() #define arm_efi_init() #endif /* CONFIG_EFI */ /* arch specific definitions used by the stub code */ Loading
arch/arm/kernel/efi.c +79 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ */ #include <linux/efi.h> #include <linux/memblock.h> #include <asm/efi.h> #include <asm/mach/map.h> #include <asm/mmu_context.h> Loading Loading @@ -73,3 +74,81 @@ int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md) return efi_set_mapping_permissions(mm, md); return 0; } static unsigned long __initdata screen_info_table = EFI_INVALID_TABLE_ADDR; static unsigned long __initdata cpu_state_table = EFI_INVALID_TABLE_ADDR; const efi_config_table_type_t efi_arch_tables[] __initconst = { {LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, &screen_info_table}, {LINUX_EFI_ARM_CPU_STATE_TABLE_GUID, &cpu_state_table}, {} }; static void __init load_screen_info_table(void) { struct screen_info *si; if (screen_info_table != EFI_INVALID_TABLE_ADDR) { si = early_memremap_ro(screen_info_table, sizeof(*si)); if (!si) { pr_err("Could not map screen_info config table\n"); return; } screen_info = *si; early_memunmap(si, sizeof(*si)); /* dummycon on ARM needs non-zero values for columns/lines */ screen_info.orig_video_cols = 80; screen_info.orig_video_lines = 25; if (memblock_is_map_memory(screen_info.lfb_base)) memblock_mark_nomap(screen_info.lfb_base, screen_info.lfb_size); } } static void __init load_cpu_state_table(void) { if (cpu_state_table != EFI_INVALID_TABLE_ADDR) { struct efi_arm_entry_state *state; bool dump_state = true; state = early_memremap_ro(cpu_state_table, sizeof(struct efi_arm_entry_state)); if (state == NULL) { pr_warn("Unable to map CPU entry state table.\n"); return; } if ((state->sctlr_before_ebs & 1) == 0) pr_warn(FW_BUG "EFI stub was entered with MMU and Dcache disabled, please fix your firmware!\n"); else if ((state->sctlr_after_ebs & 1) == 0) pr_warn(FW_BUG "ExitBootServices() returned with MMU and Dcache disabled, please fix your firmware!\n"); else dump_state = false; if (dump_state || efi_enabled(EFI_DBG)) { pr_info("CPSR at EFI stub entry : 0x%08x\n", state->cpsr_before_ebs); pr_info("SCTLR at EFI stub entry : 0x%08x\n", state->sctlr_before_ebs); pr_info("CPSR after ExitBootServices() : 0x%08x\n", state->cpsr_after_ebs); pr_info("SCTLR after ExitBootServices(): 0x%08x\n", state->sctlr_after_ebs); } early_memunmap(state, sizeof(struct efi_arm_entry_state)); } } void __init arm_efi_init(void) { efi_init(); load_screen_info_table(); /* ARM does not permit early mappings to persist across paging_init() */ efi_memmap_unmap(); load_cpu_state_table(); }
arch/arm/kernel/setup.c +1 −1 Original line number Diff line number Diff line Loading @@ -1141,7 +1141,7 @@ void __init setup_arch(char **cmdline_p) #endif setup_dma_zone(mdesc); xen_early_init(); efi_init(); arm_efi_init(); /* * Make sure the calculation for lowmem/highmem is set appropriately * before reserving/allocating any memory Loading
drivers/firmware/efi/efi-init.c +2 −59 Original line number Diff line number Diff line Loading @@ -51,34 +51,10 @@ static phys_addr_t __init efi_to_phys(unsigned long addr) return addr; } static __initdata unsigned long screen_info_table = EFI_INVALID_TABLE_ADDR; static __initdata unsigned long cpu_state_table = EFI_INVALID_TABLE_ADDR; static const efi_config_table_type_t arch_tables[] __initconst = { {LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, &screen_info_table}, {LINUX_EFI_ARM_CPU_STATE_TABLE_GUID, &cpu_state_table}, {} }; extern __weak const efi_config_table_type_t efi_arch_tables[]; static void __init init_screen_info(void) { struct screen_info *si; if (IS_ENABLED(CONFIG_ARM) && screen_info_table != EFI_INVALID_TABLE_ADDR) { si = early_memremap_ro(screen_info_table, sizeof(*si)); if (!si) { pr_err("Could not map screen_info config table\n"); return; } screen_info = *si; early_memunmap(si, sizeof(*si)); /* dummycon on ARM needs non-zero values for columns/lines */ screen_info.orig_video_cols = 80; screen_info.orig_video_lines = 25; } if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI && memblock_is_map_memory(screen_info.lfb_base)) memblock_mark_nomap(screen_info.lfb_base, screen_info.lfb_size); Loading Loading @@ -119,8 +95,7 @@ static int __init uefi_init(u64 efi_system_table) goto out; } retval = efi_config_parse_tables(config_tables, systab->nr_tables, IS_ENABLED(CONFIG_ARM) ? arch_tables : NULL); efi_arch_tables); early_memunmap(config_tables, table_size); out: Loading Loading @@ -248,36 +223,4 @@ void __init efi_init(void) PAGE_ALIGN(data.size + (data.phys_map & ~PAGE_MASK))); init_screen_info(); #ifdef CONFIG_ARM /* ARM does not permit early mappings to persist across paging_init() */ efi_memmap_unmap(); if (cpu_state_table != EFI_INVALID_TABLE_ADDR) { struct efi_arm_entry_state *state; bool dump_state = true; state = early_memremap_ro(cpu_state_table, sizeof(struct efi_arm_entry_state)); if (state == NULL) { pr_warn("Unable to map CPU entry state table.\n"); return; } if ((state->sctlr_before_ebs & 1) == 0) pr_warn(FW_BUG "EFI stub was entered with MMU and Dcache disabled, please fix your firmware!\n"); else if ((state->sctlr_after_ebs & 1) == 0) pr_warn(FW_BUG "ExitBootServices() returned with MMU and Dcache disabled, please fix your firmware!\n"); else dump_state = false; if (dump_state || efi_enabled(EFI_DBG)) { pr_info("CPSR at EFI stub entry : 0x%08x\n", state->cpsr_before_ebs); pr_info("SCTLR at EFI stub entry : 0x%08x\n", state->sctlr_before_ebs); pr_info("CPSR after ExitBootServices() : 0x%08x\n", state->cpsr_after_ebs); pr_info("SCTLR after ExitBootServices(): 0x%08x\n", state->sctlr_after_ebs); } early_memunmap(state, sizeof(struct efi_arm_entry_state)); } #endif }