Prepare v2023.10-rc4

-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEGjx/cOCPqxcHgJu/FHw5/5Y0tywFAmT17FsACgkQFHw5/5Y0
 tywn0gwAlRs5NZ4ierzvDiLQEvYgV6E+lLccwyf8mMfJVHicrrW/ckxqJGS2mrLz
 IoA0pO1oF/HFfR/0pgx9Pb2kuIK1tkCeVNYW6t9EDbEJzrbfdvykBcSB4wgKYpgB
 ZgCga0jsPNM951Y3a3TElNEet4pVTZrDLu0E2UR6zNzr5hpKnfoQTZRfBI1MyCq4
 w4/Eo2wAnnaV1lcobg9LzM6uyDnETxWyTI7DIJYSqkEgT0WcF6zrdW55MaXtrPo5
 RZ4q5MTJQwqnTV5awsmgEt8PSC+XQcPHMPrVCwoOZAdru+5zO3AWpbqq1q6K+y9U
 FEsaJ6HGn5BdITgmIK/lb8oTekfOkDPFF3WuFp5bZ6L0A63ANu/MMWHELyyt5+0z
 TlnU94PVxiLnPMzZtfBPWRQ3jIU5qltJaoW0pKwsoa7P8iUd1WZgYyN+G9WPgwFr
 XUemGRNkgnWfRoxcKGbaYDSB0Llp6m/zqPlGfhlt0ZKXc6igLu3/egRh7/8zLR0i
 y9uBKG45
 =s9vZ
 -----END PGP SIGNATURE-----

Merge tag 'v2023.10-rc4' into next

Prepare v2023.10-rc4
This commit is contained in:
Tom Rini 2023-09-04 10:51:58 -04:00
commit ddec4cae62
72 changed files with 1218 additions and 455 deletions

View file

@ -468,6 +468,7 @@ stages:
- stage: world_build - stage: world_build
jobs: jobs:
- job: build_the_world - job: build_the_world
timeoutInMinutes: 0 # Use the maximum allowed
displayName: 'Build the World' displayName: 'Build the World'
pool: pool:
vmImage: $(ubuntu_vm) vmImage: $(ubuntu_vm)

View file

@ -1016,7 +1016,6 @@ F: tools/mkeficapsule.c
ENVIRONMENT ENVIRONMENT
M: Joe Hershberger <joe.hershberger@ni.com> M: Joe Hershberger <joe.hershberger@ni.com>
R: Wolfgang Denk <wd@denx.de>
S: Maintained S: Maintained
F: env/ F: env/
F: include/env* F: include/env*
@ -1026,7 +1025,6 @@ F: tools/mkenvimage.c
ENVIRONMENT AS TEXT ENVIRONMENT AS TEXT
M: Simon Glass <sjg@chromium.org> M: Simon Glass <sjg@chromium.org>
R: Wolfgang Denk <wd@denx.de>
S: Maintained S: Maintained
F: doc/usage/environment.rst F: doc/usage/environment.rst
F: scripts/env2string.awk F: scripts/env2string.awk
@ -1344,8 +1342,7 @@ F: drivers/power/
F: include/power/ F: include/power/
POWERPC POWERPC
M: Wolfgang Denk <wd@denx.de> S: Orphan (Since 2022-10-21)
S: Maintained
F: arch/powerpc/ F: arch/powerpc/
POWERPC MPC8XX POWERPC MPC8XX

View file

@ -3,7 +3,7 @@
VERSION = 2023 VERSION = 2023
PATCHLEVEL = 10 PATCHLEVEL = 10
SUBLEVEL = SUBLEVEL =
EXTRAVERSION = -rc3 EXTRAVERSION = -rc4
NAME = NAME =
# *DOCUMENTATION* # *DOCUMENTATION*
@ -1328,11 +1328,6 @@ u-boot.ldr: u-boot
# Use 'make BINMAN_VERBOSE=3' to set vebosity level # Use 'make BINMAN_VERBOSE=3' to set vebosity level
default_dt := $(if $(DEVICE_TREE),$(DEVICE_TREE),$(CONFIG_DEFAULT_DEVICE_TREE)) default_dt := $(if $(DEVICE_TREE),$(DEVICE_TREE),$(CONFIG_DEFAULT_DEVICE_TREE))
# Temporary workaround for Venice boards
ifneq ($(CONFIG_TARGET_IMX8MM_VENICE),$(CONFIG_TARGET_IMX8MN_VENICE),$(CONFIG_TARGET_IMX8MP_VENICE),)
ignore_dups := --ignore-dup-phandles
endif
quiet_cmd_binman = BINMAN $@ quiet_cmd_binman = BINMAN $@
cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \ cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
$(foreach f,$(BINMAN_TOOLPATHS),--toolpath $(f)) \ $(foreach f,$(BINMAN_TOOLPATHS),--toolpath $(f)) \
@ -1354,7 +1349,6 @@ cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
-a spl-dtb=$(CONFIG_SPL_OF_REAL) \ -a spl-dtb=$(CONFIG_SPL_OF_REAL) \
-a tpl-dtb=$(CONFIG_TPL_OF_REAL) \ -a tpl-dtb=$(CONFIG_TPL_OF_REAL) \
-a pre-load-key-path=${PRE_LOAD_KEY_PATH} \ -a pre-load-key-path=${PRE_LOAD_KEY_PATH} \
$(ignore_dups) \
$(BINMAN_$(@F)) $(BINMAN_$(@F))
OBJCOPYFLAGS_u-boot.ldr.hex := -I binary -O ihex OBJCOPYFLAGS_u-boot.ldr.hex := -I binary -O ihex

View file

@ -41,9 +41,11 @@
}; };
}; };
/* This cannot work since it refers to a template node
&binman_configuration { &binman_configuration {
loadables = "atf", "fip"; loadables = "atf", "fip";
}; };
*/
&fec1 { &fec1 {
phy-reset-gpios = <&gpio4 22 GPIO_ACTIVE_LOW>; phy-reset-gpios = <&gpio4 22 GPIO_ACTIVE_LOW>;

View file

@ -140,7 +140,7 @@
configurations { configurations {
default = "@config-DEFAULT-SEQ"; default = "@config-DEFAULT-SEQ";
binman_configuration: @config-SEQ { @config-SEQ {
description = "NAME"; description = "NAME";
fdt = "fdt-SEQ"; fdt = "fdt-SEQ";
firmware = "uboot"; firmware = "uboot";

View file

@ -204,7 +204,7 @@
configurations { configurations {
default = "@config-DEFAULT-SEQ"; default = "@config-DEFAULT-SEQ";
binman_configuration: @config-SEQ { @config-SEQ {
description = "NAME"; description = "NAME";
fdt = "fdt-SEQ"; fdt = "fdt-SEQ";
firmware = "uboot"; firmware = "uboot";

View file

@ -162,6 +162,8 @@
}; };
}; };
/* This cannot work since it refers to a template node
&binman_configuration { &binman_configuration {
loadables = "atf", "fip"; loadables = "atf", "fip";
}; };
*/

View file

@ -146,7 +146,7 @@
type = "flat_dt"; type = "flat_dt";
compression = "none"; compression = "none";
uboot_fdt_blob: blob-ext { blob-ext {
filename = "u-boot.dtb"; filename = "u-boot.dtb";
}; };
}; };
@ -155,7 +155,7 @@
configurations { configurations {
default = "@config-DEFAULT-SEQ"; default = "@config-DEFAULT-SEQ";
binman_configuration: @config-SEQ { @config-SEQ {
description = "NAME"; description = "NAME";
fdt = "fdt-SEQ"; fdt = "fdt-SEQ";
firmware = "uboot"; firmware = "uboot";

View file

@ -112,7 +112,7 @@
configurations { configurations {
default = "@config-DEFAULT-SEQ"; default = "@config-DEFAULT-SEQ";
binman_configuration: @config-SEQ { @config-SEQ {
description = "NAME"; description = "NAME";
fdt = "fdt-SEQ"; fdt = "fdt-SEQ";
firmware = "uboot"; firmware = "uboot";

View file

@ -41,7 +41,7 @@
os = "arm-trusted-firmware"; os = "arm-trusted-firmware";
load = <CONFIG_K3_ATF_LOAD_ADDR>; load = <CONFIG_K3_ATF_LOAD_ADDR>;
entry = <CONFIG_K3_ATF_LOAD_ADDR>; entry = <CONFIG_K3_ATF_LOAD_ADDR>;
atf: atf-bl31 { atf-bl31 {
}; };
}; };
@ -53,7 +53,7 @@
os = "tee"; os = "tee";
load = <0x9e800000>; load = <0x9e800000>;
entry = <0x9e800000>; entry = <0x9e800000>;
tee: tee-os { tee-os {
}; };
}; };
@ -78,7 +78,7 @@
compression = "none"; compression = "none";
load = <CONFIG_SPL_TEXT_BASE>; load = <CONFIG_SPL_TEXT_BASE>;
entry = <CONFIG_SPL_TEXT_BASE>; entry = <CONFIG_SPL_TEXT_BASE>;
u_boot_spl_nodtb: blob-ext { blob-ext {
filename = "spl/u-boot-spl-nodtb.bin"; filename = "spl/u-boot-spl-nodtb.bin";
}; };
}; };
@ -88,7 +88,7 @@
type = "flat_dt"; type = "flat_dt";
arch = "arm"; arch = "arm";
compression = "none"; compression = "none";
spl_am65x_evm_dtb: blob-ext { blob-ext {
filename = "spl/dts/k3-am65-iot2050-spl.dtb"; filename = "spl/dts/k3-am65-iot2050-spl.dtb";
}; };
}; };

View file

@ -108,14 +108,6 @@
bootph-all; bootph-all;
}; };
&scmi_shm {
bootph-all;
};
&scmi_sram {
bootph-all;
};
&syscfg { &syscfg {
bootph-all; bootph-all;
}; };

View file

@ -40,7 +40,6 @@
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
linaro,optee-channel-id = <0>; linaro,optee-channel-id = <0>;
shmem = <&scmi_shm>;
scmi_clk: protocol@14 { scmi_clk: protocol@14 {
reg = <0x14>; reg = <0x14>;
@ -106,19 +105,6 @@
interrupt-parent = <&intc>; interrupt-parent = <&intc>;
ranges; ranges;
scmi_sram: sram@2ffff000 {
compatible = "mmio-sram";
reg = <0x2ffff000 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x2ffff000 0x1000>;
scmi_shm: scmi-sram@0 {
compatible = "arm,scmi-shmem";
reg = <0 0x80>;
};
};
timers2: timer@40000000 { timers2: timer@40000000 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;

View file

@ -16,7 +16,6 @@
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
linaro,optee-channel-id = <0>; linaro,optee-channel-id = <0>;
shmem = <&scmi_shm>;
scmi_clk: protocol@14 { scmi_clk: protocol@14 {
reg = <0x14>; reg = <0x14>;
@ -60,21 +59,6 @@
}; };
}; };
}; };
soc {
scmi_sram: sram@2ffff000 {
compatible = "mmio-sram";
reg = <0x2ffff000 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x2ffff000 0x1000>;
scmi_shm: scmi-sram@0 {
compatible = "arm,scmi-shmem";
reg = <0 0x80>;
};
};
};
}; };
&reg11 { &reg11 {

View file

@ -24,14 +24,6 @@ config SPL_TEXT_BASE
depends on SPL depends on SPL
default 0x00912000 default 0x00912000
config OPTEE_TZDRAM_SIZE
hex "Amount of Trust-Zone RAM for the OPTEE image"
default 0x0000000
depends on OPTEE_LIB
help
The size of pre-allocated Trust Zone DRAM to allocate for the OPTEE
runtime.
choice choice
prompt "MX7 board select" prompt "MX7 board select"
optional optional

View file

@ -66,7 +66,7 @@ static inline bool supports_extension(char ext)
#endif /* CONFIG_CPU */ #endif /* CONFIG_CPU */
} }
static int riscv_cpu_probe(void) static int riscv_cpu_probe(void *ctx, struct event *event)
{ {
#ifdef CONFIG_CPU #ifdef CONFIG_CPU
int ret; int ret;
@ -79,6 +79,7 @@ static int riscv_cpu_probe(void)
return 0; return 0;
} }
EVENT_SPY(EVT_DM_POST_INIT_R, riscv_cpu_probe);
/* /*
* This is called on secondary harts just after the IPI is init'd. Currently * This is called on secondary harts just after the IPI is init'd. Currently
@ -95,7 +96,7 @@ int riscv_cpu_setup(void)
{ {
int ret; int ret;
ret = riscv_cpu_probe(); ret = riscv_cpu_probe(ctx, event);
if (ret) if (ret)
return ret; return ret;
@ -149,12 +150,6 @@ EVENT_SPY_SIMPLE(EVT_DM_POST_INIT_F, riscv_cpu_setup);
int arch_early_init_r(void) int arch_early_init_r(void)
{ {
int ret;
ret = riscv_cpu_probe();
if (ret)
return ret;
if (IS_ENABLED(CONFIG_SYSRESET_SBI)) if (IS_ENABLED(CONFIG_SYSRESET_SBI))
device_bind_driver(gd->dm_root, "sbi-sysreset", device_bind_driver(gd->dm_root, "sbi-sysreset",
"sbi-sysreset", NULL); "sbi-sysreset", NULL);

View file

@ -0,0 +1,77 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* environment for Raspberry Pi boards */
dhcpuboot=usb start; dhcp u-boot.uimg; bootm
/* Environment */
stdin=serial,usbkbd
stdout=serial,vidconsole
stderr=serial,vidconsole
/* DFU over USB/UDC */
#ifdef CONFIG_CMD_DFU
dfu_alt_info=u-boot.bin fat 0 1;uboot.env fat 0 1;
config.txt fat 0 1;
#ifdef CONFIG_ARM64
dfu_alt_info+=Image fat 0 1
#else
dfu_alt_info+=zImage fat 0 1
#endif
#endif /* CONFIG_CMD_DFU */
/*
* Memory layout for where various images get loaded by boot scripts:
*
* I suspect address 0 is used as the SMP pen on the RPi2, so avoid this.
*
* Older versions of the boot firmware place the firmware-loaded DTB at 0x100,
* newer versions place it in high memory. So prevent U-Boot from doing its own
* DTB + initrd relocation so that we won't accidentally relocate the initrd
* over the firmware-loaded DTB and generally try to lay out things starting
* from the bottom of RAM.
*
* kernel_addr_r has different constraints on ARM and Aarch64. For 32-bit ARM,
* it must be within the first 128M of RAM in order for the kernel's
* CONFIG_AUTO_ZRELADDR option to work. The kernel itself will be decompressed
* to 0x8000 but the decompressor clobbers 0x4000-0x8000 as well. The
* decompressor also likes to relocate itself to right past the end of the
* decompressed kernel, so in total the sum of the compressed and
* decompressed kernel needs to be reserved.
*
* For Aarch64, the kernel image is uncompressed and must be loaded at
* text_offset bytes (specified in the header of the Image) into a 2MB
* boundary. The 'booti' command relocates the image if necessary. Linux uses
* a default text_offset of 0x80000. In summary, loading at 0x80000
* satisfies all these constraints and reserving memory up to 0x02400000
* permits fairly large (roughly 36M) kernels.
*
* scriptaddr and pxefile_addr_r can be pretty much anywhere that doesn't
* conflict with something else. Reserving 1M for each of them at
* 0x02400000-0x02500000 and 0x02500000-0x02600000 should be plenty.
*
* On ARM, both the DTB and any possible initrd must be loaded such that they
* fit inside the lowmem mapping in Linux. In practice, this usually means not
* more than ~700M away from the start of the kernel image but this number can
* be larger OR smaller depending on e.g. the 'vmalloc=xxxM' command line
* parameter given to the kernel. So reserving memory from low to high
* satisfies this constraint again. Reserving 1M at 0x02600000-0x02700000 for
* the DTB leaves rest of the free RAM to the initrd starting at 0x02700000.
* Even with the smallest possible CPU-GPU memory split of the CPU getting
* only 64M, the remaining 25M starting at 0x02700000 should allow quite
* large initrds before they start colliding with U-Boot.
*/
#ifdef CONFIG_ARM64
fdt_high=ffffffffffffffff
initrd_high=ffffffffffffffff
#else
fdt_high=ffffffff
initrd_high=ffffffff
#endif
kernel_addr_r=0x00080000
scriptaddr=0x02400000
pxefile_addr_r=0x02500000
fdt_addr_r=0x02600000
ramdisk_addr_r=0x02700000
boot_targets=mmc usb pxe dhcp

