Tom Rini 2021-05-20 11:06:33 -04:00
commit fd883eaf5b
27 changed files with 219 additions and 114 deletions

View file

@ -918,6 +918,7 @@ endif
endif
INPUTS-$(CONFIG_TPL) += tpl/u-boot-tpl.bin
INPUTS-$(CONFIG_OF_SEPARATE) += u-boot.dtb
INPUTS-$(CONFIG_BINMAN_STANDALONE_FDT) += u-boot.dtb
ifeq ($(CONFIG_SPL_FRAMEWORK),y)
INPUTS-$(CONFIG_OF_SEPARATE) += u-boot-dtb.img
endif
@ -1285,6 +1286,7 @@ cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
-I . -I $(srctree) -I $(srctree)/board/$(BOARDDIR) \
-I arch/$(ARCH)/dts -a of-list=$(CONFIG_OF_LIST) \
-a atf-bl31-path=${BL31} \
-a opensbi-path=${OPENSBI} \
-a default-dt=$(default_dt) \
-a scp-path=$(SCP) \
-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: \
$(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
$(call if_changed,mkimage)
$(BOARD_SIZE_CHECK)

View file

@ -4,6 +4,7 @@
config GENERIC_RISCV
bool
select BINMAN if SPL
select ARCH_EARLY_INIT_R
imply CPU
imply CPU_RISCV

View file

@ -1,9 +1,10 @@
# SPDX-License-Identifier: GPL-2.0+
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_SIPEED_MAIX) += k210-maix-bit.dtb
dtb-$(CONFIG_TARGET_MICROCHIP_ICICLE) += microchip-mpfs-icicle-kit.dtb
targets += $(dtb-y)

View file

@ -1,5 +1,7 @@
/dts-v1/;
#include "binman.dtsi"
/ {
#address-cells = <1>;
#size-cells = <1>;

View file

@ -1,5 +1,7 @@
/dts-v1/;
#include "binman.dtsi"
/ {
#address-cells = <2>;
#size-cells = <2>;

View file

@ -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
};
};
};
};
};

View file

@ -3,6 +3,7 @@
* Copyright (C) 2019 Jagan Teki <jagan@amarulasolutions.com>
*/
#include "binman.dtsi"
#include "fu540-c000-u-boot.dtsi"
#include "fu540-hifive-unleashed-a00-ddr.dtsi"

View file

@ -0,0 +1,8 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2021, Bin Meng <bmeng.cn@gmail.com>
*/
/dts-v1/;
#include "binman.dtsi"

View file

@ -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

View file

@ -31,6 +31,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
def_bool y
select RISCV_NDS
select SUPPORT_SPL
select BINMAN if SPL
imply SMP
imply SPL_RAM_SUPPORT
imply SPL_RAM_DEVICE

View file

@ -27,6 +27,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
def_bool y
select SIFIVE_FU540
select ENV_IS_IN_SPI_FLASH
select BINMAN
imply CMD_DHCP
imply CMD_EXT2
imply CMD_EXT4

View file

@ -205,7 +205,7 @@ config SPL_LOAD_FIT
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
images with the correct "compatible" string.
2. For FPGA images, only the "compatible" = "u-boot,fpga-legacy"
@ -274,14 +274,13 @@ config SPL_FIT_SOURCE
config USE_SPL_FIT_GENERATOR
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
string ".its file generator script for U-Boot FIT image"
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-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
Specifies a (platform specific) script file to generate the FIT
source file used to build the U-Boot FIT image file. This gets

View file

@ -2,7 +2,9 @@ CONFIG_RISCV=y
CONFIG_SYS_TEXT_BASE=0x01200000
CONFIG_NR_DRAM_BANKS=2
CONFIG_ENV_SECT_SIZE=0x1000
CONFIG_SPL_SYS_MALLOC_F_LEN=0x100000
CONFIG_SPL=y
CONFIG_DEFAULT_DEVICE_TREE="ae350_32"
CONFIG_TARGET_AX25_AE350=y
CONFIG_RISCV_SMODE=y
CONFIG_DISTRO_DEFAULTS=y

View file

@ -2,8 +2,10 @@ CONFIG_RISCV=y
CONFIG_SYS_TEXT_BASE=0x01200000
CONFIG_NR_DRAM_BANKS=2
CONFIG_ENV_SECT_SIZE=0x1000
CONFIG_SPL_SYS_MALLOC_F_LEN=0x100000
CONFIG_SPL_TEXT_BASE=0x80000000
CONFIG_SPL=y
CONFIG_DEFAULT_DEVICE_TREE="ae350_32"
CONFIG_TARGET_AX25_AE350=y
CONFIG_RISCV_SMODE=y
CONFIG_XIP=y

View file

@ -2,7 +2,9 @@ CONFIG_RISCV=y
CONFIG_SYS_TEXT_BASE=0x01200000
CONFIG_NR_DRAM_BANKS=2
CONFIG_ENV_SECT_SIZE=0x1000
CONFIG_SPL_SYS_MALLOC_F_LEN=0x100000
CONFIG_SPL=y
CONFIG_DEFAULT_DEVICE_TREE="ae350_64"
CONFIG_TARGET_AX25_AE350=y
CONFIG_ARCH_RV64I=y
CONFIG_RISCV_SMODE=y

