mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 07:04:28 +00:00
- Add bootstd support to 64-bit efi payload
- Fix a bug of missing setting size of initrd in pxeboot - Allow Python packages to be dropped - Reland "x86: Move FACP table into separate functions" - Fixes for chromebook_link64 and chromebook_samus_tpl - Fixes and improvements for coreboot - x86 documentation updates -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEUEWE0gAMrH0ckwrwqSElQ6ZwxhQFAmUNq6sACgkQqSElQ6Zw xhRG5RAAiWIJOcZLQNRM/+B2DiFxYBD284vO9azN2tWYmBntKLNp3xB7EkACovQ+ 1L5qTTSBIlg2bN6GezwZvcKVSnjcwuZ2tM/cqbWvRJfRUJdFygpW2Ufi2lP/8XCO UgMBTGjXBwT2mhwG6FE9Ecyau7//8xpChCL1Yhli5Xk5YDASt7GFuB2uhsDtyL8p HgCkPQj3YkbEkOpNeO3QOVS47wFNH85uAkIIqnkp3DKMcjNgQhY64LmFJrSLXxWg TbKt3Cc3NJ1GRdDJnNE5KB4JQNL+6TrxzXFzIzU/Z7fBu3qB3gMoikNt7d8+61e9 +lXHjaeZ5qopL0xinKqCDZcK+1Sn3yEo0Ri1W1LWY3ReJkh/6axQn2Pj0HawRENk ccY1lQ4TqO6R1OI3/FqdTB8+HDZ9kRM+xTxpnlXoVgK3ahgEIJvH/v/tWqDb/ld5 hheADW10b5+D8vy82XOzgg78CDG937UxGhEDxAJep6v5kKl2zijL7bMFDlbauS7y FcndGRqY95uzEMrfiAD6nj9YkdG70ourOhakuV24ed6sgCA+xhs04pk9MWFa8lY8 sY7ZJnCZE0FXebA40j/ubV5n7WZ5CRBNw08j+/m5f77tb1/4/8SSZZ7L3RT4H3xx /BF6rVbP/zGrv4WXZ8vw3Y78R/JD5JicuATe4vvv20hgvuFmLE8= =+q36 -----END PGP SIGNATURE----- Merge tag 'x86-pull-20230922' of https://source.denx.de/u-boot/custodians/u-boot-x86 into next - Add bootstd support to 64-bit efi payload - Fix a bug of missing setting size of initrd in pxeboot - Allow Python packages to be dropped - Reland "x86: Move FACP table into separate functions" - Fixes for chromebook_link64 and chromebook_samus_tpl - Fixes and improvements for coreboot - x86 documentation updates
This commit is contained in:
commit
b05a184379
56 changed files with 754 additions and 442 deletions
9
Makefile
9
Makefile
|
@ -485,6 +485,15 @@ export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o \
|
||||||
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
|
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
|
||||||
--exclude CVS --exclude .pc --exclude .hg --exclude .git
|
--exclude CVS --exclude .pc --exclude .hg --exclude .git
|
||||||
|
|
||||||
|
export PYTHON_ENABLE
|
||||||
|
|
||||||
|
# This is y if U-Boot should not build any Python tools or libraries. Typically
|
||||||
|
# you would need to set this if those tools/libraries (typically binman and
|
||||||
|
# pylibfdt) cannot be built by your environment and are provided separately.
|
||||||
|
ifeq ($(NO_PYTHON),)
|
||||||
|
PYTHON_ENABLE=y
|
||||||
|
endif
|
||||||
|
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# Rules shared between *config targets and build targets
|
# Rules shared between *config targets and build targets
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,9 @@ struct arch_global_data {
|
||||||
#ifdef CONFIG_ARCH_IMX8ULP
|
#ifdef CONFIG_ARCH_IMX8ULP
|
||||||
bool m33_handshake_done;
|
bool m33_handshake_done;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_SMBIOS
|
||||||
|
ulong smbios_start; /* Start address of SMBIOS table */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <asm-generic/global_data.h>
|
#include <asm-generic/global_data.h>
|
||||||
|
|
|
@ -32,6 +32,9 @@ struct arch_global_data {
|
||||||
ulong available_harts;
|
ulong available_harts;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_SMBIOS
|
||||||
|
ulong smbios_start; /* Start address of SMBIOS table */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <asm-generic/global_data.h>
|
#include <asm-generic/global_data.h>
|
||||||
|
|
|
@ -17,6 +17,7 @@ struct arch_global_data {
|
||||||
ulong table_end; /* End address of x86 tables */
|
ulong table_end; /* End address of x86 tables */
|
||||||
ulong table_start_high; /* Start address of high x86 tables */
|
ulong table_start_high; /* Start address of high x86 tables */
|
||||||
ulong table_end_high; /* End address of high x86 tables */
|
ulong table_end_high; /* End address of high x86 tables */
|
||||||
|
ulong smbios_start; /* Start address of SMBIOS table */
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <asm-generic/global_data.h>
|
#include <asm-generic/global_data.h>
|
||||||
|
|
|
@ -146,16 +146,21 @@ void fill_fadt(struct acpi_fadt *fadt)
|
||||||
fadt->x_pm_tmr_blk.addrl = IOMAP_ACPI_BASE + PM1_TMR;
|
fadt->x_pm_tmr_blk.addrl = IOMAP_ACPI_BASE + PM1_TMR;
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
static int apl_write_fadt(struct acpi_ctx *ctx, const struct acpi_writer *entry)
|
||||||
void *dsdt)
|
|
||||||
{
|
{
|
||||||
struct acpi_table_header *header = &fadt->header;
|
struct acpi_table_header *header;
|
||||||
|
struct acpi_fadt *fadt;
|
||||||
|
|
||||||
acpi_fadt_common(fadt, facs, dsdt);
|
fadt = ctx->current;
|
||||||
|
acpi_fadt_common(fadt, ctx->facs, ctx->dsdt);
|
||||||
intel_acpi_fill_fadt(fadt);
|
intel_acpi_fill_fadt(fadt);
|
||||||
fill_fadt(fadt);
|
fill_fadt(fadt);
|
||||||
|
header = &fadt->header;
|
||||||
header->checksum = table_compute_checksum(fadt, header->length);
|
header->checksum = table_compute_checksum(fadt, header->length);
|
||||||
|
|
||||||
|
return acpi_add_fadt(ctx, fadt);
|
||||||
}
|
}
|
||||||
|
ACPI_WRITER(5fadt, "FADT", apl_write_fadt, 0);
|
||||||
|
|
||||||
int apl_acpi_fill_dmar(struct acpi_ctx *ctx)
|
int apl_acpi_fill_dmar(struct acpi_ctx *ctx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -15,20 +15,24 @@
|
||||||
#include <asm/arch/iomap.h>
|
#include <asm/arch/iomap.h>
|
||||||
#include <dm/uclass-internal.h>
|
#include <dm/uclass-internal.h>
|
||||||
|
|
||||||
void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
static int baytrail_write_fadt(struct acpi_ctx *ctx,
|
||||||
void *dsdt)
|
const struct acpi_writer *entry)
|
||||||
{
|
{
|
||||||
struct acpi_table_header *header = &(fadt->header);
|
struct acpi_table_header *header;
|
||||||
|
struct acpi_fadt *fadt;
|
||||||
|
|
||||||
|
fadt = ctx->current;
|
||||||
|
header = &fadt->header;
|
||||||
u16 pmbase = ACPI_BASE_ADDRESS;
|
u16 pmbase = ACPI_BASE_ADDRESS;
|
||||||
|
|
||||||
memset((void *)fadt, 0, sizeof(struct acpi_fadt));
|
memset(fadt, '\0', sizeof(struct acpi_fadt));
|
||||||
|
|
||||||
acpi_fill_header(header, "FACP");
|
acpi_fill_header(header, "FACP");
|
||||||
header->length = sizeof(struct acpi_fadt);
|
header->length = sizeof(struct acpi_fadt);
|
||||||
header->revision = 4;
|
header->revision = 4;
|
||||||
|
|
||||||
fadt->firmware_ctrl = (u32)facs;
|
fadt->firmware_ctrl = (u32)ctx->facs;
|
||||||
fadt->dsdt = (u32)dsdt;
|
fadt->dsdt = (u32)ctx->dsdt;
|
||||||
fadt->preferred_pm_profile = ACPI_PM_MOBILE;
|
fadt->preferred_pm_profile = ACPI_PM_MOBILE;
|
||||||
fadt->sci_int = 9;
|
fadt->sci_int = 9;
|
||||||
fadt->smi_cmd = 0;
|
fadt->smi_cmd = 0;
|
||||||
|
@ -75,9 +79,9 @@ void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
||||||
fadt->reset_reg.addrh = 0;
|
fadt->reset_reg.addrh = 0;
|
||||||
fadt->reset_value = SYS_RST | RST_CPU | FULL_RST;
|
fadt->reset_value = SYS_RST | RST_CPU | FULL_RST;
|
||||||
|
|
||||||
fadt->x_firmware_ctl_l = (u32)facs;
|
fadt->x_firmware_ctl_l = (u32)ctx->facs;
|
||||||
fadt->x_firmware_ctl_h = 0;
|
fadt->x_firmware_ctl_h = 0;
|
||||||
fadt->x_dsdt_l = (u32)dsdt;
|
fadt->x_dsdt_l = (u32)ctx->dsdt;
|
||||||
fadt->x_dsdt_h = 0;
|
fadt->x_dsdt_h = 0;
|
||||||
|
|
||||||
fadt->x_pm1a_evt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
|
fadt->x_pm1a_evt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
|
||||||
|
@ -137,7 +141,10 @@ void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
||||||
fadt->x_gpe1_blk.addrh = 0x0;
|
fadt->x_gpe1_blk.addrh = 0x0;
|
||||||
|
|
||||||
header->checksum = table_compute_checksum(fadt, header->length);
|
header->checksum = table_compute_checksum(fadt, header->length);
|
||||||
|
|
||||||
|
return acpi_add_fadt(ctx, fadt);
|
||||||
}
|
}
|
||||||
|
ACPI_WRITER(5fadt, "FADT", baytrail_write_fadt, 0);
|
||||||
|
|
||||||
int acpi_create_gnvs(struct acpi_global_nvs *gnvs)
|
int acpi_create_gnvs(struct acpi_global_nvs *gnvs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <event.h>
|
#include <event.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
|
#include <spl.h>
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
#include <asm/cpu_x86.h>
|
#include <asm/cpu_x86.h>
|
||||||
#include <asm/cpu_common.h>
|
#include <asm/cpu_common.h>
|
||||||
|
@ -67,12 +68,11 @@ int arch_cpu_init(void)
|
||||||
{
|
{
|
||||||
post_code(POST_CPU_INIT);
|
post_code(POST_CPU_INIT);
|
||||||
|
|
||||||
#ifdef CONFIG_TPL
|
|
||||||
/* Do a mini-init if TPL has already done the full init */
|
/* Do a mini-init if TPL has already done the full init */
|
||||||
return x86_cpu_reinit_f();
|
if (IS_ENABLED(CONFIG_TPL) && spl_phase() != PHASE_TPL)
|
||||||
#else
|
return x86_cpu_reinit_f();
|
||||||
return x86_cpu_init_f();
|
else
|
||||||
#endif
|
return x86_cpu_init_f();
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkcpu(void)
|
int checkcpu(void)
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
* From coreboot src/soc/intel/broadwell/romstage/raminit.c
|
* From coreboot src/soc/intel/broadwell/romstage/raminit.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define LOG_CATEGORY UCLASS_RAM
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
|
|
|
@ -25,6 +25,7 @@ config SYS_COREBOOT
|
||||||
imply FS_CBFS
|
imply FS_CBFS
|
||||||
imply CBMEM_CONSOLE
|
imply CBMEM_CONSOLE
|
||||||
imply X86_TSC_READ_BASE
|
imply X86_TSC_READ_BASE
|
||||||
|
imply USE_PREBOOT
|
||||||
select BINMAN if X86_64
|
select BINMAN if X86_64
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -21,7 +21,14 @@
|
||||||
|
|
||||||
int arch_cpu_init(void)
|
int arch_cpu_init(void)
|
||||||
{
|
{
|
||||||
int ret = get_coreboot_info(&lib_sysinfo);
|
int ret;
|
||||||
|
|
||||||
|
ret = IS_ENABLED(CONFIG_X86_RUN_64BIT) ? x86_cpu_reinit_f() :
|
||||||
|
x86_cpu_init_f();
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = get_coreboot_info(&lib_sysinfo);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
printf("Failed to parse coreboot tables.\n");
|
printf("Failed to parse coreboot tables.\n");
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -29,8 +36,7 @@ int arch_cpu_init(void)
|
||||||
|
|
||||||
timestamp_init();
|
timestamp_init();
|
||||||
|
|
||||||
return IS_ENABLED(CONFIG_X86_RUN_64BIT) ? x86_cpu_reinit_f() :
|
return 0;
|
||||||
x86_cpu_init_f();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkcpu(void)
|
int checkcpu(void)
|
||||||
|
@ -80,10 +86,6 @@ static int last_stage_init(void)
|
||||||
if (IS_ENABLED(CONFIG_SPL_BUILD))
|
if (IS_ENABLED(CONFIG_SPL_BUILD))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* start usb so that usb keyboard can be used as input device */
|
|
||||||
if (IS_ENABLED(CONFIG_USB_KEYBOARD))
|
|
||||||
usb_init();
|
|
||||||
|
|
||||||
board_final_init();
|
board_final_init();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -415,7 +415,7 @@ int cpu_phys_address_size(void)
|
||||||
/* Don't allow PCI region 3 to use memory in the 2-4GB memory hole */
|
/* Don't allow PCI region 3 to use memory in the 2-4GB memory hole */
|
||||||
static void setup_pci_ram_top(void)
|
static void setup_pci_ram_top(void)
|
||||||
{
|
{
|
||||||
gd->pci_ram_top = 0x80000000U;
|
gd_set_pci_ram_top(0x80000000U);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_mtrr(void)
|
static void setup_mtrr(void)
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
|
#include <spl.h>
|
||||||
#include <syscon.h>
|
#include <syscon.h>
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
@ -251,13 +252,28 @@ static int sdram_initialise(struct udevice *dev, struct udevice *me_dev,
|
||||||
int mrc_common_init(struct udevice *dev, void *pei_data, bool use_asm_linkage)
|
int mrc_common_init(struct udevice *dev, void *pei_data, bool use_asm_linkage)
|
||||||
{
|
{
|
||||||
struct udevice *me_dev;
|
struct udevice *me_dev;
|
||||||
int ret;
|
int ret, delay;
|
||||||
|
|
||||||
ret = syscon_get_by_driver_data(X86_SYSCON_ME, &me_dev);
|
ret = syscon_get_by_driver_data(X86_SYSCON_ME, &me_dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
delay = dev_read_u32_default(dev, "fspm,training-delay", 0);
|
||||||
|
if (spl_phase() == PHASE_SPL) {
|
||||||
|
if (delay)
|
||||||
|
printf("SDRAM training (%d seconds)...", delay);
|
||||||
|
else
|
||||||
|
log_debug("SDRAM init...");
|
||||||
|
} else {
|
||||||
|
if (delay)
|
||||||
|
printf("(%d seconds)...", delay);
|
||||||
|
}
|
||||||
|
|
||||||
ret = sdram_initialise(dev, me_dev, pei_data, use_asm_linkage);
|
ret = sdram_initialise(dev, me_dev, pei_data, use_asm_linkage);
|
||||||
|
if (delay)
|
||||||
|
printf("done\n");
|
||||||
|
else
|
||||||
|
log_debug("done\n");
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
quick_ram_check();
|
quick_ram_check();
|
||||||
|
|
|
@ -10,20 +10,24 @@
|
||||||
#include <asm/arch/global_nvs.h>
|
#include <asm/arch/global_nvs.h>
|
||||||
#include <asm/arch/iomap.h>
|
#include <asm/arch/iomap.h>
|
||||||
|
|
||||||
void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
static int quark_write_fadt(struct acpi_ctx *ctx,
|
||||||
void *dsdt)
|
const struct acpi_writer *entry)
|
||||||
{
|
{
|
||||||
struct acpi_table_header *header = &(fadt->header);
|
|
||||||
u16 pmbase = ACPI_PM1_BASE_ADDRESS;
|
u16 pmbase = ACPI_PM1_BASE_ADDRESS;
|
||||||
|
struct acpi_table_header *header;
|
||||||
|
struct acpi_fadt *fadt;
|
||||||
|
|
||||||
memset((void *)fadt, 0, sizeof(struct acpi_fadt));
|
fadt = ctx->current;
|
||||||
|
header = &fadt->header;
|
||||||
|
|
||||||
|
memset(fadt, '\0', sizeof(struct acpi_fadt));
|
||||||
|
|
||||||
acpi_fill_header(header, "FACP");
|
acpi_fill_header(header, "FACP");
|
||||||
header->length = sizeof(struct acpi_fadt);
|
header->length = sizeof(struct acpi_fadt);
|
||||||
header->revision = 4;
|
header->revision = 4;
|
||||||
|
|
||||||
fadt->firmware_ctrl = (u32)facs;
|
fadt->firmware_ctrl = (u32)ctx->facs;
|
||||||
fadt->dsdt = (u32)dsdt;
|
fadt->dsdt = (u32)ctx->dsdt;
|
||||||
fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
|
fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
|
||||||
fadt->sci_int = 9;
|
fadt->sci_int = 9;
|
||||||
fadt->smi_cmd = 0;
|
fadt->smi_cmd = 0;
|
||||||
|
@ -70,9 +74,9 @@ void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
||||||
fadt->reset_reg.addrh = 0;
|
fadt->reset_reg.addrh = 0;
|
||||||
fadt->reset_value = SYS_RST | RST_CPU | FULL_RST;
|
fadt->reset_value = SYS_RST | RST_CPU | FULL_RST;
|
||||||
|
|
||||||
fadt->x_firmware_ctl_l = (u32)facs;
|
fadt->x_firmware_ctl_l = (u32)ctx->facs;
|
||||||
fadt->x_firmware_ctl_h = 0;
|
fadt->x_firmware_ctl_h = 0;
|
||||||
fadt->x_dsdt_l = (u32)dsdt;
|
fadt->x_dsdt_l = (u32)ctx->dsdt;
|
||||||
fadt->x_dsdt_h = 0;
|
fadt->x_dsdt_h = 0;
|
||||||
|
|
||||||
fadt->x_pm1a_evt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
|
fadt->x_pm1a_evt_blk.space_id = ACPI_ADDRESS_SPACE_IO;
|
||||||
|
@ -132,7 +136,10 @@ void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
||||||
fadt->x_gpe1_blk.addrh = 0x0;
|
fadt->x_gpe1_blk.addrh = 0x0;
|
||||||
|
|
||||||
header->checksum = table_compute_checksum(fadt, header->length);
|
header->checksum = table_compute_checksum(fadt, header->length);
|
||||||
|
|
||||||
|
return acpi_add_fadt(ctx, fadt);
|
||||||
}
|
}
|
||||||
|
ACPI_WRITER(5fadt, "FADT", quark_write_fadt, 0);
|
||||||
|
|
||||||
int acpi_create_gnvs(struct acpi_global_nvs *gnvs)
|
int acpi_create_gnvs(struct acpi_global_nvs *gnvs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,19 +16,23 @@
|
||||||
#include <asm/arch/iomap.h>
|
#include <asm/arch/iomap.h>
|
||||||
#include <dm/uclass-internal.h>
|
#include <dm/uclass-internal.h>
|
||||||
|
|
||||||
void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
static int tangier_write_fadt(struct acpi_ctx *ctx,
|
||||||
void *dsdt)
|
const struct acpi_writer *entry)
|
||||||
{
|
{
|
||||||
struct acpi_table_header *header = &(fadt->header);
|
struct acpi_table_header *header;
|
||||||
|
struct acpi_fadt *fadt;
|
||||||
|
|
||||||
memset((void *)fadt, 0, sizeof(struct acpi_fadt));
|
fadt = ctx->current;
|
||||||
|
header = &fadt->header;
|
||||||
|
|
||||||
|
memset(fadt, '\0', sizeof(struct acpi_fadt));
|
||||||
|
|
||||||
acpi_fill_header(header, "FACP");
|
acpi_fill_header(header, "FACP");
|
||||||
header->length = sizeof(struct acpi_fadt);
|
header->length = sizeof(struct acpi_fadt);
|
||||||
header->revision = 6;
|
header->revision = 6;
|
||||||
|
|
||||||
fadt->firmware_ctrl = (u32)facs;
|
fadt->firmware_ctrl = (u32)ctx->facs;
|
||||||
fadt->dsdt = (u32)dsdt;
|
fadt->dsdt = (u32)ctx->dsdt;
|
||||||
fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
|
fadt->preferred_pm_profile = ACPI_PM_UNSPECIFIED;
|
||||||
|
|
||||||
fadt->iapc_boot_arch = ACPI_FADT_VGA_NOT_PRESENT |
|
fadt->iapc_boot_arch = ACPI_FADT_VGA_NOT_PRESENT |
|
||||||
|
@ -41,13 +45,16 @@ void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
||||||
|
|
||||||
fadt->minor_revision = 2;
|
fadt->minor_revision = 2;
|
||||||
|
|
||||||
fadt->x_firmware_ctl_l = (u32)facs;
|
fadt->x_firmware_ctl_l = (u32)ctx->facs;
|
||||||
fadt->x_firmware_ctl_h = 0;
|
fadt->x_firmware_ctl_h = 0;
|
||||||
fadt->x_dsdt_l = (u32)dsdt;
|
fadt->x_dsdt_l = (u32)ctx->dsdt;
|
||||||
fadt->x_dsdt_h = 0;
|
fadt->x_dsdt_h = 0;
|
||||||
|
|
||||||
header->checksum = table_compute_checksum(fadt, header->length);
|
header->checksum = table_compute_checksum(fadt, header->length);
|
||||||
|
|
||||||
|
return acpi_add_fadt(ctx, fadt);
|
||||||
}
|
}
|
||||||
|
ACPI_WRITER(5fadt, "FADT", tangier_write_fadt, 0);
|
||||||
|
|
||||||
u32 acpi_fill_madt(u32 current)
|
u32 acpi_fill_madt(u32 current)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,8 +8,11 @@
|
||||||
#include <cpu_func.h>
|
#include <cpu_func.h>
|
||||||
#include <debug_uart.h>
|
#include <debug_uart.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
|
#include <asm/cpu.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
int cpu_has_64bit(void)
|
int cpu_has_64bit(void)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
@ -38,6 +41,10 @@ int x86_mp_init(void)
|
||||||
|
|
||||||
int x86_cpu_reinit_f(void)
|
int x86_cpu_reinit_f(void)
|
||||||
{
|
{
|
||||||
|
/* set the vendor to Intel so that native_calibrate_tsc() works */
|
||||||
|
gd->arch.x86_vendor = X86_VENDOR_INTEL;
|
||||||
|
gd->arch.has_mtrr = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -266,6 +266,7 @@
|
||||||
board-id-gpios = <&gpio_c 5 0>, <&gpio_c 4 0>,
|
board-id-gpios = <&gpio_c 5 0>, <&gpio_c 4 0>,
|
||||||
<&gpio_c 3 0>, <&gpio_c 1 0>;
|
<&gpio_c 3 0>, <&gpio_c 1 0>;
|
||||||
bootph-all;
|
bootph-all;
|
||||||
|
fspm,training-delay = <7>;
|
||||||
spd {
|
spd {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
coreboot-fb {
|
coreboot-fb {
|
||||||
|
bootph-some-ram;
|
||||||
compatible = "coreboot-fb";
|
compatible = "coreboot-fb";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,8 +24,6 @@ struct acpi_table_header;
|
||||||
|
|
||||||
/* These can be used by the target port */
|
/* These can be used by the target port */
|
||||||
|
|
||||||
void acpi_create_fadt(struct acpi_fadt *fadt, struct acpi_facs *facs,
|
|
||||||
void *dsdt);
|
|
||||||
int acpi_create_madt_lapics(u32 current);
|
int acpi_create_madt_lapics(u32 current);
|
||||||
int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
|
int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
|
||||||
u32 addr, u32 gsi_base);
|
u32 addr, u32 gsi_base);
|
||||||
|
|
|
@ -299,11 +299,24 @@ struct cb_vdat {
|
||||||
#define CB_TAG_TIMESTAMPS 0x0016
|
#define CB_TAG_TIMESTAMPS 0x0016
|
||||||
#define CB_TAG_CBMEM_CONSOLE 0x0017
|
#define CB_TAG_CBMEM_CONSOLE 0x0017
|
||||||
|
|
||||||
|
#define CBMC_CURSOR_MASK ((1 << 28) - 1)
|
||||||
|
#define CBMC_OVERFLOW BIT(31)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* struct cbmem_console - In-memory console buffer for coreboot
|
||||||
|
*
|
||||||
|
* Structure describing console buffer. It is overlaid on a flat memory area,
|
||||||
|
* with body covering the extent of the memory. Once the buffer is full,
|
||||||
|
* output will wrap back around to the start of the buffer. The high bit of the
|
||||||
|
* cursor field gets set to indicate that this happened. If the underlying
|
||||||
|
* storage allows this, the buffer will persist across multiple boots and append
|
||||||
|
* to the previous log.
|
||||||
|
*/
|
||||||
struct cbmem_console {
|
struct cbmem_console {
|
||||||
u32 size;
|
u32 size;
|
||||||
u32 cursor;
|
u32 cursor;
|
||||||
char body[0];
|
u8 body[0];
|
||||||
} __packed;
|
};
|
||||||
|
|
||||||
#define CB_TAG_MRC_CACHE 0x0018
|
#define CB_TAG_MRC_CACHE 0x0018
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,7 @@ struct arch_global_data {
|
||||||
ulong table_end; /* End address of x86 tables */
|
ulong table_end; /* End address of x86 tables */
|
||||||
ulong table_start_high; /* Start address of high x86 tables */
|
ulong table_start_high; /* Start address of high x86 tables */
|
||||||
ulong table_end_high; /* End address of high x86 tables */
|
ulong table_end_high; /* End address of high x86 tables */
|
||||||
|
ulong smbios_start; /* Start address of SMBIOS table */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -458,21 +458,6 @@ int acpi_write_gnvs(struct acpi_ctx *ctx, const struct acpi_writer *entry)
|
||||||
}
|
}
|
||||||
ACPI_WRITER(4gnvs, "GNVS", acpi_write_gnvs, 0);
|
ACPI_WRITER(4gnvs, "GNVS", acpi_write_gnvs, 0);
|
||||||
|
|
||||||
static int acpi_write_fadt(struct acpi_ctx *ctx,
|
|
||||||
const struct acpi_writer *entry)
|
|
||||||
{
|
|
||||||
struct acpi_fadt *fadt;
|
|
||||||
|
|
||||||
fadt = ctx->current;
|
|
||||||
acpi_create_fadt(fadt, ctx->facs, ctx->dsdt);
|
|
||||||
acpi_add_table(ctx, fadt);
|
|
||||||
|
|
||||||
acpi_inc(ctx, sizeof(struct acpi_fadt));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ACPI_WRITER(5fact, "FADT", acpi_write_fadt, 0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_write_hpet() - Write out a HPET table
|
* acpi_write_hpet() - Write out a HPET table
|
||||||
*
|
*
|
||||||
|
|
|
@ -471,6 +471,7 @@ int get_coreboot_info(struct sysinfo_t *info)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
gd->arch.coreboot_table = addr;
|
gd->arch.coreboot_table = addr;
|
||||||
gd_set_acpi_start(map_to_sysmem(info->rsdp));
|
gd_set_acpi_start(map_to_sysmem(info->rsdp));
|
||||||
|
gd_set_smbios_start(info->smbios_start);
|
||||||
gd->flags |= GD_FLG_SKIP_LL_INIT;
|
gd->flags |= GD_FLG_SKIP_LL_INIT;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -15,7 +15,8 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
int init_cache_f_r(void)
|
int init_cache_f_r(void)
|
||||||
{
|
{
|
||||||
bool do_mtrr = CONFIG_IS_ENABLED(X86_32BIT_INIT) ||
|
bool do_mtrr = CONFIG_IS_ENABLED(X86_32BIT_INIT) ||
|
||||||
IS_ENABLED(CONFIG_FSP_VERSION2);
|
IS_ENABLED(CONFIG_FSP_VERSION2) ||
|
||||||
|
(IS_ENABLED(CONFIG_TPL) && IS_ENABLED(CONFIG_HAVE_MRC));
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -23,11 +24,9 @@ int init_cache_f_r(void)
|
||||||
*
|
*
|
||||||
* booting from slimbootloader - MTRRs are already set up
|
* booting from slimbootloader - MTRRs are already set up
|
||||||
* booting with FSPv1 - MTRRs are already set up
|
* booting with FSPv1 - MTRRs are already set up
|
||||||
* booting with FSPv2 - MTRRs must be set here
|
* booting with FSPv2 or MRC - MTRRs must be set here
|
||||||
* booting from coreboot - in this case there is no SPL, so we set up
|
* booting from coreboot - in this case there is no SPL, so we set up
|
||||||
* the MTRRs here
|
* the MTRRs here
|
||||||
* Note: if there is an SPL, then it has already set up MTRRs so we
|
|
||||||
* don't need to do that here
|
|
||||||
*/
|
*/
|
||||||
do_mtrr &= !IS_ENABLED(CONFIG_FSP_VERSION1) &&
|
do_mtrr &= !IS_ENABLED(CONFIG_FSP_VERSION1) &&
|
||||||
!IS_ENABLED(CONFIG_SYS_SLIMBOOTLOADER);
|
!IS_ENABLED(CONFIG_SYS_SLIMBOOTLOADER);
|
||||||
|
|
|
@ -230,6 +230,9 @@ void board_init_f_r(void)
|
||||||
mtrr_commit(false);
|
mtrr_commit(false);
|
||||||
init_cache();
|
init_cache();
|
||||||
gd->flags &= ~GD_FLG_SERIAL_READY;
|
gd->flags &= ~GD_FLG_SERIAL_READY;
|
||||||
|
|
||||||
|
/* make sure driver model is not accessed from now on */
|
||||||
|
gd->flags |= GD_FLG_DM_DEAD;
|
||||||
debug("cache status %d\n", dcache_status());
|
debug("cache status %d\n", dcache_status());
|
||||||
board_init_r(gd, 0);
|
board_init_r(gd, 0);
|
||||||
}
|
}
|
||||||
|
@ -258,7 +261,7 @@ static int spl_board_load_image(struct spl_image_info *spl_image,
|
||||||
spl_image->os = IH_OS_U_BOOT;
|
spl_image->os = IH_OS_U_BOOT;
|
||||||
spl_image->name = "U-Boot";
|
spl_image->name = "U-Boot";
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_SYS_COREBOOT)) {
|
if (spl_image->load_addr != spl_get_image_pos()) {
|
||||||
/* Copy U-Boot from ROM */
|
/* Copy U-Boot from ROM */
|
||||||
memcpy((void *)spl_image->load_addr,
|
memcpy((void *)spl_image->load_addr,
|
||||||
(void *)spl_get_image_pos(), spl_get_image_size());
|
(void *)spl_get_image_pos(), spl_get_image_size());
|
||||||
|
|
|
@ -97,6 +97,9 @@ int write_tables(void)
|
||||||
int size = table->size ? : CONFIG_ROM_TABLE_SIZE;
|
int size = table->size ? : CONFIG_ROM_TABLE_SIZE;
|
||||||
u32 rom_table_end;
|
u32 rom_table_end;
|
||||||
|
|
||||||
|
if (!strcmp("smbios", table->name))
|
||||||
|
gd->arch.smbios_start = rom_addr;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_BLOBLIST_TABLES) && table->tag) {
|
if (IS_ENABLED(CONFIG_BLOBLIST_TABLES) && table->tag) {
|
||||||
if (!gd->arch.table_end)
|
if (!gd->arch.table_end)
|
||||||
gd->arch.table_end = rom_addr;
|
gd->arch.table_end = rom_addr;
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
* Copyright (c) 2018 Google, Inc
|
* Copyright (c) 2018 Google, Inc
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define LOG_CATEGORY LOGC_BOOT
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <debug_uart.h>
|
#include <debug_uart.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
|
|
|
@ -307,7 +307,8 @@ static int last_stage_init(void)
|
||||||
struct udevice *bus;
|
struct udevice *bus;
|
||||||
ofnode node;
|
ofnode node;
|
||||||
|
|
||||||
if (!of_machine_is_compatible("globalscale,espressobin"))
|
if (!CONFIG_IS_ENABLED(DM_MDIO) ||
|
||||||
|
!of_machine_is_compatible("globalscale,espressobin"))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
node = ofnode_by_compatible(ofnode_null(), "marvell,orion-mdio");
|
node = ofnode_by_compatible(ofnode_null(), "marvell,orion-mdio");
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include <asm/cb_sysinfo.h>
|
#include <asm/cb_sysinfo.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
int board_early_init_r(void)
|
int board_early_init_r(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -54,14 +56,12 @@ int show_board_info(void)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fallback:
|
fallback:
|
||||||
#ifdef CONFIG_OF_CONTROL
|
if (IS_ENABLED(CONFIG_OF_CONTROL)) {
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
model = fdt_getprop(gd->fdt_blob, 0, "model", NULL);
|
||||||
|
|
||||||
model = fdt_getprop(gd->fdt_blob, 0, "model", NULL);
|
if (model)
|
||||||
|
printf("Model: %s\n", model);
|
||||||
if (model)
|
}
|
||||||
printf("Model: %s\n", model);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return checkboard();
|
return checkboard();
|
||||||
}
|
}
|
||||||
|
|
|
@ -830,6 +830,33 @@ int bootdev_hunt(const char *spec, bool show)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bootdev_unhunt(enum uclass_id id)
|
||||||
|
{
|
||||||
|
struct bootdev_hunter *start;
|
||||||
|
int n_ent, i;
|
||||||
|
|
||||||
|
start = ll_entry_start(struct bootdev_hunter, bootdev_hunter);
|
||||||
|
n_ent = ll_entry_count(struct bootdev_hunter, bootdev_hunter);
|
||||||
|
for (i = 0; i < n_ent; i++) {
|
||||||
|
struct bootdev_hunter *info = start + i;
|
||||||
|
|
||||||
|
if (info->uclass == id) {
|
||||||
|
struct bootstd_priv *std;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = bootstd_get_priv(&std);
|
||||||
|
if (ret)
|
||||||
|
return log_msg_ret("std", ret);
|
||||||
|
if (!(std->hunters_used & BIT(i)))
|
||||||
|
return -EALREADY;
|
||||||
|
std->hunters_used &= ~BIT(i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
int bootdev_hunt_prio(enum bootdev_prio_t prio, bool show)
|
int bootdev_hunt_prio(enum bootdev_prio_t prio, bool show)
|
||||||
{
|
{
|
||||||
struct bootdev_hunter *start;
|
struct bootdev_hunter *start;
|
||||||
|
|
|
@ -554,7 +554,7 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
|
||||||
label->name);
|
label->name);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
strcpy(initrd_filesize, simple_xtoa(size));
|
||||||
initrd_addr_str = env_get("ramdisk_addr_r");
|
initrd_addr_str = env_get("ramdisk_addr_r");
|
||||||
size = snprintf(initrd_str, sizeof(initrd_str), "%s:%lx",
|
size = snprintf(initrd_str, sizeof(initrd_str), "%s:%lx",
|
||||||
initrd_addr_str, size);
|
initrd_addr_str, size);
|
||||||
|
|
|
@ -800,7 +800,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
|
||||||
IS_ENABLED(CONFIG_SPL_ATF))
|
IS_ENABLED(CONFIG_SPL_ATF))
|
||||||
dram_init_banksize();
|
dram_init_banksize();
|
||||||
|
|
||||||
if (CONFIG_IS_ENABLED(PCI)) {
|
if (CONFIG_IS_ENABLED(PCI) && !(gd->flags & GD_FLG_DM_DEAD)) {
|
||||||
ret = pci_init();
|
ret = pci_init();
|
||||||
if (ret)
|
if (ret)
|
||||||
puts(SPL_TPL_PROMPT "Cannot initialize PCI\n");
|
puts(SPL_TPL_PROMPT "Cannot initialize PCI\n");
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
CONFIG_X86=y
|
CONFIG_X86=y
|
||||||
CONFIG_TEXT_BASE=0xffed0000
|
CONFIG_TEXT_BASE=0xffed0000
|
||||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||||
|
CONFIG_TPL_SYS_MALLOC_F_LEN=0x2000
|
||||||
|
CONFIG_SPL_SYS_MALLOC_F_LEN=0x3000
|
||||||
CONFIG_NR_DRAM_BANKS=8
|
CONFIG_NR_DRAM_BANKS=8
|
||||||
CONFIG_ENV_SIZE=0x1000
|
CONFIG_ENV_SIZE=0x1000
|
||||||
CONFIG_ENV_OFFSET=0x3F8000
|
CONFIG_ENV_OFFSET=0x3F8000
|
||||||
|
@ -19,7 +21,7 @@ CONFIG_HAVE_MRC=y
|
||||||
CONFIG_HAVE_REFCODE=y
|
CONFIG_HAVE_REFCODE=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
CONFIG_HAVE_VGA_BIOS=y
|
CONFIG_HAVE_VGA_BIOS=y
|
||||||
CONFIG_X86_OFFSET_U_BOOT=0xffee0000
|
CONFIG_X86_OFFSET_U_BOOT=0xffed0000
|
||||||
CONFIG_SYS_MONITOR_BASE=0xFFED0000
|
CONFIG_SYS_MONITOR_BASE=0xFFED0000
|
||||||
CONFIG_BOOTSTAGE=y
|
CONFIG_BOOTSTAGE=y
|
||||||
CONFIG_BOOTSTAGE_REPORT=y
|
CONFIG_BOOTSTAGE_REPORT=y
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
CONFIG_X86=y
|
CONFIG_X86=y
|
||||||
CONFIG_TEXT_BASE=0x1120000
|
CONFIG_TEXT_BASE=0x1120000
|
||||||
|
CONFIG_SYS_MALLOC_LEN=0x2000000
|
||||||
CONFIG_NR_DRAM_BANKS=8
|
CONFIG_NR_DRAM_BANKS=8
|
||||||
CONFIG_ENV_SIZE=0x1000
|
CONFIG_ENV_SIZE=0x1000
|
||||||
CONFIG_DEFAULT_DEVICE_TREE="coreboot"
|
CONFIG_DEFAULT_DEVICE_TREE="coreboot"
|
||||||
|
@ -10,38 +11,32 @@ CONFIG_VENDOR_COREBOOT=y
|
||||||
CONFIG_TARGET_COREBOOT=y
|
CONFIG_TARGET_COREBOOT=y
|
||||||
CONFIG_FIT=y
|
CONFIG_FIT=y
|
||||||
CONFIG_FIT_SIGNATURE=y
|
CONFIG_FIT_SIGNATURE=y
|
||||||
|
CONFIG_BOOTSTD_FULL=y
|
||||||
|
CONFIG_BOOTSTD_DEFAULTS=y
|
||||||
CONFIG_SYS_MONITOR_BASE=0x01120000
|
CONFIG_SYS_MONITOR_BASE=0x01120000
|
||||||
CONFIG_SHOW_BOOT_PROGRESS=y
|
CONFIG_SHOW_BOOT_PROGRESS=y
|
||||||
CONFIG_USE_BOOTARGS=y
|
CONFIG_USE_BOOTARGS=y
|
||||||
CONFIG_BOOTARGS="root=/dev/sdb3 init=/sbin/init rootwait ro"
|
CONFIG_BOOTARGS="root=/dev/sdb3 init=/sbin/init rootwait ro"
|
||||||
CONFIG_USE_BOOTCOMMAND=y
|
|
||||||
CONFIG_BOOTCOMMAND="ext2load scsi 0:3 01000000 /boot/vmlinuz; zboot 01000000"
|
|
||||||
CONFIG_PRE_CONSOLE_BUFFER=y
|
CONFIG_PRE_CONSOLE_BUFFER=y
|
||||||
CONFIG_SYS_CONSOLE_INFO_QUIET=y
|
CONFIG_SYS_CONSOLE_INFO_QUIET=y
|
||||||
|
CONFIG_LOG=y
|
||||||
|
CONFIG_LOGF_LINE=y
|
||||||
|
CONFIG_LOGF_FUNC=y
|
||||||
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
||||||
CONFIG_SPL_NO_BSS_LIMIT=y
|
CONFIG_SPL_NO_BSS_LIMIT=y
|
||||||
CONFIG_HUSH_PARSER=y
|
|
||||||
CONFIG_SYS_PBSIZE=532
|
CONFIG_SYS_PBSIZE=532
|
||||||
CONFIG_CMD_IDE=y
|
CONFIG_CMD_IDE=y
|
||||||
CONFIG_CMD_MMC=y
|
CONFIG_CMD_MMC=y
|
||||||
CONFIG_CMD_PART=y
|
CONFIG_CMD_SATA=y
|
||||||
CONFIG_CMD_USB=y
|
CONFIG_CMD_USB=y
|
||||||
# CONFIG_CMD_SETEXPR is not set
|
# CONFIG_CMD_SETEXPR is not set
|
||||||
CONFIG_CMD_DHCP=y
|
|
||||||
CONFIG_BOOTP_BOOTFILESIZE=y
|
CONFIG_BOOTP_BOOTFILESIZE=y
|
||||||
CONFIG_CMD_PING=y
|
|
||||||
CONFIG_CMD_TIME=y
|
CONFIG_CMD_TIME=y
|
||||||
CONFIG_CMD_SOUND=y
|
CONFIG_CMD_SOUND=y
|
||||||
CONFIG_CMD_EXT2=y
|
|
||||||
CONFIG_CMD_EXT4=y
|
|
||||||
CONFIG_CMD_EXT4_WRITE=y
|
CONFIG_CMD_EXT4_WRITE=y
|
||||||
CONFIG_CMD_FAT=y
|
|
||||||
CONFIG_CMD_FS_GENERIC=y
|
|
||||||
CONFIG_MAC_PARTITION=y
|
CONFIG_MAC_PARTITION=y
|
||||||
# CONFIG_SPL_MAC_PARTITION is not set
|
# CONFIG_SPL_MAC_PARTITION is not set
|
||||||
# CONFIG_SPL_DOS_PARTITION is not set
|
# CONFIG_SPL_DOS_PARTITION is not set
|
||||||
CONFIG_ISO_PARTITION=y
|
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
# CONFIG_SPL_EFI_PARTITION is not set
|
# CONFIG_SPL_EFI_PARTITION is not set
|
||||||
CONFIG_ENV_OVERWRITE=y
|
CONFIG_ENV_OVERWRITE=y
|
||||||
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
|
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
|
||||||
|
@ -59,8 +54,14 @@ CONFIG_SYS_ATA_ALT_OFFSET=0
|
||||||
CONFIG_ATAPI=y
|
CONFIG_ATAPI=y
|
||||||
CONFIG_LBA48=y
|
CONFIG_LBA48=y
|
||||||
CONFIG_SYS_64BIT_LBA=y
|
CONFIG_SYS_64BIT_LBA=y
|
||||||
|
CONFIG_NVME_PCI=y
|
||||||
# CONFIG_PCI_PNP is not set
|
# CONFIG_PCI_PNP is not set
|
||||||
|
CONFIG_SYS_NS16550_MEM32=y
|
||||||
CONFIG_SOUND=y
|
CONFIG_SOUND=y
|
||||||
CONFIG_SOUND_I8254=y
|
CONFIG_SOUND_I8254=y
|
||||||
|
CONFIG_VIDEO_COPY=y
|
||||||
CONFIG_CONSOLE_SCROLL_LINES=5
|
CONFIG_CONSOLE_SCROLL_LINES=5
|
||||||
|
CONFIG_SPL_ACPI=y
|
||||||
|
CONFIG_CMD_DHRYSTONE=y
|
||||||
# CONFIG_GZIP is not set
|
# CONFIG_GZIP is not set
|
||||||
|
CONFIG_SMBIOS_PARSER=y
|
||||||
|
|
|
@ -10,6 +10,7 @@ CONFIG_TARGET_COREBOOT=y
|
||||||
CONFIG_FIT=y
|
CONFIG_FIT=y
|
||||||
CONFIG_FIT_SIGNATURE=y
|
CONFIG_FIT_SIGNATURE=y
|
||||||
CONFIG_BOOTSTD_FULL=y
|
CONFIG_BOOTSTD_FULL=y
|
||||||
|
CONFIG_BOOTSTD_DEFAULTS=y
|
||||||
CONFIG_SYS_MONITOR_BASE=0x01110000
|
CONFIG_SYS_MONITOR_BASE=0x01110000
|
||||||
CONFIG_SHOW_BOOT_PROGRESS=y
|
CONFIG_SHOW_BOOT_PROGRESS=y
|
||||||
CONFIG_USE_BOOTARGS=y
|
CONFIG_USE_BOOTARGS=y
|
||||||
|
@ -21,23 +22,16 @@ CONFIG_LOGF_LINE=y
|
||||||
CONFIG_LOGF_FUNC=y
|
CONFIG_LOGF_FUNC=y
|
||||||
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
||||||
CONFIG_PCI_INIT_R=y
|
CONFIG_PCI_INIT_R=y
|
||||||
|
CONFIG_CMD_IDE=y
|
||||||
CONFIG_CMD_MMC=y
|
CONFIG_CMD_MMC=y
|
||||||
CONFIG_CMD_PART=y
|
CONFIG_CMD_SATA=y
|
||||||
CONFIG_CMD_USB=y
|
CONFIG_CMD_USB=y
|
||||||
# CONFIG_CMD_SETEXPR is not set
|
# CONFIG_CMD_SETEXPR is not set
|
||||||
CONFIG_CMD_DHCP=y
|
|
||||||
CONFIG_BOOTP_BOOTFILESIZE=y
|
CONFIG_BOOTP_BOOTFILESIZE=y
|
||||||
CONFIG_CMD_PING=y
|
|
||||||
CONFIG_CMD_TIME=y
|
CONFIG_CMD_TIME=y
|
||||||
CONFIG_CMD_SOUND=y
|
CONFIG_CMD_SOUND=y
|
||||||
CONFIG_CMD_EXT2=y
|
|
||||||
CONFIG_CMD_EXT4=y
|
|
||||||
CONFIG_CMD_EXT4_WRITE=y
|
CONFIG_CMD_EXT4_WRITE=y
|
||||||
CONFIG_CMD_FAT=y
|
|
||||||
CONFIG_CMD_FS_GENERIC=y
|
|
||||||
CONFIG_MAC_PARTITION=y
|
CONFIG_MAC_PARTITION=y
|
||||||
CONFIG_ISO_PARTITION=y
|
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
CONFIG_ENV_OVERWRITE=y
|
CONFIG_ENV_OVERWRITE=y
|
||||||
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
|
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
|
||||||
CONFIG_USE_BOOTFILE=y
|
CONFIG_USE_BOOTFILE=y
|
||||||
|
@ -47,10 +41,19 @@ CONFIG_USE_ROOTPATH=y
|
||||||
CONFIG_REGMAP=y
|
CONFIG_REGMAP=y
|
||||||
CONFIG_SYSCON=y
|
CONFIG_SYSCON=y
|
||||||
# CONFIG_ACPIGEN is not set
|
# CONFIG_ACPIGEN is not set
|
||||||
|
CONFIG_SYS_IDE_MAXDEVICE=4
|
||||||
|
CONFIG_SYS_ATA_DATA_OFFSET=0
|
||||||
|
CONFIG_SYS_ATA_REG_OFFSET=0
|
||||||
|
CONFIG_SYS_ATA_ALT_OFFSET=0
|
||||||
|
CONFIG_ATAPI=y
|
||||||
|
CONFIG_LBA48=y
|
||||||
|
CONFIG_SYS_64BIT_LBA=y
|
||||||
CONFIG_NVME_PCI=y
|
CONFIG_NVME_PCI=y
|
||||||
# CONFIG_PCI_PNP is not set
|
# CONFIG_PCI_PNP is not set
|
||||||
|
CONFIG_SYS_NS16550_MEM32=y
|
||||||
CONFIG_SOUND=y
|
CONFIG_SOUND=y
|
||||||
CONFIG_SOUND_I8254=y
|
CONFIG_SOUND_I8254=y
|
||||||
|
CONFIG_VIDEO_COPY=y
|
||||||
CONFIG_CONSOLE_SCROLL_LINES=5
|
CONFIG_CONSOLE_SCROLL_LINES=5
|
||||||
CONFIG_CMD_DHRYSTONE=y
|
CONFIG_CMD_DHRYSTONE=y
|
||||||
# CONFIG_GZIP is not set
|
# CONFIG_GZIP is not set
|
||||||
|
|
|
@ -7,11 +7,12 @@ CONFIG_VENDOR_EFI=y
|
||||||
CONFIG_TARGET_EFI_PAYLOAD=y
|
CONFIG_TARGET_EFI_PAYLOAD=y
|
||||||
CONFIG_FIT=y
|
CONFIG_FIT=y
|
||||||
CONFIG_FIT_SIGNATURE=y
|
CONFIG_FIT_SIGNATURE=y
|
||||||
|
CONFIG_BOOTSTD_FULL=y
|
||||||
|
CONFIG_LEGACY_IMAGE_FORMAT=y
|
||||||
CONFIG_SHOW_BOOT_PROGRESS=y
|
CONFIG_SHOW_BOOT_PROGRESS=y
|
||||||
CONFIG_USE_BOOTARGS=y
|
CONFIG_USE_BOOTARGS=y
|
||||||
CONFIG_BOOTARGS="root=/dev/sdb3 init=/sbin/init rootwait ro"
|
CONFIG_BOOTARGS="root=/dev/sdb3 init=/sbin/init rootwait ro"
|
||||||
CONFIG_USE_BOOTCOMMAND=y
|
CONFIG_USE_BOOTCOMMAND=y
|
||||||
CONFIG_BOOTCOMMAND="ext2load scsi 0:3 01000000 /boot/vmlinuz; zboot 01000000"
|
|
||||||
CONFIG_PRE_CONSOLE_BUFFER=y
|
CONFIG_PRE_CONSOLE_BUFFER=y
|
||||||
CONFIG_SYS_CONSOLE_INFO_QUIET=y
|
CONFIG_SYS_CONSOLE_INFO_QUIET=y
|
||||||
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
||||||
|
@ -35,6 +36,9 @@ CONFIG_MAC_PARTITION=y
|
||||||
CONFIG_ISO_PARTITION=y
|
CONFIG_ISO_PARTITION=y
|
||||||
CONFIG_EFI_PARTITION=y
|
CONFIG_EFI_PARTITION=y
|
||||||
CONFIG_ENV_OVERWRITE=y
|
CONFIG_ENV_OVERWRITE=y
|
||||||
|
CONFIG_ENV_IS_IN_FAT=y
|
||||||
|
CONFIG_ENV_FAT_INTERFACE="scsi"
|
||||||
|
CONFIG_ENV_FAT_DEVICE_AND_PART="0:1"
|
||||||
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
|
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
|
||||||
CONFIG_USE_BOOTFILE=y
|
CONFIG_USE_BOOTFILE=y
|
||||||
CONFIG_BOOTFILE="bzImage"
|
CONFIG_BOOTFILE="bzImage"
|
||||||
|
|
|
@ -15,5 +15,5 @@ Architecture-specific doc
|
||||||
riscv
|
riscv
|
||||||
sandbox/index
|
sandbox/index
|
||||||
sh
|
sh
|
||||||
x86
|
x86/index
|
||||||
xtensa
|
xtensa
|
||||||
|
|
12
doc/arch/x86/index.rst
Normal file
12
doc/arch/x86/index.rst
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
.. SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
.. Copyright 2023 Google LLC
|
||||||
|
.. sectionauthor:: Simon Glass <sjg@chromium.org>
|
||||||
|
|
||||||
|
x86
|
||||||
|
===
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
x86
|
||||||
|
manual_boot
|
276
doc/arch/x86/manual_boot.rst
Normal file
276
doc/arch/x86/manual_boot.rst
Normal file
|
@ -0,0 +1,276 @@
|
||||||
|
Booting Ubuntu Manually
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
This shows a manual approach to booting Ubuntu without standard boot or the EFI
|
||||||
|
interface.
|
||||||
|
|
||||||
|
As an example of how to set up your boot flow with U-Boot, here are
|
||||||
|
instructions for starting Ubuntu from U-Boot. These instructions have been
|
||||||
|
tested on Minnowboard MAX with a SATA drive but are equally applicable on
|
||||||
|
other platforms and other media. There are really only four steps and it's a
|
||||||
|
very simple script, but a more detailed explanation is provided here for
|
||||||
|
completeness.
|
||||||
|
|
||||||
|
Note: It is possible to set up U-Boot to boot automatically using syslinux.
|
||||||
|
It could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
|
||||||
|
GUID. If you figure these out, please post patches to this README.
|
||||||
|
|
||||||
|
Firstly, you will need Ubuntu installed on an available disk. It should be
|
||||||
|
possible to make U-Boot start a USB start-up disk but for now let's assume
|
||||||
|
that you used another boot loader to install Ubuntu.
|
||||||
|
|
||||||
|
Use the U-Boot command line to find the UUID of the partition you want to
|
||||||
|
boot. For example our disk is SCSI device 0::
|
||||||
|
|
||||||
|
=> part list scsi 0
|
||||||
|
|
||||||
|
Partition Map for SCSI device 0 -- Partition Type: EFI
|
||||||
|
|
||||||
|
Part Start LBA End LBA Name
|
||||||
|
Attributes
|
||||||
|
Type GUID
|
||||||
|
Partition GUID
|
||||||
|
1 0x00000800 0x001007ff ""
|
||||||
|
attrs: 0x0000000000000000
|
||||||
|
type: c12a7328-f81f-11d2-ba4b-00a0c93ec93b
|
||||||
|
guid: 9d02e8e4-4d59-408f-a9b0-fd497bc9291c
|
||||||
|
2 0x00100800 0x037d8fff ""
|
||||||
|
attrs: 0x0000000000000000
|
||||||
|
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
|
||||||
|
guid: 965c59ee-1822-4326-90d2-b02446050059
|
||||||
|
3 0x037d9000 0x03ba27ff ""
|
||||||
|
attrs: 0x0000000000000000
|
||||||
|
type: 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
|
||||||
|
guid: 2c4282bd-1e82-4bcf-a5ff-51dedbf39f17
|
||||||
|
=>
|
||||||
|
|
||||||
|
This shows that your SCSI disk has three partitions. The really long hex
|
||||||
|
strings are called Globally Unique Identifiers (GUIDs). You can look up the
|
||||||
|
'type' ones `here`_. On this disk the first partition is for EFI and is in
|
||||||
|
VFAT format (DOS/Windows)::
|
||||||
|
|
||||||
|
=> fatls scsi 0:1
|
||||||
|
efi/
|
||||||
|
|
||||||
|
0 file(s), 1 dir(s)
|
||||||
|
|
||||||
|
|
||||||
|
Partition 2 is 'Linux filesystem data' so that will be our root disk. It is
|
||||||
|
in ext2 format::
|
||||||
|
|
||||||
|
=> ext2ls scsi 0:2
|
||||||
|
<DIR> 4096 .
|
||||||
|
<DIR> 4096 ..
|
||||||
|
<DIR> 16384 lost+found
|
||||||
|
<DIR> 4096 boot
|
||||||
|
<DIR> 12288 etc
|
||||||
|
<DIR> 4096 media
|
||||||
|
<DIR> 4096 bin
|
||||||
|
<DIR> 4096 dev
|
||||||
|
<DIR> 4096 home
|
||||||
|
<DIR> 4096 lib
|
||||||
|
<DIR> 4096 lib64
|
||||||
|
<DIR> 4096 mnt
|
||||||
|
<DIR> 4096 opt
|
||||||
|
<DIR> 4096 proc
|
||||||
|
<DIR> 4096 root
|
||||||
|
<DIR> 4096 run
|
||||||
|
<DIR> 12288 sbin
|
||||||
|
<DIR> 4096 srv
|
||||||
|
<DIR> 4096 sys
|
||||||
|
<DIR> 4096 tmp
|
||||||
|
<DIR> 4096 usr
|
||||||
|
<DIR> 4096 var
|
||||||
|
<SYM> 33 initrd.img
|
||||||
|
<SYM> 30 vmlinuz
|
||||||
|
<DIR> 4096 cdrom
|
||||||
|
<SYM> 33 initrd.img.old
|
||||||
|
=>
|
||||||
|
|
||||||
|
and if you look in the /boot directory you will see the kernel::
|
||||||
|
|
||||||
|
=> ext2ls scsi 0:2 /boot
|
||||||
|
<DIR> 4096 .
|
||||||
|
<DIR> 4096 ..
|
||||||
|
<DIR> 4096 efi
|
||||||
|
<DIR> 4096 grub
|
||||||
|
3381262 System.map-3.13.0-32-generic
|
||||||
|
1162712 abi-3.13.0-32-generic
|
||||||
|
165611 config-3.13.0-32-generic
|
||||||
|
176500 memtest86+.bin
|
||||||
|
178176 memtest86+.elf
|
||||||
|
178680 memtest86+_multiboot.bin
|
||||||
|
5798112 vmlinuz-3.13.0-32-generic
|
||||||
|
165762 config-3.13.0-58-generic
|
||||||
|
1165129 abi-3.13.0-58-generic
|
||||||
|
5823136 vmlinuz-3.13.0-58-generic
|
||||||
|
19215259 initrd.img-3.13.0-58-generic
|
||||||
|
3391763 System.map-3.13.0-58-generic
|
||||||
|
5825048 vmlinuz-3.13.0-58-generic.efi.signed
|
||||||
|
28304443 initrd.img-3.13.0-32-generic
|
||||||
|
=>
|
||||||
|
|
||||||
|
The 'vmlinuz' files contain a packaged Linux kernel. The format is a kind of
|
||||||
|
self-extracting compressed file mixed with some 'setup' configuration data.
|
||||||
|
Despite its size (uncompressed it is >10MB) this only includes a basic set of
|
||||||
|
device drivers, enough to boot on most hardware types.
|
||||||
|
|
||||||
|
The 'initrd' files contain a RAM disk. This is something that can be loaded
|
||||||
|
into RAM and will appear to Linux like a disk. Ubuntu uses this to hold lots
|
||||||
|
of drivers for whatever hardware you might have. It is loaded before the
|
||||||
|
real root disk is accessed.
|
||||||
|
|
||||||
|
The numbers after the end of each file are the version. Here it is Linux
|
||||||
|
version 3.13. You can find the source code for this in the Linux tree with
|
||||||
|
the tag v3.13. The '.0' allows for additional Linux releases to fix problems,
|
||||||
|
but normally this is not needed. The '-58' is used by Ubuntu. Each time they
|
||||||
|
release a new kernel they increment this number. New Ubuntu versions might
|
||||||
|
include kernel patches to fix reported bugs. Stable kernels can exist for
|
||||||
|
some years so this number can get quite high.
|
||||||
|
|
||||||
|
The '.efi.signed' kernel is signed for EFI's secure boot. U-Boot has its own
|
||||||
|
secure boot mechanism - see `this`_ & `that`_. It cannot read .efi files
|
||||||
|
at present.
|
||||||
|
|
||||||
|
To boot Ubuntu from U-Boot the steps are as follows:
|
||||||
|
|
||||||
|
1. Set up the boot arguments. Use the GUID for the partition you want to boot::
|
||||||
|
|
||||||
|
=> setenv bootargs root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
|
||||||
|
|
||||||
|
Here root= tells Linux the location of its root disk. The disk is specified
|
||||||
|
by its GUID, using '/dev/disk/by-partuuid/', a Linux path to a 'directory'
|
||||||
|
containing all the GUIDs Linux has found. When it starts up, there will be a
|
||||||
|
file in that directory with this name in it. It is also possible to use a
|
||||||
|
device name here, see later.
|
||||||
|
|
||||||
|
2. Load the kernel. Since it is an ext2/4 filesystem we can do::
|
||||||
|
|
||||||
|
=> ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic
|
||||||
|
|
||||||
|
The address 30000000 is arbitrary, but there seem to be problems with using
|
||||||
|
small addresses (sometimes Linux cannot find the ramdisk). This is 48MB into
|
||||||
|
the start of RAM (which is at 0 on x86).
|
||||||
|
|
||||||
|
3. Load the ramdisk (to 64MB)::
|
||||||
|
|
||||||
|
=> ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic
|
||||||
|
|
||||||
|
4. Start up the kernel. We need to know the size of the ramdisk, but can use
|
||||||
|
a variable for that. U-Boot sets 'filesize' to the size of the last file it
|
||||||
|
loaded::
|
||||||
|
|
||||||
|
=> zboot 03000000 0 04000000 ${filesize}
|
||||||
|
|
||||||
|
Type 'help zboot' if you want to see what the arguments are. U-Boot on x86 is
|
||||||
|
quite verbose when it boots a kernel. You should see these messages from
|
||||||
|
U-Boot::
|
||||||
|
|
||||||
|
Valid Boot Flag
|
||||||
|
Setup Size = 0x00004400
|
||||||
|
Magic signature found
|
||||||
|
Using boot protocol version 2.0c
|
||||||
|
Linux kernel version 3.13.0-58-generic (buildd@allspice) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015
|
||||||
|
Building boot_params at 0x00090000
|
||||||
|
Loading bzImage at address 100000 (5805728 bytes)
|
||||||
|
Magic signature found
|
||||||
|
Initial RAM disk at linear address 0x04000000, size 19215259 bytes
|
||||||
|
Kernel command line: "root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
|
||||||
|
|
||||||
|
Starting kernel ...
|
||||||
|
|
||||||
|
U-Boot prints out some bootstage timing. This is more useful if you put the
|
||||||
|
above commands into a script since then it will be faster::
|
||||||
|
|
||||||
|
Timer summary in microseconds:
|
||||||
|
Mark Elapsed Stage
|
||||||
|
0 0 reset
|
||||||
|
241,535 241,535 board_init_r
|
||||||
|
2,421,611 2,180,076 id=64
|
||||||
|
2,421,790 179 id=65
|
||||||
|
2,428,215 6,425 main_loop
|
||||||
|
48,860,584 46,432,369 start_kernel
|
||||||
|
|
||||||
|
Accumulated time:
|
||||||
|
240,329 ahci
|
||||||
|
1,422,704 vesa display
|
||||||
|
|
||||||
|
Now the kernel actually starts (if you want to examine kernel boot up message on
|
||||||
|
the serial console, append "console=ttyS0,115200" to the kernel command line)::
|
||||||
|
|
||||||
|
[ 0.000000] Initializing cgroup subsys cpuset
|
||||||
|
[ 0.000000] Initializing cgroup subsys cpu
|
||||||
|
[ 0.000000] Initializing cgroup subsys cpuacct
|
||||||
|
[ 0.000000] Linux version 3.13.0-58-generic (buildd@allspice) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015 (Ubuntu 3.13.0-58.97-generic 3.13.11-ckt22)
|
||||||
|
[ 0.000000] Command line: root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro console=ttyS0,115200
|
||||||
|
|
||||||
|
It continues for a long time. Along the way you will see it pick up your
|
||||||
|
ramdisk::
|
||||||
|
|
||||||
|
[ 0.000000] RAMDISK: [mem 0x04000000-0x05253fff]
|
||||||
|
...
|
||||||
|
[ 0.788540] Trying to unpack rootfs image as initramfs...
|
||||||
|
[ 1.540111] Freeing initrd memory: 18768K (ffff880004000000 - ffff880005254000)
|
||||||
|
...
|
||||||
|
|
||||||
|
Later it actually starts using it::
|
||||||
|
|
||||||
|
Begin: Running /scripts/local-premount ... done.
|
||||||
|
|
||||||
|
You should also see your boot disk turn up::
|
||||||
|
|
||||||
|
[ 4.357243] scsi 1:0:0:0: Direct-Access ATA ADATA SP310 5.2 PQ: 0 ANSI: 5
|
||||||
|
[ 4.366860] sd 1:0:0:0: [sda] 62533296 512-byte logical blocks: (32.0 GB/29.8 GiB)
|
||||||
|
[ 4.375677] sd 1:0:0:0: Attached scsi generic sg0 type 0
|
||||||
|
[ 4.381859] sd 1:0:0:0: [sda] Write Protect is off
|
||||||
|
[ 4.387452] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
|
||||||
|
[ 4.399535] sda: sda1 sda2 sda3
|
||||||
|
|
||||||
|
Linux has found the three partitions (sda1-3). Mercifully it doesn't print out
|
||||||
|
the GUIDs. In step 1 above we could have used::
|
||||||
|
|
||||||
|
setenv bootargs root=/dev/sda2 ro
|
||||||
|
|
||||||
|
instead of the GUID. However if you add another drive to your board the
|
||||||
|
numbering may change whereas the GUIDs will not. So if your boot partition
|
||||||
|
becomes sdb2, it will still boot. For embedded systems where you just want to
|
||||||
|
boot the first disk, you have that option.
|
||||||
|
|
||||||
|
The last thing you will see on the console is mention of plymouth (which
|
||||||
|
displays the Ubuntu start-up screen) and a lot of 'Starting' messages::
|
||||||
|
|
||||||
|
* Starting Mount filesystems on boot [ OK ]
|
||||||
|
|
||||||
|
After a pause you should see a login screen on your display and you are done.
|
||||||
|
|
||||||
|
If you want to put this in a script you can use something like this::
|
||||||
|
|
||||||
|
setenv bootargs root=UUID=b2aaf743-0418-4d90-94cc-3e6108d7d968 ro
|
||||||
|
setenv boot zboot 03000000 0 04000000 \${filesize}
|
||||||
|
setenv bootcmd "ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; run boot"
|
||||||
|
saveenv
|
||||||
|
|
||||||
|
The \ is to tell the shell not to evaluate ${filesize} as part of the setenv
|
||||||
|
command.
|
||||||
|
|
||||||
|
You can also bake this behaviour into your build by hard-coding the
|
||||||
|
environment variables if you add this to minnowmax.h:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
#undef CONFIG_BOOTCOMMAND
|
||||||
|
#define CONFIG_BOOTCOMMAND \
|
||||||
|
"ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; " \
|
||||||
|
"ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; " \
|
||||||
|
"run boot"
|
||||||
|
|
||||||
|
#undef CFG_EXTRA_ENV_SETTINGS
|
||||||
|
#define CFG_EXTRA_ENV_SETTINGS "boot=zboot 03000000 0 04000000 ${filesize}"
|
||||||
|
|
||||||
|
and change CONFIG_BOOTARGS value in configs/minnowmax_defconfig to::
|
||||||
|
|
||||||
|
CONFIG_BOOTARGS="root=/dev/sda2 ro"
|
||||||
|
|
||||||
|
.. _here: https://en.wikipedia.org/wiki/GUID_Partition_Table
|
||||||
|
.. _this: http://events.linuxfoundation.org/sites/events/files/slides/chromeos_and_diy_vboot_0.pdf
|
||||||
|
.. _that: http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
|
|
@ -11,9 +11,9 @@ including supported boards, build instructions, todo list, etc.
|
||||||
Status
|
Status
|
||||||
------
|
------
|
||||||
U-Boot supports running as a `coreboot`_ payload on x86. So far only Link
|
U-Boot supports running as a `coreboot`_ payload on x86. So far only Link
|
||||||
(Chromebook Pixel) and `QEMU`_ x86 targets have been tested, but it should
|
(Chromebook Pixel), Brya (Alder Lake Chromebook) and `QEMU`_ x86 targets have
|
||||||
work with minimal adjustments on other x86 boards since coreboot deals with
|
been tested, but it should work with minimal adjustments on other x86 boards
|
||||||
most of the low-level details.
|
since coreboot deals with most of the low-level details.
|
||||||
|
|
||||||
U-Boot is a main bootloader on Intel Edison board.
|
U-Boot is a main bootloader on Intel Edison board.
|
||||||
|
|
||||||
|
@ -25,18 +25,21 @@ are supported:
|
||||||
- Bayley Bay CRB
|
- Bayley Bay CRB
|
||||||
- Cherry Hill CRB
|
- Cherry Hill CRB
|
||||||
- Congatec QEVAL 2.0 & conga-QA3/E3845
|
- Congatec QEVAL 2.0 & conga-QA3/E3845
|
||||||
|
- Coral (Apollo Lake - Chromebook 2017)
|
||||||
- Cougar Canyon 2 CRB
|
- Cougar Canyon 2 CRB
|
||||||
- Crown Bay CRB
|
- Crown Bay CRB
|
||||||
- Galileo
|
- Galileo
|
||||||
- Link (Chromebook Pixel)
|
- Link (Ivy Bridge - Chromebook Pixel)
|
||||||
- Minnowboard MAX
|
- Minnowboard MAX
|
||||||
- Samus (Chromebook Pixel 2015)
|
- Samus (Broadwell - Chromebook Pixel 2015)
|
||||||
|
- Coral (Apollo Lake Chromebooks circa 2017)
|
||||||
- QEMU x86 (32-bit & 64-bit)
|
- QEMU x86 (32-bit & 64-bit)
|
||||||
|
|
||||||
As for loading an OS, U-Boot supports directly booting a 32-bit or 64-bit
|
As for loading an OS, U-Boot supports directly booting a 32-bit or 64-bit
|
||||||
Linux kernel as part of a FIT image. It also supports a compressed zImage.
|
Linux kernel as part of a FIT image. It also supports a compressed zImage.
|
||||||
U-Boot supports loading an x86 VxWorks kernel. Please check README.vxworks
|
U-Boot supports loading an x86 VxWorks kernel. Please check README.vxworks
|
||||||
for more details.
|
for more details. Finally, U-Boot can boot Linux distributions with a UEFI
|
||||||
|
interface.
|
||||||
|
|
||||||
Build Instructions for U-Boot as BIOS replacement (bare mode)
|
Build Instructions for U-Boot as BIOS replacement (bare mode)
|
||||||
-------------------------------------------------------------
|
-------------------------------------------------------------
|
||||||
|
@ -95,272 +98,9 @@ mtrr
|
||||||
|
|
||||||
Booting Ubuntu
|
Booting Ubuntu
|
||||||
--------------
|
--------------
|
||||||
As an example of how to set up your boot flow with U-Boot, here are
|
Typically U-Boot boots distributions automatically so long an `CONFIG_BOOTSTD`,
|
||||||
instructions for starting Ubuntu from U-Boot. These instructions have been
|
`CONFIG_BOOTSTD_DEFAULTS` and `CONFIG_EFI_LOADER` are enabled. See
|
||||||
tested on Minnowboard MAX with a SATA drive but are equally applicable on
|
:doc:`manual_boot` for how to do this manually.
|
||||||
other platforms and other media. There are really only four steps and it's a
|
|
||||||
very simple script, but a more detailed explanation is provided here for
|
|
||||||
completeness.
|
|
||||||
|
|
||||||
Note: It is possible to set up U-Boot to boot automatically using syslinux.
|
|
||||||
It could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
|
|
||||||
GUID. If you figure these out, please post patches to this README.
|
|
||||||
|
|
||||||
Firstly, you will need Ubuntu installed on an available disk. It should be
|
|
||||||
possible to make U-Boot start a USB start-up disk but for now let's assume
|
|
||||||
that you used another boot loader to install Ubuntu.
|
|
||||||
|
|
||||||
Use the U-Boot command line to find the UUID of the partition you want to
|
|
||||||
boot. For example our disk is SCSI device 0::
|
|
||||||
|
|
||||||
=> part list scsi 0
|
|
||||||
|
|
||||||
Partition Map for SCSI device 0 -- Partition Type: EFI
|
|
||||||
|
|
||||||
Part Start LBA End LBA Name
|
|
||||||
Attributes
|
|
||||||
Type GUID
|
|
||||||
Partition GUID
|
|
||||||
1 0x00000800 0x001007ff ""
|
|
||||||
attrs: 0x0000000000000000
|
|
||||||
type: c12a7328-f81f-11d2-ba4b-00a0c93ec93b
|
|
||||||
guid: 9d02e8e4-4d59-408f-a9b0-fd497bc9291c
|
|
||||||
2 0x00100800 0x037d8fff ""
|
|
||||||
attrs: 0x0000000000000000
|
|
||||||
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
|
|
||||||
guid: 965c59ee-1822-4326-90d2-b02446050059
|
|
||||||
3 0x037d9000 0x03ba27ff ""
|
|
||||||
attrs: 0x0000000000000000
|
|
||||||
type: 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
|
|
||||||
guid: 2c4282bd-1e82-4bcf-a5ff-51dedbf39f17
|
|
||||||
=>
|
|
||||||
|
|
||||||
This shows that your SCSI disk has three partitions. The really long hex
|
|
||||||
strings are called Globally Unique Identifiers (GUIDs). You can look up the
|
|
||||||
'type' ones `here`_. On this disk the first partition is for EFI and is in
|
|
||||||
VFAT format (DOS/Windows)::
|
|
||||||
|
|
||||||
=> fatls scsi 0:1
|
|
||||||
efi/
|
|
||||||
|
|
||||||
0 file(s), 1 dir(s)
|
|
||||||
|
|
||||||
|
|
||||||
Partition 2 is 'Linux filesystem data' so that will be our root disk. It is
|
|
||||||
in ext2 format::
|
|
||||||
|
|
||||||
=> ext2ls scsi 0:2
|
|
||||||
<DIR> 4096 .
|
|
||||||
<DIR> 4096 ..
|
|
||||||
<DIR> 16384 lost+found
|
|
||||||
<DIR> 4096 boot
|
|
||||||
<DIR> 12288 etc
|
|
||||||
<DIR> 4096 media
|
|
||||||
<DIR> 4096 bin
|
|
||||||
<DIR> 4096 dev
|
|
||||||
<DIR> 4096 home
|
|
||||||
<DIR> 4096 lib
|
|
||||||
<DIR> 4096 lib64
|
|
||||||
<DIR> 4096 mnt
|
|
||||||
<DIR> 4096 opt
|
|
||||||
<DIR> 4096 proc
|
|
||||||
<DIR> 4096 root
|
|
||||||
<DIR> 4096 run
|
|
||||||
<DIR> 12288 sbin
|
|
||||||
<DIR> 4096 srv
|
|
||||||
<DIR> 4096 sys
|
|
||||||
<DIR> 4096 tmp
|
|
||||||
<DIR> 4096 usr
|
|
||||||
<DIR> 4096 var
|
|
||||||
<SYM> 33 initrd.img
|
|
||||||
<SYM> 30 vmlinuz
|
|
||||||
<DIR> 4096 cdrom
|
|
||||||
<SYM> 33 initrd.img.old
|
|
||||||
=>
|
|
||||||
|
|
||||||
and if you look in the /boot directory you will see the kernel::
|
|
||||||
|
|
||||||
=> ext2ls scsi 0:2 /boot
|
|
||||||
<DIR> 4096 .
|
|
||||||
<DIR> 4096 ..
|
|
||||||
<DIR> 4096 efi
|
|
||||||
<DIR> 4096 grub
|
|
||||||
3381262 System.map-3.13.0-32-generic
|
|
||||||
1162712 abi-3.13.0-32-generic
|
|
||||||
165611 config-3.13.0-32-generic
|
|
||||||
176500 memtest86+.bin
|
|
||||||
178176 memtest86+.elf
|
|
||||||
178680 memtest86+_multiboot.bin
|
|
||||||
5798112 vmlinuz-3.13.0-32-generic
|
|
||||||
165762 config-3.13.0-58-generic
|
|
||||||
1165129 abi-3.13.0-58-generic
|
|
||||||
5823136 vmlinuz-3.13.0-58-generic
|
|
||||||
19215259 initrd.img-3.13.0-58-generic
|
|
||||||
3391763 System.map-3.13.0-58-generic
|
|
||||||
5825048 vmlinuz-3.13.0-58-generic.efi.signed
|
|
||||||
28304443 initrd.img-3.13.0-32-generic
|
|
||||||
=>
|
|
||||||
|
|
||||||
The 'vmlinuz' files contain a packaged Linux kernel. The format is a kind of
|
|
||||||
self-extracting compressed file mixed with some 'setup' configuration data.
|
|
||||||
Despite its size (uncompressed it is >10MB) this only includes a basic set of
|
|
||||||
device drivers, enough to boot on most hardware types.
|
|
||||||
|
|
||||||
The 'initrd' files contain a RAM disk. This is something that can be loaded
|
|
||||||
into RAM and will appear to Linux like a disk. Ubuntu uses this to hold lots
|
|
||||||
of drivers for whatever hardware you might have. It is loaded before the
|
|
||||||
real root disk is accessed.
|
|
||||||
|
|
||||||
The numbers after the end of each file are the version. Here it is Linux
|
|
||||||
version 3.13. You can find the source code for this in the Linux tree with
|
|
||||||
the tag v3.13. The '.0' allows for additional Linux releases to fix problems,
|
|
||||||
but normally this is not needed. The '-58' is used by Ubuntu. Each time they
|
|
||||||
release a new kernel they increment this number. New Ubuntu versions might
|
|
||||||
include kernel patches to fix reported bugs. Stable kernels can exist for
|
|
||||||
some years so this number can get quite high.
|
|
||||||
|
|
||||||
The '.efi.signed' kernel is signed for EFI's secure boot. U-Boot has its own
|
|
||||||
secure boot mechanism - see `this`_ & `that`_. It cannot read .efi files
|
|
||||||
at present.
|
|
||||||
|
|
||||||
To boot Ubuntu from U-Boot the steps are as follows:
|
|
||||||
|
|
||||||
1. Set up the boot arguments. Use the GUID for the partition you want to boot::
|
|
||||||
|
|
||||||
=> setenv bootargs root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
|
|
||||||
|
|
||||||
Here root= tells Linux the location of its root disk. The disk is specified
|
|
||||||
by its GUID, using '/dev/disk/by-partuuid/', a Linux path to a 'directory'
|
|
||||||
containing all the GUIDs Linux has found. When it starts up, there will be a
|
|
||||||
file in that directory with this name in it. It is also possible to use a
|
|
||||||
device name here, see later.
|
|
||||||
|
|
||||||
2. Load the kernel. Since it is an ext2/4 filesystem we can do::
|
|
||||||
|
|
||||||
=> ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic
|
|
||||||
|
|
||||||
The address 30000000 is arbitrary, but there seem to be problems with using
|
|
||||||
small addresses (sometimes Linux cannot find the ramdisk). This is 48MB into
|
|
||||||
the start of RAM (which is at 0 on x86).
|
|
||||||
|
|
||||||
3. Load the ramdisk (to 64MB)::
|
|
||||||
|
|
||||||
=> ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic
|
|
||||||
|
|
||||||
4. Start up the kernel. We need to know the size of the ramdisk, but can use
|
|
||||||
a variable for that. U-Boot sets 'filesize' to the size of the last file it
|
|
||||||
loaded::
|
|
||||||
|
|
||||||
=> zboot 03000000 0 04000000 ${filesize}
|
|
||||||
|
|
||||||
Type 'help zboot' if you want to see what the arguments are. U-Boot on x86 is
|
|
||||||
quite verbose when it boots a kernel. You should see these messages from
|
|
||||||
U-Boot::
|
|
||||||
|
|
||||||
Valid Boot Flag
|
|
||||||
Setup Size = 0x00004400
|
|
||||||
Magic signature found
|
|
||||||
Using boot protocol version 2.0c
|
|
||||||
Linux kernel version 3.13.0-58-generic (buildd@allspice) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015
|
|
||||||
Building boot_params at 0x00090000
|
|
||||||
Loading bzImage at address 100000 (5805728 bytes)
|
|
||||||
Magic signature found
|
|
||||||
Initial RAM disk at linear address 0x04000000, size 19215259 bytes
|
|
||||||
Kernel command line: "root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
|
|
||||||
|
|
||||||
Starting kernel ...
|
|
||||||
|
|
||||||
U-Boot prints out some bootstage timing. This is more useful if you put the
|
|
||||||
above commands into a script since then it will be faster::
|
|
||||||
|
|
||||||
Timer summary in microseconds:
|
|
||||||
Mark Elapsed Stage
|
|
||||||
0 0 reset
|
|
||||||
241,535 241,535 board_init_r
|
|
||||||
2,421,611 2,180,076 id=64
|
|
||||||
2,421,790 179 id=65
|
|
||||||
2,428,215 6,425 main_loop
|
|
||||||
48,860,584 46,432,369 start_kernel
|
|
||||||
|
|
||||||
Accumulated time:
|
|
||||||
240,329 ahci
|
|
||||||
1,422,704 vesa display
|
|
||||||
|
|
||||||
Now the kernel actually starts (if you want to examine kernel boot up message on
|
|
||||||
the serial console, append "console=ttyS0,115200" to the kernel command line)::
|
|
||||||
|
|
||||||
[ 0.000000] Initializing cgroup subsys cpuset
|
|
||||||
[ 0.000000] Initializing cgroup subsys cpu
|
|
||||||
[ 0.000000] Initializing cgroup subsys cpuacct
|
|
||||||
[ 0.000000] Linux version 3.13.0-58-generic (buildd@allspice) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015 (Ubuntu 3.13.0-58.97-generic 3.13.11-ckt22)
|
|
||||||
[ 0.000000] Command line: root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro console=ttyS0,115200
|
|
||||||
|
|
||||||
It continues for a long time. Along the way you will see it pick up your
|
|
||||||
ramdisk::
|
|
||||||
|
|
||||||
[ 0.000000] RAMDISK: [mem 0x04000000-0x05253fff]
|
|
||||||
...
|
|
||||||
[ 0.788540] Trying to unpack rootfs image as initramfs...
|
|
||||||
[ 1.540111] Freeing initrd memory: 18768K (ffff880004000000 - ffff880005254000)
|
|
||||||
...
|
|
||||||
|
|
||||||
Later it actually starts using it::
|
|
||||||
|
|
||||||
Begin: Running /scripts/local-premount ... done.
|
|
||||||
|
|
||||||
You should also see your boot disk turn up::
|
|
||||||
|
|
||||||
[ 4.357243] scsi 1:0:0:0: Direct-Access ATA ADATA SP310 5.2 PQ: 0 ANSI: 5
|
|
||||||
[ 4.366860] sd 1:0:0:0: [sda] 62533296 512-byte logical blocks: (32.0 GB/29.8 GiB)
|
|
||||||
[ 4.375677] sd 1:0:0:0: Attached scsi generic sg0 type 0
|
|
||||||
[ 4.381859] sd 1:0:0:0: [sda] Write Protect is off
|
|
||||||
[ 4.387452] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
|
|
||||||
[ 4.399535] sda: sda1 sda2 sda3
|
|
||||||
|
|
||||||
Linux has found the three partitions (sda1-3). Mercifully it doesn't print out
|
|
||||||
the GUIDs. In step 1 above we could have used::
|
|
||||||
|
|
||||||
setenv bootargs root=/dev/sda2 ro
|
|
||||||
|
|
||||||
instead of the GUID. However if you add another drive to your board the
|
|
||||||
numbering may change whereas the GUIDs will not. So if your boot partition
|
|
||||||
becomes sdb2, it will still boot. For embedded systems where you just want to
|
|
||||||
boot the first disk, you have that option.
|
|
||||||
|
|
||||||
The last thing you will see on the console is mention of plymouth (which
|
|
||||||
displays the Ubuntu start-up screen) and a lot of 'Starting' messages::
|
|
||||||
|
|
||||||
* Starting Mount filesystems on boot [ OK ]
|
|
||||||
|
|
||||||
After a pause you should see a login screen on your display and you are done.
|
|
||||||
|
|
||||||
If you want to put this in a script you can use something like this::
|
|
||||||
|
|
||||||
setenv bootargs root=UUID=b2aaf743-0418-4d90-94cc-3e6108d7d968 ro
|
|
||||||
setenv boot zboot 03000000 0 04000000 \${filesize}
|
|
||||||
setenv bootcmd "ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; run boot"
|
|
||||||
saveenv
|
|
||||||
|
|
||||||
The \ is to tell the shell not to evaluate ${filesize} as part of the setenv
|
|
||||||
command.
|
|
||||||
|
|
||||||
You can also bake this behaviour into your build by hard-coding the
|
|
||||||
environment variables if you add this to minnowmax.h:
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#undef CONFIG_BOOTCOMMAND
|
|
||||||
#define CONFIG_BOOTCOMMAND \
|
|
||||||
"ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; " \
|
|
||||||
"ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; " \
|
|
||||||
"run boot"
|
|
||||||
|
|
||||||
#undef CFG_EXTRA_ENV_SETTINGS
|
|
||||||
#define CFG_EXTRA_ENV_SETTINGS "boot=zboot 03000000 0 04000000 ${filesize}"
|
|
||||||
|
|
||||||
and change CONFIG_BOOTARGS value in configs/minnowmax_defconfig to::
|
|
||||||
|
|
||||||
CONFIG_BOOTARGS="root=/dev/sda2 ro"
|
|
||||||
|
|
||||||
Test with SeaBIOS
|
Test with SeaBIOS
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -695,14 +435,15 @@ to load a 'u-boot-payload.efi', see below test logs on QEMU.
|
||||||
No controllers found
|
No controllers found
|
||||||
Hit any key to stop autoboot: 0
|
Hit any key to stop autoboot: 0
|
||||||
|
|
||||||
See :doc:`../develop/uefi/u-boot_on_efi` and :doc:`../develop/uefi/uefi` for
|
See :doc:`../../develop/uefi/u-boot_on_efi` and :doc:`../../develop/uefi/uefi`
|
||||||
details of EFI support in U-Boot.
|
for details of EFI support in U-Boot.
|
||||||
|
|
||||||
Chain-loading
|
Chain-loading
|
||||||
-------------
|
-------------
|
||||||
U-Boot can be chain-loaded from another bootloader, such as coreboot or
|
U-Boot can be chain-loaded from another bootloader, such as
|
||||||
Slim Bootloader. Typically this is done by building for targets 'coreboot' or
|
:doc:`../../board/coreboot/index` coreboot or
|
||||||
'slimbootloader'.
|
:doc:`../../board/intel/slimbootloader`. Typically this is done by building for
|
||||||
|
targets 'coreboot' or 'slimbootloader'.
|
||||||
|
|
||||||
For example, at present we have a 'coreboot' target but this runs very
|
For example, at present we have a 'coreboot' target but this runs very
|
||||||
different code from the bare-metal targets, such as coral. There is very little
|
different code from the bare-metal targets, such as coral. There is very little
|
||||||
|
@ -732,7 +473,7 @@ SMBIOS tables
|
||||||
To generate SMBIOS tables in U-Boot, for use by the OS, enable the
|
To generate SMBIOS tables in U-Boot, for use by the OS, enable the
|
||||||
CONFIG_GENERATE_SMBIOS_TABLE option. The easiest way to provide the values to
|
CONFIG_GENERATE_SMBIOS_TABLE option. The easiest way to provide the values to
|
||||||
use is via the device tree. For details see
|
use is via the device tree. For details see
|
||||||
:download:`smbios.txt <../device-tree-bindings/sysinfo/smbios.txt>`.
|
:download:`smbios.txt <../../device-tree-bindings/sysinfo/smbios.txt>`.
|
||||||
|
|
||||||
TODO List
|
TODO List
|
||||||
---------
|
---------
|
||||||
|
@ -744,8 +485,5 @@ TODO List
|
||||||
.. _microcode: http://en.wikipedia.org/wiki/Microcode
|
.. _microcode: http://en.wikipedia.org/wiki/Microcode
|
||||||
.. _SFI: http://simplefirmware.org
|
.. _SFI: http://simplefirmware.org
|
||||||
.. _MP: http://www.intel.com/design/archives/processors/pro/docs/242016.htm
|
.. _MP: http://www.intel.com/design/archives/processors/pro/docs/242016.htm
|
||||||
.. _here: https://en.wikipedia.org/wiki/GUID_Partition_Table
|
|
||||||
.. _this: http://events.linuxfoundation.org/sites/events/files/slides/chromeos_and_diy_vboot_0.pdf
|
|
||||||
.. _that: http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
|
|
||||||
.. _SeaBIOS: http://www.seabios.org/SeaBIOS
|
.. _SeaBIOS: http://www.seabios.org/SeaBIOS
|
||||||
.. _ACPI: http://www.acpi.info
|
.. _ACPI: http://www.acpi.info
|
|
@ -41,15 +41,56 @@ At present it seems that for Minnowboard Max, coreboot does not pass through
|
||||||
the video information correctly (it always says the resolution is 0x0). This
|
the video information correctly (it always says the resolution is 0x0). This
|
||||||
works correctly for link though.
|
works correctly for link though.
|
||||||
|
|
||||||
|
You can run via QEMU using::
|
||||||
|
|
||||||
|
qemu-system-x86_64 -bios build/coreboot.rom -serial mon:stdio
|
||||||
|
|
||||||
|
The `-serial mon:stdio` part shows both output in the display and on the
|
||||||
|
console. It is optional. You can add `nographic` as well to *only* get console
|
||||||
|
output.
|
||||||
|
|
||||||
|
To run with a SATA drive called `$DISK`::
|
||||||
|
|
||||||
|
qemu-system-x86_64 -bios build/coreboot.rom -serial mon:stdio \
|
||||||
|
-drive id=disk,file=$DISK,if=none \
|
||||||
|
-device ahci,id=ahci \
|
||||||
|
-device ide-hd,drive=disk,bus=ahci.0
|
||||||
|
|
||||||
|
Then you can scan it with `scsi scan` and access it normally.
|
||||||
|
|
||||||
|
To use 4GB of memory, typically necessary for booting Linux distros, add
|
||||||
|
`-m 4GB`.
|
||||||
|
|
||||||
64-bit U-Boot
|
64-bit U-Boot
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
In addition to the 32-bit 'coreboot' build there is a 'coreboot64' build. This
|
In addition to the 32-bit 'coreboot' build there is a 'coreboot64' build. This
|
||||||
produces an image which can be booted from coreboot (32-bit). Internally it
|
produces an image which can be booted from coreboot (32-bit). Internally it
|
||||||
works by using a 32-bit SPL binary to switch to 64-bit for running U-Boot. It
|
works by using a 32-bit SPL binary to switch to 64-bit for running U-Boot. It
|
||||||
can be useful for running UEFI applications, for example.
|
can be useful for running UEFI applications, for example with the coreboot
|
||||||
|
build in `$CBDIR`::
|
||||||
|
|
||||||
This has only been lightly tested.
|
DISK=ubuntu-23.04-desktop-amd64.iso
|
||||||
|
CBDIR=~/coreboot/build
|
||||||
|
|
||||||
|
cp $CBDIR/coreboot.rom.in coreboot.rom
|
||||||
|
cbfstool coreboot.rom add-flat-binary -f u-boot-x86-with-spl.bin \
|
||||||
|
-n fallback/payload -c lzma -l 0x1110000 -e 0x1110000
|
||||||
|
|
||||||
|
qemu-system-x86_64 -m 2G -smp 4 -bios coreboot.rom \
|
||||||
|
-drive id=disk,file=$DISK,if=none \
|
||||||
|
-device ahci,id=ahci \
|
||||||
|
-device ide-hd,drive=disk,bus=ahci.0 \
|
||||||
|
|
||||||
|
This allows booting and installing various distros, many of which are
|
||||||
|
64-bit-only, so cannot work with the 32-bit 'coreboot' build.
|
||||||
|
|
||||||
|
USB keyboard
|
||||||
|
------------
|
||||||
|
|
||||||
|
The `CONFIG_USE_PREBOOT` option is enabled by default, meaning that USB starts
|
||||||
|
up just before the command-line starts. This allows user interaction on
|
||||||
|
non-laptop devices which use a USB keyboard.
|
||||||
|
|
||||||
CBFS access
|
CBFS access
|
||||||
-----------
|
-----------
|
||||||
|
|
|
@ -193,6 +193,9 @@ Linux is selected from grub, e.g. with `debian-12.1.0-i386-netinst.iso`::
|
||||||
The bochs video driver also seems to cause problems before the OS is able to
|
The bochs video driver also seems to cause problems before the OS is able to
|
||||||
show a display.
|
show a display.
|
||||||
|
|
||||||
|
The QEMU `-cdrom` option is intended to work with the original ISO-format
|
||||||
|
images, not the recently invented ISOHybrid image.
|
||||||
|
|
||||||
Finally, the use of `-M accel=kvm` is intended to use the native CPU's
|
Finally, the use of `-M accel=kvm` is intended to use the native CPU's
|
||||||
virtual-machine features to accelerate operation, but this causes U-Boot to hang
|
virtual-machine features to accelerate operation, but this causes U-Boot to hang
|
||||||
when jumping 64-bit mode, at least on AMD machines. This may be a bug in U-Boot
|
when jumping 64-bit mode, at least on AMD machines. This may be a bug in U-Boot
|
||||||
|
|
9
doc/build/tools.rst
vendored
9
doc/build/tools.rst
vendored
|
@ -45,3 +45,12 @@ Launch the MSYS2 shell of the MSYS2 environment, and do the following::
|
||||||
|
|
||||||
$ make tools-only_defconfig
|
$ make tools-only_defconfig
|
||||||
$ make tools-only
|
$ make tools-only
|
||||||
|
|
||||||
|
|
||||||
|
Building without Python
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
The tools-only builds bytes pylibfdt by default. To disable this, use the
|
||||||
|
NO_PYTHON variable::
|
||||||
|
|
||||||
|
NO_PYTHON=1 make tools-only_defconfig tools-only
|
||||||
|
|
|
@ -122,6 +122,14 @@ config VEXPRESS_CONFIG
|
||||||
configuration bus on the Arm Versatile Express boards via
|
configuration bus on the Arm Versatile Express boards via
|
||||||
a sysreg driver.
|
a sysreg driver.
|
||||||
|
|
||||||
|
config CBMEM_CONSOLE
|
||||||
|
bool "Write console output to coreboot cbmem"
|
||||||
|
depends on X86
|
||||||
|
help
|
||||||
|
Enables console output to the cbmem console, which is a memory
|
||||||
|
region set up by coreboot to hold a record of all console output.
|
||||||
|
Enable this only if booting from coreboot.
|
||||||
|
|
||||||
config CMD_CROS_EC
|
config CMD_CROS_EC
|
||||||
bool "Enable crosec command"
|
bool "Enable crosec command"
|
||||||
depends on CROS_EC
|
depends on CROS_EC
|
||||||
|
|
|
@ -5,27 +5,37 @@
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <console.h>
|
#include <console.h>
|
||||||
#ifndef CONFIG_SYS_COREBOOT
|
|
||||||
#error This driver requires coreboot
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <asm/cb_sysinfo.h>
|
#include <asm/cb_sysinfo.h>
|
||||||
|
|
||||||
struct cbmem_console {
|
|
||||||
u32 buffer_size;
|
|
||||||
u32 buffer_cursor;
|
|
||||||
u8 buffer_body[0];
|
|
||||||
} __attribute__ ((__packed__));
|
|
||||||
|
|
||||||
static struct cbmem_console *cbmem_console_p;
|
|
||||||
|
|
||||||
void cbmemc_putc(struct stdio_dev *dev, char data)
|
void cbmemc_putc(struct stdio_dev *dev, char data)
|
||||||
{
|
{
|
||||||
int cursor;
|
const struct sysinfo_t *sysinfo = cb_get_sysinfo();
|
||||||
|
struct cbmem_console *cons;
|
||||||
|
uint pos, flags;
|
||||||
|
|
||||||
cursor = cbmem_console_p->buffer_cursor++;
|
if (!sysinfo)
|
||||||
if (cursor < cbmem_console_p->buffer_size)
|
return;
|
||||||
cbmem_console_p->buffer_body[cursor] = data;
|
cons = sysinfo->cbmem_cons;
|
||||||
|
if (!cons)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pos = cons->cursor & CBMC_CURSOR_MASK;
|
||||||
|
|
||||||
|
/* preserve the overflow flag if present */
|
||||||
|
flags = cons->cursor & ~CBMC_CURSOR_MASK;
|
||||||
|
|
||||||
|
cons->body[pos++] = data;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Deal with overflow - the flag may be cleared by another program which
|
||||||
|
* reads the buffer out later, e.g. Linux
|
||||||
|
*/
|
||||||
|
if (pos >= cons->size) {
|
||||||
|
pos = 0;
|
||||||
|
flags |= CBMC_OVERFLOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
cons->cursor = flags | pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cbmemc_puts(struct stdio_dev *dev, const char *str)
|
void cbmemc_puts(struct stdio_dev *dev, const char *str)
|
||||||
|
@ -40,7 +50,6 @@ int cbmemc_init(void)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct stdio_dev cons_dev;
|
struct stdio_dev cons_dev;
|
||||||
cbmem_console_p = lib_sysinfo.cbmem_cons;
|
|
||||||
|
|
||||||
memset(&cons_dev, 0, sizeof(cons_dev));
|
memset(&cons_dev, 0, sizeof(cons_dev));
|
||||||
|
|
||||||
|
|
|
@ -672,7 +672,7 @@ config COREBOOT_SERIAL
|
||||||
config COREBOOT_SERIAL_FROM_DBG2
|
config COREBOOT_SERIAL_FROM_DBG2
|
||||||
bool "Obtain UART from ACPI tables"
|
bool "Obtain UART from ACPI tables"
|
||||||
depends on COREBOOT_SERIAL
|
depends on COREBOOT_SERIAL
|
||||||
default y if !SPL
|
default y
|
||||||
help
|
help
|
||||||
Select this to try to find a DBG2 record in the ACPI tables, in the
|
Select this to try to find a DBG2 record in the ACPI tables, in the
|
||||||
event that coreboot does not provide information about the UART in the
|
event that coreboot does not provide information about the UART in the
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#define LOG_CATEGORY UCLASS_USB
|
#define LOG_CATEGORY UCLASS_USB
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <bootdev.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
|
@ -208,6 +209,13 @@ int usb_stop(void)
|
||||||
#ifdef CONFIG_USB_STORAGE
|
#ifdef CONFIG_USB_STORAGE
|
||||||
usb_stor_reset();
|
usb_stor_reset();
|
||||||
#endif
|
#endif
|
||||||
|
if (CONFIG_IS_ENABLED(BOOTSTD)) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = bootdev_unhunt(UCLASS_USB);
|
||||||
|
if (IS_ENABLED(CONFIG_BOOTSTD_FULL) && ret && ret != -EALREADY)
|
||||||
|
printf("failed to unhunt USB (err=%dE)\n", ret);
|
||||||
|
}
|
||||||
uc_priv->companion_device_count = 0;
|
uc_priv->companion_device_count = 0;
|
||||||
usb_started = 0;
|
usb_started = 0;
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,17 @@ err:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int coreboot_video_bind(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev);
|
||||||
|
|
||||||
|
/* Set the maximum supported resolution */
|
||||||
|
uc_plat->size = 4096 * 2160 * 4;
|
||||||
|
log_debug("%s: Frame buffer size %x\n", __func__, uc_plat->size);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct udevice_id coreboot_video_ids[] = {
|
static const struct udevice_id coreboot_video_ids[] = {
|
||||||
{ .compatible = "coreboot-fb" },
|
{ .compatible = "coreboot-fb" },
|
||||||
{ }
|
{ }
|
||||||
|
@ -82,5 +93,6 @@ U_BOOT_DRIVER(coreboot_video) = {
|
||||||
.name = "coreboot_video",
|
.name = "coreboot_video",
|
||||||
.id = UCLASS_VIDEO,
|
.id = UCLASS_VIDEO,
|
||||||
.of_match = coreboot_video_ids,
|
.of_match = coreboot_video_ids,
|
||||||
|
.bind = coreboot_video_bind,
|
||||||
.probe = coreboot_video_probe,
|
.probe = coreboot_video_probe,
|
||||||
};
|
};
|
||||||
|
|
|
@ -883,6 +883,13 @@ void acpi_inc_align(struct acpi_ctx *ctx, uint amount);
|
||||||
*/
|
*/
|
||||||
int acpi_add_table(struct acpi_ctx *ctx, void *table);
|
int acpi_add_table(struct acpi_ctx *ctx, void *table);
|
||||||
|
|
||||||
|
static inline int acpi_add_fadt(struct acpi_ctx *ctx, struct acpi_fadt *fadt)
|
||||||
|
{
|
||||||
|
acpi_add_table(ctx, fadt);
|
||||||
|
acpi_inc(ctx, sizeof(struct acpi_fadt));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_write_rsdp() - Write out an RSDP indicating where the ACPI tables are
|
* acpi_write_rsdp() - Write out an RSDP indicating where the ACPI tables are
|
||||||
*
|
*
|
||||||
|
|
|
@ -552,6 +552,14 @@ static_assert(sizeof(struct global_data) == GD_SIZE);
|
||||||
#define gd_set_acpi_start(addr)
|
#define gd_set_acpi_start(addr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMBIOS
|
||||||
|
#define gd_smbios_start() gd->smbios_start
|
||||||
|
#define gd_set_smbios_start(addr) gd->arch.smbios_start = addr
|
||||||
|
#else
|
||||||
|
#define gd_smbios_start() 0UL
|
||||||
|
#define gd_set_smbios_start(addr)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
|
#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
|
||||||
#define gd_multi_dtb_fit() gd->multi_dtb_fit
|
#define gd_multi_dtb_fit() gd->multi_dtb_fit
|
||||||
#define gd_set_multi_dtb_fit(_dtb) gd->multi_dtb_fit = _dtb
|
#define gd_set_multi_dtb_fit(_dtb) gd->multi_dtb_fit = _dtb
|
||||||
|
@ -573,6 +581,13 @@ static_assert(sizeof(struct global_data) == GD_SIZE);
|
||||||
#define gd_malloc_start() 0
|
#define gd_malloc_start() 0
|
||||||
#define gd_set_malloc_start(val)
|
#define gd_set_malloc_start(val)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(PCI)
|
||||||
|
#define gd_set_pci_ram_top(val) gd->pci_ram_top = val
|
||||||
|
#else
|
||||||
|
#define gd_set_pci_ram_top(val)
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum gd_flags - global data flags
|
* enum gd_flags - global data flags
|
||||||
*
|
*
|
||||||
|
@ -667,6 +682,11 @@ enum gd_flags {
|
||||||
* @GD_FLG_OF_TAG_MIGRATE: Device tree has old u-boot,dm- tags
|
* @GD_FLG_OF_TAG_MIGRATE: Device tree has old u-boot,dm- tags
|
||||||
*/
|
*/
|
||||||
GD_FLG_OF_TAG_MIGRATE = 0x200000,
|
GD_FLG_OF_TAG_MIGRATE = 0x200000,
|
||||||
|
/**
|
||||||
|
* @GD_FLG_DM_DEAD: Driver model is not accessible. This can be set when
|
||||||
|
* the memory used to holds its tables has been mapped out.
|
||||||
|
*/
|
||||||
|
GD_FLG_DM_DEAD = 0x400000,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
|
@ -320,6 +320,15 @@ int bootdev_hunt(const char *spec, bool show);
|
||||||
*/
|
*/
|
||||||
int bootdev_hunt_prio(enum bootdev_prio_t prio, bool show);
|
int bootdev_hunt_prio(enum bootdev_prio_t prio, bool show);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bootdev_unhunt() - Mark a device as needing to be hunted again
|
||||||
|
*
|
||||||
|
* @id: uclass ID to update
|
||||||
|
* Return: 0 if done, -EALREADY if already in this state, -ENOENT if no hunter
|
||||||
|
* found for that uclass
|
||||||
|
*/
|
||||||
|
int bootdev_unhunt(enum uclass_id id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bootdev_hunt_and_find_by_label() - Hunt for bootdevs by label
|
* bootdev_hunt_and_find_by_label() - Hunt for bootdevs by label
|
||||||
*
|
*
|
||||||
|
|
24
lib/Kconfig
24
lib/Kconfig
|
@ -289,6 +289,14 @@ config ACPI
|
||||||
not necessarily include generation of tables
|
not necessarily include generation of tables
|
||||||
(see GENERATE_ACPI_TABLE), but allows for tables to be located.
|
(see GENERATE_ACPI_TABLE), but allows for tables to be located.
|
||||||
|
|
||||||
|
config SPL_ACPI
|
||||||
|
bool "Enable support for ACPI libraries in SPL"
|
||||||
|
depends on SPL && SUPPORT_ACPI
|
||||||
|
help
|
||||||
|
Provides library functions for dealing with ACPI tables in SPL. This
|
||||||
|
does not necessarily include generation of tables
|
||||||
|
(see GENERATE_ACPI_TABLE), but allows for tables to be located.
|
||||||
|
|
||||||
config GENERATE_ACPI_TABLE
|
config GENERATE_ACPI_TABLE
|
||||||
bool "Generate an ACPI (Advanced Configuration and Power Interface) table"
|
bool "Generate an ACPI (Advanced Configuration and Power Interface) table"
|
||||||
depends on ACPI
|
depends on ACPI
|
||||||
|
@ -967,8 +975,8 @@ config BLOBLIST_TABLES
|
||||||
|
|
||||||
config GENERATE_SMBIOS_TABLE
|
config GENERATE_SMBIOS_TABLE
|
||||||
bool "Generate an SMBIOS (System Management BIOS) table"
|
bool "Generate an SMBIOS (System Management BIOS) table"
|
||||||
|
depends on SMBIOS
|
||||||
default y
|
default y
|
||||||
depends on X86 || EFI_LOADER
|
|
||||||
help
|
help
|
||||||
The System Management BIOS (SMBIOS) specification addresses how
|
The System Management BIOS (SMBIOS) specification addresses how
|
||||||
motherboard and system vendors present management information about
|
motherboard and system vendors present management information about
|
||||||
|
@ -1037,6 +1045,20 @@ config SPL_OID_REGISTRY
|
||||||
unambiguous persistent name (https://en.wikipedia.org/wiki/Object_identifier).
|
unambiguous persistent name (https://en.wikipedia.org/wiki/Object_identifier).
|
||||||
Enable fast lookup object identifier registry in the SPL.
|
Enable fast lookup object identifier registry in the SPL.
|
||||||
|
|
||||||
|
config SMBIOS
|
||||||
|
bool "SMBIOS support"
|
||||||
|
depends on X86 || EFI_LOADER
|
||||||
|
default y
|
||||||
|
select LAST_STAGE_INIT
|
||||||
|
help
|
||||||
|
Indicates that this platform can support System Management BIOS
|
||||||
|
(SMBIOS) tables. These provide various pieces of information about
|
||||||
|
the board, such as the manufacturer and the model name.
|
||||||
|
|
||||||
|
See GENERATE_SMBIOS_TABLE which controls whether U-Boot actually
|
||||||
|
creates these tables, rather than them coming from a previous firmware
|
||||||
|
stage.
|
||||||
|
|
||||||
config SMBIOS_PARSER
|
config SMBIOS_PARSER
|
||||||
bool "SMBIOS parser"
|
bool "SMBIOS parser"
|
||||||
help
|
help
|
||||||
|
|
|
@ -78,8 +78,8 @@ obj-$(CONFIG_EFI_ESRT) += efi_esrt.o
|
||||||
obj-$(CONFIG_VIDEO) += efi_gop.o
|
obj-$(CONFIG_VIDEO) += efi_gop.o
|
||||||
obj-$(CONFIG_BLK) += efi_disk.o
|
obj-$(CONFIG_BLK) += efi_disk.o
|
||||||
obj-$(CONFIG_NETDEVICES) += efi_net.o
|
obj-$(CONFIG_NETDEVICES) += efi_net.o
|
||||||
obj-$(CONFIG_GENERATE_ACPI_TABLE) += efi_acpi.o
|
obj-$(CONFIG_ACPI) += efi_acpi.o
|
||||||
obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += efi_smbios.o
|
obj-$(CONFIG_SMBIOS) += efi_smbios.o
|
||||||
obj-$(CONFIG_EFI_RNG_PROTOCOL) += efi_rng.o
|
obj-$(CONFIG_EFI_RNG_PROTOCOL) += efi_rng.o
|
||||||
obj-$(CONFIG_EFI_TCG2_PROTOCOL) += efi_tcg2.o
|
obj-$(CONFIG_EFI_TCG2_PROTOCOL) += efi_tcg2.o
|
||||||
obj-$(CONFIG_EFI_RISCV_BOOT_PROTOCOL) += efi_riscv.o
|
obj-$(CONFIG_EFI_RISCV_BOOT_PROTOCOL) += efi_riscv.o
|
||||||
|
|
|
@ -321,16 +321,16 @@ efi_status_t efi_init_obj_list(void)
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto out;
|
goto out;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_GENERATE_ACPI_TABLE
|
if (IS_ENABLED(CONFIG_ACPI)) {
|
||||||
ret = efi_acpi_register();
|
ret = efi_acpi_register();
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto out;
|
goto out;
|
||||||
#endif
|
}
|
||||||
#ifdef CONFIG_GENERATE_SMBIOS_TABLE
|
if (IS_ENABLED(CONFIG_SMBIOS)) {
|
||||||
ret = efi_smbios_register();
|
ret = efi_smbios_register();
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto out;
|
goto out;
|
||||||
#endif
|
}
|
||||||
ret = efi_watchdog_register();
|
ret = efi_watchdog_register();
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -10,8 +10,14 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <efi_loader.h>
|
#include <efi_loader.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
|
#include <malloc.h>
|
||||||
#include <mapmem.h>
|
#include <mapmem.h>
|
||||||
#include <smbios.h>
|
#include <smbios.h>
|
||||||
|
#include <linux/sizes.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TABLE_SIZE = SZ_4K,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Install the SMBIOS table as a configuration table.
|
* Install the SMBIOS table as a configuration table.
|
||||||
|
@ -20,36 +26,50 @@
|
||||||
*/
|
*/
|
||||||
efi_status_t efi_smbios_register(void)
|
efi_status_t efi_smbios_register(void)
|
||||||
{
|
{
|
||||||
/* Map within the low 32 bits, to allow for 32bit SMBIOS tables */
|
ulong addr;
|
||||||
u64 dmi_addr = U32_MAX;
|
|
||||||
efi_status_t ret;
|
efi_status_t ret;
|
||||||
void *dmi;
|
|
||||||
|
|
||||||
/* Reserve 4kiB page for SMBIOS */
|
addr = gd->arch.smbios_start;
|
||||||
ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
|
if (!addr) {
|
||||||
EFI_RUNTIME_SERVICES_DATA, 1, &dmi_addr);
|
log_err("No SMBIOS tables to install\n");
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
if (ret != EFI_SUCCESS) {
|
|
||||||
/* Could not find space in lowmem, use highmem instead */
|
|
||||||
ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES,
|
|
||||||
EFI_RUNTIME_SERVICES_DATA, 1,
|
|
||||||
&dmi_addr);
|
|
||||||
|
|
||||||
if (ret != EFI_SUCCESS)
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Mark space used for tables */
|
||||||
* Generate SMBIOS tables - we know that efi_allocate_pages() returns
|
ret = efi_add_memory_map(addr, TABLE_SIZE, EFI_RUNTIME_SERVICES_DATA);
|
||||||
* a 4k-aligned address, so it is safe to assume that
|
if (ret)
|
||||||
* write_smbios_table() will write the table at that address.
|
return ret;
|
||||||
*/
|
|
||||||
assert(!(dmi_addr & 0xf));
|
log_debug("EFI using SMBIOS tables at %lx\n", addr);
|
||||||
dmi = (void *)(uintptr_t)dmi_addr;
|
|
||||||
if (write_smbios_table(map_to_sysmem(dmi)))
|
/* Install SMBIOS information as configuration table */
|
||||||
/* Install SMBIOS information as configuration table */
|
return efi_install_configuration_table(&smbios_guid,
|
||||||
return efi_install_configuration_table(&smbios_guid, dmi);
|
map_sysmem(addr, 0));
|
||||||
efi_free_pages(dmi_addr, 1);
|
|
||||||
log_err("Cannot create SMBIOS table\n");
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int install_smbios_table(void)
|
||||||
|
{
|
||||||
|
ulong addr;
|
||||||
|
void *buf;
|
||||||
|
|
||||||
|
if (!IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLE) || IS_ENABLED(CONFIG_X86))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Align the table to a 4KB boundary to keep EFI happy */
|
||||||
|
buf = memalign(SZ_4K, TABLE_SIZE);
|
||||||
|
if (!buf)
|
||||||
|
return log_msg_ret("mem", -ENOMEM);
|
||||||
|
|
||||||
|
addr = map_to_sysmem(buf);
|
||||||
|
if (!write_smbios_table(addr)) {
|
||||||
|
log_err("Failed to write SMBIOS table\n");
|
||||||
|
return log_msg_ret("smbios", -EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make a note of where we put it */
|
||||||
|
log_debug("SMBIOS tables written to %lx\n", addr);
|
||||||
|
gd->arch.smbios_start = addr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, install_smbios_table);
|
||||||
|
|
|
@ -19,4 +19,6 @@ HOSTCFLAGS_dtc-parser.tab.o := -I$(src)
|
||||||
$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
|
$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
|
||||||
|
|
||||||
# Added for U-Boot
|
# Added for U-Boot
|
||||||
|
ifeq ($(PYTHON_ENABLE),y)
|
||||||
subdir-$(CONFIG_PYLIBFDT) += pylibfdt
|
subdir-$(CONFIG_PYLIBFDT) += pylibfdt
|
||||||
|
endif
|
||||||
|
|
|
@ -18,6 +18,7 @@ def test_event_dump(u_boot_console):
|
||||||
-------------------- ------------------------------ ------------------------------
|
-------------------- ------------------------------ ------------------------------
|
||||||
EVT_FT_FIXUP bootmeth_vbe_ft_fixup .*boot/vbe_request.c:.*
|
EVT_FT_FIXUP bootmeth_vbe_ft_fixup .*boot/vbe_request.c:.*
|
||||||
EVT_FT_FIXUP bootmeth_vbe_simple_ft_fixup .*boot/vbe_simple_os.c:.*
|
EVT_FT_FIXUP bootmeth_vbe_simple_ft_fixup .*boot/vbe_simple_os.c:.*
|
||||||
|
EVT_LAST_STAGE_INIT install_smbios_table .*lib/efi_loader/efi_smbios.c:.*
|
||||||
EVT_MISC_INIT_F sandbox_early_getopt_check .*arch/sandbox/cpu/start.c:.*
|
EVT_MISC_INIT_F sandbox_early_getopt_check .*arch/sandbox/cpu/start.c:.*
|
||||||
EVT_TEST h_adder_simple .*test/common/event.c:'''
|
EVT_TEST h_adder_simple .*test/common/event.c:'''
|
||||||
assert re.match(expect, out, re.MULTILINE) is not None
|
assert re.match(expect, out, re.MULTILINE) is not None
|
||||||
|
|
Loading…
Reference in a new issue