View file

@ -1442,7 +1442,7 @@ config AUTOBOOT_MENU_SHOW
This enables the boot menu, controlled by environment variables This enables the boot menu, controlled by environment variables
defined by the board. The menu starts after running the 'preboot' defined by the board. The menu starts after running the 'preboot'
environmnent variable (if enabled) and before handling the boot delay. environmnent variable (if enabled) and before handling the boot delay.
See README.bootmenu for more details. See doc/usage/cmd/bootmenu.rst for more details.
config BOOTMENU_DISABLE_UBOOT_CONSOLE config BOOTMENU_DISABLE_UBOOT_CONSOLE
bool "Disallow bootmenu to enter the U-Boot console" bool "Disallow bootmenu to enter the U-Boot console"

View file

@ -184,7 +184,8 @@ static const struct udevice_id extlinux_bootmeth_ids[] = {
{ } { }
}; };
U_BOOT_DRIVER(bootmeth_extlinux) = { /* Put an number before 'extlinux' to provide a default ordering */
U_BOOT_DRIVER(bootmeth_1extlinux) = {
.name = "bootmeth_extlinux", .name = "bootmeth_extlinux",
.id = UCLASS_BOOTMETH, .id = UCLASS_BOOTMETH,
.of_match = extlinux_bootmeth_ids, .of_match = extlinux_bootmeth_ids,

View file

@ -243,7 +243,8 @@ static const struct udevice_id script_bootmeth_ids[] = {
{ } { }
}; };
U_BOOT_DRIVER(bootmeth_script) = { /* Put an number before 'script' to provide a default ordering */
U_BOOT_DRIVER(bootmeth_2script) = {
.name = "bootmeth_script", .name = "bootmeth_script",
.id = UCLASS_BOOTMETH, .id = UCLASS_BOOTMETH,
.of_match = script_bootmeth_ids, .of_match = script_bootmeth_ids,

View file

@ -689,12 +689,13 @@ static int gpt_enumerate(struct blk_desc *desc)
int ret; int ret;
int i; int i;
if (part_drv->test(desc))
continue;
for (i = 1; i < part_drv->max_entries; i++) { for (i = 1; i < part_drv->max_entries; i++) {
ret = part_drv->get_info(desc, i, &pinfo); ret = part_drv->get_info(desc, i, &pinfo);
if (ret) { if (ret)
/* no more entries in table */ continue;
break;
}
ptr = &part_list[str_len]; ptr = &part_list[str_len];
tmp_len = strlen((const char *)pinfo.name); tmp_len = strlen((const char *)pinfo.name);
@ -709,9 +710,10 @@ static int gpt_enumerate(struct blk_desc *desc)
/* One byte for space(" ") delimiter */ /* One byte for space(" ") delimiter */
ptr[tmp_len] = ' '; ptr[tmp_len] = ' ';
} }
if (*part_list)
part_list[strlen(part_list) - 1] = 0;
break;
} }
if (*part_list)
part_list[strlen(part_list) - 1] = 0;
debug("setenv gpt_partition_list %s\n", part_list); debug("setenv gpt_partition_list %s\n", part_list);
return env_set("gpt_partition_list", part_list); return env_set("gpt_partition_list", part_list);
@ -740,7 +742,7 @@ static int gpt_setenv_part_variables(struct disk_partition *pinfo, int i)
if (ret) if (ret)
goto fail; goto fail;
ret = env_set_ulong("gpt_partition_entry", i); ret = env_set_hex("gpt_partition_entry", i);
if (ret) if (ret)
goto fail; goto fail;
@ -784,10 +786,8 @@ static int gpt_setenv(struct blk_desc *desc, const char *name)
for (i = 1; i < part_drv->max_entries; i++) { for (i = 1; i < part_drv->max_entries; i++) {
ret = part_drv->get_info(desc, i, &pinfo); ret = part_drv->get_info(desc, i, &pinfo);
if (ret) { if (ret)
/* no more entries in table */ continue;
break;
}
if (!strcmp(name, (const char *)pinfo.name)) { if (!strcmp(name, (const char *)pinfo.name)) {
/* match found, setup environment variables */ /* match found, setup environment variables */
@ -1058,8 +1058,6 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
" gpt_partition_name, gpt_partition_entry\n" " gpt_partition_name, gpt_partition_entry\n"
" gpt enumerate mmc 0\n" " gpt enumerate mmc 0\n"
" - store list of partitions to gpt_partition_list environment variable\n" " - store list of partitions to gpt_partition_list environment variable\n"
" read <interface> <dev>\n"
" - read GPT into a data structure for manipulation\n"
" gpt guid <interface> <dev>\n" " gpt guid <interface> <dev>\n"
" - print disk GUID\n" " - print disk GUID\n"
" gpt guid <interface> <dev> <varname>\n" " gpt guid <interface> <dev> <varname>\n"

View file

@ -144,10 +144,10 @@ static void printf_str(struct print_inf *inf, char *format, ...)
i = vsnprintf(inf->str + inf->offset, remaining, format, args); i = vsnprintf(inf->str + inf->offset, remaining, format, args);
va_end(args); va_end(args);
if (i >= remaining) if (i < 0)
inf->error |= PRINT_TRUNCATED_ERROR;
else if (i < 0)
inf->error |= PRINT_CONVERSION_ERROR; inf->error |= PRINT_CONVERSION_ERROR;
else if ((unsigned int)i >= remaining)
inf->error |= PRINT_TRUNCATED_ERROR;
else else
inf->offset += i; inf->offset += i;
} }

View file

@ -28,6 +28,7 @@ const char *const type_name[] = {
/* Events related to driver model */ /* Events related to driver model */
"dm_post_init_f", "dm_post_init_f",
"dm_post_init_r",
"dm_pre_probe", "dm_pre_probe",
"dm_post_probe", "dm_post_probe",
"dm_pre_remove", "dm_pre_remove",

View file

@ -70,7 +70,7 @@ CONFIG_NET_RETRY_COUNT=10
CONFIG_BOOTP_SEND_HOSTNAME=y CONFIG_BOOTP_SEND_HOSTNAME=y
CONFIG_SPL_DM=y CONFIG_SPL_DM=y
CONFIG_SPL_DM_SEQ_ALIAS=y CONFIG_SPL_DM_SEQ_ALIAS=y
CONFIG_SCSI_AHCI=y CONFIG_DWC_AHCI=y
CONFIG_DFU_MMC=y CONFIG_DFU_MMC=y
CONFIG_DFU_RAM=y CONFIG_DFU_RAM=y
CONFIG_USB_FUNCTION_FASTBOOT=y CONFIG_USB_FUNCTION_FASTBOOT=y
@ -102,7 +102,7 @@ CONFIG_PMIC_PALMAS=y
CONFIG_DM_REGULATOR=y CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_PALMAS=y CONFIG_DM_REGULATOR_PALMAS=y
CONFIG_PALMAS_POWER=y CONFIG_PALMAS_POWER=y
CONFIG_SCSI_AHCI_PLAT=y CONFIG_DM_SCSI=y
CONFIG_DM_SERIAL=y CONFIG_DM_SERIAL=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_DM_SPI=y CONFIG_DM_SPI=y

View file

@ -81,3 +81,4 @@ CONFIG_MTK_SPIM=y
CONFIG_LZO=y CONFIG_LZO=y
CONFIG_HEXDUMP=y CONFIG_HEXDUMP=y
# CONFIG_EFI_LOADER is not set # CONFIG_EFI_LOADER is not set
CONFIG_LMB_MAX_REGIONS=64

View file

@ -69,3 +69,4 @@ CONFIG_MTK_SPIM=y
CONFIG_LZO=y CONFIG_LZO=y
CONFIG_HEXDUMP=y CONFIG_HEXDUMP=y
# CONFIG_EFI_LOADER is not set # CONFIG_EFI_LOADER is not set
CONFIG_LMB_MAX_REGIONS=64

View file

@ -12,8 +12,8 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2835-rpi-zero-w"
CONFIG_SYS_PROMPT="U-Boot> " CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -13,8 +13,8 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2836-rpi-2-b"
CONFIG_SYS_PROMPT="U-Boot> " CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -12,8 +12,8 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b"
CONFIG_SYS_PROMPT="U-Boot> " CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -11,8 +11,8 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b-plus"
CONFIG_SYS_PROMPT="U-Boot> " CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -11,8 +11,8 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b"
CONFIG_SYS_PROMPT="U-Boot> " CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -10,9 +10,9 @@ CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_DM_RESET=y CONFIG_DM_RESET=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="pci enum; usb start;" CONFIG_PREBOOT="pci enum; usb start;"
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set

View file

@ -10,9 +10,9 @@ CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_DM_RESET=y CONFIG_DM_RESET=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="pci enum; usb start;" CONFIG_PREBOOT="pci enum; usb start;"
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set

View file

@ -10,9 +10,9 @@ CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_DM_RESET=y CONFIG_DM_RESET=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="pci enum; usb start;" CONFIG_PREBOOT="pci enum; usb start;"
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set

View file

@ -12,8 +12,8 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2835-rpi-b"
CONFIG_SYS_PROMPT="U-Boot> " CONFIG_SYS_PROMPT="U-Boot> "
CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_SYS_LOAD_ADDR=0x1000000 CONFIG_SYS_LOAD_ADDR=0x1000000
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y CONFIG_OF_BOARD_SETUP=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_USE_PREBOOT=y CONFIG_USE_PREBOOT=y
# CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set

9
doc/api/event.rst Normal file
View file

@ -0,0 +1,9 @@
.. SPDX-License-Identifier: GPL-2.0+
Events
======
The concept of events is decribed :doc:`here <../develop/event>`.
.. kernel-doc:: include/event.h
:internal:

View file

@ -10,6 +10,7 @@ U-Boot API documentation
dfu dfu
dm dm
efi efi
event
getopt getopt
linker_lists linker_lists
lmb lmb

View file

@ -38,9 +38,10 @@ and FIT image instead of ``initramfs``. Android bootloader expect gzipped kernel
with appended dtb, so let's mimic linux to satisfy stock bootloader. with appended dtb, so let's mimic linux to satisfy stock bootloader.
Boards Boards
------------ ------
starqlte starqlte
^^^^^^^^^^^^ ^^^^^^^^
The starqltechn is a production board for Samsung S9 (SM-G9600) phone, The starqltechn is a production board for Samsung S9 (SM-G9600) phone,
based on the Qualcomm SDM845 SoC. based on the Qualcomm SDM845 SoC.
@ -149,7 +150,11 @@ Steps:
mkbootimg --kernel u-boot.bin.gz-dtb --ramdisk db845c.itb \ mkbootimg --kernel u-boot.bin.gz-dtb --ramdisk db845c.itb \
--output boot.img --pagesize 4096 --base 0x80000000 --output boot.img --pagesize 4096 --base 0x80000000
- Flash boot.img using db845c fastboot method. - Flash boot.img using db845c fastboot method:
.. code-block:: bash
sudo fastboot flash boot boot.img
More information can be found on the `DragonBoard 845c page`_. More information can be found on the `DragonBoard 845c page`_.

View file

@ -47,6 +47,7 @@ Boot Flow:
Below is the pictorial representation of boot flow: Below is the pictorial representation of boot flow:
.. image:: img/boot_diagram_k3_current.svg .. image:: img/boot_diagram_k3_current.svg
:alt: Boot flow diagram
- Here TIFS acts as master and provides all the critical services. R5/A53 - Here TIFS acts as master and provides all the critical services. R5/A53
requests TIFS to get these services done as shown in the above diagram. requests TIFS to get these services done as shown in the above diagram.
@ -102,13 +103,13 @@ Set the variables corresponding to this platform:
3. U-Boot: 3. U-Boot:
* 4.1 R5: * 3.1 R5:
.. include:: ../ti/k3.rst .. include:: ../ti/k3.rst
:start-after: .. k3_rst_include_start_build_steps_spl_r5 :start-after: .. k3_rst_include_start_build_steps_spl_r5
:end-before: .. k3_rst_include_end_build_steps_spl_r5 :end-before: .. k3_rst_include_end_build_steps_spl_r5
* 4.2 A53: * 3.2 A53:
.. include:: ../ti/k3.rst .. include:: ../ti/k3.rst
:start-after: .. k3_rst_include_start_build_steps_uboot :start-after: .. k3_rst_include_start_build_steps_uboot
@ -141,10 +142,12 @@ Image formats:
- tiboot3.bin - tiboot3.bin
.. image:: img/multi_cert_tiboot3.bin.svg .. image:: img/multi_cert_tiboot3.bin.svg
:alt: tiboot3.bin image format
- tispl.bin - tispl.bin
.. image:: img/dm_tispl.bin.svg .. image:: img/dm_tispl.bin.svg
:alt: tispl.bin image format
A53 SPL DDR Memory Layout A53 SPL DDR Memory Layout
------------------------- -------------------------

View file

@ -46,6 +46,7 @@ applications. This should happen before running Linux.
instead use Falcon boot flow to reduce boot time. instead use Falcon boot flow to reduce boot time.
.. image:: img/boot_diagram_am65.svg .. image:: img/boot_diagram_am65.svg
:alt: Boot flow diagram
- Here DMSC acts as master and provides all the critical services. R5/A53 - Here DMSC acts as master and provides all the critical services. R5/A53
requests DMSC to get these services done as shown in the above diagram. requests DMSC to get these services done as shown in the above diagram.
@ -102,13 +103,13 @@ Set the variables corresponding to this platform:
3. U-Boot: 3. U-Boot:
* 4.1 R5: * 3.1 R5:
.. include:: k3.rst .. include:: k3.rst
:start-after: .. k3_rst_include_start_build_steps_spl_r5 :start-after: .. k3_rst_include_start_build_steps_spl_r5
:end-before: .. k3_rst_include_end_build_steps_spl_r5 :end-before: .. k3_rst_include_end_build_steps_spl_r5
* 4.2 A53: * 3.2 A53:
.. include:: k3.rst .. include:: k3.rst
:start-after: .. k3_rst_include_start_build_steps_uboot :start-after: .. k3_rst_include_start_build_steps_uboot
@ -122,13 +123,13 @@ Each SoC variant (GP and HS) requires a different source for these files.
- GP - GP
* tiboot3-am65x_sr2-gp-evm.bin, sysfw-am65x_sr2-gp-evm.itb from step 4.1 * tiboot3-am65x_sr2-gp-evm.bin, sysfw-am65x_sr2-gp-evm.itb from step 3.1
* tispl.bin_unsigned, u-boot.img_unsigned from step 4.2 * tispl.bin_unsigned, u-boot.img_unsigned from step 3.2
- HS - HS
* tiboot3-am65x_sr2-hs-evm.bin, sysfw-am65x_sr2-hs-evm.itb from step 4.1 * tiboot3-am65x_sr2-hs-evm.bin, sysfw-am65x_sr2-hs-evm.itb from step 3.1
* tispl.bin, u-boot.img from step 4.2 * tispl.bin, u-boot.img from step 3.2
Image formats: Image formats:
-------------- --------------
@ -136,14 +137,17 @@ Image formats:
- tiboot3.bin - tiboot3.bin
.. image:: img/no_multi_cert_tiboot3.bin.svg .. image:: img/no_multi_cert_tiboot3.bin.svg
:alt: tiboot3.bin image format
- tispl.bin - tispl.bin
.. image:: img/nodm_tispl.bin.svg .. image:: img/nodm_tispl.bin.svg
:alt: tispl.bin image format
- sysfw.itb - sysfw.itb
.. image:: img/sysfw.itb.svg .. image:: img/sysfw.itb.svg
:alt: sysfw.itb image format
eMMC: eMMC:
----- -----
@ -185,6 +189,7 @@ used:
eMMC layout: eMMC layout:
.. image:: img/emmc_am65x_evm_boot0.svg .. image:: img/emmc_am65x_evm_boot0.svg
:alt: emmc boot partition layout
Kernel image and DT are expected to be present in the /boot folder of rootfs. Kernel image and DT are expected to be present in the /boot folder of rootfs.
To boot kernel from eMMC, use the following commands: To boot kernel from eMMC, use the following commands:
@ -220,6 +225,7 @@ addresses.
Flash layout for OSPI: Flash layout for OSPI:
.. image:: img/ospi_sysfw.svg .. image:: img/ospi_sysfw.svg
:alt: OSPI flash partition layout
Kernel Image and DT are expected to be present in the /boot folder of UBIFS Kernel Image and DT are expected to be present in the /boot folder of UBIFS
ospi.rootfs just like in SD card case. U-Boot looks for UBI volume named ospi.rootfs just like in SD card case. U-Boot looks for UBI volume named

View file

@ -35,6 +35,7 @@ Boot Flow:
Below is the pictorial representation of boot flow: Below is the pictorial representation of boot flow:
.. image:: img/boot_diagram_k3_current.svg .. image:: img/boot_diagram_k3_current.svg
:alt: Boot flow diagram
- Here DMSC acts as master and provides all the critical services. R5/A72 - Here DMSC acts as master and provides all the critical services. R5/A72
requests DMSC to get these services done as shown in the above diagram. requests DMSC to get these services done as shown in the above diagram.
@ -91,13 +92,13 @@ Set the variables corresponding to this platform:
3. U-Boot: 3. U-Boot:
* 4.1 R5: * 3.1 R5:
.. include:: k3.rst .. include:: k3.rst
:start-after: .. k3_rst_include_start_build_steps_spl_r5 :start-after: .. k3_rst_include_start_build_steps_spl_r5
:end-before: .. k3_rst_include_end_build_steps_spl_r5 :end-before: .. k3_rst_include_end_build_steps_spl_r5
* 4.2 A72: * 3.2 A72:
.. include:: k3.rst .. include:: k3.rst
:start-after: .. k3_rst_include_start_build_steps_uboot :start-after: .. k3_rst_include_start_build_steps_uboot
@ -111,18 +112,18 @@ variant (GP, HS-FS, HS-SE) requires a different source for these files.
- GP - GP
* tiboot3-j7200-gp-evm.bin from step 4.1 * tiboot3-j7200-gp-evm.bin from step 3.1
* tispl.bin_unsigned, u-boot.img_unsigned from step 4.2 * tispl.bin_unsigned, u-boot.img_unsigned from step 3.2
- HS-FS - HS-FS
* tiboot3-j7200_sr2-hs-fs-evm.bin from step 4.1 * tiboot3-j7200_sr2-hs-fs-evm.bin from step 3.1
* tispl.bin, u-boot.img from step 4.2 * tispl.bin, u-boot.img from step 3.2
- HS-SE - HS-SE
* tiboot3-j7200_sr2-hs-evm.bin from step 4.1 * tiboot3-j7200_sr2-hs-evm.bin from step 3.1
* tispl.bin, u-boot.img from step 4.2 * tispl.bin, u-boot.img from step 3.2
Image formats: Image formats:
-------------- --------------
@ -130,12 +131,12 @@ Image formats:
- tiboot3.bin - tiboot3.bin
.. image:: img/j7200_tiboot3.bin.svg .. image:: img/j7200_tiboot3.bin.svg
:alt: tiboot3.bin image format
- tispl.bin - tispl.bin
.. image:: img/dm_tispl.bin.svg .. image:: img/dm_tispl.bin.svg
:alt: tispl.bin image format
Switch Setting for Boot Mode Switch Setting for Boot Mode
---------------------------- ----------------------------
@ -191,6 +192,7 @@ Size of u-boot.img is taken 4MB for refernece,
But this is subject to change depending upon atf, optee size But this is subject to change depending upon atf, optee size
.. image:: img/emmc_j7200_evm_boot01.svg .. image:: img/emmc_j7200_evm_boot01.svg
:alt: Traditional eMMC boot partition layout
In case of UDA FS mode booting, following is layout. In case of UDA FS mode booting, following is layout.
@ -198,6 +200,7 @@ All boot images tiboot3.bin, tispl and u-boot should be written to
fat formatted UDA FS as file. fat formatted UDA FS as file.
.. image:: img/emmc_j7200_evm_udafs.svg .. image:: img/emmc_j7200_evm_udafs.svg
:alt: eMMC UDA boot partition layout
In case of booting from eMMC, write above images into raw or UDA FS. In case of booting from eMMC, write above images into raw or UDA FS.
and set mmc partconf accordingly. and set mmc partconf accordingly.

View file

@ -40,6 +40,7 @@ Boot flow is similar to that of AM65x SoC and extending it with remoteproc
support. Below is the pictorial representation of boot flow: support. Below is the pictorial representation of boot flow:
.. image:: img/boot_diagram_j721e.svg .. image:: img/boot_diagram_j721e.svg
:alt: Boot flow diagram
- Here DMSC acts as master and provides all the critical services. R5/A72 - Here DMSC acts as master and provides all the critical services. R5/A72
requests DMSC to get these services done as shown in the above diagram. requests DMSC to get these services done as shown in the above diagram.
@ -96,13 +97,13 @@ Set the variables corresponding to this platform:
3. U-Boot: 3. U-Boot:
* 4.1 R5: * 3.1 R5:
.. include:: k3.rst .. include:: k3.rst
:start-after: .. k3_rst_include_start_build_steps_spl_r5 :start-after: .. k3_rst_include_start_build_steps_spl_r5
:end-before: .. k3_rst_include_end_build_steps_spl_r5 :end-before: .. k3_rst_include_end_build_steps_spl_r5
* 4.2 A72: * 3.2 A72:
.. include:: k3.rst .. include:: k3.rst
:start-after: .. k3_rst_include_start_build_steps_uboot :start-after: .. k3_rst_include_start_build_steps_uboot
@ -117,18 +118,18 @@ files.
- GP - GP
* tiboot3-j721e-gp-evm.bin, sysfw-j721e-gp-evm.itb from step 4.1 * tiboot3-j721e-gp-evm.bin, sysfw-j721e-gp-evm.itb from step 3.1
* tispl.bin_unsigned, u-boot.img_unsigned from step 4.2 * tispl.bin_unsigned, u-boot.img_unsigned from step 3.2
- HS-FS - HS-FS
* tiboot3-j721e_sr2-hs-fs-evm.bin, sysfw-j721e_sr2-hs-fs-evm.itb from step 4.1 * tiboot3-j721e_sr2-hs-fs-evm.bin, sysfw-j721e_sr2-hs-fs-evm.itb from step 3.1
* tispl.bin, u-boot.img from step 4.2 * tispl.bin, u-boot.img from step 3.2
- HS-SE - HS-SE
* tiboot3-j721e_sr2-hs-evm.bin, sysfw-j721e_sr2-hs-evm.itb from step 4.1 * tiboot3-j721e_sr2-hs-evm.bin, sysfw-j721e_sr2-hs-evm.itb from step 3.1
* tispl.bin, u-boot.img from step 4.2 * tispl.bin, u-boot.img from step 3.2
Image formats: Image formats:
-------------- --------------
@ -136,14 +137,17 @@ Image formats:
- tiboot3.bin - tiboot3.bin
.. image:: img/no_multi_cert_tiboot3.bin.svg .. image:: img/no_multi_cert_tiboot3.bin.svg
:alt: tiboot3.bin image format
- tispl.bin - tispl.bin
.. image:: img/dm_tispl.bin.svg .. image:: img/dm_tispl.bin.svg
:alt: tispl.bin image format
- sysfw.itb - sysfw.itb
.. image:: img/sysfw.itb.svg .. image:: img/sysfw.itb.svg
:alt: sysfw.itb image format
R5 Memory Map: R5 Memory Map:
-------------- --------------
@ -213,6 +217,7 @@ addresses.
Flash layout for OSPI: Flash layout for OSPI:
.. image:: img/ospi_sysfw.svg .. image:: img/ospi_sysfw.svg
:alt: OSPI flash partition layout
Firmwares: Firmwares:
---------- ----------

View file

@ -48,6 +48,7 @@ including a 32bit U-Boot SPL, (called the wakup SPL) that ROM will jump
to after it has finished loading everything into internal SRAM. to after it has finished loading everything into internal SRAM.
.. image:: img/boot_flow_01.svg .. image:: img/boot_flow_01.svg
:alt: Boot flow up to wakeup domain SPL
The wakeup SPL, running on a wakeup domain core, will initialize DDR and The wakeup SPL, running on a wakeup domain core, will initialize DDR and
any peripherals needed load the larger binaries inside the `tispl.bin` any peripherals needed load the larger binaries inside the `tispl.bin`
@ -57,6 +58,7 @@ starting with Trusted Firmware-A (TF-A), before moving on to start
OP-TEE and the main domain's U-Boot SPL. OP-TEE and the main domain's U-Boot SPL.
.. image:: img/boot_flow_02.svg .. image:: img/boot_flow_02.svg
:alt: Boot flow up to main domain SPL
The main domain's SPL, running on a 64bit application core, has The main domain's SPL, running on a 64bit application core, has
virtually unlimited space (billions of bytes now that DDR is working) to virtually unlimited space (billions of bytes now that DDR is working) to
@ -65,6 +67,7 @@ which loads more firmware into the micro-controller & wakeup domains and
finally prepare the main domain to run Linux. finally prepare the main domain to run Linux.
.. image:: img/boot_flow_03.svg .. image:: img/boot_flow_03.svg
:alt: Complete boot flow up to Linux
This is the typical boot flow for all K3 based SoCs, however this flow This is the typical boot flow for all K3 based SoCs, however this flow
offers quite a lot in the terms of flexibility, especially on High offers quite a lot in the terms of flexibility, especially on High
@ -121,11 +124,30 @@ online
| **source:** https://github.com/OP-TEE/optee_os.git | **source:** https://github.com/OP-TEE/optee_os.git
| **branch:** master | **branch:** master
* **TI Firmware (TIFS, DM, DSMC)** * **TI Firmware (TIFS, DM, SYSFW)**
| **source:** https://git.ti.com/git/processor-firmware/ti-linux-firmware.git | **source:** https://git.ti.com/git/processor-firmware/ti-linux-firmware.git
| **branch:** ti-linux-firmware | **branch:** ti-linux-firmware
.. note::
The TI Firmware required for functionality of the system can be
one of the following combination (see platform specific boot diagram for
further information as to which component runs on which processor):
* **TIFS** - TI Foundational Security Firmware - Consists of purely firmware
meant to run on the security enclave.
* **DM** - Device Management firmware also called TI System Control Interface
server (TISCI Server) - This component purely plays the role of managing
device resources such as power, clock, interrupts, dma etc. This firmware
runs on a dedicated or multi-use microcontroller outside the security
enclave.
OR
* **SYSFW** - System firmware - consists of both TIFS and DM both running on
the security enclave.
.. k3_rst_include_end_boot_sources .. k3_rst_include_end_boot_sources
Build Procedure Build Procedure
@ -173,13 +195,13 @@ All of that to say you will need both a 32bit and 64bit cross compiler
.. k3_rst_include_end_common_env_vars_desc .. k3_rst_include_end_common_env_vars_desc
.. k3_rst_include_start_common_env_vars_defn .. k3_rst_include_start_common_env_vars_defn
.. code-block:: bash .. prompt:: bash
$ export CC32=arm-linux-gnueabihf- export CC32=arm-linux-gnueabihf-
$ export CC64=aarch64-linux-gnu- export CC64=aarch64-linux-gnu-
$ export LNX_FW_PATH=path/to/ti-linux-firmware export LNX_FW_PATH=path/to/ti-linux-firmware
$ export TFA_PATH=path/to/trusted-firmware-a export TFA_PATH=path/to/trusted-firmware-a
$ export OPTEE_PATH=path/to/optee_os export OPTEE_PATH=path/to/optee_os
.. k3_rst_include_end_common_env_vars_defn .. k3_rst_include_end_common_env_vars_defn
We will also need some common environment variables set up for the various We will also need some common environment variables set up for the various
@ -223,11 +245,11 @@ Building tiboot3.bin
uses the split binary flow) uses the split binary flow)
.. k3_rst_include_start_build_steps_spl_r5 .. k3_rst_include_start_build_steps_spl_r5
.. code-block:: bash .. prompt:: bash
$ # inside u-boot source # inside u-boot source
$ make $UBOOT_CFG_CORTEXR make $UBOOT_CFG_CORTEXR
$ make CROSS_COMPILE=$CC32 BINMAN_INDIRS=$LNX_FW_PATH make CROSS_COMPILE=$CC32 BINMAN_INDIRS=$LNX_FW_PATH
.. k3_rst_include_end_build_steps_spl_r5 .. k3_rst_include_end_build_steps_spl_r5
At this point you should have all the needed binaries to boot the wakeup At this point you should have all the needed binaries to boot the wakeup
@ -259,11 +281,11 @@ firmware if your device using a split firmware.
application cores on the main domain. application cores on the main domain.
.. k3_rst_include_start_build_steps_tfa .. k3_rst_include_start_build_steps_tfa
.. code-block:: bash .. prompt:: bash
$ # inside trusted-firmware-a source # inside trusted-firmware-a source
$ make CROSS_COMPILE=$CC64 ARCH=aarch64 PLAT=k3 SPD=opteed $TFA_EXTRA_ARGS \ make CROSS_COMPILE=$CC64 ARCH=aarch64 PLAT=k3 SPD=opteed $TFA_EXTRA_ARGS \
TARGET_BOARD=$TFA_BOARD TARGET_BOARD=$TFA_BOARD
.. k3_rst_include_end_build_steps_tfa .. k3_rst_include_end_build_steps_tfa
Typically all `j7*` devices will use `TARGET_BOARD=generic` or `TARGET_BOARD Typically all `j7*` devices will use `TARGET_BOARD=generic` or `TARGET_BOARD
@ -275,11 +297,11 @@ use the `lite` option.
using the TrustZone technology built into the core. using the TrustZone technology built into the core.
.. k3_rst_include_start_build_steps_optee .. k3_rst_include_start_build_steps_optee
.. code-block:: bash .. prompt:: bash
$ # inside optee_os source # inside optee_os source
$ make CROSS_COMPILE=$CC32 CROSS_COMPILE64=$CC64 CFG_ARM64_core=y $OPTEE_EXTRA_ARGS \ make CROSS_COMPILE=$CC32 CROSS_COMPILE64=$CC64 CFG_ARM64_core=y $OPTEE_EXTRA_ARGS \
PLATFORM=$OPTEE_PLATFORM PLATFORM=$OPTEE_PLATFORM
.. k3_rst_include_end_build_steps_optee .. k3_rst_include_end_build_steps_optee
4. Finally, after TF-A has initialized the main domain and OP-TEE has 4. Finally, after TF-A has initialized the main domain and OP-TEE has
@ -287,11 +309,11 @@ use the `lite` option.
64bit core in the main domain. 64bit core in the main domain.
.. k3_rst_include_start_build_steps_uboot .. k3_rst_include_start_build_steps_uboot
.. code-block:: bash .. prompt:: bash
$ # inside u-boot source # inside u-boot source
$ make $UBOOT_CFG_CORTEXA make $UBOOT_CFG_CORTEXA
$ make CROSS_COMPILE=$CC64 BINMAN_INDIRS=$LNX_FW_PATH \ make CROSS_COMPILE=$CC64 BINMAN_INDIRS=$LNX_FW_PATH \
BL31=$TFA_PATH/build/k3/$TFA_BOARD/release/bl31.bin \ BL31=$TFA_PATH/build/k3/$TFA_BOARD/release/bl31.bin \
TEE=$OPTEE_PATH/out/arm-plat-k3/core/tee-raw.bin TEE=$OPTEE_PATH/out/arm-plat-k3/core/tee-raw.bin
.. k3_rst_include_end_build_steps_uboot .. k3_rst_include_end_build_steps_uboot
@ -386,14 +408,14 @@ and the same can be extended to other platforms
be passing to mkimage for signing the fitImage and embedding the key in be passing to mkimage for signing the fitImage and embedding the key in
the u-boot dtb. the u-boot dtb.
.. code-block:: bash .. prompt:: bash
mkimage -r -f fitImage.its -k $UBOOT_PATH/board/ti/keys -K mkimage -r -f fitImage.its -k $UBOOT_PATH/board/ti/keys -K
$UBOOT_PATH/build/a72/dts/dt.dtb $UBOOT_PATH/build/a72/dts/dt.dtb
For signing a secondary platform, pass the -K parameter to that DTB For signing a secondary platform, pass the -K parameter to that DTB
.. code-block:: bash .. prompt:: bash
mkimage -f fitImage.its -k $UBOOT_PATH/board/ti/keys -K mkimage -f fitImage.its -k $UBOOT_PATH/board/ti/keys -K
$UBOOT_PATH/build/a72/arch/arm/dts/k3-j721e-sk.dtb $UBOOT_PATH/build/a72/arch/arm/dts/k3-j721e-sk.dtb
@ -452,10 +474,11 @@ then the saveenv command and can be used across various bootmodes too.
**Writing to MMC/EMMC** **Writing to MMC/EMMC**
.. code-block:: .. prompt:: bash
:prompts: =>
=> env export -t $loadaddr <list of variables> env export -t $loadaddr <list of variables>
=> fatwrite mmc ${mmcdev} ${loadaddr} ${bootenvfile} ${filesize} fatwrite mmc ${mmcdev} ${loadaddr} ${bootenvfile} ${filesize}
**Reading from MMC/EMMC** **Reading from MMC/EMMC**
@ -465,10 +488,11 @@ mmcdev) and set the environments.
If manually needs to be done then the environment can be read from the If manually needs to be done then the environment can be read from the
filesystem and then imported filesystem and then imported
.. code-block:: .. prompt:: bash
:prompts: =>
=> fatload mmc ${mmcdev} ${loadaddr} ${bootenvfile} fatload mmc ${mmcdev} ${loadaddr} ${bootenvfile}
=> env import -t ${loadaddr} ${filesize} env import -t ${loadaddr} ${filesize}
.. _k3_rst_refer_openocd: .. _k3_rst_refer_openocd:
@ -486,6 +510,7 @@ generation device.
The overall structure of this setup is in the following figure. The overall structure of this setup is in the following figure.
.. image:: img/openocd-overview.svg .. image:: img/openocd-overview.svg
:alt: Overview of OpenOCD setup.
.. note:: .. note::
@ -524,7 +549,7 @@ Refer to the release notes corresponding to the `OpenOCD version
box support by OpenOCD. The board-specific documentation will box support by OpenOCD. The board-specific documentation will
cover the details and any adapter/dongle recommendations. cover the details and any adapter/dongle recommendations.
.. code-block:: bash .. prompt:: bash
openocd -v openocd -v
@ -542,21 +567,21 @@ systems, but equivalent instructions should exist for systems with
other package managers. Please refer to the `OpenOCD Documentation other package managers. Please refer to the `OpenOCD Documentation
<https://openocd.org/>`_ for more recent installation steps. <https://openocd.org/>`_ for more recent installation steps.
.. code-block:: bash .. prompt:: bash
$ # Check the packages to be installed: needs deb-src in sources.list # Check the packages to be installed: needs deb-src in sources.list
$ sudo apt build-dep openocd sudo apt build-dep openocd
$ # The following list is NOT complete - please check the latest # The following list is NOT complete - please check the latest
$ sudo apt-get install libtool pkg-config texinfo libusb-dev \ sudo apt-get install libtool pkg-config texinfo libusb-dev \
libusb-1.0.0-dev libftdi-dev libhidapi-dev autoconf automake libusb-1.0.0-dev libftdi-dev libhidapi-dev autoconf automake
$ git clone https://github.com/openocd-org/openocd.git openocd git clone https://github.com/openocd-org/openocd.git openocd
$ cd openocd cd openocd
$ git submodule init git submodule init
$ git submodule update git submodule update
$ ./bootstrap ./bootstrap
$ ./configure --prefix=/usr/local/ ./configure --prefix=/usr/local/
$ make -j`nproc` make -j`nproc`
$ sudo make install sudo make install
.. note:: .. note::
@ -572,28 +597,28 @@ The step is not necessary if the distribution supports the OpenOCD, but
if building from a source, ensure that the udev rules are installed if building from a source, ensure that the udev rules are installed
correctly to ensure a sane system. correctly to ensure a sane system.
.. code-block:: bash .. prompt:: bash
# Go to the OpenOCD source directory # Go to the OpenOCD source directory
$ cd openocd cd openocd
# Copy the udev rules to the correct system location Copy the udev rules to the correct system location
$ sudo cp ./contrib/60-openocd.rules \ sudo cp ./contrib/60-openocd.rules \
./src/JTAG/drivers/libjaylink/contrib/99-libjaylink.rules \ ./src/jtag/drivers/libjaylink/contrib/99-libjaylink.rules \
/etc/udev/rules.d/ /etc/udev/rules.d/
# Get Udev to load the new rules up # Get Udev to load the new rules up
$ sudo udevadm control --reload-rules sudo udevadm control --reload-rules
# Use the new rules on existing connected devices # Use the new rules on existing connected devices
$ sudo udevadm trigger sudo udevadm trigger
Step 2: Setup GDB Step 2: Setup GDB
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
Most systems come with gdb-multiarch package. Most systems come with gdb-multiarch package.
.. code-block:: bash .. prompt:: bash
# Install gdb-multiarch package # Install gdb-multiarch package
$ sudo apt-get install gdb-multiarch sudo apt-get install gdb-multiarch
Though using GDB natively is normal, developers with interest in using IDE Though using GDB natively is normal, developers with interest in using IDE
may find a few of these interesting: may find a few of these interesting:
@ -769,7 +794,7 @@ Code modification
In this example, we will debug ``board_init_f`` inside In this example, we will debug ``board_init_f`` inside
``arch/arm/mach-k3/{soc}_init.c``. Since some sections of U-Boot ``arch/arm/mach-k3/{soc}_init.c``. Since some sections of U-Boot
will be executed multiple times during the bootup process of K3 will be executed multiple times during the bootup process of K3
devices, we will need to include either ``CONFIG_CPU_ARM64`` or devices, we will need to include either ``CONFIG_ARM64`` or
``CONFIG_CPU_V7R`` to catch the CPU at the desired place during the ``CONFIG_CPU_V7R`` to catch the CPU at the desired place during the
bootup process (Main or Wakeup domains). For example, modify the bootup process (Main or Wakeup domains). For example, modify the
file as follows (depending on need): file as follows (depending on need):
@ -787,7 +812,7 @@ Code modification
} }
... ...
/* Code to run on the ARMV8 (Main Domain) */ /* Code to run on the ARMV8 (Main Domain) */
if (IS_ENABLED(CONFIG_CPU_ARM64)) { if (IS_ENABLED(CONFIG_ARM64)) {
volatile int x = 1; volatile int x = 1;
while(x) {}; while(x) {};
} }
@ -806,7 +831,7 @@ Startup OpenOCD to debug the platform as follows:
.. k3_rst_include_start_openocd_cfg_XDS110 .. k3_rst_include_start_openocd_cfg_XDS110
.. code-block:: bash .. prompt:: bash
openocd -f board/{board_of_choice}.cfg openocd -f board/{board_of_choice}.cfg
@ -820,7 +845,7 @@ Startup OpenOCD to debug the platform as follows:
<https://github.com/openocd-org/openocd/blob/master/tcl/target/ti_k3.cfg#L59>`_ <https://github.com/openocd-org/openocd/blob/master/tcl/target/ti_k3.cfg#L59>`_
to decide if the SoC is supported or not. to decide if the SoC is supported or not.
.. code-block:: bash .. prompt:: bash
openocd -f openocd_connect.cfg openocd -f openocd_connect.cfg
@ -895,7 +920,7 @@ To debug using this server, use GDB directly or your preferred
GDB-based IDE. To start up GDB in the terminal, run the following GDB-based IDE. To start up GDB in the terminal, run the following
command. command.
.. code-block:: bash .. prompt:: bash
gdb-multiarch gdb-multiarch

