mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-28 21:45:01 +08:00
40cd01a9c3
LoongArch does not use FDT or DT natively [yet], and the only reason it currently uses it is so that it can reuse the existing EFI stub code. Overloading the DT with data passed between the EFI stub and the core kernel has been a source of problems: there is the overlap between information provided by EFI which DT can also provide (initrd base/size, command line, memory descriptions), requiring us to reason about which is which and what to prioritize. It has also resulted in ABI leaks, i.e., internal ABI being promoted to external ABI inadvertently because the bootloader can set the EFI stub's DT properties as well (e.g., "kaslr-seed"). This has become especially problematic with boot environments that want to pretend that EFI boot is being done (to access ACPI and SMBIOS tables, for instance) but have no ability to execute the EFI stub, and so the environment that the EFI stub creates is emulated [poorly, in some cases]. Another downside of treating DT like this is that the DT binary that the kernel receives is different from the one created by the firmware, which is undesirable in the context of secure and measured boot. Given that LoongArch support in Linux is brand new, we can avoid these pitfalls, and treat the DT strictly as a hardware description, and use a separate handover method between the EFI stub and the kernel. Now that initrd loading and passing the EFI memory map have been refactored into pure EFI routines that use EFI configuration tables, the only thing we need to pass directly is the kernel command line (even if we could pass this via a config table as well, it is used extremely early, so passing it directly is preferred in this case.) Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Acked-by: Huacai Chen <chenhuacai@loongson.cn>
77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Author: Huacai Chen <chenhuacai@loongson.cn>
|
|
*
|
|
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
|
*/
|
|
#include <linux/acpi.h>
|
|
#include <linux/efi.h>
|
|
#include <linux/export.h>
|
|
#include <linux/memblock.h>
|
|
#include <asm/early_ioremap.h>
|
|
#include <asm/bootinfo.h>
|
|
#include <asm/loongson.h>
|
|
|
|
u64 efi_system_table;
|
|
struct loongson_system_configuration loongson_sysconf;
|
|
EXPORT_SYMBOL(loongson_sysconf);
|
|
|
|
void __init init_environ(void)
|
|
{
|
|
int efi_boot = fw_arg0;
|
|
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);
|
|
|
|
strscpy(boot_command_line, cmdline, COMMAND_LINE_SIZE);
|
|
early_memunmap(cmdline, COMMAND_LINE_SIZE);
|
|
|
|
efi_system_table = fw_arg2;
|
|
}
|
|
|
|
static int __init init_cpu_fullname(void)
|
|
{
|
|
int cpu;
|
|
|
|
if (loongson_sysconf.cpuname && !strncmp(loongson_sysconf.cpuname, "Loongson", 8)) {
|
|
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
|
__cpu_full_name[cpu] = loongson_sysconf.cpuname;
|
|
}
|
|
return 0;
|
|
}
|
|
arch_initcall(init_cpu_fullname);
|
|
|
|
static ssize_t boardinfo_show(struct kobject *kobj,
|
|
struct kobj_attribute *attr, char *buf)
|
|
{
|
|
return sprintf(buf,
|
|
"BIOS Information\n"
|
|
"Vendor\t\t\t: %s\n"
|
|
"Version\t\t\t: %s\n"
|
|
"ROM Size\t\t: %d KB\n"
|
|
"Release Date\t\t: %s\n\n"
|
|
"Board Information\n"
|
|
"Manufacturer\t\t: %s\n"
|
|
"Board Name\t\t: %s\n"
|
|
"Family\t\t\t: LOONGSON64\n\n",
|
|
b_info.bios_vendor, b_info.bios_version,
|
|
b_info.bios_size, b_info.bios_release_date,
|
|
b_info.board_vendor, b_info.board_name);
|
|
}
|
|
|
|
static struct kobj_attribute boardinfo_attr = __ATTR(boardinfo, 0444,
|
|
boardinfo_show, NULL);
|
|
|
|
static int __init boardinfo_init(void)
|
|
{
|
|
struct kobject *loongson_kobj;
|
|
|
|
loongson_kobj = kobject_create_and_add("loongson", firmware_kobj);
|
|
|
|
return sysfs_create_file(loongson_kobj, &boardinfo_attr.attr);
|
|
}
|
|
late_initcall(boardinfo_init);
|