[PATCH 0/7] arm64: binman: use binman symbols for imx

From: Peng Fan peng.fan@nxp.com
binman symbol is a good feature, but only used on X86 for now. This patchset is to use it for i.MX8M platform.
The current imx8m ddr phy firmware consumes lots of space, because we pad them to the largest 32KB and 16KB for IMEM and DMEM.
With this patchset we use binman symbols to get firmware location and size, we could save near 36KB with i.MX8MP-EVK.
Please help check and test
Note: with this patchset, nxp downstream imx-mkimage will not work. Later patches will follow up to address.
Peng Fan (7): spl: guard u_boot_any with X86 arm: dts: imx8m: update binman ddr firmware node name armv8: u-boot-spl.lds: mark __image_copy_start as symbol binman_sym: update symbol alignment to 8 bytes tools: binman: section: replace @ with - ddr: imx8m: helper: load ddr firmware according to binman symbols arm: dts: imx8m: shrink ddr firmware size to actual file size
arch/arm/cpu/armv8/u-boot-spl.lds | 2 +- arch/arm/dts/imx8mm-u-boot.dtsi | 16 +++---- arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi | 8 ++-- .../dts/imx8mn-bsh-smm-s2-u-boot-common.dtsi | 4 +- arch/arm/dts/imx8mn-ddr4-evk-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mn-evk-u-boot.dtsi | 8 ++-- .../dts/imx8mn-var-som-symphony-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mn-venice-u-boot.dtsi | 16 +++---- arch/arm/dts/imx8mp-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mq-cm-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mq-u-boot.dtsi | 16 +++---- common/spl/spl.c | 8 +++- drivers/ddr/imx/imx8m/helper.c | 45 ++++++++++++++++--- include/binman_sym.h | 6 +-- tools/binman/etype/section.py | 2 +- 15 files changed, 101 insertions(+), 62 deletions(-)