View file

@ -1,7 +1,11 @@
.. SPDX-License-Identifier: GPL-2.0+ .. SPDX-License-Identifier: GPL-2.0-or-later
.. sectionauthor:: Marcel Ziswiler <marcel.ziswiler@toradex.com>
Apalis iMX8QM V1.0B Module Apalis iMX8 Module
========================== ==================
- SoM: https://www.toradex.com/computer-on-modules/apalis-arm-family/nxp-imx-8
- Carrier board: https://www.toradex.com/products/carrier-board/apalis-evaluation-board
Quick Start Quick Start
----------- -----------
@ -49,6 +53,7 @@ Copy the following firmware to the U-Boot folder:
Build U-Boot Build U-Boot
------------ ------------
.. code-block:: bash .. code-block:: bash
$ make apalis-imx8_defconfig $ make apalis-imx8_defconfig
@ -61,8 +66,8 @@ Get the latest version of the universal update utility (uuu) aka ``mfgtools 3.0`
https://community.nxp.com/external-link.jspa?url=https%3A%2F%2Fgithub.com%2FNXPmicro%2Fmfgtools%2Freleases https://community.nxp.com/external-link.jspa?url=https%3A%2F%2Fgithub.com%2FNXPmicro%2Fmfgtools%2Freleases
Put the module into USB recovery aka serial downloader mode, connect USB device Put the module into USB recovery aka serial downloader mode, connect the USB
to your host and execute uuu: device to your host and execute ``uuu``:
.. code-block:: bash .. code-block:: bash
@ -80,3 +85,10 @@ partition and boot:
setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200 setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200
mmc dev 0 1 mmc dev 0 1
mmc write ${loadaddr} 0x0 ${blkcnt} mmc write ${loadaddr} 0x0 ${blkcnt}
As a convenience, instead of the last three commands, one may also use the
update U-Boot wrapper:
.. code-block:: bash
> run update_uboot

View file

@ -1,7 +1,11 @@
.. SPDX-License-Identifier: GPL-2.0+ .. SPDX-License-Identifier: GPL-2.0-or-later
.. sectionauthor:: Marcel Ziswiler <marcel.ziswiler@toradex.com>
Colibri iMX8QXP V1.0D Module Colibri iMX8X Module
============================ ====================
- SoM: https://www.toradex.com/computer-on-modules/colibri-arm-family/nxp-imx-8x
- Carrier board: https://www.toradex.com/products/carrier-board/colibri-evaluation-board
Quick Start Quick Start
----------- -----------
@ -23,18 +27,19 @@ Get and Build the ARM Trusted Firmware
Get scfw_tcm.bin and ahab-container.img Get scfw_tcm.bin and ahab-container.img
--------------------------------------- ---------------------------------------
.. code-block:: bash .. code-block:: bash
$ wget https://github.com/toradex/i.MX-System-Controller-Firmware/raw/master/src/scfw_export_mx8qx_b0/build_mx8qx_b0/mx8qx-colibri-scfw-tcm.bin $ wget https://github.com/toradex/i.MX-System-Controller-Firmware/raw/master/src/scfw_export_mx8qx_b0/build_mx8qx_b0/mx8qx-colibri-scfw-tcm.bin
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/imx-seco-3.7.4.bin $ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/imx-seco-3.8.1.bin
$ sh imx-seco-3.7.4.bin --auto-accept $ sh imx-seco-3.8.1.bin --auto-accept
Copy the following firmware to the U-Boot folder: Copy the following firmware to the U-Boot folder:
.. code-block:: bash .. code-block:: bash
$ cp imx-atf/build/imx8qx/release/bl31.bin . $ cp imx-atf/build/imx8qx/release/bl31.bin .
$ cp imx-seco-3.7.4/firmware/seco/mx8qxc0-ahab-container.img mx8qx-ahab-container.img $ cp imx-seco-3.8.1/firmware/seco/mx8qxc0-ahab-container.img mx8qx-ahab-container.img
Build U-Boot Build U-Boot
------------ ------------
@ -51,8 +56,8 @@ Get the latest version of the universal update utility (uuu) aka ``mfgtools 3.0`
https://community.nxp.com/external-link.jspa?url=https%3A%2F%2Fgithub.com%2FNXPmicro%2Fmfgtools%2Freleases https://community.nxp.com/external-link.jspa?url=https%3A%2F%2Fgithub.com%2FNXPmicro%2Fmfgtools%2Freleases
Put the module into USB recovery aka serial downloader mode, connect USB device Put the module into USB recovery aka serial downloader mode, connect the USB
to your host and execute ``uuu``: device to your host and execute ``uuu``:
.. code-block:: bash .. code-block:: bash
@ -61,7 +66,8 @@ to your host and execute ``uuu``:
Flash the U-Boot Binary into the eMMC Flash the U-Boot Binary into the eMMC
------------------------------------- -------------------------------------
Burn the ``u-boot-dtb.imx`` binary to the primary eMMC hardware boot area partition: Burn the ``u-boot-dtb.imx`` binary to the primary eMMC hardware boot area
partition and boot:
.. code-block:: bash .. code-block:: bash
@ -69,3 +75,10 @@ Burn the ``u-boot-dtb.imx`` binary to the primary eMMC hardware boot area partit
setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200 setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200
mmc dev 0 1 mmc dev 0 1
mmc write ${loadaddr} 0x0 ${blkcnt} mmc write ${loadaddr} 0x0 ${blkcnt}
As a convenience, instead of the last three commands, one may also use the
update U-Boot wrapper:
.. code-block:: bash
> run update_uboot

