diff mbox series

[07/10] package/freescale-imx/firmware-imx: support i.MX95's LPDDR4x FW

Message ID 20260203153617.80012-8-laurentiumihalcea111@gmail.com
State Handled Elsewhere
Headers show
Series Add support for IMX95-15x15-FRDM board | expand

Commit Message

Laurentiu Mihalcea Feb. 3, 2026, 3:36 p.m. UTC
From: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>

The DDR FW for the i.MX95 SoC requires a different handling as opposed
to other SoCs. For now, only introduce support for LPDDR4x.

Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
---
 package/freescale-imx/firmware-imx/Config.in  | 13 ++++++-
 .../firmware-imx/firmware-imx.mk              | 39 +++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/package/freescale-imx/firmware-imx/Config.in b/package/freescale-imx/firmware-imx/Config.in
index 0acc235e0a..43c74e8bbe 100644
--- a/package/freescale-imx/firmware-imx/Config.in
+++ b/package/freescale-imx/firmware-imx/Config.in
@@ -57,12 +57,18 @@  config BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW
 	default y if BR2_PACKAGE_FREESCALE_IMX_PLATFORM_IMX8MN
 	default y if BR2_PACKAGE_FREESCALE_IMX_PLATFORM_IMX8MP
 
+config BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW_IMX95
+	bool
+	default y if BR2_PACKAGE_FREESCALE_IMX_PLATFORM_IMX95
+
 config BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW_IMX9
 	bool
 	default y if BR2_PACKAGE_FREESCALE_IMX_PLATFORM_IMX91
 	default y if BR2_PACKAGE_FREESCALE_IMX_PLATFORM_IMX93
 
-if BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW || BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW_IMX9
+if BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW || \
+	BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW_IMX9 || \
+	BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW_IMX95
 
 choice
 	bool "DDR training binaries"
@@ -72,6 +78,11 @@  choice
 	  kind of memory that is available on the target board (DDR4,
 	  LPDDR4, etc...).
 
+config BR2_PACKAGE_FIRMWARE_IMX_LPDDR4X
+	bool "lpddr4x"
+	help
+	  Use LPDDR4x binaries.
+
 config BR2_PACKAGE_FIRMWARE_IMX_LPDDR4
 	bool "lpddr4"
 	help
diff --git a/package/freescale-imx/firmware-imx/firmware-imx.mk b/package/freescale-imx/firmware-imx/firmware-imx.mk
index f8c9df1cce..9682633ac3 100644
--- a/package/freescale-imx/firmware-imx/firmware-imx.mk
+++ b/package/freescale-imx/firmware-imx/firmware-imx.mk
@@ -46,6 +46,45 @@  ifneq ($(FIRMWARE_IMX_DDR_VERSION),)
 FIRMWARE_IMX_DDR_VERSION_SUFFIX = _$(FIRMWARE_IMX_DDR_VERSION)
 endif
 
+ifeq ($(BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW_IMX95),y)
+FIRMWARE_IMX_DDRFW_DIR = $(@D)/firmware/ddr/synopsys
+
+define FIRMWARE_IMX_GENERATE_DDR_HDR
+	wc -c $(FIRMWARE_IMX_DDRFW_DIR)/$(strip $(1)).bin | \
+	awk '{printf "%.8x", $$1}' | \
+	sed -e 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/' | \
+	xxd -r -p >  $(BINARIES_DIR)/$(strip $(3)).bin
+
+	wc -c $(FIRMWARE_IMX_DDRFW_DIR)/$(strip $(2)).bin | \
+	awk '{printf "%.8x", $$1}' | \
+	sed -e 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/' | \
+	xxd -r -p >>  $(BINARIES_DIR)/$(strip $(3)).bin
+endef
+
+define FIRMWARE_IMX_INSTALL_IMAGE_DDR_FW
+	$(call FIRMWARE_IMX_GENERATE_DDR_HDR, \
+		lpddr4x_imem_v202409,
+		lpddr4x_dmem_v202409,
+		fw-header)
+
+	$(call FIRMWARE_IMX_GENERATE_DDR_HDR, \
+		lpddr4x_imem_qb_v202409,
+		lpddr4x_dmem_qb_v202409,
+		fw-header-qb)
+
+	cat $(BINARIES_DIR)/fw-header.bin \
+	$(FIRMWARE_IMX_DDRFW_DIR)/lpddr4x_imem_v202409.bin \
+	$(FIRMWARE_IMX_DDRFW_DIR)/lpddr4x_dmem_v202409.bin \
+	$(BINARIES_DIR)/fw-header-qb.bin \
+	$(FIRMWARE_IMX_DDRFW_DIR)/lpddr4x_imem_qb_v202409.bin \
+	$(FIRMWARE_IMX_DDRFW_DIR)/lpddr4x_dmem_qb_v202409.bin > $(BINARIES_DIR)/ddr_fw.bin
+
+	rm -f $(BINARIES_DIR)/fw-header.bin
+	rm -f $(BINARIES_DIR)/fw-header-qb.bin
+endef
+
+endif
+
 ifeq ($(BR2_PACKAGE_FIRMWARE_IMX_NEEDS_DDR_FW_IMX9),y)
 FIRMWARE_IMX_DDRFW_DIR = $(@D)/firmware/ddr/synopsys