From: Peng Fan peng.fan@nxp.com
set the symbol as weak not work if LTO is enabled. Since u_boot_any is only used on X86 for now, so guard it with X86, otherwise build break if we use BINMAN_SYMBOLS on i.MX.
Signed-off-by: Peng Fan peng.fan@nxp.com --- common/spl/spl.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/common/spl/spl.c b/common/spl/spl.c index c8c463f80bd..4b28180467a 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -50,7 +50,7 @@ DECLARE_GLOBAL_DATA_PTR;
u32 *boot_params_ptr = NULL;
-#if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) +#if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) && CONFIG_IS_ENABLED(X86) /* See spl.h for information about this */ binman_sym_declare(ulong, u_boot_any, image_pos); binman_sym_declare(ulong, u_boot_any, size); @@ -148,7 +148,7 @@ void spl_fixup_fdt(void *fdt_blob) #endif }
-#if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) +#if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) && CONFIG_IS_ENABLED(X86) ulong spl_get_image_pos(void) { #ifdef CONFIG_VPL @@ -221,7 +221,11 @@ __weak struct image_header *spl_get_load_buffer(ssize_t offset, size_t size)
void spl_set_header_raw_uboot(struct spl_image_info *spl_image) { +#if CONFIG_IS_ENABLED(X86) ulong u_boot_pos = binman_sym(ulong, u_boot_any, image_pos); +#else + ulong u_boot_pos = BINMAN_SYM_MISSING; +#endif
spl_image->size = CONFIG_SYS_MONITOR_LEN;

On Sat, May 07, 2022 at 05:21:36PM +0800, Peng Fan (OSS) wrote:
From: Peng Fan peng.fan@nxp.com
set the symbol as weak not work if LTO is enabled. Since u_boot_any is only used on X86 for now, so guard it with X86, otherwise build break if we use BINMAN_SYMBOLS on i.MX.
Signed-off-by: Peng Fan peng.fan@nxp.com
common/spl/spl.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/common/spl/spl.c b/common/spl/spl.c index c8c463f80bd..4b28180467a 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -50,7 +50,7 @@ DECLARE_GLOBAL_DATA_PTR;
u32 *boot_params_ptr = NULL;
-#if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) +#if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) && CONFIG_IS_ENABLED(X86) /* See spl.h for information about this */ binman_sym_declare(ulong, u_boot_any, image_pos); binman_sym_declare(ulong, u_boot_any, size); @@ -148,7 +148,7 @@ void spl_fixup_fdt(void *fdt_blob) #endif }
-#if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) +#if CONFIG_IS_ENABLED(BINMAN_SYMBOLS) && CONFIG_IS_ENABLED(X86) ulong spl_get_image_pos(void) { #ifdef CONFIG_VPL @@ -221,7 +221,11 @@ __weak struct image_header *spl_get_load_buffer(ssize_t offset, size_t size)
void spl_set_header_raw_uboot(struct spl_image_info *spl_image) { +#if CONFIG_IS_ENABLED(X86) ulong u_boot_pos = binman_sym(ulong, u_boot_any, image_pos); +#else
- ulong u_boot_pos = BINMAN_SYM_MISSING;
+#endif
spl_image->size = CONFIG_SYS_MONITOR_LEN;
I think we need to look at using __used perhaps? LTO is / will be enabled on imx boards at some point.

From: Peng Fan peng.fan@nxp.com
We are migrating to use BINMAN SYMBOLS, the current name is not a valid binman type, so update to use blob-ext@[1,2,3,4].
Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/dts/imx8mm-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mn-bsh-smm-s2-u-boot-common.dtsi | 4 ++-- arch/arm/dts/imx8mn-venice-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mq-u-boot.dtsi | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/arch/arm/dts/imx8mm-u-boot.dtsi b/arch/arm/dts/imx8mm-u-boot.dtsi index 9f66cdb65a9..5de55a2d80b 100644 --- a/arch/arm/dts/imx8mm-u-boot.dtsi +++ b/arch/arm/dts/imx8mm-u-boot.dtsi @@ -39,25 +39,25 @@ filename = "u-boot-spl.bin"; };
- 1d-imem { + imem_1d: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; size = <0x8000>; type = "blob-ext"; };
- 1d-dmem { + dmem_1d: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; size = <0x4000>; type = "blob-ext"; };
- 2d-imem { + imem_2d: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; size = <0x8000>; type = "blob-ext"; };
- 2d-dmem { + dmem_2d: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; size = <0x4000>; type = "blob-ext"; diff --git a/arch/arm/dts/imx8mn-bsh-smm-s2-u-boot-common.dtsi b/arch/arm/dts/imx8mn-bsh-smm-s2-u-boot-common.dtsi index 46a9d7fd78b..5a52b73d7e9 100644 --- a/arch/arm/dts/imx8mn-bsh-smm-s2-u-boot-common.dtsi +++ b/arch/arm/dts/imx8mn-bsh-smm-s2-u-boot-common.dtsi @@ -111,13 +111,13 @@ filename = "u-boot-spl.bin"; };
- 1d-imem { + imem_1d: blob-ext@1 { filename = "ddr3_imem_1d.bin"; size = <0x8000>; type = "blob-ext"; };
- 1d_dmem { + dmem_1d: blob-ext@2 { filename = "ddr3_dmem_1d.bin"; size = <0x4000>; type = "blob-ext"; diff --git a/arch/arm/dts/imx8mn-venice-u-boot.dtsi b/arch/arm/dts/imx8mn-venice-u-boot.dtsi index 35819553879..67922146963 100644 --- a/arch/arm/dts/imx8mn-venice-u-boot.dtsi +++ b/arch/arm/dts/imx8mn-venice-u-boot.dtsi @@ -126,25 +126,25 @@ filename = "u-boot-spl.bin"; };
- 1d-imem { + imem_1d: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; size = <0x8000>; type = "blob-ext"; };
- 1d_dmem { + dmem_1d: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; size = <0x4000>; type = "blob-ext"; };
- 2d_imem { + imem_2d: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; size = <0x8000>; type = "blob-ext"; };
- 2d_dmem { + dmem_2d: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; size = <0x4000>; type = "blob-ext"; diff --git a/arch/arm/dts/imx8mq-u-boot.dtsi b/arch/arm/dts/imx8mq-u-boot.dtsi index 912a3d4a356..389414ad26f 100644 --- a/arch/arm/dts/imx8mq-u-boot.dtsi +++ b/arch/arm/dts/imx8mq-u-boot.dtsi @@ -46,25 +46,25 @@ filename = "u-boot-spl.bin"; };
- 1d-imem { + imem_1d: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; size = <0x8000>; type = "blob-ext"; };
- 1d-dmem { + dmem_1d: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; size = <0x4000>; type = "blob-ext"; };
- 2d-imem { + imem_2d: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; size = <0x8000>; type = "blob-ext"; };
- 2d-dmem { + dmem_2d: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; size = <0x4000>; type = "blob-ext";

From: Peng Fan peng.fan@nxp.com
In arch/arm/lib/sections.c there is below code: char __image_copy_start[0] __section(".__image_copy_start"); But actually 'objdump -t spl/u-boot-spl' not able to find out symbol '__image_copy_start' for binman update image-pos/size.
So update link file
Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/cpu/armv8/u-boot-spl.lds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/cpu/armv8/u-boot-spl.lds b/arch/arm/cpu/armv8/u-boot-spl.lds index 730eb93dbc3..9b1e7d46287 100644 --- a/arch/arm/cpu/armv8/u-boot-spl.lds +++ b/arch/arm/cpu/armv8/u-boot-spl.lds @@ -23,7 +23,7 @@ SECTIONS { .text : { . = ALIGN(8); - *(.__image_copy_start) + __image_copy_start = .; CPUDIR/start.o (.text*) *(.text*) } >.sram

From: Peng Fan peng.fan@nxp.com
To ARM64 SPL which normally not enable MMU and Dcache, there will be data abort if the symbol is not 8 bytes aligned, because symbol type is ulong which is 8 bytes. So update to 8 bytes aligned.
Signed-off-by: Peng Fan peng.fan@nxp.com --- include/binman_sym.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/include/binman_sym.h b/include/binman_sym.h index 72e6765fe52..aac2dad0ec5 100644 --- a/include/binman_sym.h +++ b/include/binman_sym.h @@ -34,7 +34,7 @@ */ #define binman_sym_declare(_type, _entry_name, _prop_name) \ _type binman_symname(_entry_name, _prop_name) \ - __attribute__((aligned(4), unused, section(".binman_sym"))) + __attribute__((aligned(8), unused, section(".binman_sym")))
/** * binman_sym_extern() - Declare a extern symbol that will be used at run-time @@ -45,7 +45,7 @@ */ #define binman_sym_extern(_type, _entry_name, _prop_name) \ extern _type binman_symname(_entry_name, _prop_name) \ - __attribute__((aligned(4), unused, section(".binman_sym"))) + __attribute__((aligned(8), unused, section(".binman_sym")))
/** * binman_sym_declare_optional() - Declare an optional symbol @@ -59,7 +59,7 @@ */ #define binman_sym_declare_optional(_type, _entry_name, _prop_name) \ _type binman_symname(_entry_name, _prop_name) \ - __attribute__((aligned(4), weak, unused, \ + __attribute__((aligned(8), weak, unused, \ section(".binman_sym")))
/**

From: Peng Fan peng.fan@nxp.com
In arch/arm/dts/imx8mp-u-boot.dtsi, there are blob-ext@1, blob-ext@2 and etc which is for packing ddr phy firmware. However we could not declare symbol name such as 'binman_sym_declare(ulong, blob_ext@1, image_pos)', because '@' is not allowed, so we choose to declare the symbol 'binman_sym_declare(ulong, blob_ext_1, image_pos);' with '@' replaced with '_'. It does not impact if there is no '@' in section name.
Signed-off-by: Peng Fan peng.fan@nxp.com --- tools/binman/etype/section.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/binman/etype/section.py b/tools/binman/etype/section.py index bd67238b919..e3f362b442b 100644 --- a/tools/binman/etype/section.py +++ b/tools/binman/etype/section.py @@ -875,7 +875,7 @@ class Entry_section(Entry): entries[entry.GetPath()] = entry for entry in to_add.values(): self._CollectEntries(entries, entries_by_name, entry) - entries_by_name[add_entry.name] = add_entry + entries_by_name[add_entry.name.replace('@', '-')] = add_entry
def MissingArgs(self, entry, missing): """Report a missing argument, if enabled

From: Peng Fan peng.fan@nxp.com
By reading binman symbols, we no need hard coded IMEM_LEN/DMEM_LEN after we update the binman dtsi to drop 0x8000/0x4000 length for the firmware.
And that could save binary size for many KBs.
Signed-off-by: Peng Fan peng.fan@nxp.com --- drivers/ddr/imx/imx8m/helper.c | 45 ++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-)
diff --git a/drivers/ddr/imx/imx8m/helper.c b/drivers/ddr/imx/imx8m/helper.c index f23904bf712..cd93d129dc0 100644 --- a/drivers/ddr/imx/imx8m/helper.c +++ b/drivers/ddr/imx/imx8m/helper.c @@ -4,6 +4,7 @@ */
#include <common.h> +#include <binman_sym.h> #include <log.h> #include <spl.h> #include <asm/global_data.h> @@ -25,6 +26,20 @@ DECLARE_GLOBAL_DATA_PTR; #define DMEM_OFFSET_ADDR 0x00054000 #define DDR_TRAIN_CODE_BASE_ADDR IP2APB_DDRPHY_IPS_BASE_ADDR(0)
+binman_sym_declare(ulong, blob_ext_1, image_pos); +binman_sym_declare(ulong, blob_ext_1, size); + +binman_sym_declare(ulong, blob_ext_2, image_pos); +binman_sym_declare(ulong, blob_ext_2, size); + +#if !IS_ENABLED(CONFIG_IMX8M_DDR3L) +binman_sym_declare(ulong, blob_ext_3, image_pos); +binman_sym_declare(ulong, blob_ext_3, size); + +binman_sym_declare(ulong, blob_ext_4, image_pos); +binman_sym_declare(ulong, blob_ext_4, size); +#endif + /* We need PHY iMEM PHY is 32KB padded */ void ddr_load_train_firmware(enum fw_type type) { @@ -34,6 +49,7 @@ void ddr_load_train_firmware(enum fw_type type) unsigned long fw_offset = type ? IMEM_2D_OFFSET : 0; unsigned long imem_start = (unsigned long)&_end + fw_offset; unsigned long dmem_start; + unsigned long imem_len = IMEM_LEN, dmem_len = DMEM_LEN;
#ifdef CONFIG_SPL_OF_CONTROL if (gd->fdt_blob && !fdt_check_header(gd->fdt_blob)) { @@ -43,11 +59,30 @@ void ddr_load_train_firmware(enum fw_type type) } #endif
- dmem_start = imem_start + IMEM_LEN; + if (CONFIG_IS_ENABLED(BINMAN_SYMBOLS)) { + switch (type) { + case FW_1D_IMAGE: + imem_start = binman_sym(ulong, blob_ext_1, image_pos); + imem_len = binman_sym(ulong, blob_ext_1, size); + dmem_start = binman_sym(ulong, blob_ext_2, image_pos); + dmem_len = binman_sym(ulong, blob_ext_2, size); + break; + case FW_2D_IMAGE: +#if !IS_ENABLED(CONFIG_IMX8M_DDR3L) + imem_start = binman_sym(ulong, blob_ext_3, image_pos); + imem_len = binman_sym(ulong, blob_ext_3, size); + dmem_start = binman_sym(ulong, blob_ext_4, image_pos); + dmem_len = binman_sym(ulong, blob_ext_4, size); +#endif + break; + } + } + + dmem_start = imem_start + imem_len;
pr_from32 = imem_start; pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * IMEM_OFFSET_ADDR; - for (i = 0x0; i < IMEM_LEN; ) { + for (i = 0x0; i < imem_len; ) { tmp32 = readl(pr_from32); writew(tmp32 & 0x0000ffff, pr_to32); pr_to32 += 4; @@ -59,7 +94,7 @@ void ddr_load_train_firmware(enum fw_type type)
pr_from32 = dmem_start; pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * DMEM_OFFSET_ADDR; - for (i = 0x0; i < DMEM_LEN; ) { + for (i = 0x0; i < dmem_len; ) { tmp32 = readl(pr_from32); writew(tmp32 & 0x0000ffff, pr_to32); pr_to32 += 4; @@ -72,7 +107,7 @@ void ddr_load_train_firmware(enum fw_type type) debug("check ddr_pmu_train_imem code\n"); pr_from32 = imem_start; pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * IMEM_OFFSET_ADDR; - for (i = 0x0; i < IMEM_LEN; ) { + for (i = 0x0; i < imem_len; ) { tmp32 = (readw(pr_to32) & 0x0000ffff); pr_to32 += 4; tmp32 += ((readw(pr_to32) & 0x0000ffff) << 16); @@ -93,7 +128,7 @@ void ddr_load_train_firmware(enum fw_type type) debug("check ddr4_pmu_train_dmem code\n"); pr_from32 = dmem_start; pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * DMEM_OFFSET_ADDR; - for (i = 0x0; i < DMEM_LEN;) { + for (i = 0x0; i < dmem_len;) { tmp32 = (readw(pr_to32) & 0x0000ffff); pr_to32 += 4; tmp32 += ((readw(pr_to32) & 0x0000ffff) << 16);

From: Peng Fan peng.fan@nxp.com
After we switch to use BINMAN_SYMBOLS, there is no need to pad the file size to 0x8000 and 0x4000. After we use BINMAN_SYMBOLS, the u-boot-spl-ddr.bin shrink about 36KB with i.MX8MP-EVK.
Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/dts/imx8mm-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mn-ddr4-evk-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mn-evk-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mn-var-som-symphony-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mn-venice-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mp-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mq-cm-u-boot.dtsi | 8 ++++---- arch/arm/dts/imx8mq-u-boot.dtsi | 8 ++++---- 9 files changed, 36 insertions(+), 36 deletions(-)
diff --git a/arch/arm/dts/imx8mm-u-boot.dtsi b/arch/arm/dts/imx8mm-u-boot.dtsi index 5de55a2d80b..19a2da30f51 100644 --- a/arch/arm/dts/imx8mm-u-boot.dtsi +++ b/arch/arm/dts/imx8mm-u-boot.dtsi @@ -41,25 +41,25 @@
imem_1d: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; - size = <0x8000>; + align-end = <4>; type = "blob-ext"; };
dmem_1d: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; - size = <0x4000>; + align-end = <4>; type = "blob-ext"; };
imem_2d: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; - size = <0x8000>; + align-end = <4>; type = "blob-ext"; };
dmem_2d: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; - size = <0x4000>; + align-end = <4>; type = "blob-ext"; }; }; diff --git a/arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi b/arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi index eb1dd8debba..e1740fa31a6 100644 --- a/arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi +++ b/arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi @@ -149,22 +149,22 @@
blob_1: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; - size = <0x8000>; + align-end = <4>; };
blob_2: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; - size = <0x4000>; + align-end = <4>; };
blob_3: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; - size = <0x8000>; + align-end = <4>; };
blob_4: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; - size = <0x4000>; + align-end = <4>; }; };
diff --git a/arch/arm/dts/imx8mn-ddr4-evk-u-boot.dtsi b/arch/arm/dts/imx8mn-ddr4-evk-u-boot.dtsi index 4d0ecb07d4f..1fe2d0fd507 100644 --- a/arch/arm/dts/imx8mn-ddr4-evk-u-boot.dtsi +++ b/arch/arm/dts/imx8mn-ddr4-evk-u-boot.dtsi @@ -157,22 +157,22 @@
blob_1: blob-ext@1 { filename = "ddr4_imem_1d_201810.bin"; - size = <0x8000>; + align-end = <4>; };
blob_2: blob-ext@2 { filename = "ddr4_dmem_1d_201810.bin"; - size = <0x4000>; + align-end = <4>; };
blob_3: blob-ext@3 { filename = "ddr4_imem_2d_201810.bin"; - size = <0x8000>; + align-end = <4>; };
blob_4: blob-ext@4 { filename = "ddr4_dmem_2d_201810.bin"; - size = <0x4000>; + align-end = <4>; }; };
diff --git a/arch/arm/dts/imx8mn-evk-u-boot.dtsi b/arch/arm/dts/imx8mn-evk-u-boot.dtsi index 3db46d4cbcb..4f6dcf307b2 100644 --- a/arch/arm/dts/imx8mn-evk-u-boot.dtsi +++ b/arch/arm/dts/imx8mn-evk-u-boot.dtsi @@ -38,22 +38,22 @@
blob_1: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; - size = <0x8000>; + align-end = <4>; };
blob_2: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; - size = <0x4000>; + align-end = <4>; };
blob_3: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; - size = <0x8000>; + align-end = <4>; };
blob_4: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; - size = <0x4000>; + align-end = <4>; }; };
diff --git a/arch/arm/dts/imx8mn-var-som-symphony-u-boot.dtsi b/arch/arm/dts/imx8mn-var-som-symphony-u-boot.dtsi index 6e37622cca7..55530abf832 100644 --- a/arch/arm/dts/imx8mn-var-som-symphony-u-boot.dtsi +++ b/arch/arm/dts/imx8mn-var-som-symphony-u-boot.dtsi @@ -132,25 +132,25 @@
1d-imem { filename = "ddr4_imem_1d.bin"; - size = <0x8000>; + align-end = <4>; type = "blob-ext"; };
1d_dmem { filename = "ddr4_dmem_1d.bin"; - size = <0x4000>; + align-end = <4>; type = "blob-ext"; };
2d_imem { filename = "ddr4_imem_2d.bin"; - size = <0x8000>; + align-end = <4>; type = "blob-ext"; };
2d_dmem { filename = "ddr4_dmem_2d.bin"; - size = <0x4000>; + align-end = <4>; type = "blob-ext"; }; }; diff --git a/arch/arm/dts/imx8mn-venice-u-boot.dtsi b/arch/arm/dts/imx8mn-venice-u-boot.dtsi index 67922146963..e3a0b170347 100644 --- a/arch/arm/dts/imx8mn-venice-u-boot.dtsi +++ b/arch/arm/dts/imx8mn-venice-u-boot.dtsi @@ -128,25 +128,25 @@
imem_1d: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; - size = <0x8000>; + align-end = <4>; type = "blob-ext"; };
dmem_1d: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; - size = <0x4000>; + align-end = <4>; type = "blob-ext"; };
imem_2d: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; - size = <0x8000>; + align-end = <4>; type = "blob-ext"; };
dmem_2d: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; - size = <0x4000>; + align-end = <4>; type = "blob-ext"; }; }; diff --git a/arch/arm/dts/imx8mp-u-boot.dtsi b/arch/arm/dts/imx8mp-u-boot.dtsi index 20edd90cfad..274515a010e 100644 --- a/arch/arm/dts/imx8mp-u-boot.dtsi +++ b/arch/arm/dts/imx8mp-u-boot.dtsi @@ -63,22 +63,22 @@
blob_1: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem_202006.bin"; - size = <0x8000>; + align-end = <4>; };
blob_2: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem_202006.bin"; - size = <0x4000>; + align-end = <4>; };
blob_3: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem_202006.bin"; - size = <0x8000>; + align-end = <4>; };
blob_4: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem_202006.bin"; - size = <0x4000>; + align-end = <4>; }; };
diff --git a/arch/arm/dts/imx8mq-cm-u-boot.dtsi b/arch/arm/dts/imx8mq-cm-u-boot.dtsi index e2f4b0e740d..9538a04ed97 100644 --- a/arch/arm/dts/imx8mq-cm-u-boot.dtsi +++ b/arch/arm/dts/imx8mq-cm-u-boot.dtsi @@ -30,22 +30,22 @@
blob_1: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; - size = <0x8000>; + align-end = <4>; };
blob_2: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; - size = <0x4000>; + align-end = <4>; };
blob_3: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; - size = <0x8000>; + align-end = <4>; };
blob_4: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; - size = <0x4000>; + align-end = <4>; }; };
diff --git a/arch/arm/dts/imx8mq-u-boot.dtsi b/arch/arm/dts/imx8mq-u-boot.dtsi index 389414ad26f..1495869fcd2 100644 --- a/arch/arm/dts/imx8mq-u-boot.dtsi +++ b/arch/arm/dts/imx8mq-u-boot.dtsi @@ -48,25 +48,25 @@
imem_1d: blob-ext@1 { filename = "lpddr4_pmu_train_1d_imem.bin"; - size = <0x8000>; + align-end = <4>; type = "blob-ext"; };
dmem_1d: blob-ext@2 { filename = "lpddr4_pmu_train_1d_dmem.bin"; - size = <0x4000>; + align-end = <4>; type = "blob-ext"; };
imem_2d: blob-ext@3 { filename = "lpddr4_pmu_train_2d_imem.bin"; - size = <0x8000>; + align-end = <4>; type = "blob-ext"; };
dmem_2d: blob-ext@4 { filename = "lpddr4_pmu_train_2d_dmem.bin"; - size = <0x4000>; + align-end = <4>; type = "blob-ext"; }; };

