A common scripting pattern in barebox is continuing boot from the current bootsource: if [ "$bootsource" = "mmc" ]; then global.boot.default="mmc${bootsource_instance} ${global.boot.default}" fi This fails on the RK356x boards, because of a mismatch in numbering: block device numbering is dictated by the mmc* DT aliases and numbering used for bootsource_instance is taken as is from what the bootrom reports. On SoCs like i.MX, this is a much rarer issue, because the upstream DT has predefined aliases in the same order as reported by the bootrom. In Rockchip DTs on the other hand, aliases are delegated to the board device trees and all boards we support have aliases in an order different from what the bootrom numbering. Fix this by employing the newly supported barebox,bootsource-* mapping table. As a result $bootsource_instance will change. We fix the upstream code depending on specific numbering here, but custom scripts and board code may still be broken. Co-developed-by: Johannes Zink <j.zink@xxxxxxxxxxxxxx> Signed-off-by: Johannes Zink <j.zink@xxxxxxxxxxxxxx> Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- arch/arm/boards/radxa-rock3/board.c | 2 +- arch/arm/boards/rockchip-rk3568-bpi-r2pro/board.c | 2 +- arch/arm/boards/rockchip-rk3568-evb/board.c | 2 +- arch/arm/dts/rk3566-quartz64-a.dts | 1 + arch/arm/dts/rk3568-bpi-r2-pro.dts | 1 + arch/arm/dts/rk3568-evb1-v10.dts | 1 + arch/arm/dts/rk3568-rock-3a.dts | 1 + arch/arm/dts/rk356x.dtsi | 9 +++++++++ arch/arm/mach-rockchip/rk3568.c | 8 +++----- 9 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 arch/arm/dts/rk356x.dtsi diff --git a/arch/arm/boards/radxa-rock3/board.c b/arch/arm/boards/radxa-rock3/board.c index aef5ec5df669..2413ea6cacc0 100644 --- a/arch/arm/boards/radxa-rock3/board.c +++ b/arch/arm/boards/radxa-rock3/board.c @@ -21,7 +21,7 @@ static int rock3_probe(struct device_d *dev) barebox_set_model(model->name); barebox_set_hostname(model->shortname); - if (bootsource == BOOTSOURCE_MMC && instance == 1) + if (bootsource == BOOTSOURCE_MMC && instance == 0) of_device_enable_path("/chosen/environment-sd"); else of_device_enable_path("/chosen/environment-emmc"); diff --git a/arch/arm/boards/rockchip-rk3568-bpi-r2pro/board.c b/arch/arm/boards/rockchip-rk3568-bpi-r2pro/board.c index e472f13c8bbf..1a5faa8afb12 100644 --- a/arch/arm/boards/rockchip-rk3568-bpi-r2pro/board.c +++ b/arch/arm/boards/rockchip-rk3568-bpi-r2pro/board.c @@ -23,7 +23,7 @@ static int rk3568_bpi_r2pro_probe(struct device_d *dev) barebox_set_hostname("bpi-r2pro"); machine_is_bpi_r2pro = true; - if (bootsource == BOOTSOURCE_MMC && instance == 1) + if (bootsource == BOOTSOURCE_MMC && instance == 0) of_device_enable_path("/chosen/environment-sd"); else of_device_enable_path("/chosen/environment-emmc"); diff --git a/arch/arm/boards/rockchip-rk3568-evb/board.c b/arch/arm/boards/rockchip-rk3568-evb/board.c index a466d385a223..212c801c93d3 100644 --- a/arch/arm/boards/rockchip-rk3568-evb/board.c +++ b/arch/arm/boards/rockchip-rk3568-evb/board.c @@ -23,7 +23,7 @@ static int rk3568_evb_probe(struct device_d *dev) barebox_set_hostname("rk3568-evb"); machine_is_rk3568_evb = true; - if (bootsource == BOOTSOURCE_MMC && instance == 1) + if (bootsource == BOOTSOURCE_MMC && instance == 0) of_device_enable_path("/chosen/environment-sd"); else of_device_enable_path("/chosen/environment-emmc"); diff --git a/arch/arm/dts/rk3566-quartz64-a.dts b/arch/arm/dts/rk3566-quartz64-a.dts index 8639ca0886f1..0036ef31f13a 100644 --- a/arch/arm/dts/rk3566-quartz64-a.dts +++ b/arch/arm/dts/rk3566-quartz64-a.dts @@ -3,6 +3,7 @@ /dts-v1/; #include <arm64/rockchip/rk3566-quartz64-a.dts> +#include "rk356x.dtsi" / { memory@a00000 { diff --git a/arch/arm/dts/rk3568-bpi-r2-pro.dts b/arch/arm/dts/rk3568-bpi-r2-pro.dts index da76ab64c106..8c13ddd5c103 100644 --- a/arch/arm/dts/rk3568-bpi-r2-pro.dts +++ b/arch/arm/dts/rk3568-bpi-r2-pro.dts @@ -9,6 +9,7 @@ #include <dt-bindings/leds/common.h> #include <dt-bindings/pinctrl/rockchip.h> #include "rk3568.dtsi" +#include "rk356x.dtsi" / { model = "Bananapi-R2 Pro (RK3568) DDR4 Board"; diff --git a/arch/arm/dts/rk3568-evb1-v10.dts b/arch/arm/dts/rk3568-evb1-v10.dts index d2c1fc89a8cb..82186ff86ead 100644 --- a/arch/arm/dts/rk3568-evb1-v10.dts +++ b/arch/arm/dts/rk3568-evb1-v10.dts @@ -7,6 +7,7 @@ /dts-v1/; #include <arm64/rockchip/rk3568-evb1-v10.dts> +#include "rk356x.dtsi" / { chosen: chosen { diff --git a/arch/arm/dts/rk3568-rock-3a.dts b/arch/arm/dts/rk3568-rock-3a.dts index 44d4fc9686df..25a0c05737d0 100644 --- a/arch/arm/dts/rk3568-rock-3a.dts +++ b/arch/arm/dts/rk3568-rock-3a.dts @@ -3,6 +3,7 @@ /dts-v1/; #include <arm64/rockchip/rk3568-rock-3a.dts> +#include "rk356x.dtsi" / { chosen: chosen { diff --git a/arch/arm/dts/rk356x.dtsi b/arch/arm/dts/rk356x.dtsi new file mode 100644 index 000000000000..254450d78fa8 --- /dev/null +++ b/arch/arm/dts/rk356x.dtsi @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/ { + aliases { + barebox,bootsource-mmc0 = &sdhci; + barebox,bootsource-mmc1 = &sdmmc0; + barebox,bootsource-mmc2 = &sdmmc1; + }; +}; diff --git a/arch/arm/mach-rockchip/rk3568.c b/arch/arm/mach-rockchip/rk3568.c index 2d80bad8a658..19dfa9b87151 100644 --- a/arch/arm/mach-rockchip/rk3568.c +++ b/arch/arm/mach-rockchip/rk3568.c @@ -151,18 +151,16 @@ static struct rk_bootsource bootdev_map[] = { [0xa] = { .src = BOOTSOURCE_USB, .instance = 0 }, }; -static enum bootsource rk3568_bootsource(void) +static void rk3568_bootsource(void) { u32 v; v = readl(RK3568_IRAM_BASE + 0x10); if (v >= ARRAY_SIZE(bootdev_map)) - return BOOTSOURCE_UNKNOWN; + return; - bootsource_set_raw(bootdev_map[v].src, bootdev_map[v].instance); - - return bootdev_map[v].src; + bootsource_set(bootdev_map[v].src, bootdev_map[v].instance); } int rk3568_init(void) -- 2.30.2