This commit is contained in:
commit
fd883eaf5b
4
Makefile
4
Makefile
|
@ -918,6 +918,7 @@ endif
|
||||||
endif
|
endif
|
||||||
INPUTS-$(CONFIG_TPL) += tpl/u-boot-tpl.bin
|
INPUTS-$(CONFIG_TPL) += tpl/u-boot-tpl.bin
|
||||||
INPUTS-$(CONFIG_OF_SEPARATE) += u-boot.dtb
|
INPUTS-$(CONFIG_OF_SEPARATE) += u-boot.dtb
|
||||||
|
INPUTS-$(CONFIG_BINMAN_STANDALONE_FDT) += u-boot.dtb
|
||||||
ifeq ($(CONFIG_SPL_FRAMEWORK),y)
|
ifeq ($(CONFIG_SPL_FRAMEWORK),y)
|
||||||
INPUTS-$(CONFIG_OF_SEPARATE) += u-boot-dtb.img
|
INPUTS-$(CONFIG_OF_SEPARATE) += u-boot-dtb.img
|
||||||
endif
|
endif
|
||||||
|
@ -1285,6 +1286,7 @@ cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
|
||||||
-I . -I $(srctree) -I $(srctree)/board/$(BOARDDIR) \
|
-I . -I $(srctree) -I $(srctree)/board/$(BOARDDIR) \
|
||||||
-I arch/$(ARCH)/dts -a of-list=$(CONFIG_OF_LIST) \
|
-I arch/$(ARCH)/dts -a of-list=$(CONFIG_OF_LIST) \
|
||||||
-a atf-bl31-path=${BL31} \
|
-a atf-bl31-path=${BL31} \
|
||||||
|
-a opensbi-path=${OPENSBI} \
|
||||||
-a default-dt=$(default_dt) \
|
-a default-dt=$(default_dt) \
|
||||||
-a scp-path=$(SCP) \
|
-a scp-path=$(SCP) \
|
||||||
-a spl-bss-pad=$(if $(CONFIG_SPL_SEPARATE_BSS),,1) \
|
-a spl-bss-pad=$(if $(CONFIG_SPL_SEPARATE_BSS),,1) \
|
||||||
|
@ -1389,7 +1391,7 @@ u-boot-lzma.img: u-boot.bin.lzma FORCE
|
||||||
|
|
||||||
u-boot-dtb.img u-boot.img u-boot.kwb u-boot.pbl u-boot-ivt.img: \
|
u-boot-dtb.img u-boot.img u-boot.kwb u-boot.pbl u-boot-ivt.img: \
|
||||||
$(if $(CONFIG_SPL_LOAD_FIT),u-boot-nodtb.bin \
|
$(if $(CONFIG_SPL_LOAD_FIT),u-boot-nodtb.bin \
|
||||||
$(if $(CONFIG_OF_SEPARATE)$(CONFIG_OF_EMBED)$(CONFIG_OF_HOSTFILE),dts/dt.dtb) \
|
$(if $(CONFIG_OF_SEPARATE)$(CONFIG_OF_EMBED)$(CONFIG_OF_HOSTFILE)$(CONFIG_BINMAN_STANDALONE_FDT),dts/dt.dtb) \
|
||||||
,$(UBOOT_BIN)) FORCE
|
,$(UBOOT_BIN)) FORCE
|
||||||
$(call if_changed,mkimage)
|
$(call if_changed,mkimage)
|
||||||
$(BOARD_SIZE_CHECK)
|
$(BOARD_SIZE_CHECK)
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
config GENERIC_RISCV
|
config GENERIC_RISCV
|
||||||
bool
|
bool
|
||||||
|
select BINMAN if SPL
|
||||||
select ARCH_EARLY_INIT_R
|
select ARCH_EARLY_INIT_R
|
||||||
imply CPU
|
imply CPU
|
||||||
imply CPU_RISCV
|
imply CPU_RISCV
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0+
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
dtb-$(CONFIG_TARGET_AX25_AE350) += ae350_32.dtb ae350_64.dtb
|
dtb-$(CONFIG_TARGET_AX25_AE350) += ae350_32.dtb ae350_64.dtb
|
||||||
|
dtb-$(CONFIG_TARGET_MICROCHIP_ICICLE) += microchip-mpfs-icicle-kit.dtb
|
||||||
|
dtb-$(CONFIG_TARGET_QEMU_VIRT) += qemu-virt.dtb
|
||||||
dtb-$(CONFIG_TARGET_SIFIVE_UNLEASHED) += hifive-unleashed-a00.dtb
|
dtb-$(CONFIG_TARGET_SIFIVE_UNLEASHED) += hifive-unleashed-a00.dtb
|
||||||
dtb-$(CONFIG_TARGET_SIPEED_MAIX) += k210-maix-bit.dtb
|
dtb-$(CONFIG_TARGET_SIPEED_MAIX) += k210-maix-bit.dtb
|
||||||
dtb-$(CONFIG_TARGET_MICROCHIP_ICICLE) += microchip-mpfs-icicle-kit.dtb
|
|
||||||
|
|
||||||
targets += $(dtb-y)
|
targets += $(dtb-y)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
|
#include "binman.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
|
#include "binman.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
#address-cells = <2>;
|
#address-cells = <2>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021, Bin Meng <bmeng.cn@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
binman: binman {
|
||||||
|
multiple-images;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&binman {
|
||||||
|
itb {
|
||||||
|
filename = "u-boot.itb";
|
||||||
|
|
||||||
|
fit {
|
||||||
|
description = "Configuration to load OpenSBI before U-Boot";
|
||||||
|
#address-cells = <1>;
|
||||||
|
fit,fdt-list = "of-list";
|
||||||
|
|
||||||
|
images {
|
||||||
|
uboot {
|
||||||
|
description = "U-Boot";
|
||||||
|
type = "standalone";
|
||||||
|
os = "U-Boot";
|
||||||
|
arch = "riscv";
|
||||||
|
compression = "none";
|
||||||
|
load = <CONFIG_SYS_TEXT_BASE>;
|
||||||
|
|
||||||
|
uboot_blob: blob-ext {
|
||||||
|
filename = "u-boot-nodtb.bin";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
opensbi {
|
||||||
|
description = "OpenSBI fw_dynamic Firmware";
|
||||||
|
type = "firmware";
|
||||||
|
os = "opensbi";
|
||||||
|
arch = "riscv";
|
||||||
|
compression = "none";
|
||||||
|
load = <CONFIG_SPL_OPENSBI_LOAD_ADDR>;
|
||||||
|
entry = <CONFIG_SPL_OPENSBI_LOAD_ADDR>;
|
||||||
|
|
||||||
|
opensbi_blob: opensbi {
|
||||||
|
filename = "fw_dynamic.bin";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef CONFIG_OF_PRIOR_STAGE
|
||||||
|
@fdt-SEQ {
|
||||||
|
description = "NAME";
|
||||||
|
type = "flat_dt";
|
||||||
|
compression = "none";
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
default = "conf-1";
|
||||||
|
|
||||||
|
#ifndef CONFIG_OF_PRIOR_STAGE
|
||||||
|
@conf-SEQ {
|
||||||
|
#else
|
||||||
|
conf-1 {
|
||||||
|
#endif
|
||||||
|
description = "NAME";
|
||||||
|
firmware = "opensbi";
|
||||||
|
loadables = "uboot";
|
||||||
|
#ifndef CONFIG_OF_PRIOR_STAGE
|
||||||
|
fdt = "fdt-SEQ";
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -3,6 +3,7 @@
|
||||||
* Copyright (C) 2019 Jagan Teki <jagan@amarulasolutions.com>
|
* Copyright (C) 2019 Jagan Teki <jagan@amarulasolutions.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "binman.dtsi"
|
||||||
#include "fu540-c000-u-boot.dtsi"
|
#include "fu540-c000-u-boot.dtsi"
|
||||||
#include "fu540-hifive-unleashed-a00-ddr.dtsi"
|
#include "fu540-hifive-unleashed-a00-ddr.dtsi"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021, Bin Meng <bmeng.cn@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
#include "binman.dtsi"
|
|
@ -1,100 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# SPDX-License-Identifier: GPL-2.0+
|
|
||||||
#
|
|
||||||
# script to generate FIT image source for RISC-V boards with OpenSBI
|
|
||||||
# and, optionally, multiple device trees (given on the command line).
|
|
||||||
#
|
|
||||||
# usage: $0 [<dt_name> [<dt_name] ...]
|
|
||||||
|
|
||||||
[ -z "$OPENSBI" ] && OPENSBI="fw_dynamic.bin"
|
|
||||||
|
|
||||||
if [ -z "$UBOOT_LOAD_ADDR" ]; then
|
|
||||||
UBOOT_LOAD_ADDR="$(grep "^CONFIG_SYS_TEXT_BASE=" .config | awk 'BEGIN{FS="="} {print $2}')"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$OPENSBI_LOAD_ADDR" ]; then
|
|
||||||
OPENSBI_LOAD_ADDR="$(grep "^CONFIG_SPL_OPENSBI_LOAD_ADDR=" .config | awk 'BEGIN{FS="="} {print $2}')"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f $OPENSBI ]; then
|
|
||||||
echo "WARNING: OpenSBI binary \"$OPENSBI\" not found, resulting binary is not functional." >&2
|
|
||||||
OPENSBI=/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat << __HEADER_EOF
|
|
||||||
/dts-v1/;
|
|
||||||
|
|
||||||
/ {
|
|
||||||
description = "Configuration to load OpenSBI before U-Boot";
|
|
||||||
|
|
||||||
images {
|
|
||||||
uboot {
|
|
||||||
description = "U-Boot";
|
|
||||||
data = /incbin/("u-boot-nodtb.bin");
|
|
||||||
type = "standalone";
|
|
||||||
os = "U-Boot";
|
|
||||||
arch = "riscv";
|
|
||||||
compression = "none";
|
|
||||||
load = <$UBOOT_LOAD_ADDR>;
|
|
||||||
};
|
|
||||||
opensbi {
|
|
||||||
description = "RISC-V OpenSBI";
|
|
||||||
data = /incbin/("$OPENSBI");
|
|
||||||
type = "firmware";
|
|
||||||
os = "opensbi";
|
|
||||||
arch = "riscv";
|
|
||||||
compression = "none";
|
|
||||||
load = <$OPENSBI_LOAD_ADDR>;
|
|
||||||
entry = <$OPENSBI_LOAD_ADDR>;
|
|
||||||
};
|
|
||||||
__HEADER_EOF
|
|
||||||
|
|
||||||
cnt=1
|
|
||||||
for dtname in $*
|
|
||||||
do
|
|
||||||
cat << __FDT_IMAGE_EOF
|
|
||||||
fdt_$cnt {
|
|
||||||
description = "$(basename $dtname .dtb)";
|
|
||||||
data = /incbin/("$dtname");
|
|
||||||
type = "flat_dt";
|
|
||||||
compression = "none";
|
|
||||||
};
|
|
||||||
__FDT_IMAGE_EOF
|
|
||||||
cnt=$((cnt+1))
|
|
||||||
done
|
|
||||||
|
|
||||||
cat << __CONF_HEADER_EOF
|
|
||||||
};
|
|
||||||
configurations {
|
|
||||||
default = "config_1";
|
|
||||||
|
|
||||||
__CONF_HEADER_EOF
|
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
|
||||||
cat << __CONF_SECTION_EOF
|
|
||||||
config_1 {
|
|
||||||
description = "U-Boot FIT";
|
|
||||||
firmware = "opensbi";
|
|
||||||
loadables = "uboot";
|
|
||||||
};
|
|
||||||
__CONF_SECTION_EOF
|
|
||||||
else
|
|
||||||
cnt=1
|
|
||||||
for dtname in $*
|
|
||||||
do
|
|
||||||
cat << __CONF_SECTION_EOF
|
|
||||||
config_$cnt {
|
|
||||||
description = "$(basename $dtname .dtb)";
|
|
||||||
firmware = "opensbi";
|
|
||||||
loadables = "uboot";
|
|
||||||
fdt = "fdt_$cnt";
|
|
||||||
};
|
|
||||||
__CONF_SECTION_EOF
|
|
||||||
cnt=$((cnt+1))
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat << __ITS_EOF
|
|
||||||
};
|
|
||||||
};
|
|
||||||
__ITS_EOF
|
|
|
@ -31,6 +31,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
|
||||||
def_bool y
|
def_bool y
|
||||||
select RISCV_NDS
|
select RISCV_NDS
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select BINMAN if SPL
|
||||||
imply SMP
|
imply SMP
|
||||||
imply SPL_RAM_SUPPORT
|
imply SPL_RAM_SUPPORT
|
||||||
imply SPL_RAM_DEVICE
|
imply SPL_RAM_DEVICE
|
||||||
|
|
|
@ -27,6 +27,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
|
||||||
def_bool y
|
def_bool y
|
||||||
select SIFIVE_FU540
|
select SIFIVE_FU540
|
||||||
select ENV_IS_IN_SPI_FLASH
|
select ENV_IS_IN_SPI_FLASH
|
||||||
|
select BINMAN
|
||||||
imply CMD_DHCP
|
imply CMD_DHCP
|
||||||
imply CMD_EXT2
|
imply CMD_EXT2
|
||||||
imply CMD_EXT4
|
imply CMD_EXT4
|
||||||
|
|
|
@ -205,7 +205,7 @@ config SPL_LOAD_FIT
|
||||||
|
|
||||||
This path has the following limitations:
|
This path has the following limitations:
|
||||||
|
|
||||||
1. "loadables" images, other than FTDs, which do not have a "load"
|
1. "loadables" images, other than FDTs, which do not have a "load"
|
||||||
property will not be loaded. This limitation also applies to FPGA
|
property will not be loaded. This limitation also applies to FPGA
|
||||||
images with the correct "compatible" string.
|
images with the correct "compatible" string.
|
||||||
2. For FPGA images, only the "compatible" = "u-boot,fpga-legacy"
|
2. For FPGA images, only the "compatible" = "u-boot,fpga-legacy"
|
||||||
|
@ -274,14 +274,13 @@ config SPL_FIT_SOURCE
|
||||||
|
|
||||||
config USE_SPL_FIT_GENERATOR
|
config USE_SPL_FIT_GENERATOR
|
||||||
bool "Use a script to generate the .its script"
|
bool "Use a script to generate the .its script"
|
||||||
default y if SPL_FIT && !ARCH_SUNXI
|
default y if SPL_FIT && (!ARCH_SUNXI && !RISCV)
|
||||||
|
|
||||||
config SPL_FIT_GENERATOR
|
config SPL_FIT_GENERATOR
|
||||||
string ".its file generator script for U-Boot FIT image"
|
string ".its file generator script for U-Boot FIT image"
|
||||||
depends on USE_SPL_FIT_GENERATOR
|
depends on USE_SPL_FIT_GENERATOR
|
||||||
default "arch/arm/mach-rockchip/make_fit_atf.py" if SPL_LOAD_FIT && ARCH_ROCKCHIP
|
default "arch/arm/mach-rockchip/make_fit_atf.py" if SPL_LOAD_FIT && ARCH_ROCKCHIP
|
||||||
default "arch/arm/mach-zynqmp/mkimage_fit_atf.sh" if SPL_LOAD_FIT && ARCH_ZYNQMP
|
default "arch/arm/mach-zynqmp/mkimage_fit_atf.sh" if SPL_LOAD_FIT && ARCH_ZYNQMP
|
||||||
default "arch/riscv/lib/mkimage_fit_opensbi.sh" if SPL_LOAD_FIT && RISCV
|
|
||||||
help
|
help
|
||||||
Specifies a (platform specific) script file to generate the FIT
|
Specifies a (platform specific) script file to generate the FIT
|
||||||
source file used to build the U-Boot FIT image file. This gets
|
source file used to build the U-Boot FIT image file. This gets
|
||||||
|
|
|
@ -2,7 +2,9 @@ CONFIG_RISCV=y
|
||||||
CONFIG_SYS_TEXT_BASE=0x01200000
|
CONFIG_SYS_TEXT_BASE=0x01200000
|
||||||
CONFIG_NR_DRAM_BANKS=2
|
CONFIG_NR_DRAM_BANKS=2
|
||||||
CONFIG_ENV_SECT_SIZE=0x1000
|
CONFIG_ENV_SECT_SIZE=0x1000
|
||||||
|
CONFIG_SPL_SYS_MALLOC_F_LEN=0x100000
|
||||||
CONFIG_SPL=y
|
CONFIG_SPL=y
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="ae350_32"
|
||||||
CONFIG_TARGET_AX25_AE350=y
|
CONFIG_TARGET_AX25_AE350=y
|
||||||
CONFIG_RISCV_SMODE=y
|
CONFIG_RISCV_SMODE=y
|
||||||
CONFIG_DISTRO_DEFAULTS=y
|
CONFIG_DISTRO_DEFAULTS=y
|
||||||
|
|
|
@ -2,8 +2,10 @@ CONFIG_RISCV=y
|
||||||
CONFIG_SYS_TEXT_BASE=0x01200000
|
CONFIG_SYS_TEXT_BASE=0x01200000
|
||||||
CONFIG_NR_DRAM_BANKS=2
|
CONFIG_NR_DRAM_BANKS=2
|
||||||
CONFIG_ENV_SECT_SIZE=0x1000
|
CONFIG_ENV_SECT_SIZE=0x1000
|
||||||
|
CONFIG_SPL_SYS_MALLOC_F_LEN=0x100000
|
||||||
CONFIG_SPL_TEXT_BASE=0x80000000
|
CONFIG_SPL_TEXT_BASE=0x80000000
|
||||||
CONFIG_SPL=y
|
CONFIG_SPL=y
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="ae350_32"
|
||||||
CONFIG_TARGET_AX25_AE350=y
|
CONFIG_TARGET_AX25_AE350=y
|
||||||
CONFIG_RISCV_SMODE=y
|
CONFIG_RISCV_SMODE=y
|
||||||
CONFIG_XIP=y
|
CONFIG_XIP=y
|
||||||
|
|
|
@ -2,7 +2,9 @@ CONFIG_RISCV=y
|
||||||
CONFIG_SYS_TEXT_BASE=0x01200000
|
CONFIG_SYS_TEXT_BASE=0x01200000
|
||||||
CONFIG_NR_DRAM_BANKS=2
|
CONFIG_NR_DRAM_BANKS=2
|
||||||
CONFIG_ENV_SECT_SIZE=0x1000
|
CONFIG_ENV_SECT_SIZE=0x1000
|
||||||
|
CONFIG_SPL_SYS_MALLOC_F_LEN=0x100000
|
||||||
CONFIG_SPL=y
|
CONFIG_SPL=y
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="ae350_64"
|
||||||
CONFIG_TARGET_AX25_AE350=y
|
CONFIG_TARGET_AX25_AE350=y
|
||||||
CONFIG_ARCH_RV64I=y
|
CONFIG_ARCH_RV64I=y
|
||||||
CONFIG_RISCV_SMODE=y
|
CONFIG_RISCV_SMODE=y
|
||||||
|
|
|
@ -2,8 +2,10 @@ CONFIG_RISCV=y
|
||||||
CONFIG_SYS_TEXT_BASE=0x01200000
|
CONFIG_SYS_TEXT_BASE=0x01200000
|
||||||
CONFIG_NR_DRAM_BANKS=2
|
CONFIG_NR_DRAM_BANKS=2
|
||||||
CONFIG_ENV_SECT_SIZE=0x1000
|
CONFIG_ENV_SECT_SIZE=0x1000
|
||||||
|
CONFIG_SPL_SYS_MALLOC_F_LEN=0x100000
|
||||||
CONFIG_SPL_TEXT_BASE=0x80000000
|
CONFIG_SPL_TEXT_BASE=0x80000000
|
||||||
CONFIG_SPL=y
|
CONFIG_SPL=y
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="ae350_64"
|
||||||
CONFIG_TARGET_AX25_AE350=y
|
CONFIG_TARGET_AX25_AE350=y
|
||||||
CONFIG_ARCH_RV64I=y
|
CONFIG_ARCH_RV64I=y
|
||||||
CONFIG_RISCV_SMODE=y
|
CONFIG_RISCV_SMODE=y
|
||||||
|
|
|
@ -2,6 +2,7 @@ CONFIG_RISCV=y
|
||||||
CONFIG_NR_DRAM_BANKS=1
|
CONFIG_NR_DRAM_BANKS=1
|
||||||
CONFIG_ENV_SIZE=0x20000
|
CONFIG_ENV_SIZE=0x20000
|
||||||
CONFIG_SPL=y
|
CONFIG_SPL=y
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="qemu-virt"
|
||||||
CONFIG_TARGET_QEMU_VIRT=y
|
CONFIG_TARGET_QEMU_VIRT=y
|
||||||
CONFIG_RISCV_SMODE=y
|
CONFIG_RISCV_SMODE=y
|
||||||
CONFIG_DISTRO_DEFAULTS=y
|
CONFIG_DISTRO_DEFAULTS=y
|
||||||
|
|
|
@ -2,6 +2,7 @@ CONFIG_RISCV=y
|
||||||
CONFIG_NR_DRAM_BANKS=1
|
CONFIG_NR_DRAM_BANKS=1
|
||||||
CONFIG_ENV_SIZE=0x20000
|
CONFIG_ENV_SIZE=0x20000
|
||||||
CONFIG_SPL=y
|
CONFIG_SPL=y
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="qemu-virt"
|
||||||
CONFIG_TARGET_QEMU_VIRT=y
|
CONFIG_TARGET_QEMU_VIRT=y
|
||||||
CONFIG_ARCH_RV64I=y
|
CONFIG_ARCH_RV64I=y
|
||||||
CONFIG_RISCV_SMODE=y
|
CONFIG_RISCV_SMODE=y
|
||||||
|
|
18
dts/Kconfig
18
dts/Kconfig
|
@ -19,6 +19,24 @@ config BINMAN
|
||||||
bool
|
bool
|
||||||
select DTOC
|
select DTOC
|
||||||
|
|
||||||
|
config BINMAN_STANDALONE_FDT
|
||||||
|
bool
|
||||||
|
depends on BINMAN
|
||||||
|
default y if OF_BOARD || OF_PRIOR_STAGE
|
||||||
|
help
|
||||||
|
This option tells U-Boot build system that a standalone device tree
|
||||||
|
source is explicitly required when using binman to package U-Boot.
|
||||||
|
|
||||||
|
This is not necessary in a common scenario where a device tree source
|
||||||
|
that contains the binman node is provided in the arch/<arch>/dts
|
||||||
|
directory for a specific board. Such device tree sources are built for
|
||||||
|
OF_SEPARATE or OF_EMBED. However for a scenario like the board device
|
||||||
|
tree blob is not provided in the U-Boot build tree, but fed to U-Boot
|
||||||
|
in the runtime, e.g.: in the OF_PRIOR_STAGE case that it is passed by
|
||||||
|
a prior stage bootloader. For such scenario, a standalone device tree
|
||||||
|
blob containing binman node to describe how to package U-Boot should
|
||||||
|
be provided explicitly.
|
||||||
|
|
||||||
menu "Device Tree Control"
|
menu "Device Tree Control"
|
||||||
depends on SUPPORT_OF_CONTROL
|
depends on SUPPORT_OF_CONTROL
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ config BCH
|
||||||
config BINMAN_FDT
|
config BINMAN_FDT
|
||||||
bool "Allow access to binman information in the device tree"
|
bool "Allow access to binman information in the device tree"
|
||||||
depends on BINMAN && DM && OF_CONTROL
|
depends on BINMAN && DM && OF_CONTROL
|
||||||
default y
|
default y if OF_SEPARATE || OF_EMBED
|
||||||
help
|
help
|
||||||
This enables U-Boot to access information about binman entries,
|
This enables U-Boot to access information about binman entries,
|
||||||
stored in the device tree in a binman node. Typical uses are to
|
stored in the device tree in a binman node. Typical uses are to
|
||||||
|
|
|
@ -232,6 +232,30 @@ You can use other, more specific CONFIG options - see 'Automatic .dtsi
|
||||||
inclusion' below.
|
inclusion' below.
|
||||||
|
|
||||||
|
|
||||||
|
Using binman with OF_BOARD or OF_PRIOR_STAGE
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
Normally binman is used with a board configured with OF_SEPARATE or OF_EMBED.
|
||||||
|
This is a typical scenario where a device tree source that contains the binman
|
||||||
|
node is provided in the arch/<arch>/dts directory for a specific board.
|
||||||
|
|
||||||
|
However for a board configured with OF_BOARD or OF_PRIOR_STAGE, no device tree
|
||||||
|
blob is provided in the U-Boot build phase hence the binman node information
|
||||||
|
is not available. In order to support such use case, a new Kconfig option
|
||||||
|
BINMAN_STANDALONE_FDT is introduced, to tell the build system that a standalone
|
||||||
|
device tree blob containing binman node is explicitly required.
|
||||||
|
|
||||||
|
Note there is a Kconfig option BINMAN_FDT which enables U-Boot run time to
|
||||||
|
access information about binman entries, stored in the device tree in a binman
|
||||||
|
node. Generally speaking, this option makes sense for OF_SEPARATE or OF_EMBED.
|
||||||
|
For the other OF_CONTROL methods, it's quite possible binman node is not
|
||||||
|
available as binman is invoked during the build phase, thus this option is not
|
||||||
|
turned on by default for these OF_CONTROL methods.
|
||||||
|
|
||||||
|
See qemu-riscv64_spl_defconfig for an example of how binman is used with
|
||||||
|
OF_PRIOR_STAGE to generate u-boot.itb image.
|
||||||
|
|
||||||
|
|
||||||
Access to binman entry offsets at run time (symbols)
|
Access to binman entry offsets at run time (symbols)
|
||||||
----------------------------------------------------
|
----------------------------------------------------
|
||||||
|
|
||||||
|
@ -322,9 +346,9 @@ Sometimes it is useful to pass binman the value of an entry property from the
|
||||||
command line. For example some entries need access to files and it is not
|
command line. For example some entries need access to files and it is not
|
||||||
always convenient to put these filenames in the image definition (device tree).
|
always convenient to put these filenames in the image definition (device tree).
|
||||||
|
|
||||||
The-a option supports this::
|
The -a option supports this::
|
||||||
|
|
||||||
-a<prop>=<value>
|
-a <prop>=<value>
|
||||||
|
|
||||||
where::
|
where::
|
||||||
|
|
||||||
|
|
|
@ -761,6 +761,19 @@ binman.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Entry: opensbi: RISC-V OpenSBI fw_dynamic blob
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
Properties / Entry arguments:
|
||||||
|
- opensbi-path: Filename of file to read into entry. This is typically
|
||||||
|
called fw_dynamic.bin
|
||||||
|
|
||||||
|
This entry holds the run-time firmware, typically started by U-Boot SPL.
|
||||||
|
See the U-Boot README for your architecture or board for how to use it. See
|
||||||
|
https://github.com/riscv/opensbi for more information about OpenSBI.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Entry: powerpc-mpc85xx-bootpg-resetvec: PowerPC mpc85xx bootpg + resetvec code for U-Boot
|
Entry: powerpc-mpc85xx-bootpg-resetvec: PowerPC mpc85xx bootpg + resetvec code for U-Boot
|
||||||
-----------------------------------------------------------------------------------------
|
-----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# Copyright 2020 Google LLC
|
# Copyright 2020 Google LLC
|
||||||
# Written by Simon Glass <sjg@chromium.org>
|
# Written by Simon Glass <sjg@chromium.org>
|
||||||
#
|
#
|
||||||
# Entry-type module for Intel Management Engine binary blob
|
# Entry-type module for ARM Trusted Firmware binary blob
|
||||||
#
|
#
|
||||||
|
|
||||||
from binman.etype.blob_named_by_arg import Entry_blob_named_by_arg
|
from binman.etype.blob_named_by_arg import Entry_blob_named_by_arg
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
#
|
||||||
|
# Copyright (C) 2021, Bin Meng <bmeng.cn@gmail.com>
|
||||||
|
#
|
||||||
|
# Entry-type module for RISC-V OpenSBI binary blob
|
||||||
|
#
|
||||||
|
|
||||||
|
from binman.etype.blob_named_by_arg import Entry_blob_named_by_arg
|
||||||
|
|
||||||
|
class Entry_opensbi(Entry_blob_named_by_arg):
|
||||||
|
"""RISC-V OpenSBI fw_dynamic blob
|
||||||
|
|
||||||
|
Properties / Entry arguments:
|
||||||
|
- opensbi-path: Filename of file to read into entry. This is typically
|
||||||
|
called fw_dynamic.bin
|
||||||
|
|
||||||
|
This entry holds the run-time firmware, typically started by U-Boot SPL.
|
||||||
|
See the U-Boot README for your architecture or board for how to use it. See
|
||||||
|
https://github.com/riscv/opensbi for more information about OpenSBI.
|
||||||
|
"""
|
||||||
|
def __init__(self, section, etype, node):
|
||||||
|
super().__init__(section, etype, node, 'opensbi')
|
||||||
|
self.external = True
|
|
@ -76,6 +76,7 @@ FSP_M_DATA = b'fsp_m'
|
||||||
FSP_S_DATA = b'fsp_s'
|
FSP_S_DATA = b'fsp_s'
|
||||||
FSP_T_DATA = b'fsp_t'
|
FSP_T_DATA = b'fsp_t'
|
||||||
ATF_BL31_DATA = b'bl31'
|
ATF_BL31_DATA = b'bl31'
|
||||||
|
OPENSBI_DATA = b'opensbi'
|
||||||
SCP_DATA = b'scp'
|
SCP_DATA = b'scp'
|
||||||
TEST_FDT1_DATA = b'fdt1'
|
TEST_FDT1_DATA = b'fdt1'
|
||||||
TEST_FDT2_DATA = b'test-fdt2'
|
TEST_FDT2_DATA = b'test-fdt2'
|
||||||
|
@ -178,6 +179,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
TestFunctional._MakeInputFile('compress', COMPRESS_DATA)
|
TestFunctional._MakeInputFile('compress', COMPRESS_DATA)
|
||||||
TestFunctional._MakeInputFile('compress_big', COMPRESS_DATA_BIG)
|
TestFunctional._MakeInputFile('compress_big', COMPRESS_DATA_BIG)
|
||||||
TestFunctional._MakeInputFile('bl31.bin', ATF_BL31_DATA)
|
TestFunctional._MakeInputFile('bl31.bin', ATF_BL31_DATA)
|
||||||
|
TestFunctional._MakeInputFile('fw_dynamic.bin', OPENSBI_DATA)
|
||||||
TestFunctional._MakeInputFile('scp.bin', SCP_DATA)
|
TestFunctional._MakeInputFile('scp.bin', SCP_DATA)
|
||||||
|
|
||||||
# Add a few .dtb files for testing
|
# Add a few .dtb files for testing
|
||||||
|
@ -3826,7 +3828,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
'default-dt': 'test-fdt2',
|
'default-dt': 'test-fdt2',
|
||||||
}
|
}
|
||||||
data = self._DoReadFileDtb(
|
data = self._DoReadFileDtb(
|
||||||
'172_fit_fdt.dts',
|
'170_fit_fdt.dts',
|
||||||
entry_args=entry_args,
|
entry_args=entry_args,
|
||||||
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
||||||
self.assertEqual(U_BOOT_NODTB_DATA, data[-len(U_BOOT_NODTB_DATA):])
|
self.assertEqual(U_BOOT_NODTB_DATA, data[-len(U_BOOT_NODTB_DATA):])
|
||||||
|
@ -3848,7 +3850,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
def testFitFdtMissingList(self):
|
def testFitFdtMissingList(self):
|
||||||
"""Test handling of a missing 'of-list' entry arg"""
|
"""Test handling of a missing 'of-list' entry arg"""
|
||||||
with self.assertRaises(ValueError) as e:
|
with self.assertRaises(ValueError) as e:
|
||||||
self._DoReadFile('172_fit_fdt.dts')
|
self._DoReadFile('170_fit_fdt.dts')
|
||||||
self.assertIn("Generator node requires 'of-list' entry argument",
|
self.assertIn("Generator node requires 'of-list' entry argument",
|
||||||
str(e.exception))
|
str(e.exception))
|
||||||
|
|
||||||
|
@ -3871,7 +3873,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
entry_args = {
|
entry_args = {
|
||||||
'of-list': '',
|
'of-list': '',
|
||||||
}
|
}
|
||||||
data = self._DoReadFileDtb('172_fit_fdt.dts', entry_args=entry_args)[0]
|
data = self._DoReadFileDtb('170_fit_fdt.dts', entry_args=entry_args)[0]
|
||||||
|
|
||||||
def testFitFdtMissing(self):
|
def testFitFdtMissing(self):
|
||||||
"""Test handling of a missing 'default-dt' entry arg"""
|
"""Test handling of a missing 'default-dt' entry arg"""
|
||||||
|
@ -3880,7 +3882,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
}
|
}
|
||||||
with self.assertRaises(ValueError) as e:
|
with self.assertRaises(ValueError) as e:
|
||||||
self._DoReadFileDtb(
|
self._DoReadFileDtb(
|
||||||
'172_fit_fdt.dts',
|
'170_fit_fdt.dts',
|
||||||
entry_args=entry_args,
|
entry_args=entry_args,
|
||||||
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
||||||
self.assertIn("Generated 'default' node requires default-dt entry argument",
|
self.assertIn("Generated 'default' node requires default-dt entry argument",
|
||||||
|
@ -3894,7 +3896,7 @@ class TestFunctional(unittest.TestCase):
|
||||||
}
|
}
|
||||||
with self.assertRaises(ValueError) as e:
|
with self.assertRaises(ValueError) as e:
|
||||||
self._DoReadFileDtb(
|
self._DoReadFileDtb(
|
||||||
'172_fit_fdt.dts',
|
'170_fit_fdt.dts',
|
||||||
entry_args=entry_args,
|
entry_args=entry_args,
|
||||||
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
|
||||||
self.assertIn("default-dt entry argument 'test-fdt3' not found in fdt list: test-fdt1, test-fdt2",
|
self.assertIn("default-dt entry argument 'test-fdt3' not found in fdt list: test-fdt1, test-fdt2",
|
||||||
|
@ -4535,5 +4537,10 @@ class TestFunctional(unittest.TestCase):
|
||||||
expected += tools.GetBytes(0, 88 - len(expected)) + U_BOOT_NODTB_DATA
|
expected += tools.GetBytes(0, 88 - len(expected)) + U_BOOT_NODTB_DATA
|
||||||
self.assertEqual(expected, data)
|
self.assertEqual(expected, data)
|
||||||
|
|
||||||
|
def testPackOpenSBI(self):
|
||||||
|
"""Test that an image with an OpenSBI binary can be created"""
|
||||||
|
data = self._DoReadFile('201_opensbi.dts')
|
||||||
|
self.assertEqual(OPENSBI_DATA, data[:len(OPENSBI_DATA)])
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/ {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
binman {
|
||||||
|
opensbi {
|
||||||
|
filename = "fw_dynamic.bin";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
Loading…
Reference in New Issue