[PATCH v2 1/2] dm: core: ofnode: Add ofnode_read_bootscript_flash()

ofnode_read_bootscript_flash() reads bootscript address from /options/u-boot DT node. bootscr-flash-offset and bootscr-flash-size properties are read and values are filled. When bootscr-flash-size is not defined, bootscr-flash-offset property is unusable that's why cleaned. Both of these properties should be defined to function properly.
Also add test to cover this new function.
Reviewed-by: Simon Glass sjg@chromium.org Signed-off-by: Michal Simek michal.simek@amd.com ---
Changes in v2: - Add missing static inline for !DM case (found by CI loop)
arch/sandbox/dts/test.dts | 2 ++ drivers/core/ofnode.c | 34 ++++++++++++++++++++++++++++++++++ include/dm/ofnode.h | 27 +++++++++++++++++++++++++++ test/dm/ofnode.c | 9 +++++++-- 4 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 84879cc31ac0..cedb66af09e7 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -83,6 +83,8 @@ u-boot { compatible = "u-boot,config"; bootscr-ram-offset = /bits/ 64 <0x12345678>; + bootscr-flash-offset = /bits/ 64 <0>; + bootscr-flash-size = /bits/ 64 <0x2000>; }; };
diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index d94f0300c30a..023aad06ddc3 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -1588,6 +1588,40 @@ int ofnode_read_bootscript_address(u64 *bootscr_address, u64 *bootscr_offset) return 0; }
+int ofnode_read_bootscript_flash(u64 *bootscr_flash_offset, + u64 *bootscr_flash_size) +{ + int ret; + ofnode uboot; + + *bootscr_flash_offset = 0; + *bootscr_flash_size = 0; + + uboot = ofnode_path("/options/u-boot"); + if (!ofnode_valid(uboot)) { + printf("%s: Missing /u-boot node\n", __func__); + return -EINVAL; + } + + ret = ofnode_read_u64(uboot, "bootscr-flash-offset", + bootscr_flash_offset); + if (ret) + return -EINVAL; + + ret = ofnode_read_u64(uboot, "bootscr-flash-size", + bootscr_flash_size); + if (ret) + return -EINVAL; + + if (!bootscr_flash_size) { + debug("bootscr-flash-size is zero. Ignoring properties!\n"); + *bootscr_flash_offset = 0; + return -EINVAL; + } + + return 0; +} + ofnode ofnode_get_phy_node(ofnode node) { /* DT node properties that reference a PHY node */ diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index c1afa69e1c56..6f8dc4fb4551 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -1521,6 +1521,27 @@ const char *ofnode_conf_read_str(const char *prop_name); */ int ofnode_read_bootscript_address(u64 *bootscr_address, u64 *bootscr_offset);
+/** + * ofnode_read_bootscript_flash() - Read bootscr-flash-offset/size + * + * @bootscr_flash_offset: pointer to 64bit offset where bootscr-flash-offset + * property value is stored + * @bootscr_flash_size: pointer to 64bit size where bootscr-flash-size property + * value is stored + * + * This reads a bootscr-flash-offset and bootscr-flash-size properties from + * the /options/u-boot/ node of the devicetree. bootscr-flash-offset holds + * the offset of the boot script file from start of flash. bootscr-flash-size + * holds the boot script size in flash. When bootscr-flash-size is not defined, + * bootscr-flash-offset property is cleaned. + * + * This only works with the control FDT. + * + * Return: 0 if OK, -EINVAL if property is not found or incorrect. + */ +int ofnode_read_bootscript_flash(u64 *bootscr_flash_offset, + u64 *bootscr_flash_size); + #else /* CONFIG_DM */ static inline bool ofnode_conf_read_bool(const char *prop_name) { @@ -1542,6 +1563,12 @@ static inline int ofnode_read_bootscript_address(u64 *bootscr_address, u64 *boot return -EINVAL; }
+static inline int ofnode_read_bootscript_flash(u64 *bootscr_flash_offset, + u64 *bootscr_flash_size) +{ + return -EINVAL; +} + #endif /* CONFIG_DM */
/** diff --git a/test/dm/ofnode.c b/test/dm/ofnode.c index a4e04f23784f..d84b738ed7c4 100644 --- a/test/dm/ofnode.c +++ b/test/dm/ofnode.c @@ -585,14 +585,19 @@ DM_TEST(dm_test_ofnode_conf, 0);
static int dm_test_ofnode_options(struct unit_test_state *uts) { - u64 bootscr_address; - u64 bootscr_offset; + u64 bootscr_address, bootscr_offset; + u64 bootscr_flash_offset, bootscr_flash_size;
ut_assertok(ofnode_read_bootscript_address(&bootscr_address, &bootscr_offset)); ut_asserteq_64(0, bootscr_address); ut_asserteq_64(0x12345678, bootscr_offset);
+ ut_assertok(ofnode_read_bootscript_flash(&bootscr_flash_offset, + &bootscr_flash_size)); + ut_asserteq_64(0, bootscr_flash_offset); + ut_asserteq_64(0x2000, bootscr_flash_size); + return 0; } DM_TEST(dm_test_ofnode_options, 0);

Location of bootscript in flash can be specified via /options/u-boot DT node by using bootscr-flash-offset and bootscr-flash-size properties. Values should be saved to script_offset_f and script_size_f variables. Variables are described in doc/develop/bootstd.rst as: script_offset_f SPI flash offset from which to load the U-Boot script, e.g. 0xffe000
script_size_f Size of the script to load, e.g. 0x2000
Both of them are used by sf_get_bootflow() in drivers/mtd/spi/sf_bootdev.c to identify bootscript location inside flash.
Signed-off-by: Michal Simek michal.simek@amd.com ---
Changes in v2: - Change message from printf to debug not to disturb current users
board/xilinx/common/board.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c index b3fb6acc25a3..126f0d81a9ed 100644 --- a/board/xilinx/common/board.c +++ b/board/xilinx/common/board.c @@ -411,6 +411,7 @@ int board_late_init_xilinx(void) int i, id, macid = 0; struct xilinx_board_description *desc; phys_size_t bootm_size = gd->ram_top - gd->ram_base; + u64 bootscr_flash_offset, bootscr_flash_size;
if (!IS_ENABLED(CONFIG_MICROBLAZE)) { ulong scriptaddr; @@ -435,11 +436,19 @@ int board_late_init_xilinx(void) } }
+ if (!ofnode_read_bootscript_flash(&bootscr_flash_offset, + &bootscr_flash_size)) { + ret |= env_set_hex("script_offset_f", bootscr_flash_offset); + ret |= env_set_hex("script_size_f", bootscr_flash_size); + } else { + debug("!!! Please define bootscr-flash-offset via DT !!!\n"); + ret |= env_set_hex("script_offset_f", + CONFIG_BOOT_SCRIPT_OFFSET); + } + if (IS_ENABLED(CONFIG_ARCH_ZYNQ) || IS_ENABLED(CONFIG_MICROBLAZE)) bootm_size = min(bootm_size, (phys_size_t)(SZ_512M + SZ_256M));
- ret |= env_set_hex("script_offset_f", CONFIG_BOOT_SCRIPT_OFFSET); - ret |= env_set_addr("bootm_low", (void *)gd->ram_base); ret |= env_set_addr("bootm_size", (void *)bootm_size);

On Thu, 31 Aug 2023 at 01:04, Michal Simek michal.simek@amd.com wrote:
Location of bootscript in flash can be specified via /options/u-boot DT node by using bootscr-flash-offset and bootscr-flash-size properties. Values should be saved to script_offset_f and script_size_f variables. Variables are described in doc/develop/bootstd.rst as: script_offset_f SPI flash offset from which to load the U-Boot script, e.g. 0xffe000
script_size_f Size of the script to load, e.g. 0x2000
Both of them are used by sf_get_bootflow() in drivers/mtd/spi/sf_bootdev.c to identify bootscript location inside flash.
Signed-off-by: Michal Simek michal.simek@amd.com
Changes in v2:
- Change message from printf to debug not to disturb current users
board/xilinx/common/board.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c index b3fb6acc25a3..126f0d81a9ed 100644 --- a/board/xilinx/common/board.c +++ b/board/xilinx/common/board.c @@ -411,6 +411,7 @@ int board_late_init_xilinx(void) int i, id, macid = 0; struct xilinx_board_description *desc; phys_size_t bootm_size = gd->ram_top - gd->ram_base;
u64 bootscr_flash_offset, bootscr_flash_size; if (!IS_ENABLED(CONFIG_MICROBLAZE)) { ulong scriptaddr;
@@ -435,11 +436,19 @@ int board_late_init_xilinx(void) } }
if (!ofnode_read_bootscript_flash(&bootscr_flash_offset,
&bootscr_flash_size)) {
ret |= env_set_hex("script_offset_f", bootscr_flash_offset);
ret |= env_set_hex("script_size_f", bootscr_flash_size);
} else {
debug("!!! Please define bootscr-flash-offset via DT !!!\n");
ret |= env_set_hex("script_offset_f",
CONFIG_BOOT_SCRIPT_OFFSET);
}
if (IS_ENABLED(CONFIG_ARCH_ZYNQ) || IS_ENABLED(CONFIG_MICROBLAZE)) bootm_size = min(bootm_size, (phys_size_t)(SZ_512M + SZ_256M));
ret |= env_set_hex("script_offset_f", CONFIG_BOOT_SCRIPT_OFFSET);
ret |= env_set_addr("bootm_low", (void *)gd->ram_base); ret |= env_set_addr("bootm_size", (void *)bootm_size);
-- 2.36.1

On 8/31/23 09:04, Michal Simek wrote:
ofnode_read_bootscript_flash() reads bootscript address from /options/u-boot DT node. bootscr-flash-offset and bootscr-flash-size properties are read and values are filled. When bootscr-flash-size is not defined, bootscr-flash-offset property is unusable that's why cleaned. Both of these properties should be defined to function properly.
Also add test to cover this new function.
Reviewed-by: Simon Glass sjg@chromium.org Signed-off-by: Michal Simek michal.simek@amd.com
Changes in v2:
Add missing static inline for !DM case (found by CI loop)
arch/sandbox/dts/test.dts | 2 ++ drivers/core/ofnode.c | 34 ++++++++++++++++++++++++++++++++++ include/dm/ofnode.h | 27 +++++++++++++++++++++++++++ test/dm/ofnode.c | 9 +++++++-- 4 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 84879cc31ac0..cedb66af09e7 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -83,6 +83,8 @@ u-boot { compatible = "u-boot,config"; bootscr-ram-offset = /bits/ 64 <0x12345678>;
bootscr-flash-offset = /bits/ 64 <0>;
}; };bootscr-flash-size = /bits/ 64 <0x2000>;
diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index d94f0300c30a..023aad06ddc3 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -1588,6 +1588,40 @@ int ofnode_read_bootscript_address(u64 *bootscr_address, u64 *bootscr_offset) return 0; }
+int ofnode_read_bootscript_flash(u64 *bootscr_flash_offset,
u64 *bootscr_flash_size)
+{
- int ret;
- ofnode uboot;
- *bootscr_flash_offset = 0;
- *bootscr_flash_size = 0;
- uboot = ofnode_path("/options/u-boot");
- if (!ofnode_valid(uboot)) {
printf("%s: Missing /u-boot node\n", __func__);
return -EINVAL;
- }
- ret = ofnode_read_u64(uboot, "bootscr-flash-offset",
bootscr_flash_offset);
- if (ret)
return -EINVAL;
- ret = ofnode_read_u64(uboot, "bootscr-flash-size",
bootscr_flash_size);
- if (ret)
return -EINVAL;
- if (!bootscr_flash_size) {
debug("bootscr-flash-size is zero. Ignoring properties!\n");
*bootscr_flash_offset = 0;
return -EINVAL;
- }
- return 0;
+}
- ofnode ofnode_get_phy_node(ofnode node) { /* DT node properties that reference a PHY node */
diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index c1afa69e1c56..6f8dc4fb4551 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -1521,6 +1521,27 @@ const char *ofnode_conf_read_str(const char *prop_name); */ int ofnode_read_bootscript_address(u64 *bootscr_address, u64 *bootscr_offset);
+/**
- ofnode_read_bootscript_flash() - Read bootscr-flash-offset/size
- @bootscr_flash_offset: pointer to 64bit offset where bootscr-flash-offset
- property value is stored
- @bootscr_flash_size: pointer to 64bit size where bootscr-flash-size property
- value is stored
- This reads a bootscr-flash-offset and bootscr-flash-size properties from
- the /options/u-boot/ node of the devicetree. bootscr-flash-offset holds
- the offset of the boot script file from start of flash. bootscr-flash-size
- holds the boot script size in flash. When bootscr-flash-size is not defined,
- bootscr-flash-offset property is cleaned.
- This only works with the control FDT.
- Return: 0 if OK, -EINVAL if property is not found or incorrect.
- */
+int ofnode_read_bootscript_flash(u64 *bootscr_flash_offset,
u64 *bootscr_flash_size);
- #else /* CONFIG_DM */ static inline bool ofnode_conf_read_bool(const char *prop_name) {
@@ -1542,6 +1563,12 @@ static inline int ofnode_read_bootscript_address(u64 *bootscr_address, u64 *boot return -EINVAL; }
+static inline int ofnode_read_bootscript_flash(u64 *bootscr_flash_offset,
u64 *bootscr_flash_size)
+{
- return -EINVAL;
+}
#endif /* CONFIG_DM */
/**
diff --git a/test/dm/ofnode.c b/test/dm/ofnode.c index a4e04f23784f..d84b738ed7c4 100644 --- a/test/dm/ofnode.c +++ b/test/dm/ofnode.c @@ -585,14 +585,19 @@ DM_TEST(dm_test_ofnode_conf, 0);
static int dm_test_ofnode_options(struct unit_test_state *uts) {
- u64 bootscr_address;
- u64 bootscr_offset;
u64 bootscr_address, bootscr_offset;
u64 bootscr_flash_offset, bootscr_flash_size;
ut_assertok(ofnode_read_bootscript_address(&bootscr_address, &bootscr_offset)); ut_asserteq_64(0, bootscr_address); ut_asserteq_64(0x12345678, bootscr_offset);
ut_assertok(ofnode_read_bootscript_flash(&bootscr_flash_offset,
&bootscr_flash_size));
ut_asserteq_64(0, bootscr_flash_offset);
ut_asserteq_64(0x2000, bootscr_flash_size);
return 0; } DM_TEST(dm_test_ofnode_options, 0);
Applied both.
M
participants (2)
-
Michal Simek
-
Simon Glass