View file

@ -1,7 +1,11 @@
.. SPDX-License-Identifier: GPL-2.0+ .. SPDX-License-Identifier: GPL-2.0-or-later
.. sectionauthor:: Igor Opaniuk <igor.opaniuk@toradex.com>
Colibri iMX7 Colibri iMX7 Modules
============ ====================
- SoM: https://www.toradex.com/computer-on-modules/colibri-arm-family/nxp-freescale-imx7
- Carrier board: https://www.toradex.com/products/carrier-board/colibri-evaluation-board
Quick Start Quick Start
----------- -----------
@ -21,11 +25,11 @@ Build U-Boot
$ make colibri_imx7_emmc_defconfig # For NAND: colibri_imx7_defconfig $ make colibri_imx7_emmc_defconfig # For NAND: colibri_imx7_defconfig
$ make $ make
After build succeeds, you will obtain final ``u-boot-dtb.imx`` IMX specific After the build succeeds, you will obtain the final ``u-boot-dtb.imx`` IMX
image, ready for flashing (but check next section for additional specific image, ready for flashing (but check next section for additional
adjustments). adjustments).
Final IMX program image includes (section ``6.6.7`` from `IMX7DRM The final IMX program image includes (section ``6.6.7`` from `IMX7DRM
<https://www.nxp.com/webapp/Download?colCode=IMX7DRM>`_): <https://www.nxp.com/webapp/Download?colCode=IMX7DRM>`_):
* **Image vector table** (IVT) for BootROM * **Image vector table** (IVT) for BootROM
@ -34,21 +38,20 @@ Final IMX program image includes (section ``6.6.7`` from `IMX7DRM
* **Device configuration data** * **Device configuration data**
* **User image**: U-Boot image (``u-boot-dtb.bin``) * **User image**: U-Boot image (``u-boot-dtb.bin``)
IMX image adjustments prior to flashing IMX image adjustments prior to flashing
--------------------------------------- ---------------------------------------
1. U-Boot for both Colibri iMX7 NAND and eMMC versions 1. U-Boot for both Colibri iMX7 NAND and eMMC versions
is built with HABv4 support (`AN4581.pdf is built with HABv4 support (`AN4581.pdf
<https://www.nxp.com/docs/en/application-note/AN4581.pdf>`_) <https://www.nxp.com/docs/en/application-note/AN4581.pdf>`_)
enabled by default, which requires to generate a proper enabled by default, which requires generating a proper
Command Sequence File (CSF) by srktool from NXP (not included in the Command Sequence File (CSF) by srktool from NXP (not included in the
U-Boot tree, check additional details in introduction_habv4.txt) U-Boot tree, check additional details in introduction_habv4.txt)
and concatenate it to the final ``u-boot-dtb.imx``. and concatenate it to the final ``u-boot-dtb.imx``.
2. In case if you don't want to generate a proper ``CSF`` (for any reason), 2. In case you don't want to generate a proper ``CSF`` (for any reason),
you still need to pad the IMX image so i has the same size as specified in you still need to pad the IMX image so it has the same size as specified in
in **Boot Data** section of IMX image. the **Boot Data** section of the IMX image.
To obtain this value, run: To obtain this value, run:
.. code-block:: bash .. code-block:: bash
@ -78,11 +81,11 @@ and then pad the image:
$ objcopy -I binary -O binary --pad-to 0xa7c60 --gap-fill=0x00 \ $ objcopy -I binary -O binary --pad-to 0xa7c60 --gap-fill=0x00 \
u-boot-dtb.imx u-boot-dtb.imx.zero-padded u-boot-dtb.imx u-boot-dtb.imx.zero-padded
3. Also, according to requirement from ``6.6.7.1``, the final image 3. Also, according to the requirement from ``6.6.7.1``, the final image
should have ``0x400`` offset for initial IVT table. should have ``0x400`` offset for the initial IVT table.
For eMMC setup we handle this by flashing it to ``0x400``, howewer For eMMC setup we handle this by flashing it to ``0x400``, however
for NAND setup we adjust the image prior to flashing, adding padding in the for NAND setup we adjust the image prior to flashing, adding padding at the
beginning of the image. beginning of the image.
.. code-block:: bash .. code-block:: bash
@ -97,7 +100,6 @@ boot area partition:
.. code-block:: bash .. code-block:: bash
=> load mmc 1:1 $loadaddr u-boot-dtb.imx.zero-padded => load mmc 1:1 $loadaddr u-boot-dtb.imx.zero-padded
=> setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200 => setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200
=> mmc dev 0 1 => mmc dev 0 1
@ -117,8 +119,8 @@ Flash U-Boot IMX image to NAND
Using update_uboot script Using update_uboot script
------------------------- -------------------------
You can also usb U-Boot env update_uboot script, You can also use U-Boot env update_uboot script,
which wraps all eMMC/NAND specific command invocation: which wraps all eMMC/NAND specific command invocations:
.. code-block:: bash .. code-block:: bash

View file

@ -24,12 +24,14 @@ For an overview of the TI AM62 SoC boot flow please head over to:
Sources: Sources:
-------- --------
.. include:: ../ti/k3.rst .. include:: ../ti/k3.rst
:start-after: .. k3_rst_include_start_boot_sources :start-after: .. k3_rst_include_start_boot_sources
:end-before: .. k3_rst_include_end_boot_sources :end-before: .. k3_rst_include_end_boot_sources
Build procedure: Build procedure:
---------------- ----------------
0. Setup the environment variables: 0. Setup the environment variables:
.. include:: ../ti/k3.rst .. include:: ../ti/k3.rst
@ -50,7 +52,7 @@ Set the variables corresponding to this platform:
$ export UBOOT_CFG_CORTEXR=verdin-am62_r5_defconfig $ export UBOOT_CFG_CORTEXR=verdin-am62_r5_defconfig
$ export UBOOT_CFG_CORTEXA=verdin-am62_a53_defconfig $ export UBOOT_CFG_CORTEXA=verdin-am62_a53_defconfig
$ export TFA_BOARD=lite $ export TFA_BOARD=lite
$ # we dont use any extra TFA parameters $ # we don't use any extra TFA parameters
$ unset TFA_EXTRA_ARGS $ unset TFA_EXTRA_ARGS
$ export OPTEE_PLATFORM=k3-am62x $ export OPTEE_PLATFORM=k3-am62x
$ export OPTEE_EXTRA_ARGS="CFG_WITH_SOFTWARE_PRNG=y" $ export OPTEE_EXTRA_ARGS="CFG_WITH_SOFTWARE_PRNG=y"
@ -72,12 +74,24 @@ Flash to eMMC
=> fatload mmc 1 ${loadaddr} u-boot.img => fatload mmc 1 ${loadaddr} u-boot.img
=> mmc write ${loadaddr} 0x1400 0x2000 => mmc write ${loadaddr} 0x1400 0x2000
As a convenience, instead of having to remember all those addresses and sizes,
one may also use the update U-Boot wrappers:
.. code-block:: bash
> tftpboot ${loadaddr} tiboot3-am62x-gp-verdin.bin
> run update_tiboot3
> tftpboot ${loadaddr} tispl.bin
> run update_tispl
> tftpboot ${loadaddr} u-boot.img
> run update_uboot
Boot Boot
---- ----
Output: Output::
.. code-block:: none
U-Boot SPL 2023.10-rc1-00210-gb678170a34c (Aug 03 2023 - 00:09:14 +0200) U-Boot SPL 2023.10-rc1-00210-gb678170a34c (Aug 03 2023 - 00:09:14 +0200)
SYSFW ABI: 3.1 (firmware rev 0x0009 '9.0.1--v09.00.01 (Kool Koala)') SYSFW ABI: 3.1 (firmware rev 0x0009 '9.0.1--v09.00.01 (Kool Koala)')

View file

@ -46,6 +46,7 @@ Get the DDR Firmware
Build U-Boot Build U-Boot
------------ ------------
.. code-block:: bash .. code-block:: bash
$ export CROSS_COMPILE=aarch64-linux-gnu- $ export CROSS_COMPILE=aarch64-linux-gnu-
@ -61,7 +62,7 @@ Flash to eMMC
> setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200 > setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200
> mmc dev 0 1 && mmc write ${loadaddr} 0x2 ${blkcnt} > mmc dev 0 1 && mmc write ${loadaddr} 0x2 ${blkcnt}
As a convenience, instead of the last two commands one may also use the update As a convenience, instead of the last two commands, one may also use the update
U-Boot wrapper: U-Boot wrapper:
.. code-block:: bash .. code-block:: bash
@ -71,16 +72,14 @@ U-Boot wrapper:
Boot Boot
---- ----
ATF, U-Boot proper and u-boot.dtb images are packed into FIT image, ATF, U-Boot proper and u-boot.dtb images are packed into a FIT image,
which is loaded and parsed by SPL. which is loaded and parsed by SPL.
Boot sequence is: Boot sequence is:
* SPL ---> ATF (TF-A) ---> U-Boot proper * SPL ---> ATF (TF-A) ---> U-Boot proper
Output: Output::
.. code-block:: none
U-Boot SPL 2021.10-rc2-00028-gee010ba1129 (Aug 23 2021 - 16:56:02 +0200) U-Boot SPL 2021.10-rc2-00028-gee010ba1129 (Aug 23 2021 - 16:56:02 +0200)
Normal Boot Normal Boot

View file

@ -46,6 +46,7 @@ Get the DDR Firmware
Build U-Boot Build U-Boot
------------ ------------
.. code-block:: bash .. code-block:: bash
$ export CROSS_COMPILE=aarch64-linux-gnu- $ export CROSS_COMPILE=aarch64-linux-gnu-
@ -61,7 +62,7 @@ Flash to eMMC
> setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200 > setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200
> mmc dev 2 1 && mmc write ${loadaddr} 0x0 ${blkcnt} > mmc dev 2 1 && mmc write ${loadaddr} 0x0 ${blkcnt}
As a convenience, instead of the last two commands one may also use the update As a convenience, instead of the last two commands, one may also use the update
U-Boot wrapper: U-Boot wrapper:
.. code-block:: bash .. code-block:: bash
@ -71,16 +72,14 @@ U-Boot wrapper:
Boot Boot
---- ----
ATF, U-Boot proper and u-boot.dtb images are packed into FIT image, ATF, U-Boot proper and u-boot.dtb images are packed into a FIT image,
which is loaded and parsed by SPL. which is loaded and parsed by SPL.
Boot sequence is: Boot sequence is:
* SPL ---> ATF (TF-A) ---> U-Boot proper * SPL ---> ATF (TF-A) ---> U-Boot proper
Output: Output::
.. code-block:: none
U-Boot SPL 2022.04-rc1-00164-g21a0312611-dirty (Feb 07 2022 - 11:34:04 +0100) U-Boot SPL 2022.04-rc1-00164-g21a0312611-dirty (Feb 07 2022 - 11:34:04 +0100)
Quad die, dual rank failed, attempting dual die, single rank configuration. Quad die, dual rank failed, attempting dual die, single rank configuration.

View file

@ -5,6 +5,17 @@ Building documentation
The U-Boot documentation is based on the Sphinx documentation generator. The U-Boot documentation is based on the Sphinx documentation generator.
In addition to the Python packages listed in ``doc/sphinx/requirements.txt``,
the following dependencies are needed to build the documentation:
* fontconfig
* graphviz
* imagemagick
* texinfo (if building the `Infodoc documentation`_)
HTML documentation HTML documentation
------------------ ------------------

View file

@ -39,7 +39,7 @@ needs_sphinx = '2.4.4'
extensions = ['kerneldoc', 'rstFlatTable', 'kernel_include', extensions = ['kerneldoc', 'rstFlatTable', 'kernel_include',
'kfigure', 'sphinx.ext.ifconfig', # 'automarkup', 'kfigure', 'sphinx.ext.ifconfig', # 'automarkup',
'maintainers_include', 'sphinx.ext.autosectionlabel', 'maintainers_include', 'sphinx.ext.autosectionlabel',
'kernel_abi', 'kernel_feat'] 'kernel_abi', 'kernel_feat', 'sphinx-prompt']
# #
# cdomain is badly broken in Sphinx 3+. Leaving it out generates *most* # cdomain is badly broken in Sphinx 3+. Leaving it out generates *most*

View file

@ -132,6 +132,9 @@ above bootdev scanning.
Controlling ordering Controlling ordering
-------------------- --------------------
By default, faster bootdevs (or those which are assumed to be faster) are used
first, since they are more likely to be able to boot the device quickly.
Several options are available to control the ordering of boot scanning: Several options are available to control the ordering of boot scanning:
@ -151,6 +154,10 @@ bootdevs and their sequence numbers.
bootmeths bootmeths
~~~~~~~~~ ~~~~~~~~~
By default bootmeths are checked in name order. Use `bootmeth list` to see the
ordering. Note that the `extlinux` and `script` bootmeth is first, to preserve the behaviour
used by the old distro scripts.
This environment variable can be used to control the list of bootmeths used and This environment variable can be used to control the list of bootmeths used and
their ordering for example:: their ordering for example::
@ -164,7 +171,6 @@ controlled by aliases.
The :ref:`usage/cmd/bootmeth:bootmeth command` (`bootmeth order`) operates in The :ref:`usage/cmd/bootmeth:bootmeth command` (`bootmeth order`) operates in
the same way as setting this variable. the same way as setting this variable.
Bootdev uclass Bootdev uclass
-------------- --------------

View file

@ -70,7 +70,7 @@ For the next scheduled release, release candidates were made on::
* U-Boot v2023.10-rc3 was released on Mon 21 August 2023. * U-Boot v2023.10-rc3 was released on Mon 21 August 2023.
.. * U-Boot v2023.10-rc4 was released on Mon 04 September 2023. * U-Boot v2023.10-rc4 was released on Mon 04 September 2023.
.. * U-Boot v2023.10-rc5 was released on Mon 18 September 2023. .. * U-Boot v2023.10-rc5 was released on Mon 18 September 2023.

View file

@ -254,6 +254,90 @@ This shows running with serial enabled (see `include/configs/efi-x86_app.h`)::
=> QEMU: Terminated => QEMU: Terminated
Run on VirtualBox (x86_64)
--------------------------
Enable EFI
~~~~~~~~~~
At settings for virtual machine the flag at **System->Motherboard->Enable EFI
(special OSes only)** has to be enabled.
Installation
~~~~~~~~~~~~
Provide the preinstalled Linux system as a Virtual Disk Image (VDI) and assign
it to a SATA controller (type AHCI) using the settings for the virtual machine
at menu item **System->Storage->Controller:SATA**.
For the following description three GPT partitions are assumed:
- Partition 1: formatted as FAT file-system and marked as EFI system partition
(partition type 0xEF00) used for the U-Boot EFI binary. (If VirtualBox is UEFI
compliant, it should recognize the ESP as the boot partition.)
- Partition 2: formatted as **ext4**, used for root file system
Create an extlinux.conf or a boot script
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Following files are assumed to be located at system for boot configuration::
Partition File Comment
1 EFI/BOOT/BOOTX64.efi # renamed U-Boot EFI image
1 Image # Linux image
1 Initrd # Initramfs of Linux
**EFI/BOOT/BOOTX64.efi** is a renamed build result **u-boot-payload.efi**, built with
**efi-x86_payload64_defconfig** configuration.
Boot script
~~~~~~~~~~~
The boot script **boot.scr** is assumed to be located at::
Partition File Comment
1 boot.scr # Boot script, generated with mkimage from template
Content of **boot.scr**:
.. code-block:: bash
ext4load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image
setenv kernel_size ${filesize}
ext4load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}Initrd
setenv initrd_size ${filesize}
zboot ${kernel_addr_r} ${kernel_size} ${ramdisk_addr_r} ${initrd_size}
Extlinux configuration
~~~~~~~~~~~~~~~~~~~~~~
Alternatively a configuration **extlinux.conf** can be used. **extlinux.conf**
is assumed to be located at::
Partition File Comment
1 extlinux/extlinux.conf # Extlinux boot configuration
Content of **extlinux.conf**:
.. code-block:: bash
default l0
menu title U-Boot menu
prompt 0
timeout 50
label l0
menu label Linux
linux /Image
initrd /Initrd
Additionally something like (sda is assumed as disk device):
.. code-block:: bash
append root=/dev/sda2 console=tty0 console=ttyS0,115200n8 rootwait rw
Future work Future work
----------- -----------

View file

@ -3,9 +3,18 @@
U-Boot Talks U-Boot Talks
============ ============
U-Boot is a topic at various conferences each year. These talkes might help you U-Boot is a topic at various conferences each year. These talks might help you
learn a bit about U-Boot. learn a bit about U-Boot:
See elinux_talks_ for a list. * `Tutorial: Introduction to the Embedded Boot Loader U-boot - Behan Webster,
Converse in Code <https://www.youtube.com/watch?v=INWghYZH3hI>`__
from Embedded Linux Conference 2020
(`slides <https://cm.e-ale.org/2020/ELC2020/intro-to-u-boot/intro-to-u-boot-2020.pdf>`__).
* `Recent Advances in U-Boot - Simon Glass, Google Inc.
<https://www.youtube.com/watch?v=YlJBsVZJkDI>`__
from Embedded Linux Conference 2023.
See elinux_talks_ for a more comprehensive list.
.. _elinux_talks: https://elinux.org/Boot_Loaders#U-Boot .. _elinux_talks: https://elinux.org/Boot_Loaders#U-Boot

View file

@ -15,6 +15,7 @@ requests==2.31.0
six==1.16.0 six==1.16.0
snowballstemmer==2.2.0 snowballstemmer==2.2.0
Sphinx==3.4.3 Sphinx==3.4.3
sphinx-prompt==1.5.0
sphinx-rtd-theme==1.0.0 sphinx-rtd-theme==1.0.0
sphinxcontrib-applehelp==1.0.2 sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2 sphinxcontrib-devhelp==1.0.2

184
doc/usage/cmd/gpt.rst Normal file
View file

@ -0,0 +1,184 @@
.. SPDX-License-Identifier: GPL-2.0+
gpt command
===========
Synopsis
--------
::
gpt enumerate <interface> <dev>
gpt guid <interface> <dev> [<varname>]
gpt read <interface> <dev> [<varname>]
gpt rename <interface> <dev> <part> <name>
gpt repair <interface> <dev>
gpt setenv <interface> <dev> <partition name>
gpt swap <interface> <dev> <name1> <name2>
gpt verify <interface> <dev> [<partition string>]
gpt write <interface> <dev> <partition string>
Description
-----------
The gpt command lets users read, create, modify, or verify the GPT (GUID
Partition Table) partition layout.
Common arguments:
interface
interface for accessing the block device (mmc, sata, scsi, usb, ....)
dev
device number
partition string
Describes the GPT partition layout for a disk. The syntax is similar to
the one used by the :doc:`mbr command <mbr>` command. The string contains
one or more partition descriptors, each separated by a ";". Each descriptor
contains one or more fields, with each field separated by a ",". Fields are
either of the form "key=value" to set a specific value, or simple "flag" to
set a boolean flag
The first descriptor can optionally be used to describe parameters for the
whole disk with the following fields:
* uuid_disk=UUID - Set the UUID for the disk
Partition descriptors can have the following fields:
* name=<NAME> - The partition name, required
* start=<BYTES> - The partition start offset in bytes, required
* size=<BYTES> - The partition size in bytes or "-" to expand it to the whole free area
* bootable - Set the legacy bootable flag
* uuid=<UUID> - The partition UUID, optional if CONFIG_RANDOM_UUID=y is enabled
* type=<UUID> - The partition type GUID, requires CONFIG_PARTITION_TYPE_GUID=y
If 'uuid' is not specified, but CONFIG_RANDOM_UUID is enabled, a random UUID
will be generated for the partition
gpt enumerate
~~~~~~~~~~~~~
Sets the variable 'gpt_partition_list' to be a list of all the partition names
on the device.
gpt guid
~~~~~~~~
Report the GUID of a disk. If 'varname' is specified, the command will set the
variable to the GUID, otherwise it will be printed out.
gpt read
~~~~~~~~
Prints the current state of the GPT partition table. If 'varname' is specified,
the variable will be filled with a partition string in the same format as a
'<partition string>', suitable for passing to other 'gpt' commands. If the
argument is omitted, a human readable description is printed out.
CONFIG_CMD_GPT_RENAME=y is required.
gpt rename
~~~~~~~~~~
Renames all partitions named 'part' to be 'name'. CONFIG_CMD_GPT_RENAME=y is
required.
gpt repair
~~~~~~~~~~
Repairs the GPT partition tables if it they become corrupted.
gpt setenv
~~~~~~~~~~
The 'gpt setenv' command will set a series of environment variables with
information about the partition named '<partition name>'. The variables are:
gpt_partition_addr
the starting offset of the partition in blocks as a hexadecimal number
gpt_partition_size
the size of the partition in blocks as a hexadecimal number
gpt_partition_name
the name of the partition
gpt_partition_entry
the partition number in the table, e.g. 1, 2, 3, etc.
gpt swap
~~~~~~~~
Changes the names of all partitions that are named 'name1' to be 'name2', and
all partitions named 'name2' to be 'name1'. CONFIG_CMD_GPT_RENAME=y is
required.
gpt verify
~~~~~~~~~~
Sets return value $? to 0 (true) if the partition layout on the
specified disk matches the one in the provided partition string, and 1 (false)
if it does not match. If no partition string is specified, the command will
check if the disk is partitioned or not.
gpt write
~~~~~~~~~
(Re)writes the partition table on the disk to match the provided
partition string. It returns 0 on success or 1 on failure.
Configuration
-------------
To use the 'gpt' command you must specify CONFIG_CMD_GPT=y. To enable 'gpt
read', 'gpt swap' and 'gpt rename', you must specify CONFIG_CMD_GPT_RENAME=y.
Examples
~~~~~~~~
Create 6 partitions on a disk::
=> setenv gpt_parts 'uuid_disk=bec9fc2a-86c1-483d-8a0e-0109732277d7;
name=boot,start=4M,size=128M,bootable,type=ebd0a0a2-b9e5-4433-87c0-68b6b72699c7,
name=rootfs,size=3072M,type=0fc63daf-8483-4772-8e79-3d69d8477de4;
name=system-data,size=512M,type=0fc63daf-8483-4772-8e79-3d69d8477de4;
name=[ext],size=-,type=0fc63daf-8483-4772-8e79-3d69d8477de4;
name=user,size=-,type=0fc63daf-8483-4772-8e79-3d69d8477de4;
name=modules,size=100M,type=0fc63daf-8483-4772-8e79-3d69d8477de4;
name=ramdisk,size=8M,type=0fc63daf-8483-4772-8e79-3d69d8477de4
=> gpt write mmc 0 $gpt_parts
Verify that the device matches the partition layout described in the variable
$gpt_parts::
=> gpt verify mmc 0 $gpt_parts
Get the information about the partition named 'rootfs'::
=> gpt setenv mmc 0 rootfs
=> echo ${gpt_partition_addr}
2000
=> echo ${gpt_partition_size}
14a000
=> echo ${gpt_partition_name}
rootfs
=> echo ${gpt_partition_entry}
2
Get the list of partition names on the disk::
=> gpt enumerate
=> echo gpt_partition_list
boot rootfs system-data [ext] user modules ramdisk
Get the GUID for a disk::
=> gpt guid mmc 0
bec9fc2a-86c1-483d-8a0e-0109732277d7
=> gpt guid mmc gpt_disk_uuid
=> echo ${gpt_disk_uuid}
bec9fc2a-86c1-483d-8a0e-0109732277d7

View file

@ -4,6 +4,7 @@ Use U-Boot
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
spl_boot
blkmap blkmap
dfu dfu
environment environment
@ -65,6 +66,7 @@ Shell commands
cmd/for cmd/for
cmd/fwu_mdata cmd/fwu_mdata
cmd/gpio cmd/gpio
cmd/gpt
cmd/host cmd/host
cmd/imxtract cmd/imxtract
cmd/load cmd/load

321
doc/usage/spl_boot.rst Normal file
View file

@ -0,0 +1,321 @@
.. SPDX-License-Identifier: GPL-2.0-or-later
Booting from TPL/SPL
====================
The main U-Boot binary may be too large to be loaded directly by the Boot ROM.
This was the original driver for splitting up U-Boot into multiple boot stages.
U-Boot typically goes through the following boot phases where TPL, VPL, and SPL
are optional. While many boards use SPL only few use TPL.
TPL
Tertiary Program Loader. Very early init, as tiny as possible. This loads SPL
(or VPL if enabled).
VPL
Verifying Program Loader. Optional verification step, which can select one of
several SPL binaries, if A/B verified boot is enabled. Implementation of the
VPL logic is work-in-progress. For now it just boots into SPL.
SPL
Secondary Program Loader. Sets up SDRAM and loads U-Boot proper. It may also
load other firmware components.
U-Boot
U-Boot proper. This is the only stage containing command. It also implements
logic to load an operating system, e.g. via UEFI.
.. note::
The naming convention on the PowerPC architecture deviates from the other
archtitectures. Here the boot sequence is SPL->TPL->U-Boot.
Further usages for U-Boot SPL comprise:
* launching BL31 of ARM Trusted Firmware which invokes U-Boot as BL33
* launching EDK II
* launching Linux, e.g. :doc:`Falcon Mode <../develop/falcon>`
* launching RISC-V OpenSBI which invokes main U-Boot
Target binaries
---------------
Binaries loaded by SPL/TPL can be:
* raw binaries where the entry address equals the start address. This is the
only binary format supported by TPL.
* :doc:`FIT <fit/index>` images
* legacy U-Boot images
Configuration
~~~~~~~~~~~~~
Raw images are only supported in SPL if CONFIG_SPL_RAW_IMAGE_SUPPORT=y.
CONFIG_SPL_FIT=y and CONFIG_SPL_LOAD_FIT=y are needed to load FIT images.
CONFIG_SPL_LEGACY_IMAGE_FORMAT=y is needed to load legacy U-Boot images.
CONFIG_SPL_LEGACY_IMAGE_CRC_CHECK=y enables checking the CRC32 of legacy U-Boot
images.
Image load methods
------------------
The image boot methods available for a board must be defined in two places:
The board code implements a function board_boot_order() enumerating up to
five boot methods and the sequence in which they are tried. (The maximum
number of boot methods is currently hard coded as variable spl_boot_list[]).
If there is only one boot method function, spl_boot_device() may be implemented
instead.
The configuration controls which of these boot methods are actually available.
Loading from block devices
~~~~~~~~~~~~~~~~~~~~~~~~~~
MMC1, MMC2, MMC2_2
These methods read an image from SD card or eMMC. The first digit after
'MMC' indicates the device number. Required configuration settings include:
* CONFIG_SPL_MMC=y or CONFIG_TPL_MMC=y
To use a PCI connected MMC controller you need to additionally specify:
* CONFIG_SPL_PCI=y
* CONFIG_SPL_PCI_PNP=y
* CONFIG_MMC=y
* CONFIG_MMC_PCI=y
* CONFIG_MMC_SDHCI=y
To load from a file system use:
* CONFIG_SPL_FS_FAT=y or CONFIG_SPL_FS_EXT=y
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<filepath>"
NVMe
This methods load the image from an NVMe drive.
Required configuration settings include:
* CONFIG_SPL_PCI=y
* CONFIG_SPL_PCI_PNP=y
* CONFIG_SPL_NVME=y
* CONFIG_SPL_NVME_PCI=y
* CONFIG_SPL_NVME_BOOT_DEVICE (number of the NVMe device)
* CONFIG_SYS_NVME_BOOT_PARTITION (partition to read from)
To load from a file system use:
* CONFIG_SPL_FS_FAT=y or CONFIG_SPL_FS_EXT=y
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<filepath>"
SATA
This method reads an image from a SATA drive.
Required configuration settings include:
* CONFIG_SPL_SATA=y or CONFIG_TPL_SATA=y
To use a PCIe connecte SATA controller you additionally need:
* CONFIG_SPL_PCI=y
* CONFIG_SPL_SATA=y
* CONFIG_SPL_AHCI_PCI=y
* CONFIG_SPL_PCI_PNP=y
To load from a file system use:
* CONFIG_SPL_FS_FAT=y
* CONFIG_SYS_SATA_FAT_BOOT_PARTITION=<partition number>
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<filepath>"
USB
The USB method loads an image from a USB block device.
Required configuration settings include:
* CONFIG_SPL_USB_HOST=y
* CONFIG_SPL_USB_STORAGE=y
To use a PCI connected USB 3.0 controller you additionally need:
* CONFIG_SPL_FS_FAT=y
* CONFIG_SPL_PCI=y
* CONFIG_SPL_PCI_PNP=y
* CONFIG_USB=y
* CONFIG_USB_XHCI_HCD=y
* CONFIG_USB_XHCI_PCI=y
To load from a file system use:
* CONFIG_SPL_FS_FAT=y or CONFIG_SPL_FS_EXT=y
* CONFIG_SYS_USB_FAT_BOOT_PARTITION=<partition number>
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<filepath>"
Loading from raw flash devices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NAND
This method loads the image from NAND flash. To read from raw NAND the
following configuration settings are required:
* CONFIG_SPL_NAND_SUPPORT=y or CONFIG_TPL_NAND_SUPPORT=y
If CONFIG_SPL_NAND_RAW_ONLY=y only raw images can be loaded.
For using UBI (Unsorted Block Images) volumes to read from NAND the
following configuration settings are required:
* CONFIG_SPL_UBI=y or CONFIG_TPL_UBI=y
The UBI volume to read can either be specified
* by name using CONFIG_SPL_UBI_LOAD_BY_VOLNAME or
* by number using CONFIG_SPL_UBI_LOAD_MONITOR_ID.
NOR
This method loads the image from NOR flash.
Required configuration settings include:
* CONFIG_SPL_NOR_SUPPORT=y or CONFIG_TPL_NOR_SUPPORT=y
OneNAND
This methods loads the image from a OneNAND device. To read from raw OneNAND
the following configuration settings are required:
* CONFIG_SPL_ONENAND_SUPPORT=y or CONFIG_TPL_ONENAND_SUPPORT=y
For using the Ubi file system to read from NAND the following configuration
settings are required:
* CONFIG_SPL_UBI=y or CONFIG_TPL_UBI=y
SPI
This method loads an image form SPI NOR flash.
Required configuration settings include:
* CONFIG_SPL_DM_SPI=y
* CONFIG_SPL_SPI_FLASH=y
* CONFIG_SPI_LOAD=y or CONFIG_TPL_SPI_LOAD=y
Sunxi SPI
This method which is specific to Allwinner SoCs loads an image form SPI NOR
flash. Required configuration settings include:
* CONFIG_SPL_SPI_SUNXI=y
Loading from other devices
~~~~~~~~~~~~~~~~~~~~~~~~~~
BOOTROM
The binary is loaded by the boot ROM.
Required configuration settings include:
* CONFIG_SPL_BOOTROM_SUPPORT=y or CONFIG_TPL_BOOTROM_SUPPORT=y
DFU
:doc:`Device Firmware Upgrade <dfu>` is used to load the binary into RAM.
Required configuration settings include:
* CONFIG_DFU=y
* CONFIG_SPL_RAM_SUPPORT=y or CONFIG TPL_RAM_SUPPORT=y
Ethernet
This method loads an image over Ethernet. The BOOTP protocol is used to find
a TFTP server and binary name. The binary is downloaded via the TFTP
protocol. Required configuration settings include:
* CONFIG_SPL_NET=y or CONFIG_TPL_NET=y
* CONFIG_SPL_ETH_DEVICE=y or CONFIG_DM_USB_GADGET=y
FEL
This method does not actually load an image for U-Boot.
FEL is a routine contained in the boot ROM of Allwinner SoCs which serves
for the initial programming or recovery via USB
RAM
This method uses an image preloaded into RAM.
Required configuration settings include:
* CONFIG_SPL_RAM_SUPPORT=y or CONFIG_TPL_RAM_SUPPORT=y
* CONFIG_RAM_DEVICE=y
Sandbox file
On the sandbox this method loads an image from the host file system.
Sandbox image
On the sandbox this method loads an image from the host file system.
Semihosting
When running in an ARM or RISC-V virtual machine the semihosting method can
be used to load an image from the host file system.
Required configuration settings include:
* CONFIG_SPL_SEMIHOSTING=y
* CONFIG_SPL_SEMIHOSTING_FALLBACK=y
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME=<path to file>
UART
This method loads an image via the Y-Modem protocol from the UART.
Required configuration settings include:
* CONFIG_SPL_YMODEM_SUPPORT=y or CONFIG_TPL_YMODEM_SUPPORT=y
USB SDP
This method loads the image using the Serial Download Protocol as
implemented by the boot ROM of the i.MX family of SoCs.
Required configuration settings include:
* CONFIG_SPL_SERIAL=y
* CONFIG_SPL_USB_SDP_SUPPORT=y or CONFIG_TPL_USB_SDP_SUPPORT
VBE Simple
This method is used by the VPL stage to extract the next stage image from
the loaded image.
Required configuration settings include:
* CONFIG_VPL=y
* CONFIG_SPL_BOOTMETH_VBE_SIMPLE_FW=y or CONFIG_TPL_BOOTMETH_VBE_SIMPLE_FW=y
XIP
This method executes an image in place.
Required configuration settings include:
* CONFIG_SPL_XIP_SUPPORT

View file

@ -436,8 +436,10 @@ int dm_init_and_scan(bool pre_reloc_only)
return ret; return ret;
} }
} }
if (CONFIG_IS_ENABLED(DM_EVENT) && !(gd->flags & GD_FLG_RELOC)) { if (CONFIG_IS_ENABLED(DM_EVENT)) {
ret = event_notify_null(EVT_DM_POST_INIT_F); ret = event_notify_null(gd->flags & GD_FLG_RELOC ?
EVT_DM_POST_INIT_R :
EVT_DM_POST_INIT_F);
if (ret) if (ret)
return log_msg_ret("ev", ret); return log_msg_ret("ev", ret);
} }

