Hi Yao Zi,

On Mon, Jan 19, 2026 at 4:41 AM Yao Zi <[email protected]> wrote:

> (My mail provider complains about the huge list of recipients, so I
> reduced it a little.)
>
> On Sat, Jan 17, 2026 at 02:01:48PM -0500, Raymond Mao wrote:
> > From: Raymond Mao <[email protected]>
> >
> > Include DDR initialization firmware in the SPL image. The firmware
> > path can be specified via the DDR_FW_FILE environment variable. If
> > the firmware is not found, an empty placeholder file is created to
> > allow the build to proceed without DDR initialization support.
> >
> > Signed-off-by: Raymond Mao <[email protected]>
> > ---
> >  arch/riscv/dts/k1-spl.dts      |  34 ++++++++++++++++++++++++++++++++-
> >  board/spacemit/k1/Kconfig      |   8 ++++++++
> >  board/spacemit/k1/Makefile     |  19 ++++++++++++++++++
> >  board/spacemit/k1/spl.c        |  30 +++++++++++++++++++++++++++++
> >  include/configs/k1.h           |   3 +++
> >  lib/vendor/spacemit/ddr_fw.bin | Bin 0 -> 19416 bytes
>
> It's unusual to ship binary firmware in U-Boot repository. Please place
> the firmware somewhere else, and give a clear instruction in the
> board/architecture documentation explaining how to obtain/build it.
>
> >  6 files changed, 93 insertions(+), 1 deletion(-)
> >  create mode 100644 lib/vendor/spacemit/ddr_fw.bin
>
> ...
>
> > diff --git a/board/spacemit/k1/Kconfig b/board/spacemit/k1/Kconfig
> > index 9f9c806d00d..a5fa788f660 100644
> > --- a/board/spacemit/k1/Kconfig
> > +++ b/board/spacemit/k1/Kconfig
> > @@ -15,6 +15,14 @@ config SYS_CONFIG_NAME
> >  config TEXT_BASE
> >       default 0x00200000
> >
> > +config SPL_DDR_FIRMWARE_OFFSET
> > +     hex "DDR firmware offset in SPL image"
> > +     depends on SPL
> > +     default 0x20000
> > +     help
> > +       Offset where DDR firmware should be placed in the SPL
> > +       image.
> > +
> >  config SPL_OPENSBI_LOAD_ADDR
> >       default 0x00000000
> >
> > diff --git a/board/spacemit/k1/Makefile b/board/spacemit/k1/Makefile
> > index 7bce47bac8c..ebe6e55867c 100644
> > --- a/board/spacemit/k1/Makefile
> > +++ b/board/spacemit/k1/Makefile
> > @@ -5,3 +5,22 @@
> >
> >  obj-y := board.o
> >  obj-$(CONFIG_SPL_BUILD) += spl.o
> > +
> > +DDR_FW_SRC ?= $(DDR_FW_FILE)
> > +FW_TARGET = $(srctree)/lib/vendor/spacemit/ddr_fw.bin
> > +
> > +DDR_FW_HEADER = $(objtree)/include/generated/ddr_fw_info.h
> > +
> > +$(obj)/spl.o: $(DDR_FW_HEADER)
> > +
> > +$(DDR_FW_HEADER): $(FW_TARGET)
> > +     @echo "/* DDR firmware info - $$(date) */" > $@
> > +     @if [ -f "$(FW_TARGET)" ]; then \
> > +             SIZE=$$(stat -c%s "$(FW_TARGET)" 2>/dev/null || echo 0); \
> > +     else \
> > +             SIZE=0; \
> > +     fi; \
> > +     echo "#define DDR_FW_FILE_SIZE  $$SIZE" >> $@
> > +     @echo "/* Note: Update ADDR if binman layout changes */" >> $@
> > +
> > +clean-files += $(FW_TARGET) $(DDR_FW_HEADER)
>
> Please make use of existing binman[1] facibilities to avoid the extra
> Kconfig and Makefile pieces. binman_sym() could be used for obtaining
> both size and offset of a binman entry.
>
> It doesn't work at all in SPL. I checked the binman symbol table
that was totally empty.


> > diff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c
> > index 6fe064bd430..54bad9000fe 100644
> > --- a/board/spacemit/k1/spl.c
> > +++ b/board/spacemit/k1/spl.c
> > @@ -6,10 +6,12 @@
> >  #include <asm/io.h>
> >  #include <clk.h>
> >  #include <clk-uclass.h>
> > +#include <cpu_func.h>
> >  #include <configs/k1.h>
> >  #include <dm/device.h>
> >  #include <dm/uclass.h>
> >  #include <dt-bindings/pinctrl/k1-pinctrl.h>
> > +#include <generated/ddr_fw_info.h>
> >  #include <i2c.h>
> >  #include <linux/delay.h>
> >  #include <log.h>
> > @@ -115,6 +117,33 @@ void serial_early_init(void)
> >               panic("Serial uclass init failed: %d\n", ret);
> >  }
> >
> > +/* Load DDR training firmware */
> > +int init_ddr_firmware(void)
> > +{
> > +     void __iomem *src, *dst;
> > +     unsigned long size;
> > +
> > +     src = (void __iomem *)(CONFIG_SPL_TEXT_BASE +
> > +                            CONFIG_SPL_DDR_FIRMWARE_OFFSET);
> > +     dst = (void __iomem *)(DDR_TRAINING_DATA_BASE);
> > +     memcpy(dst, src, DDR_FW_FILE_SIZE);
> > +     size = round_up(DDR_FW_FILE_SIZE, 64);
> > +     flush_dcache_range((u32)(u64)dst, (u32)(u64)dst + size);
> > +     return 0;
> > +}
> > +
> > +void ddr_early_init(void)
> > +{
> > +     void __iomem *addr;
> > +
> > +     init_ddr_firmware();
> > +     addr = (void __iomem *)(CONFIG_SPL_TEXT_BASE +
> > +                             CONFIG_SPL_DDR_FIRMWARE_OFFSET);
> > +     // verify DDR firmware header
>
> However, you don't verify it, but only print some of the information.
> The comment seems misleading and extra.
>
> OK. I could remove the print and use checking instead.

Raymond


> > +     log_info("[0x%x]:0x%x, firmware size:%d\n",
> > +              (uint)(u64)addr, readl(addr), DDR_FW_FILE_SIZE);
>
> Regards,
> Yao Zi
>

Reply via email to