Hi Peng
On Sat, May 7, 2022 at 10:39 AM Peng Fan (OSS) peng.fan@oss.nxp.com wrote:
From: Peng Fan peng.fan@nxp.com
binman symbol is a good feature, but only used on X86 for now. This patchset is to use it for i.MX8M platform.
The current imx8m ddr phy firmware consumes lots of space, because we pad them to the largest 32KB and 16KB for IMEM and DMEM.
With this patchset we use binman symbols to get firmware location and size, we could save near 36KB with i.MX8MP-EVK.
Please help check and test
Note: with this patchset, nxp downstream imx-mkimage will not work. Later patches will follow up to address.
First of all, thank you very much for this series. I will test on our boards and let you know.
Michael
Peng Fan (7): spl: guard u_boot_any with X86 arm: dts: imx8m: update binman ddr firmware node name armv8: u-boot-spl.lds: mark __image_copy_start as symbol binman_sym: update symbol alignment to 8 bytes tools: binman: section: replace @ with - ddr: imx8m: helper: load ddr firmware according to binman symbols arm: dts: imx8m: shrink ddr firmware size to actual file size
arch/arm/cpu/armv8/u-boot-spl.lds | 2 +- arch/arm/dts/imx8mm-u-boot.dtsi | 16 +++---- arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi | 8 ++-- .../dts/imx8mn-bsh-smm-s2-u-boot-common.dtsi | 4 +- arch/arm/dts/imx8mn-ddr4-evk-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mn-evk-u-boot.dtsi | 8 ++-- .../dts/imx8mn-var-som-symphony-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mn-venice-u-boot.dtsi | 16 +++---- arch/arm/dts/imx8mp-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mq-cm-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mq-u-boot.dtsi | 16 +++---- common/spl/spl.c | 8 +++- drivers/ddr/imx/imx8m/helper.c | 45 ++++++++++++++++--- include/binman_sym.h | 6 +-- tools/binman/etype/section.py | 2 +- 15 files changed, 101 insertions(+), 62 deletions(-)
-- 2.36.0

