mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'efi-next-for-v6.1' into loongarch-next
LoongArch architecture changes for 6.1 depend on the efi changes to work, so merge them to create a base.
This commit is contained in:
@@ -65,10 +65,6 @@ linux,uefi-mmap-desc-size 32-bit Size in bytes of each entry in the UEFI
|
||||
|
||||
linux,uefi-mmap-desc-ver 32-bit Version of the mmap descriptor format.
|
||||
|
||||
linux,initrd-start 64-bit Physical start address of an initrd
|
||||
|
||||
linux,initrd-end 64-bit Physical end address of an initrd
|
||||
|
||||
kaslr-seed 64-bit Entropy used to randomize the kernel image
|
||||
base address location.
|
||||
========================== ====== ===========================================
|
||||
|
||||
@@ -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);
|
||||
@@ -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 */
|
||||
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
+7
-2
@@ -151,12 +151,17 @@ libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
|
||||
|
||||
# Default target when executing plain make
|
||||
boot := arch/arm64/boot
|
||||
|
||||
ifeq ($(CONFIG_EFI_ZBOOT),)
|
||||
KBUILD_IMAGE := $(boot)/Image.gz
|
||||
else
|
||||
KBUILD_IMAGE := $(boot)/vmlinuz.efi
|
||||
endif
|
||||
|
||||
all: Image.gz
|
||||
all: $(notdir $(KBUILD_IMAGE))
|
||||
|
||||
|
||||
Image: vmlinux
|
||||
Image vmlinuz.efi: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
Image.%: Image
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
Image
|
||||
Image.gz
|
||||
vmlinuz*
|
||||
|
||||
@@ -38,3 +38,9 @@ $(obj)/Image.lzo: $(obj)/Image FORCE
|
||||
|
||||
$(obj)/Image.zst: $(obj)/Image FORCE
|
||||
$(call if_changed,zstd)
|
||||
|
||||
EFI_ZBOOT_PAYLOAD := Image
|
||||
EFI_ZBOOT_BFD_TARGET := elf64-littleaarch64
|
||||
EFI_ZBOOT_MACH_TYPE := ARM64
|
||||
|
||||
include $(srctree)/drivers/firmware/efi/libstub/Makefile.zboot
|
||||
|
||||
@@ -24,9 +24,6 @@ PROVIDE(__efistub_primary_entry_offset = primary_entry - _text);
|
||||
*/
|
||||
PROVIDE(__efistub_memcmp = __pi_memcmp);
|
||||
PROVIDE(__efistub_memchr = __pi_memchr);
|
||||
PROVIDE(__efistub_memcpy = __pi_memcpy);
|
||||
PROVIDE(__efistub_memmove = __pi_memmove);
|
||||
PROVIDE(__efistub_memset = __pi_memset);
|
||||
PROVIDE(__efistub_strlen = __pi_strlen);
|
||||
PROVIDE(__efistub_strnlen = __pi_strnlen);
|
||||
PROVIDE(__efistub_strcmp = __pi_strcmp);
|
||||
@@ -40,16 +37,6 @@ PROVIDE(__efistub__edata = _edata);
|
||||
PROVIDE(__efistub_screen_info = screen_info);
|
||||
PROVIDE(__efistub__ctype = _ctype);
|
||||
|
||||
/*
|
||||
* The __ prefixed memcpy/memset/memmove symbols are provided by KASAN, which
|
||||
* instruments the conventional ones. Therefore, any references from the EFI
|
||||
* stub or other position independent, low level C code should be redirected to
|
||||
* the non-instrumented versions as well.
|
||||
*/
|
||||
PROVIDE(__efistub___memcpy = __pi_memcpy);
|
||||
PROVIDE(__efistub___memmove = __pi_memmove);
|
||||
PROVIDE(__efistub___memset = __pi_memset);
|
||||
|
||||
PROVIDE(__pi___memcpy = __pi_memcpy);
|
||||
PROVIDE(__pi___memmove = __pi_memmove);
|
||||
PROVIDE(__pi___memset = __pi_memset);
|
||||
|
||||
@@ -106,8 +106,6 @@ config LOONGARCH
|
||||
select MODULES_USE_ELF_RELA if MODULES
|
||||
select NEED_PER_CPU_EMBED_FIRST_CHUNK
|
||||
select NEED_PER_CPU_PAGE_FIRST_CHUNK
|
||||
select OF
|
||||
select OF_EARLY_FLATTREE
|
||||
select PCI
|
||||
select PCI_DOMAINS_GENERIC
|
||||
select PCI_ECAM if ACPI
|
||||
@@ -314,12 +312,20 @@ config DMI
|
||||
config EFI
|
||||
bool "EFI runtime service support"
|
||||
select UCS2_STRING
|
||||
select EFI_PARAMS_FROM_FDT
|
||||
select EFI_RUNTIME_WRAPPERS
|
||||
help
|
||||
This enables the kernel to use EFI runtime services that are
|
||||
available (such as the EFI variable services).
|
||||
|
||||
config EFI_STUB
|
||||
bool "EFI boot stub support"
|
||||
default y
|
||||
depends on EFI
|
||||
select EFI_GENERIC_STUB
|
||||
help
|
||||
This kernel feature allows the kernel to be loaded directly by
|
||||
EFI firmware without the use of a bootloader.
|
||||
|
||||
config SMP
|
||||
bool "Multi-Processing support"
|
||||
help
|
||||
|
||||
+13
-5
@@ -7,7 +7,14 @@ boot := arch/loongarch/boot
|
||||
|
||||
KBUILD_DEFCONFIG := loongson3_defconfig
|
||||
|
||||
KBUILD_IMAGE = $(boot)/vmlinux
|
||||
image-name-y := vmlinux
|
||||
image-name-$(CONFIG_EFI_ZBOOT) := vmlinuz
|
||||
|
||||
ifndef CONFIG_EFI_STUB
|
||||
KBUILD_IMAGE := $(boot)/vmlinux.elf
|
||||
else
|
||||
KBUILD_IMAGE := $(boot)/$(image-name-y).efi
|
||||
endif
|
||||
|
||||
#
|
||||
# Select the object file format to substitute into the linker script.
|
||||
@@ -75,6 +82,7 @@ endif
|
||||
head-y := arch/loongarch/kernel/head.o
|
||||
|
||||
libs-y += arch/loongarch/lib/
|
||||
libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
|
||||
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
prepare: vdso_prepare
|
||||
@@ -86,13 +94,13 @@ PHONY += vdso_install
|
||||
vdso_install:
|
||||
$(Q)$(MAKE) $(build)=arch/loongarch/vdso $@
|
||||
|
||||
all: $(KBUILD_IMAGE)
|
||||
all: $(notdir $(KBUILD_IMAGE))
|
||||
|
||||
$(KBUILD_IMAGE): vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $@
|
||||
vmlinux.elf vmlinux.efi vmlinuz.efi: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $(boot)/$@
|
||||
|
||||
install:
|
||||
$(Q)install -D -m 755 $(KBUILD_IMAGE) $(INSTALL_PATH)/vmlinux-$(KERNELRELEASE)
|
||||
$(Q)install -D -m 755 $(KBUILD_IMAGE) $(INSTALL_PATH)/$(image-name-y)-$(KERNELRELEASE)
|
||||
$(Q)install -D -m 644 .config $(INSTALL_PATH)/config-$(KERNELRELEASE)
|
||||
$(Q)install -D -m 644 System.map $(INSTALL_PATH)/System.map-$(KERNELRELEASE)
|
||||
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
vmlinux*
|
||||
vmlinuz*
|
||||
|
||||
@@ -8,9 +8,19 @@ drop-sections := .comment .note .options .note.gnu.build-id
|
||||
strip-flags := $(addprefix --remove-section=,$(drop-sections)) -S
|
||||
OBJCOPYFLAGS_vmlinux.efi := -O binary $(strip-flags)
|
||||
|
||||
targets := vmlinux
|
||||
quiet_cmd_strip = STRIP $@
|
||||
cmd_strip = $(STRIP) -s -o $@ $<
|
||||
|
||||
$(obj)/vmlinux: vmlinux FORCE
|
||||
targets := vmlinux.elf
|
||||
$(obj)/vmlinux.elf: vmlinux FORCE
|
||||
$(call if_changed,strip)
|
||||
|
||||
targets += vmlinux.efi
|
||||
$(obj)/vmlinux.efi: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
EFI_ZBOOT_PAYLOAD := vmlinux.efi
|
||||
EFI_ZBOOT_BFD_TARGET := elf64-loongarch
|
||||
EFI_ZBOOT_MACH_TYPE := LOONGARCH64
|
||||
|
||||
include $(srctree)/drivers/firmware/efi/libstub/Makefile.zboot
|
||||
|
||||
@@ -36,7 +36,7 @@ struct loongson_system_configuration {
|
||||
};
|
||||
|
||||
extern u64 efi_system_table;
|
||||
extern unsigned long fw_arg0, fw_arg1;
|
||||
extern unsigned long fw_arg0, fw_arg1, fw_arg2;
|
||||
extern struct loongson_board_info b_info;
|
||||
extern struct loongson_system_configuration loongson_sysconf;
|
||||
|
||||
|
||||
@@ -17,9 +17,16 @@ void efifb_setup_from_dmi(struct screen_info *si, const char *opt);
|
||||
#define arch_efi_call_virt_teardown()
|
||||
|
||||
#define EFI_ALLOC_ALIGN SZ_64K
|
||||
#define EFI_RT_VIRTUAL_OFFSET CSR_DMW0_BASE
|
||||
|
||||
struct screen_info *alloc_screen_info(void);
|
||||
void free_screen_info(struct screen_info *si);
|
||||
static inline struct screen_info *alloc_screen_info(void)
|
||||
{
|
||||
return &screen_info;
|
||||
}
|
||||
|
||||
static inline void free_screen_info(struct screen_info *si)
|
||||
{
|
||||
}
|
||||
|
||||
static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#include <linux/pe.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
.macro __EFI_PE_HEADER
|
||||
.long PE_MAGIC
|
||||
.Lcoff_header:
|
||||
.short IMAGE_FILE_MACHINE_LOONGARCH64 /* Machine */
|
||||
.short .Lsection_count /* NumberOfSections */
|
||||
.long 0 /* TimeDateStamp */
|
||||
.long 0 /* PointerToSymbolTable */
|
||||
.long 0 /* NumberOfSymbols */
|
||||
.short .Lsection_table - .Loptional_header /* SizeOfOptionalHeader */
|
||||
.short IMAGE_FILE_DEBUG_STRIPPED | \
|
||||
IMAGE_FILE_EXECUTABLE_IMAGE | \
|
||||
IMAGE_FILE_LINE_NUMS_STRIPPED /* Characteristics */
|
||||
|
||||
.Loptional_header:
|
||||
.short PE_OPT_MAGIC_PE32PLUS /* PE32+ format */
|
||||
.byte 0x02 /* MajorLinkerVersion */
|
||||
.byte 0x14 /* MinorLinkerVersion */
|
||||
.long __inittext_end - .Lefi_header_end /* SizeOfCode */
|
||||
.long _end - __initdata_begin /* SizeOfInitializedData */
|
||||
.long 0 /* SizeOfUninitializedData */
|
||||
.long __efistub_efi_pe_entry - _head /* AddressOfEntryPoint */
|
||||
.long .Lefi_header_end - _head /* BaseOfCode */
|
||||
|
||||
.Lextra_header_fields:
|
||||
.quad 0 /* ImageBase */
|
||||
.long PECOFF_SEGMENT_ALIGN /* SectionAlignment */
|
||||
.long PECOFF_FILE_ALIGN /* FileAlignment */
|
||||
.short 0 /* MajorOperatingSystemVersion */
|
||||
.short 0 /* MinorOperatingSystemVersion */
|
||||
.short LINUX_EFISTUB_MAJOR_VERSION /* MajorImageVersion */
|
||||
.short LINUX_EFISTUB_MINOR_VERSION /* MinorImageVersion */
|
||||
.short 0 /* MajorSubsystemVersion */
|
||||
.short 0 /* MinorSubsystemVersion */
|
||||
.long 0 /* Win32VersionValue */
|
||||
|
||||
.long _end - _head /* SizeOfImage */
|
||||
|
||||
/* Everything before the kernel image is considered part of the header */
|
||||
.long .Lefi_header_end - _head /* SizeOfHeaders */
|
||||
.long 0 /* CheckSum */
|
||||
.short IMAGE_SUBSYSTEM_EFI_APPLICATION /* Subsystem */
|
||||
.short 0 /* DllCharacteristics */
|
||||
.quad 0 /* SizeOfStackReserve */
|
||||
.quad 0 /* SizeOfStackCommit */
|
||||
.quad 0 /* SizeOfHeapReserve */
|
||||
.quad 0 /* SizeOfHeapCommit */
|
||||
.long 0 /* LoaderFlags */
|
||||
.long (.Lsection_table - .) / 8 /* NumberOfRvaAndSizes */
|
||||
|
||||
.quad 0 /* ExportTable */
|
||||
.quad 0 /* ImportTable */
|
||||
.quad 0 /* ResourceTable */
|
||||
.quad 0 /* ExceptionTable */
|
||||
.quad 0 /* CertificationTable */
|
||||
.quad 0 /* BaseRelocationTable */
|
||||
|
||||
/* Section table */
|
||||
.Lsection_table:
|
||||
.ascii ".text\0\0\0"
|
||||
.long __inittext_end - .Lefi_header_end /* VirtualSize */
|
||||
.long .Lefi_header_end - _head /* VirtualAddress */
|
||||
.long __inittext_end - .Lefi_header_end /* SizeOfRawData */
|
||||
.long .Lefi_header_end - _head /* PointerToRawData */
|
||||
|
||||
.long 0 /* PointerToRelocations */
|
||||
.long 0 /* PointerToLineNumbers */
|
||||
.short 0 /* NumberOfRelocations */
|
||||
.short 0 /* NumberOfLineNumbers */
|
||||
.long IMAGE_SCN_CNT_CODE | \
|
||||
IMAGE_SCN_MEM_READ | \
|
||||
IMAGE_SCN_MEM_EXECUTE /* Characteristics */
|
||||
|
||||
.ascii ".data\0\0\0"
|
||||
.long _end - __initdata_begin /* VirtualSize */
|
||||
.long __initdata_begin - _head /* VirtualAddress */
|
||||
.long _edata - __initdata_begin /* SizeOfRawData */
|
||||
.long __initdata_begin - _head /* PointerToRawData */
|
||||
|
||||
.long 0 /* PointerToRelocations */
|
||||
.long 0 /* PointerToLineNumbers */
|
||||
.short 0 /* NumberOfRelocations */
|
||||
.short 0 /* NumberOfLineNumbers */
|
||||
.long IMAGE_SCN_CNT_INITIALIZED_DATA | \
|
||||
IMAGE_SCN_MEM_READ | \
|
||||
IMAGE_SCN_MEM_WRITE /* Characteristics */
|
||||
|
||||
.set .Lsection_count, (. - .Lsection_table) / 40
|
||||
|
||||
.balign 0x10000 /* PECOFF_SEGMENT_ALIGN */
|
||||
.Lefi_header_end:
|
||||
.endm
|
||||
@@ -27,8 +27,13 @@
|
||||
static unsigned long efi_nr_tables;
|
||||
static unsigned long efi_config_table;
|
||||
|
||||
static unsigned long __initdata boot_memmap = EFI_INVALID_TABLE_ADDR;
|
||||
|
||||
static efi_system_table_t *efi_systab;
|
||||
static efi_config_table_type_t arch_tables[] __initdata = {{},};
|
||||
static efi_config_table_type_t arch_tables[] __initdata = {
|
||||
{LINUX_EFI_BOOT_MEMMAP_GUID, &boot_memmap, "MEMMAP" },
|
||||
{},
|
||||
};
|
||||
|
||||
void __init efi_runtime_init(void)
|
||||
{
|
||||
@@ -51,6 +56,7 @@ void __init efi_init(void)
|
||||
{
|
||||
int size;
|
||||
void *config_tables;
|
||||
struct efi_boot_memmap *tbl;
|
||||
|
||||
if (!efi_system_table)
|
||||
return;
|
||||
@@ -61,6 +67,8 @@ void __init efi_init(void)
|
||||
return;
|
||||
}
|
||||
|
||||
efi_systab_report_header(&efi_systab->hdr, efi_systab->fw_vendor);
|
||||
|
||||
set_bit(EFI_64BIT, &efi.flags);
|
||||
efi_nr_tables = efi_systab->nr_tables;
|
||||
efi_config_table = (unsigned long)efi_systab->tables;
|
||||
@@ -69,4 +77,27 @@ void __init efi_init(void)
|
||||
config_tables = early_memremap(efi_config_table, efi_nr_tables * size);
|
||||
efi_config_parse_tables(config_tables, efi_systab->nr_tables, arch_tables);
|
||||
early_memunmap(config_tables, efi_nr_tables * size);
|
||||
|
||||
set_bit(EFI_CONFIG_TABLES, &efi.flags);
|
||||
|
||||
if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI)
|
||||
memblock_reserve(screen_info.lfb_base, screen_info.lfb_size);
|
||||
|
||||
if (boot_memmap == EFI_INVALID_TABLE_ADDR)
|
||||
return;
|
||||
|
||||
tbl = early_memremap_ro(boot_memmap, sizeof(*tbl));
|
||||
if (tbl) {
|
||||
struct efi_memory_map_data data;
|
||||
|
||||
data.phys_map = boot_memmap + sizeof(*tbl);
|
||||
data.size = tbl->map_size;
|
||||
data.desc_size = tbl->desc_size;
|
||||
data.desc_version = tbl->desc_ver;
|
||||
|
||||
if (efi_memmap_init_early(&data) < 0)
|
||||
panic("Unable to map EFI memory map.\n");
|
||||
|
||||
early_memunmap(tbl, sizeof(*tbl));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include <linux/efi.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <asm/early_ioremap.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/loongson.h>
|
||||
@@ -20,21 +19,17 @@ EXPORT_SYMBOL(loongson_sysconf);
|
||||
void __init init_environ(void)
|
||||
{
|
||||
int efi_boot = fw_arg0;
|
||||
struct efi_memory_map_data data;
|
||||
void *fdt_ptr = early_memremap_ro(fw_arg1, SZ_64K);
|
||||
char *cmdline = early_memremap_ro(fw_arg1, COMMAND_LINE_SIZE);
|
||||
|
||||
if (efi_boot)
|
||||
set_bit(EFI_BOOT, &efi.flags);
|
||||
else
|
||||
clear_bit(EFI_BOOT, &efi.flags);
|
||||
|
||||
early_init_dt_scan(fdt_ptr);
|
||||
early_init_fdt_reserve_self();
|
||||
efi_system_table = efi_get_fdt_params(&data);
|
||||
strscpy(boot_command_line, cmdline, COMMAND_LINE_SIZE);
|
||||
early_memunmap(cmdline, COMMAND_LINE_SIZE);
|
||||
|
||||
efi_memmap_init_early(&data);
|
||||
memblock_reserve(data.phys_map & PAGE_MASK,
|
||||
PAGE_ALIGN(data.size + (data.phys_map & ~PAGE_MASK)));
|
||||
efi_system_table = fw_arg2;
|
||||
}
|
||||
|
||||
static int __init init_cpu_fullname(void)
|
||||
|
||||
@@ -12,6 +12,26 @@
|
||||
#include <asm/loongarch.h>
|
||||
#include <asm/stackframe.h>
|
||||
|
||||
#ifdef CONFIG_EFI_STUB
|
||||
|
||||
#include "efi-header.S"
|
||||
|
||||
__HEAD
|
||||
|
||||
_head:
|
||||
.word MZ_MAGIC /* "MZ", MS-DOS header */
|
||||
.org 0x3c /* 0x04 ~ 0x3b reserved */
|
||||
.long pe_header - _head /* Offset to the PE header */
|
||||
|
||||
pe_header:
|
||||
__EFI_PE_HEADER
|
||||
|
||||
SYM_DATA(kernel_asize, .long _end - _text);
|
||||
SYM_DATA(kernel_fsize, .long _edata - _text);
|
||||
SYM_DATA(kernel_offset, .long kernel_offset - _text);
|
||||
|
||||
#endif
|
||||
|
||||
__REF
|
||||
|
||||
.align 12
|
||||
@@ -49,6 +69,8 @@ SYM_CODE_START(kernel_entry) # kernel entry point
|
||||
st.d a0, t0, 0 # firmware arguments
|
||||
la t0, fw_arg1
|
||||
st.d a1, t0, 0
|
||||
la t0, fw_arg2
|
||||
st.d a2, t0, 0
|
||||
|
||||
/* KSave3 used for percpu base, initialized as 0 */
|
||||
csrwr zero, PERCPU_BASE_KS
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#ifndef __LOONGARCH_KERNEL_IMAGE_VARS_H
|
||||
#define __LOONGARCH_KERNEL_IMAGE_VARS_H
|
||||
|
||||
#ifdef CONFIG_EFI_STUB
|
||||
|
||||
__efistub_memcmp = memcmp;
|
||||
__efistub_memchr = memchr;
|
||||
__efistub_strcat = strcat;
|
||||
__efistub_strcmp = strcmp;
|
||||
__efistub_strlen = strlen;
|
||||
__efistub_strncat = strncat;
|
||||
__efistub_strnstr = strnstr;
|
||||
__efistub_strnlen = strnlen;
|
||||
__efistub_strrchr = strrchr;
|
||||
__efistub_kernel_entry = kernel_entry;
|
||||
__efistub_kernel_asize = kernel_asize;
|
||||
__efistub_kernel_fsize = kernel_fsize;
|
||||
__efistub_kernel_offset = kernel_offset;
|
||||
__efistub_screen_info = screen_info;
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __LOONGARCH_KERNEL_IMAGE_VARS_H */
|
||||
@@ -49,11 +49,9 @@
|
||||
#define SMBIOS_CORE_PACKAGE_OFFSET 0x23
|
||||
#define LOONGSON_EFI_ENABLE (1 << 3)
|
||||
|
||||
#ifdef CONFIG_VT
|
||||
struct screen_info screen_info;
|
||||
#endif
|
||||
struct screen_info screen_info __section(".data");
|
||||
|
||||
unsigned long fw_arg0, fw_arg1;
|
||||
unsigned long fw_arg0, fw_arg1, fw_arg2;
|
||||
DEFINE_PER_CPU(unsigned long, kernelsp);
|
||||
struct cpuinfo_loongarch cpu_data[NR_CPUS] __read_mostly;
|
||||
|
||||
@@ -122,16 +120,9 @@ static void __init parse_cpu_table(const struct dmi_header *dm)
|
||||
|
||||
static void __init parse_bios_table(const struct dmi_header *dm)
|
||||
{
|
||||
int bios_extern;
|
||||
char *dmi_data = (char *)dm;
|
||||
|
||||
bios_extern = *(dmi_data + SMBIOS_BIOSEXTERN_OFFSET);
|
||||
b_info.bios_size = (*(dmi_data + SMBIOS_BIOSSIZE_OFFSET) + 1) << 6;
|
||||
|
||||
if (bios_extern & LOONGSON_EFI_ENABLE)
|
||||
set_bit(EFI_BOOT, &efi.flags);
|
||||
else
|
||||
clear_bit(EFI_BOOT, &efi.flags);
|
||||
}
|
||||
|
||||
static void __init find_tokens(const struct dmi_header *dm, void *dummy)
|
||||
@@ -196,7 +187,6 @@ early_param("mem", early_parse_mem);
|
||||
|
||||
void __init platform_init(void)
|
||||
{
|
||||
efi_init();
|
||||
#ifdef CONFIG_ACPI_TABLE_UPGRADE
|
||||
acpi_table_upgrade();
|
||||
#endif
|
||||
@@ -356,6 +346,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
*cmdline_p = boot_command_line;
|
||||
|
||||
init_environ();
|
||||
efi_init();
|
||||
memblock_init();
|
||||
parse_early_param();
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user