View file

@ -2,8 +2,10 @@ CONFIG_RISCV=y
CONFIG_SYS_TEXT_BASE=0x01200000
CONFIG_NR_DRAM_BANKS=2
CONFIG_ENV_SECT_SIZE=0x1000
CONFIG_SPL_SYS_MALLOC_F_LEN=0x100000
CONFIG_SPL_TEXT_BASE=0x80000000
CONFIG_SPL=y
CONFIG_DEFAULT_DEVICE_TREE="ae350_64"
CONFIG_TARGET_AX25_AE350=y
CONFIG_ARCH_RV64I=y
CONFIG_RISCV_SMODE=y

View file

@ -2,6 +2,7 @@ CONFIG_RISCV=y
CONFIG_NR_DRAM_BANKS=1
CONFIG_ENV_SIZE=0x20000
CONFIG_SPL=y
CONFIG_DEFAULT_DEVICE_TREE="qemu-virt"
CONFIG_TARGET_QEMU_VIRT=y
CONFIG_RISCV_SMODE=y
CONFIG_DISTRO_DEFAULTS=y

View file

@ -2,6 +2,7 @@ CONFIG_RISCV=y
CONFIG_NR_DRAM_BANKS=1
CONFIG_ENV_SIZE=0x20000
CONFIG_SPL=y
CONFIG_DEFAULT_DEVICE_TREE="qemu-virt"
CONFIG_TARGET_QEMU_VIRT=y
CONFIG_ARCH_RV64I=y
CONFIG_RISCV_SMODE=y

View file

@ -19,6 +19,24 @@ config BINMAN
bool
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"
depends on SUPPORT_OF_CONTROL

View file

@ -25,7 +25,7 @@ config BCH
config BINMAN_FDT
bool "Allow access to binman information in the device tree"
depends on BINMAN && DM && OF_CONTROL
default y
default y if OF_SEPARATE || OF_EMBED
help
This enables U-Boot to access information about binman entries,
stored in the device tree in a binman node. Typical uses are to

View file

@ -232,6 +232,30 @@ You can use other, more specific CONFIG options - see 'Automatic .dtsi
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)
----------------------------------------------------
@ -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
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::

View file

@ -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
-----------------------------------------------------------------------------------------

View file

@ -2,7 +2,7 @@
# Copyright 2020 Google LLC
# 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

View file

@ -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

View file

@ -76,6 +76,7 @@ FSP_M_DATA = b'fsp_m'
FSP_S_DATA = b'fsp_s'
FSP_T_DATA = b'fsp_t'
ATF_BL31_DATA = b'bl31'
OPENSBI_DATA = b'opensbi'
SCP_DATA = b'scp'
TEST_FDT1_DATA = b'fdt1'
TEST_FDT2_DATA = b'test-fdt2'
@ -178,6 +179,7 @@ class TestFunctional(unittest.TestCase):
TestFunctional._MakeInputFile('compress', COMPRESS_DATA)
TestFunctional._MakeInputFile('compress_big', COMPRESS_DATA_BIG)
TestFunctional._MakeInputFile('bl31.bin', ATF_BL31_DATA)
TestFunctional._MakeInputFile('fw_dynamic.bin', OPENSBI_DATA)
TestFunctional._MakeInputFile('scp.bin', SCP_DATA)
# Add a few .dtb files for testing
@ -3826,7 +3828,7 @@ class TestFunctional(unittest.TestCase):
'default-dt': 'test-fdt2',
}
data = self._DoReadFileDtb(
'172_fit_fdt.dts',
'170_fit_fdt.dts',
entry_args=entry_args,
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
self.assertEqual(U_BOOT_NODTB_DATA, data[-len(U_BOOT_NODTB_DATA):])
@ -3848,7 +3850,7 @@ class TestFunctional(unittest.TestCase):
def testFitFdtMissingList(self):
"""Test handling of a missing 'of-list' entry arg"""
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",
str(e.exception))
@ -3871,7 +3873,7 @@ class TestFunctional(unittest.TestCase):
entry_args = {
'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):
"""Test handling of a missing 'default-dt' entry arg"""
@ -3880,7 +3882,7 @@ class TestFunctional(unittest.TestCase):
}
with self.assertRaises(ValueError) as e:
self._DoReadFileDtb(
'172_fit_fdt.dts',
'170_fit_fdt.dts',
entry_args=entry_args,
extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
self.assertIn("Generated 'default' node requires default-dt entry argument",
@ -3894,7 +3896,7 @@ class TestFunctional(unittest.TestCase):
}
with self.assertRaises(ValueError) as e:
self._DoReadFileDtb(
'172_fit_fdt.dts',
'170_fit_fdt.dts',
entry_args=entry_args,
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",
@ -4535,5 +4537,10 @@ class TestFunctional(unittest.TestCase):
expected += tools.GetBytes(0, 88 - len(expected)) + U_BOOT_NODTB_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__":
unittest.main()

View file

@ -0,0 +1,14 @@
// SPDX-License-Identifier: GPL-2.0+
/dts-v1/;
/ {
#address-cells = <1>;
#size-cells = <1>;
binman {
opensbi {
filename = "fw_dynamic.bin";
};
};
};