View file

@ -14,6 +14,8 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/err.h> #include <linux/err.h>
#include <clk.h> #include <clk.h>
#include <dm/device_compat.h>
#include <power/regulator.h>
#define PHY_CTRL0 0x0 #define PHY_CTRL0 0x0
#define PHY_CTRL0_REF_SSP_EN BIT(2) #define PHY_CTRL0_REF_SSP_EN BIT(2)
@ -76,11 +78,10 @@ enum imx8mpq_phy_type {
}; };
struct imx8mq_usb_phy { struct imx8mq_usb_phy {
#if CONFIG_IS_ENABLED(CLK)
struct clk phy_clk; struct clk phy_clk;
#endif
void __iomem *base; void __iomem *base;
enum imx8mpq_phy_type type; enum imx8mpq_phy_type type;
struct udevice *vbus_supply;
}; };
static const struct udevice_id imx8mq_usb_phy_of_match[] = { static const struct udevice_id imx8mq_usb_phy_of_match[] = {
@ -173,15 +174,23 @@ static int imx8mq_usb_phy_power_on(struct phy *usb_phy)
struct udevice *dev = usb_phy->dev; struct udevice *dev = usb_phy->dev;
struct imx8mq_usb_phy *imx_phy = dev_get_priv(dev); struct imx8mq_usb_phy *imx_phy = dev_get_priv(dev);
u32 value; u32 value;
#if CONFIG_IS_ENABLED(CLK)
int ret; int ret;
ret = clk_enable(&imx_phy->phy_clk);
if (ret) { if (CONFIG_IS_ENABLED(CLK)) {
printf("Failed to enable usb phy clock\n"); ret = clk_enable(&imx_phy->phy_clk);
return ret; if (ret) {
dev_err(dev, "Failed to enable usb phy clock: %d\n", ret);
return ret;
}
}
if (CONFIG_IS_ENABLED(DM_REGULATOR) && imx_phy->vbus_supply) {
ret = regulator_set_enable_if_allowed(imx_phy->vbus_supply, true);
if (ret && ret != -ENOSYS) {
dev_err(dev, "Failed to enable VBUS regulator: %d\n", ret);
goto err;
}
} }
#endif
/* Disable rx term override */ /* Disable rx term override */
value = readl(imx_phy->base + PHY_CTRL6); value = readl(imx_phy->base + PHY_CTRL6);
@ -189,6 +198,11 @@ static int imx8mq_usb_phy_power_on(struct phy *usb_phy)
writel(value, imx_phy->base + PHY_CTRL6); writel(value, imx_phy->base + PHY_CTRL6);
return 0; return 0;
err:
if (CONFIG_IS_ENABLED(CLK))
clk_disable(&imx_phy->phy_clk);
return ret;
} }
static int imx8mq_usb_phy_power_off(struct phy *usb_phy) static int imx8mq_usb_phy_power_off(struct phy *usb_phy)
@ -196,15 +210,23 @@ static int imx8mq_usb_phy_power_off(struct phy *usb_phy)
struct udevice *dev = usb_phy->dev; struct udevice *dev = usb_phy->dev;
struct imx8mq_usb_phy *imx_phy = dev_get_priv(dev); struct imx8mq_usb_phy *imx_phy = dev_get_priv(dev);
u32 value; u32 value;
int ret;
/* Override rx term to be 0 */ /* Override rx term to be 0 */
value = readl(imx_phy->base + PHY_CTRL6); value = readl(imx_phy->base + PHY_CTRL6);
value |= PHY_CTRL6_RXTERM_OVERRIDE_SEL; value |= PHY_CTRL6_RXTERM_OVERRIDE_SEL;
writel(value, imx_phy->base + PHY_CTRL6); writel(value, imx_phy->base + PHY_CTRL6);
#if CONFIG_IS_ENABLED(CLK) if (CONFIG_IS_ENABLED(CLK))
clk_disable(&imx_phy->phy_clk); clk_disable(&imx_phy->phy_clk);
#endif
if (CONFIG_IS_ENABLED(DM_REGULATOR) && imx_phy->vbus_supply) {
ret = regulator_set_enable_if_allowed(imx_phy->vbus_supply, false);
if (ret && ret != -ENOSYS) {
dev_err(dev, "Failed to disable VBUS regulator: %d\n", ret);
return ret;
}
}
return 0; return 0;
} }
@ -224,6 +246,7 @@ struct phy_ops imx8mq_usb_phy_ops = {
int imx8mq_usb_phy_probe(struct udevice *dev) int imx8mq_usb_phy_probe(struct udevice *dev)
{ {
struct imx8mq_usb_phy *priv = dev_get_priv(dev); struct imx8mq_usb_phy *priv = dev_get_priv(dev);
int ret;
priv->type = dev_get_driver_data(dev); priv->type = dev_get_driver_data(dev);
priv->base = dev_read_addr_ptr(dev); priv->base = dev_read_addr_ptr(dev);
@ -231,16 +254,22 @@ int imx8mq_usb_phy_probe(struct udevice *dev)
if (!priv->base) if (!priv->base)
return -EINVAL; return -EINVAL;
#if CONFIG_IS_ENABLED(CLK) if (CONFIG_IS_ENABLED(CLK)) {
int ret; ret = clk_get_by_name(dev, "phy", &priv->phy_clk);
if (ret) {
/* Assigned clock already set clock */ dev_err(dev, "Failed to get usb phy clock %d\n", ret);
ret = clk_get_by_name(dev, "phy", &priv->phy_clk); return ret;
if (ret) { }
printf("Failed to get usb phy clock\n"); }
return ret;
if (CONFIG_IS_ENABLED(DM_REGULATOR)) {
ret = device_get_supply_regulator(dev, "vbus-supply",
&priv->vbus_supply);
if (ret && ret != -ENOENT) {
dev_err(dev, "Failed to get VBUS regulator: %d\n", ret);
return ret;
}
} }
#endif
return 0; return 0;
} }