On Sat, May 07, 2022 at 05:21:35PM +0800, Peng Fan (OSS) wrote:
From: Peng Fan peng.fan@nxp.com
binman symbol is a good feature, but only used on X86 for now. This patchset is to use it for i.MX8M platform.
The current imx8m ddr phy firmware consumes lots of space, because we pad them to the largest 32KB and 16KB for IMEM and DMEM.
With this patchset we use binman symbols to get firmware location and size, we could save near 36KB with i.MX8MP-EVK.
Please help check and test
Note: with this patchset, nxp downstream imx-mkimage will not work. Later patches will follow up to address.
I just want to say I am very happy to see this work happening.

On Sat, May 7, 2022 at 1:39 AM Peng Fan (OSS) peng.fan@oss.nxp.com wrote:
From: Peng Fan peng.fan@nxp.com
binman symbol is a good feature, but only used on X86 for now. This patchset is to use it for i.MX8M platform.
The current imx8m ddr phy firmware consumes lots of space, because we pad them to the largest 32KB and 16KB for IMEM and DMEM.
With this patchset we use binman symbols to get firmware location and size, we could save near 36KB with i.MX8MP-EVK.
Please help check and test
Note: with this patchset, nxp downstream imx-mkimage will not work. Later patches will follow up to address.
Peng Fan (7): spl: guard u_boot_any with X86 arm: dts: imx8m: update binman ddr firmware node name armv8: u-boot-spl.lds: mark __image_copy_start as symbol binman_sym: update symbol alignment to 8 bytes tools: binman: section: replace @ with - ddr: imx8m: helper: load ddr firmware according to binman symbols arm: dts: imx8m: shrink ddr firmware size to actual file size
arch/arm/cpu/armv8/u-boot-spl.lds | 2 +- arch/arm/dts/imx8mm-u-boot.dtsi | 16 +++---- arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi | 8 ++-- .../dts/imx8mn-bsh-smm-s2-u-boot-common.dtsi | 4 +- arch/arm/dts/imx8mn-ddr4-evk-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mn-evk-u-boot.dtsi | 8 ++-- .../dts/imx8mn-var-som-symphony-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mn-venice-u-boot.dtsi | 16 +++---- arch/arm/dts/imx8mp-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mq-cm-u-boot.dtsi | 8 ++-- arch/arm/dts/imx8mq-u-boot.dtsi | 16 +++---- common/spl/spl.c | 8 +++- drivers/ddr/imx/imx8m/helper.c | 45 ++++++++++++++++--- include/binman_sym.h | 6 +-- tools/binman/etype/section.py | 2 +- 15 files changed, 101 insertions(+), 62 deletions(-)
Peng,
Thank you for doing this, its something I've wanted to get in for a long time now.
I can confirm this saves 39K in the IMX8M SPL.
Tested-by: Tim Harvey tharvey@gateworks.com #imx8mm-venice #imx8mn-venice #imx8mp-venice
Best Regards,
Tim
participants (4)
-
Michael Nazzareno Trimarchi
-
Peng Fan (OSS)
-
Tim Harvey
-
Tom Rini