View file

@ -145,7 +145,8 @@ static int dwc3_generic_remove(struct udevice *dev,
struct dwc3 *dwc3 = &priv->dwc3; struct dwc3 *dwc3 = &priv->dwc3;
if (CONFIG_IS_ENABLED(DM_GPIO) && if (CONFIG_IS_ENABLED(DM_GPIO) &&
device_is_compatible(dev->parent, "xlnx,zynqmp-dwc3")) { device_is_compatible(dev->parent, "xlnx,zynqmp-dwc3") &&
priv->ulpi_reset) {
struct gpio_desc *ulpi_reset = priv->ulpi_reset; struct gpio_desc *ulpi_reset = priv->ulpi_reset;
dm_gpio_free(ulpi_reset->dev, ulpi_reset); dm_gpio_free(ulpi_reset->dev, ulpi_reset);

View file

@ -13,8 +13,6 @@
#include <asm/arch/base.h> #include <asm/arch/base.h>
#endif #endif
/* Architecture, CPU, etc.*/
/* Use SoC timer for AArch32, but architected timer for AArch64 */ /* Use SoC timer for AArch32, but architected timer for AArch64 */
#ifndef CONFIG_ARM64 #ifndef CONFIG_ARM64
#define CFG_SYS_TIMER_RATE 1000000 #define CFG_SYS_TIMER_RATE 1000000
@ -33,136 +31,4 @@
*/ */
#define CFG_SYS_SDRAM_SIZE SZ_128M #define CFG_SYS_SDRAM_SIZE SZ_128M
/* Devices */
/* LCD */
/* DFU over USB/UDC */
#ifdef CONFIG_CMD_DFU
#ifdef CONFIG_ARM64
#define KERNEL_FILENAME "Image"
#else
#define KERNEL_FILENAME "zImage"
#endif
#define ENV_DFU_SETTINGS \
"dfu_alt_info=u-boot.bin fat 0 1;uboot.env fat 0 1;" \
"config.txt fat 0 1;" \
KERNEL_FILENAME " fat 0 1\0"
#else
#define ENV_DFU_SETTINGS ""
#endif
/* Console configuration */
/* Environment */
/* Shell */
/* Environment */
#define ENV_DEVICE_SETTINGS \
"stdin=serial,usbkbd\0" \
"stdout=serial,vidconsole\0" \
"stderr=serial,vidconsole\0"
#ifdef CONFIG_ARM64
#define FDT_HIGH "ffffffffffffffff"
#define INITRD_HIGH "ffffffffffffffff"
#else
#define FDT_HIGH "ffffffff"
#define INITRD_HIGH "ffffffff"
#endif
/*
* Memory layout for where various images get loaded by boot scripts:
*
* I suspect address 0 is used as the SMP pen on the RPi2, so avoid this.
*
* Older versions of the boot firmware place the firmware-loaded DTB at 0x100,
* newer versions place it in high memory. So prevent U-Boot from doing its own
* DTB + initrd relocation so that we won't accidentally relocate the initrd
* over the firmware-loaded DTB and generally try to lay out things starting
* from the bottom of RAM.
*
* kernel_addr_r has different constraints on ARM and Aarch64. For 32-bit ARM,
* it must be within the first 128M of RAM in order for the kernel's
* CONFIG_AUTO_ZRELADDR option to work. The kernel itself will be decompressed
* to 0x8000 but the decompressor clobbers 0x4000-0x8000 as well. The
* decompressor also likes to relocate itself to right past the end of the
* decompressed kernel, so in total the sum of the compressed and and
* decompressed kernel needs to be reserved.
*
* For Aarch64, the kernel image is uncompressed and must be loaded at
* text_offset bytes (specified in the header of the Image) into a 2MB
* boundary. The 'booti' command relocates the image if necessary. Linux uses
* a default text_offset of 0x80000. In summary, loading at 0x80000
* satisfies all these constraints and reserving memory up to 0x02400000
* permits fairly large (roughly 36M) kernels.
*
* scriptaddr and pxefile_addr_r can be pretty much anywhere that doesn't
* conflict with something else. Reserving 1M for each of them at
* 0x02400000-0x02500000 and 0x02500000-0x02600000 should be plenty.
*
* On ARM, both the DTB and any possible initrd must be loaded such that they
* fit inside the lowmem mapping in Linux. In practice, this usually means not
* more than ~700M away from the start of the kernel image but this number can
* be larger OR smaller depending on e.g. the 'vmalloc=xxxM' command line
* parameter given to the kernel. So reserving memory from low to high
* satisfies this constraint again. Reserving 1M at 0x02600000-0x02700000 for
* the DTB leaves rest of the free RAM to the initrd starting at 0x02700000.
* Even with the smallest possible CPU-GPU memory split of the CPU getting
* only 64M, the remaining 25M starting at 0x02700000 should allow quite
* large initrds before they start colliding with U-Boot.
*/
#define ENV_MEM_LAYOUT_SETTINGS \
"fdt_high=" FDT_HIGH "\0" \
"initrd_high=" INITRD_HIGH "\0" \
"kernel_addr_r=0x00080000\0" \
"scriptaddr=0x02400000\0" \
"pxefile_addr_r=0x02500000\0" \
"fdt_addr_r=0x02600000\0" \
"ramdisk_addr_r=0x02700000\0"
#if IS_ENABLED(CONFIG_CMD_MMC)
#define BOOT_TARGET_MMC(func) \
func(MMC, mmc, 0) \
func(MMC, mmc, 1) \
func(MMC, mmc, 2)
#else
#define BOOT_TARGET_MMC(func)
#endif
#if IS_ENABLED(CONFIG_CMD_USB)
#define BOOT_TARGET_USB(func) func(USB, usb, 0)
#else
#define BOOT_TARGET_USB(func)
#endif
#if CONFIG_IS_ENABLED(CMD_PXE)
#define BOOT_TARGET_PXE(func) func(PXE, pxe, na)
#else
#define BOOT_TARGET_PXE(func)
#endif
#if CONFIG_IS_ENABLED(CMD_DHCP)
#define BOOT_TARGET_DHCP(func) func(DHCP, dhcp, na)
#else
#define BOOT_TARGET_DHCP(func)
#endif
#define BOOT_TARGET_DEVICES(func) \
BOOT_TARGET_MMC(func) \
BOOT_TARGET_USB(func) \
BOOT_TARGET_PXE(func) \
BOOT_TARGET_DHCP(func)
#include <config_distro_bootcmd.h>
#define CFG_EXTRA_ENV_SETTINGS \
"dhcpuboot=usb start; dhcp u-boot.uimg; bootm\0" \
ENV_DEVICE_SETTINGS \
ENV_DFU_SETTINGS \
ENV_MEM_LAYOUT_SETTINGS \
BOOTENV
#endif #endif

View file

@ -19,17 +19,79 @@
* @EVT_DM_PRE_PROBE: Device is about to be probed * @EVT_DM_PRE_PROBE: Device is about to be probed
*/ */
enum event_t { enum event_t {
EVT_NONE, /**
* @EVT_NONE: This zero value is not used for events.
*/
EVT_NONE = 0,
/**
* @EVT_TEST: This event is used in unit tests.
*/
EVT_TEST, EVT_TEST,
/* Events related to driver model */ /**
* @EVT_DM_POST_INIT_F:
* This event is triggered after pre-relocation initialization of the
* driver model. Its parameter is NULL.
* A non-zero return code from the event handler let's the boot process
* fail.
*/
EVT_DM_POST_INIT_F, EVT_DM_POST_INIT_F,
/**
* @EVT_DM_POST_INIT_R:
* This event is triggered after post-relocation initialization of the
* driver model. Its parameter is NULL.
* A non-zero return code from the event handler let's the boot process
* fail.
*/
EVT_DM_POST_INIT_R,
/**
* @EVT_DM_PRE_PROBE:
* This event is triggered before probing a device. Its parameter is the
* device to be probed.
* A non-zero return code from the event handler lets the device not
* being probed.
*/
EVT_DM_PRE_PROBE, EVT_DM_PRE_PROBE,
/**
* @EVT_DM_POST_PROBE:
* This event is triggered after probing a device. Its parameter is the
* device that was probed.
* A non-zero return code from the event handler leaves the device in
* the unprobed state and therefore not usable.
*/
EVT_DM_POST_PROBE, EVT_DM_POST_PROBE,
/**
* @EVT_DM_PRE_REMOVE:
* This event is triggered after removing a device. Its parameter is
* the device to be removed.
* A non-zero return code from the event handler stops the removal of
* the device before any changes.
*/
EVT_DM_PRE_REMOVE, EVT_DM_PRE_REMOVE,
/**
* @EVT_DM_POST_REMOVE:
* This event is triggered before removing a device. Its parameter is
* the device that was removed.
* A non-zero return code stops from the event handler the removal of
* the device after all removal changes. The previous state is not
* restored. All children will be gone and the device may not be
* functional.
*/
EVT_DM_POST_REMOVE, EVT_DM_POST_REMOVE,
/* Init hooks */ /**
* @EVT_MISC_INIT_F:
* This event is triggered during the initialization sequence before
* relocation. Its parameter is NULL.
* A non-zero return code from the event handler let's the boot process
* fail.
*/
EVT_MISC_INIT_F, EVT_MISC_INIT_F,
/* /*
@ -53,15 +115,39 @@ enum event_t {
*/ */
EVT_LAST_STAGE_INIT, EVT_LAST_STAGE_INIT,
/* Fpga load hook */ /**
* @EVT_FPGA_LOAD:
* The FPGA load hook is called after loading an FPGA with a new binary.
* Its parameter is of type struct event_fpga_load and contains
* information about the loaded image.
*/
EVT_FPGA_LOAD, EVT_FPGA_LOAD,
/* Device tree fixups before booting */ /**
* @EVT_FT_FIXUP:
* This event is triggered during device-tree fix up after all
* other device-tree fixups have been executed.
* Its parameter is of type struct event_ft_fixup which contains
* the address of the device-tree to fix up and the list of images to be
* booted.
* A non-zero return code from the event handler let's booting the
* images fail.
*/
EVT_FT_FIXUP, EVT_FT_FIXUP,
/* To be called once, before calling main_loop() */ /**
* @EVT_MAIN_LOOP:
* This event is triggered immediately before calling main_loop() which
* is the entry point of the command line. Its parameter is NULL.
* A non-zero return value causes the boot to fail.
*/
EVT_MAIN_LOOP, EVT_MAIN_LOOP,
/**
* @EVT_COUNT:
* This constants holds the maximum event number + 1 and is used when
* looping over all event classes.
*/
EVT_COUNT EVT_COUNT
}; };

View file

@ -260,7 +260,7 @@ int video_fill_part(struct udevice *dev, int xstart, int ystart, int xend,
int video_sync(struct udevice *vid, bool force); int video_sync(struct udevice *vid, bool force);
/** /**
* video_sync_all() - Sync all devices' frame buffers with there hardware * video_sync_all() - Sync all devices' frame buffers with their hardware
* *
* This calls video_sync() on all active video devices. * This calls video_sync() on all active video devices.
*/ */

View file

@ -73,9 +73,9 @@ obj-$(CONFIG_ECDSA) += ecdsa/
obj-$(CONFIG_$(SPL_)RSA) += rsa/ obj-$(CONFIG_$(SPL_)RSA) += rsa/
obj-$(CONFIG_HASH) += hash-checksum.o obj-$(CONFIG_HASH) += hash-checksum.o
obj-$(CONFIG_BLAKE2) += blake2/blake2b.o obj-$(CONFIG_BLAKE2) += blake2/blake2b.o
obj-$(CONFIG_SHA1) += sha1.o obj-$(CONFIG_$(SPL_)SHA1) += sha1.o
obj-$(CONFIG_SHA256) += sha256.o obj-$(CONFIG_$(SPL_)SHA256) += sha256.o
obj-$(CONFIG_SHA512) += sha512.o obj-$(CONFIG_$(SPL_)SHA512) += sha512.o
obj-$(CONFIG_CRYPT_PW) += crypt/ obj-$(CONFIG_CRYPT_PW) += crypt/
obj-$(CONFIG_$(SPL_)ASN1_DECODER) += asn1_decoder.o obj-$(CONFIG_$(SPL_)ASN1_DECODER) += asn1_decoder.o

View file

@ -61,7 +61,7 @@ static volatile gd_t *efi_gd, *app_gd;
static efi_status_t efi_uninstall_protocol static efi_status_t efi_uninstall_protocol
(efi_handle_t handle, const efi_guid_t *protocol, (efi_handle_t handle, const efi_guid_t *protocol,
void *protocol_interface); void *protocol_interface, bool preserve);
/* 1 if inside U-Boot code, 0 if inside EFI payload code */ /* 1 if inside U-Boot code, 0 if inside EFI payload code */
static int entry_count = 1; static int entry_count = 1;
@ -207,6 +207,36 @@ static bool efi_event_is_queued(struct efi_event *event)
return !!event->queue_link.next; return !!event->queue_link.next;
} }
/**
* efi_purge_handle() - Clean the deleted handle from the various lists
* @handle: handle to remove
*
* Return: status code
*/
static efi_status_t efi_purge_handle(efi_handle_t handle)
{
struct efi_register_notify_event *item;
if (!list_empty(&handle->protocols))
return EFI_ACCESS_DENIED;
/* The handle is about to be freed. Remove it from events */
list_for_each_entry(item, &efi_register_notify_events, link) {
struct efi_protocol_notification *hitem, *hnext;
list_for_each_entry_safe(hitem, hnext, &item->handles, link) {
if (handle == hitem->handle) {
list_del(&hitem->link);
free(hitem);
}
}
}
/* The last protocol has been removed, delete the handle. */
list_del(&handle->link);
free(handle);
return EFI_SUCCESS;
}
/** /**
* efi_process_event_queue() - process event queue * efi_process_event_queue() - process event queue
*/ */
@ -615,7 +645,7 @@ static efi_status_t efi_remove_all_protocols(const efi_handle_t handle)
efi_status_t ret; efi_status_t ret;
ret = efi_uninstall_protocol(handle, &protocol->guid, ret = efi_uninstall_protocol(handle, &protocol->guid,
protocol->protocol_interface); protocol->protocol_interface, true);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
return ret; return ret;
} }
@ -639,10 +669,7 @@ efi_status_t efi_delete_handle(efi_handle_t handle)
return ret; return ret;
} }
list_del(&handle->link); return efi_purge_handle(handle);
free(handle);
return ret;
} }
/** /**
@ -1356,6 +1383,8 @@ reconnect:
* @handle: handle from which the protocol shall be removed * @handle: handle from which the protocol shall be removed
* @protocol: GUID of the protocol to be removed * @protocol: GUID of the protocol to be removed
* @protocol_interface: interface to be removed * @protocol_interface: interface to be removed
* @preserve: preserve or delete the handle and remove it from any
* list it participates if no protocols remain
* *
* This function DOES NOT delete a handle without installed protocol. * This function DOES NOT delete a handle without installed protocol.
* *
@ -1363,7 +1392,7 @@ reconnect:
*/ */
static efi_status_t efi_uninstall_protocol static efi_status_t efi_uninstall_protocol
(efi_handle_t handle, const efi_guid_t *protocol, (efi_handle_t handle, const efi_guid_t *protocol,
void *protocol_interface) void *protocol_interface, bool preserve)
{ {
struct efi_handler *handler; struct efi_handler *handler;
struct efi_open_protocol_info_item *item; struct efi_open_protocol_info_item *item;
@ -1397,6 +1426,14 @@ static efi_status_t efi_uninstall_protocol
goto out; goto out;
} }
r = efi_remove_protocol(handle, protocol, protocol_interface); r = efi_remove_protocol(handle, protocol, protocol_interface);
if (r != EFI_SUCCESS)
return r;
/*
* We don't care about the return value here since the
* handle might have more protocols installed
*/
if (!preserve)
efi_purge_handle(handle);
out: out:
return r; return r;
} }
@ -1422,15 +1459,10 @@ static efi_status_t EFIAPI efi_uninstall_protocol_interface
EFI_ENTRY("%p, %pUs, %p", handle, protocol, protocol_interface); EFI_ENTRY("%p, %pUs, %p", handle, protocol, protocol_interface);
ret = efi_uninstall_protocol(handle, protocol, protocol_interface); ret = efi_uninstall_protocol(handle, protocol, protocol_interface, false);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto out; goto out;
/* If the last protocol has been removed, delete the handle. */
if (list_empty(&handle->protocols)) {
list_del(&handle->link);
free(handle);
}
out: out:
return EFI_EXIT(ret); return EFI_EXIT(ret);
} }
@ -2785,7 +2817,7 @@ static efi_status_t EFIAPI
efi_uninstall_multiple_protocol_interfaces_int(efi_handle_t handle, efi_uninstall_multiple_protocol_interfaces_int(efi_handle_t handle,
efi_va_list argptr) efi_va_list argptr)
{ {
const efi_guid_t *protocol; const efi_guid_t *protocol, *next_protocol;
void *protocol_interface; void *protocol_interface;
efi_status_t ret = EFI_SUCCESS; efi_status_t ret = EFI_SUCCESS;
size_t i = 0; size_t i = 0;
@ -2795,25 +2827,34 @@ efi_uninstall_multiple_protocol_interfaces_int(efi_handle_t handle,
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
efi_va_copy(argptr_copy, argptr); efi_va_copy(argptr_copy, argptr);
protocol = efi_va_arg(argptr, efi_guid_t*);
for (;;) { for (;;) {
protocol = efi_va_arg(argptr, efi_guid_t*); /*
* If efi_uninstall_protocol() fails we need to be able to
* reinstall the previously uninstalled protocols on the same
* handle.
* Instead of calling efi_uninstall_protocol(...,..., false)
* and potentially removing the handle, only allow the handle
* removal on the last protocol that we requested to uninstall.
* That way we can preserve the handle in case the latter fails
*/
bool preserve = true;
if (!protocol) if (!protocol)
break; break;
protocol_interface = efi_va_arg(argptr, void*); protocol_interface = efi_va_arg(argptr, void*);
next_protocol = efi_va_arg(argptr, efi_guid_t*);
if (!next_protocol)
preserve = false;
ret = efi_uninstall_protocol(handle, protocol, ret = efi_uninstall_protocol(handle, protocol,
protocol_interface); protocol_interface, preserve);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
break; break;
i++; i++;
protocol = next_protocol;
} }
if (ret == EFI_SUCCESS) { if (ret == EFI_SUCCESS)
/* If the last protocol has been removed, delete the handle. */
if (list_empty(&handle->protocols)) {
list_del(&handle->link);
free(handle);
}
goto out; goto out;
}
/* If an error occurred undo all changes. */ /* If an error occurred undo all changes. */
for (; i; --i) { for (; i; --i) {
@ -3712,7 +3753,7 @@ static efi_status_t EFIAPI efi_reinstall_protocol_interface(
new_interface); new_interface);
/* Uninstall protocol but do not delete handle */ /* Uninstall protocol but do not delete handle */
ret = efi_uninstall_protocol(handle, protocol, old_interface); ret = efi_uninstall_protocol(handle, protocol, old_interface, true);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto out; goto out;

View file

@ -23,8 +23,10 @@ int hash_calculate(const char *name,
struct hash_algo *algo; struct hash_algo *algo;
int ret = 0; int ret = 0;
void *ctx; void *ctx;
uint32_t i; int i;
i = 0;
if (region_count < 1)
return -EINVAL;
ret = hash_progressive_lookup_algo(name, &algo); ret = hash_progressive_lookup_algo(name, &algo);
if (ret) if (ret)

View file

@ -11,6 +11,14 @@ config OPTEE_IMAGE
This option enable the OPTEE specific checks done before booting This option enable the OPTEE specific checks done before booting
an OPTEE image created with mkimage an OPTEE image created with mkimage
config OPTEE_TZDRAM_SIZE
hex "Amount of Trust-Zone RAM for the OPTEE image"
default 0x0000000
depends on OPTEE_LIB
help
The size of pre-allocated Trust Zone DRAM to allocate for the OPTEE
runtime.
config BOOTM_OPTEE config BOOTM_OPTEE
bool "Support OPTEE bootm command" bool "Support OPTEE bootm command"
select BOOTM_LINUX select BOOTM_LINUX

View file

@ -28,7 +28,7 @@
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
extern U_BOOT_DRIVER(bootmeth_cros); extern U_BOOT_DRIVER(bootmeth_cros);
extern U_BOOT_DRIVER(bootmeth_script); extern U_BOOT_DRIVER(bootmeth_2script);
static int inject_response(struct unit_test_state *uts) static int inject_response(struct unit_test_state *uts)
{ {
@ -532,7 +532,7 @@ static int prep_mmc_bootdev(struct unit_test_state *uts, const char *mmc_dev,
/* Enable the script bootmeth too */ /* Enable the script bootmeth too */
ut_assertok(uclass_first_device_err(UCLASS_BOOTSTD, &bootstd)); ut_assertok(uclass_first_device_err(UCLASS_BOOTSTD, &bootstd));
ut_assertok(device_bind(bootstd, DM_DRIVER_REF(bootmeth_script), ut_assertok(device_bind(bootstd, DM_DRIVER_REF(bootmeth_2script),
"bootmeth_script", 0, ofnode_null(), &dev)); "bootmeth_script", 0, ofnode_null(), &dev));
/* Enable the cros bootmeth if needed */ /* Enable the cros bootmeth if needed */

View file

@ -126,8 +126,6 @@ controlled by a description in the board device tree.'''
help='Comma-separated list of bintools to consider missing (for testing)') help='Comma-separated list of bintools to consider missing (for testing)')
build_parser.add_argument('-i', '--image', type=str, action='append', build_parser.add_argument('-i', '--image', type=str, action='append',
help='Image filename to build (if not specified, build all)') help='Image filename to build (if not specified, build all)')
build_parser.add_argument('--ignore-dup-phandles', action='store_true',
help='Temporary option to ignore duplicate phandles')
build_parser.add_argument('-I', '--indir', action='append', build_parser.add_argument('-I', '--indir', action='append',
help='Add a path to the list of directories to use for input files') help='Add a path to the list of directories to use for input files')
build_parser.add_argument('-m', '--map', action='store_true', build_parser.add_argument('-m', '--map', action='store_true',

View file

@ -22,7 +22,6 @@ from binman import bintool
from binman import cbfs_util from binman import cbfs_util
from binman import elf from binman import elf
from binman import entry from binman import entry
from dtoc import fdt
from dtoc import fdt_util from dtoc import fdt_util
from u_boot_pylib import command from u_boot_pylib import command
from u_boot_pylib import tools from u_boot_pylib import tools
@ -817,10 +816,6 @@ def Binman(args):
cbfs_util.VERBOSE = args.verbosity > 2 cbfs_util.VERBOSE = args.verbosity > 2
state.use_fake_dtb = args.fake_dtb state.use_fake_dtb = args.fake_dtb
# Temporary hack
if args.ignore_dup_phandles: # pragma: no cover
fdt.IGNORE_DUP_PHANDLES = True
# Normally we replace the 'u-boot' etype with 'u-boot-expanded', etc. # Normally we replace the 'u-boot' etype with 'u-boot-expanded', etc.
# When running tests this can be disabled using this flag. When not # When running tests this can be disabled using this flag. When not
# updating the FDT in image, it is not needed by binman, but we use it # updating the FDT in image, it is not needed by binman, but we use it

View file

@ -15,9 +15,6 @@ from libfdt import QUIET_NOTFOUND
from u_boot_pylib import tools from u_boot_pylib import tools
from u_boot_pylib import tout from u_boot_pylib import tout
# Temporary hack
IGNORE_DUP_PHANDLES = False
# This deals with a device tree, presenting it as an assortment of Node and # This deals with a device tree, presenting it as an assortment of Node and
# Prop objects, representing nodes and properties, respectively. This file # Prop objects, representing nodes and properties, respectively. This file
# contains the base classes and defines the high-level API. You can use # contains the base classes and defines the high-level API. You can use
@ -342,11 +339,10 @@ class Node:
if phandle: if phandle:
dup = self._fdt.phandle_to_node.get(phandle) dup = self._fdt.phandle_to_node.get(phandle)
if dup: if dup:
if not IGNORE_DUP_PHANDLES: raise ValueError(
raise ValueError( f'Duplicate phandle {phandle} in nodes {dup.path} and {self.path}')
f'Duplicate phandle {phandle} in nodes {dup.path} and {self.path}')
else: self._fdt.phandle_to_node[phandle] = self
self._fdt.phandle_to_node[phandle] = self
offset = fdt_obj.first_subnode(self.Offset(), QUIET_NOTFOUND) offset = fdt_obj.first_subnode(self.Offset(), QUIET_NOTFOUND)
while offset >= 0: while offset >= 0: