[PATCH v2 2/2] imx: Support i.MX91 11x11 FRDM board

Francesco Valla francesco at valla.it
Wed Dec 3 14:53:06 CET 2025


Hello Joseph,

On Tue, Dec 02, 2025 at 07:05:03PM +0900, Joseph Guo wrote:
> Add i.MX91 11x11 FRDM Board support.
>  - Four ddr scripts included w/o inline ecc feature. Support
>    both 1gb and 2gb DDR
>  - SDHC/EQOS/I2C/UART supported
>  - PCA9451 supported, default nominal drive mode
>  - Documentation added.
> 
> Signed-off-by: Joseph Guo <qijian.guo at nxp.com>
> ---
> Changes in v2:
> - correct commit message 'EVK' to 'FRDM'
> - use #include in ecc config file
> - add ecc description in README
> - drop extraneous includes
> - rename 'imx91_frdm.rst' to 'imx91_11x11_frdm.rst'
> - drop IMX91_FRDM_LPDDR4 symbol
> - drop bootph- property
> ---
>  arch/arm/dts/imx91-11x11-frdm-u-boot.dtsi          |   51 +
>  arch/arm/mach-imx/imx9/Kconfig                     |    9 +
>  board/freescale/imx91_frdm/Kconfig                 |   12 +
>  board/freescale/imx91_frdm/MAINTAINERS             |    7 +
>  board/freescale/imx91_frdm/Makefile                |   16 +
>  board/freescale/imx91_frdm/imx91_frdm.c            |   25 +
>  board/freescale/imx91_frdm/imx91_frdm.env          |   88 +
>  .../imx91_frdm/lpddr4_2400mts_1gb_timing.c         | 1996 ++++++++++++++++++++
>  .../imx91_frdm/lpddr4_2400mts_2gb_timing.c         | 1996 ++++++++++++++++++++
>  .../imx91_frdm/lpddr4_2400mts_ecc_1gb_timing.c     | 1996 ++++++++++++++++++++
>  .../imx91_frdm/lpddr4_2400mts_ecc_2gb_timing.c     | 1996 ++++++++++++++++++++
>  board/freescale/imx91_frdm/lpddr4_timing.h         |   12 +
>  board/freescale/imx91_frdm/spl.c                   |  193 ++
>  configs/imx91_11x11_frdm_defconfig                 |  143 ++
>  configs/imx91_11x11_frdm_inline_ecc_defconfig      |    3 +
>  doc/board/nxp/imx91_11x11_frdm.rst                 |  100 +
>  doc/board/nxp/index.rst                            |    1 +
>  include/configs/imx91_frdm.h                       |   25 +
>  18 files changed, 8669 insertions(+)
> 
> diff --git a/arch/arm/dts/imx91-11x11-frdm-u-boot.dtsi b/arch/arm/dts/imx91-11x11-frdm-u-boot.dtsi
> new file mode 100644
> index 0000000000000000000000000000000000000000..2541d808aa084fb68a047c74b21daf8af044cc84
> --- /dev/null
> +++ b/arch/arm/dts/imx91-11x11-frdm-u-boot.dtsi
> @@ -0,0 +1,51 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2025 NXP
> + */
> +
> +#include "imx91-u-boot.dtsi"
> +
> +/ {
> +	wdt-reboot {
> +		compatible = "wdt-reboot";
> +		wdt = <&wdog3>;
> +		bootph-pre-ram;
> +		bootph-some-ram;
> +	};
> +
> +	firmware {
> +		optee {
> +			compatible = "linaro,optee-tz";
> +			method = "smc";
> +		};
> +	};
> +};
> +
> +&usdhc2 {
> +	fsl,signal-voltage-switch-extra-delay-ms = <8>;
> +};
> +
> +&fec {
> +	compatible = "fsl,imx91-fec", "fsl,imx93-fec", "fsl,imx8mq-fec";
> +	phy-reset-gpios = <&pcal6524 16 GPIO_ACTIVE_LOW>;
> +	phy-reset-duration = <15>;
> +	phy-reset-post-delay = <100>;
> +};
> +
> +&ethphy1 {
> +	reset-gpios = <&pcal6524 15 GPIO_ACTIVE_LOW>;
> +	reset-assert-us = <15000>;
> +	reset-deassert-us = <100000>;
> +};
> +
> +&s4muap {
> +	bootph-pre-ram;
> +	bootph-some-ram;
> +	status = "okay";
> +};
> +
> +&clk {
> +	/delete-property/ assigned-clocks;
> +	/delete-property/ assigned-clock-rates;
> +	/delete-property/ assigned-clock-parents;
> +};
> diff --git a/arch/arm/mach-imx/imx9/Kconfig b/arch/arm/mach-imx/imx9/Kconfig
> index d9725a96043657768af424ffe8efed7155c78f69..1ac3e583068bc14444e5f68c3a79b21ddbfc24a0 100644
> --- a/arch/arm/mach-imx/imx9/Kconfig
> +++ b/arch/arm/mach-imx/imx9/Kconfig
> @@ -61,6 +61,14 @@ config TARGET_IMX91_11X11_EVK
>  	imply BOOTSTD_FULL
>  	imply BOOTSTD_BOOTCOMMAND
>  
> +config TARGET_IMX91_11X11_FRDM
> +	bool "imx91_11x11_frdm"
> +	select OF_BOARD_FIXUP
> +	select IMX91
> +	select IMX9_LPDDR4X
> +	imply BOOTSTD_FULL
> +	imply BOOTSTD_BOOTCOMMAND
> +
>  config TARGET_IMX93_9X9_QSB
>  	bool "imx93_qsb"
>  	select OF_BOARD_FIXUP
> @@ -139,6 +147,7 @@ config TARGET_TORADEX_SMARC_IMX95
>  endchoice
>  
>  source "board/freescale/imx91_evk/Kconfig"
> +source "board/freescale/imx91_frdm/Kconfig"
>  source "board/freescale/imx93_evk/Kconfig"
>  source "board/freescale/imx93_frdm/Kconfig"
>  source "board/freescale/imx93_qsb/Kconfig"
> diff --git a/board/freescale/imx91_frdm/Kconfig b/board/freescale/imx91_frdm/Kconfig
> new file mode 100644
> index 0000000000000000000000000000000000000000..68f4bb5c7ecda2b0847ecfd10f954283c4068960
> --- /dev/null
> +++ b/board/freescale/imx91_frdm/Kconfig
> @@ -0,0 +1,12 @@
> +if TARGET_IMX91_11X11_FRDM
> +
> +config SYS_BOARD
> +	default "imx91_frdm"
> +
> +config SYS_VENDOR
> +	default "freescale"
> +
> +config SYS_CONFIG_NAME
> +	default "imx91_frdm"
> +
> +endif
> diff --git a/board/freescale/imx91_frdm/MAINTAINERS b/board/freescale/imx91_frdm/MAINTAINERS
> new file mode 100644
> index 0000000000000000000000000000000000000000..bf5320f03dbb78e97e1e990408d43dc89054e397
> --- /dev/null
> +++ b/board/freescale/imx91_frdm/MAINTAINERS
> @@ -0,0 +1,7 @@
> +FRDM-IMX91 BOARD
> +M:	Joseph Guo <qijian.guo at nxp.com>
> +S:	Maintained
> +F:	board/freescale/imx91_frdm/
> +F:	include/configs/imx91_frdm.h
> +F:	configs/imx91_11x11_frdm_defconfig
> +F:	configs/imx91_11x11_frdm_inline_ecc_defconfig
> diff --git a/board/freescale/imx91_frdm/Makefile b/board/freescale/imx91_frdm/Makefile
> new file mode 100644
> index 0000000000000000000000000000000000000000..75510b13b44ead742b5c463ba5e520e0d33a64f7
> --- /dev/null
> +++ b/board/freescale/imx91_frdm/Makefile
> @@ -0,0 +1,16 @@
> +#
> +# Copyright 2025 NXP
> +#
> +# SPDX-License-Identifier:      GPL-2.0+
> +#
> +
> +obj-y += imx91_frdm.o
> +
> +ifdef CONFIG_SPL_BUILD
> +obj-y += spl.o
> +ifdef CONFIG_IMX9_DRAM_INLINE_ECC
> +obj-y += lpddr4_2400mts_ecc_1gb_timing.o lpddr4_2400mts_ecc_2gb_timing.o
> +else
> +obj-y += lpddr4_2400mts_1gb_timing.o lpddr4_2400mts_2gb_timing.o
> +endif
> +endif
> diff --git a/board/freescale/imx91_frdm/imx91_frdm.c b/board/freescale/imx91_frdm/imx91_frdm.c
> new file mode 100644
> index 0000000000000000000000000000000000000000..f32310e4a9df87e5d876cfa50e4ff38c31f887d7
> --- /dev/null
> +++ b/board/freescale/imx91_frdm/imx91_frdm.c
> @@ -0,0 +1,25 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2025 NXP
> + */
> +
> +#include <env.h>
> +#include <asm/arch/sys_proto.h>
> +
> +int board_late_init(void)
> +{
> +	if (IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT))
> +		board_late_mmc_env_init();
> +

This should probably depend on CONFIG_ENV_IS_IN_MMC, not
CONFIG_EFI_HAVE_CAPSULE_SUPPORT.

> +	env_set("sec_boot", "no");
> +
> +	if (IS_ENABLED(CONFIG_AHAB_BOOT))
> +		env_set("sec_boot", "yes");
> +
> +	if (IS_ENABLED(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG)) {
> +		env_set("board_name", "11X11_FRDM");
> +		env_set("board_rev", "iMX91");
> +	}
> +
> +	return 0;
> +}
> diff --git a/board/freescale/imx91_frdm/imx91_frdm.env b/board/freescale/imx91_frdm/imx91_frdm.env
> new file mode 100644
> index 0000000000000000000000000000000000000000..6c10784cf61a9a6ee29f4c5e9c4cc41b6c8ef4dc
> --- /dev/null
> +++ b/board/freescale/imx91_frdm/imx91_frdm.env
> @@ -0,0 +1,88 @@
> +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
> +
> +boot_targets=mmc0 mmc1
> +boot_fit=no
> +bootm_size=0x10000000
> +cntr_addr=0x98000000
> +cntr_file=os_cntr_signed.bin
> +console=ttyLP0,115200 earlycon
> +fdt_addr_r=0x83000000
> +fdt_addr=0x83000000
> +fdtfile=CONFIG_DEFAULT_FDT_FILE
> +image=Image
> +mmcdev=CONFIG_ENV_MMC_DEVICE_INDEX
> +mmcpart=1
> +mmcroot=/dev/mmcblk1p2 rootwait rw
> +mmcautodetect=yes
> +mmcargs=setenv bootargs ${jh_clk} ${mcore_clk} console=${console} root=${mmcroot}
> +prepare_mcore=setenv mcore_clk clk-imx93.mcore_booted

There isn't a Cortex-M core in i.MX91.

> +loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
> +loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr_r} ${fdtfile}
> +loadcntr=fatload mmc ${mmcdev}:${mmcpart} ${cntr_addr} ${cntr_file}
> +auth_os=auth_cntr ${cntr_addr}
> +sec_boot=no
> +boot_os=booti ${loadaddr} - ${fdt_addr_r}
> +mmcboot=
> +	echo Booting from mmc ...;
> +	run mmcargs;
> +	if test ${sec_boot} = yes; then
> +		if run true; then
> +			run boot_os;
> +		else
> +			echo ERR: failed to authenticate;
> +		fi;
> +	else
> +		if run loadfdt; then
> +			run boot_os;
> +		else
> +			echo WARN: Cannot load the DT;
> +		fi;
> +	fi;
> +netargs=setenv bootargs ${jh_clk} ${mcore_clk} console=${console} root=/dev/nfs
> +	ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
> +netboot=
> +	echo Booting from net ...;
> +	run netargs;
> +	if test ${ip_dyn} = yes; then
> +		setenv get_cmd dhcp;
> +	else
> +		setenv get_cmd tftp;
> +	fi;
> +	if test ${sec_boot} = yes; then
> +		${get_cmd} ${cntr_addr} ${cntr_file};
> +		if true; then
> +			run boot_os;
> +		else
> +			echo ERR: failed to authenticate;
> +		fi;
> +	else
> +		${get_cmd} ${loadaddr} ${image};
> +		if ${get_cmd} ${fdt_addr_r} ${fdtfile}; then
> +			run boot_os;
> +		else
> +			echo WARN: Cannot load the DT;
> +		fi;
> +	fi;
> +bsp_bootcmd=
> +	echo Running BSP bootcmd ...;
> +	mmc dev ${mmcdev};
> +	if mmc rescan; then
> +		if run loadbootscript; then
> +			run bootscript;
> +		else
> +			if test ${sec_boot} = yes; then
> +				if run loadcntr; then
> +					run mmcboot;
> +				else
> +					run netboot;
> +				fi;
> +			else
> +				if run loadimage; then
> +					run mmcboot;
> +				else
> +					run netboot;
> +				fi;
> +			fi;
> +		fi;
> +	fi;
> +scriptaddr=0x83500000

[snip]

> diff --git a/configs/imx91_11x11_frdm_defconfig b/configs/imx91_11x11_frdm_defconfig
> new file mode 100644
> index 0000000000000000000000000000000000000000..f87f3bf5ef797816843398dceedd873b7acbb7ad
> --- /dev/null
> +++ b/configs/imx91_11x11_frdm_defconfig
> @@ -0,0 +1,143 @@
> +CONFIG_ARM=y
> +CONFIG_ARCH_IMX9=y
> +CONFIG_TEXT_BASE=0x80200000
> +CONFIG_SYS_MALLOC_LEN=0x2000000
> +CONFIG_SYS_MALLOC_F_LEN=0x18000
> +CONFIG_SPL_LIBCOMMON_SUPPORT=y
> +CONFIG_SPL_LIBGENERIC_SUPPORT=y
> +CONFIG_NR_DRAM_BANKS=2
> +CONFIG_SF_DEFAULT_SPEED=40000000
> +CONFIG_ENV_SIZE=0x4000
> +CONFIG_ENV_OFFSET=0x700000
> +CONFIG_IMX_CONFIG="arch/arm/mach-imx/imx9/imximage.cfg"
> +CONFIG_DM_GPIO=y
> +CONFIG_DEFAULT_DEVICE_TREE="imx91-11x11-frdm"
> +CONFIG_TARGET_IMX91_11X11_FRDM=y
> +CONFIG_OF_LIBFDT_OVERLAY=y
> +CONFIG_SYS_MONITOR_LEN=524288
> +CONFIG_SPL_SERIAL=y
> +CONFIG_SPL_DRIVERS_MISC=y
> +CONFIG_SPL_STACK=0x204E0000
> +CONFIG_SPL_SYS_MALLOC_F_LEN=0x2000
> +CONFIG_SPL_TEXT_BASE=0x204A0000
> +CONFIG_SPL_HAS_BSS_LINKER_SECTION=y
> +CONFIG_SPL_BSS_START_ADDR=0x20498000
> +CONFIG_SPL_BSS_MAX_SIZE=0x2000
> +CONFIG_SYS_LOAD_ADDR=0x80400000
> +CONFIG_SPL=y
> +CONFIG_CMD_DEKBLOB=y
> +CONFIG_SPL_IMX_ROMAPI_LOADADDR=0x88000000
> +CONFIG_SYS_MEMTEST_START=0x80000000
> +CONFIG_SYS_MEMTEST_END=0x90000000
> +CONFIG_REMAKE_ELF=y
> +CONFIG_OF_SYSTEM_SETUP=y
> +CONFIG_BOOTCOMMAND="bootflow scan -lb; run bsp_bootcmd"
> +CONFIG_DEFAULT_FDT_FILE="imx91-11x11-frdm.dtb"
> +CONFIG_SYS_CBSIZE=2048
> +CONFIG_SYS_PBSIZE=2074
> +# CONFIG_BOARD_INIT is not set
> +CONFIG_BOARD_LATE_INIT=y
> +CONFIG_SPL_MAX_SIZE=0x26000
> +CONFIG_SPL_BOARD_INIT=y
> +CONFIG_SPL_BOOTROM_SUPPORT=y
> +CONFIG_SPL_LOAD_IMX_CONTAINER=y
> +CONFIG_IMX_CONTAINER_CFG="arch/arm/mach-imx/imx9/container.cfg"
> +# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
> +CONFIG_SPL_HAVE_INIT_STACK=y
> +CONFIG_SPL_SYS_MALLOC=y
> +CONFIG_SPL_HAS_CUSTOM_MALLOC_START=y
> +CONFIG_SPL_CUSTOM_SYS_MALLOC_ADDR=0x83200000
> +CONFIG_SPL_SYS_MALLOC_SIZE=0x80000
> +CONFIG_SPL_I2C=y
> +CONFIG_SPL_POWER=y
> +CONFIG_SPL_WATCHDOG=y
> +CONFIG_SYS_PROMPT="u-boot=> "
> +CONFIG_CMD_CPU=y
> +CONFIG_CMD_ERASEENV=y
> +CONFIG_CMD_NVEDIT_EFI=y
> +CONFIG_CRC32_VERIFY=y
> +CONFIG_CMD_MEMTEST=y
> +CONFIG_CMD_CLK=y
> +CONFIG_CMD_DFU=y
> +CONFIG_CMD_FUSE=y
> +CONFIG_CMD_GPIO=y
> +CONFIG_CMD_GPT=y
> +CONFIG_CMD_I2C=y
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_POWEROFF=y
> +CONFIG_CMD_SNTP=y
> +CONFIG_CMD_CACHE=y
> +CONFIG_CMD_EFIDEBUG=y
> +CONFIG_CMD_RTC=y
> +CONFIG_CMD_TIME=y
> +CONFIG_CMD_GETTIME=y
> +CONFIG_CMD_TIMER=y
> +CONFIG_CMD_REGULATOR=y
> +CONFIG_CMD_HASH=y
> +CONFIG_CMD_EXT4_WRITE=y
> +CONFIG_OF_CONTROL=y
> +CONFIG_SPL_OF_CONTROL=y
> +CONFIG_ENV_OVERWRITE=y
> +CONFIG_ENV_IS_NOWHERE=y
> +CONFIG_ENV_IS_IN_MMC=y
> +CONFIG_ENV_RELOC_GD_ENV_ADDR=y
> +CONFIG_ENV_MMC_DEVICE_INDEX=1
> +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
> +CONFIG_USE_ETHPRIME=y
> +CONFIG_ETHPRIME="eth1"
> +CONFIG_NET_RANDOM_ETHADDR=y
> +CONFIG_SPL_DM=y
> +CONFIG_REGMAP=y
> +CONFIG_SYSCON=y
> +CONFIG_ADC=y
> +CONFIG_ADC_IMX93=y
> +CONFIG_CLK_IMX93=y
> +CONFIG_SAVED_DRAM_TIMING_BASE=0x2049C000
> +CONFIG_IMX_RGPIO2P=y
> +CONFIG_DM_PCA953X=y
> +CONFIG_ADP5585_GPIO=y
> +CONFIG_DM_I2C=y
> +CONFIG_SYS_I2C_IMX_LPI2C=y
> +CONFIG_SUPPORT_EMMC_RPMB=y
> +CONFIG_SUPPORT_EMMC_BOOT=y
> +CONFIG_MMC_IO_VOLTAGE=y
> +CONFIG_MMC_UHS_SUPPORT=y
> +CONFIG_MMC_HS400_ES_SUPPORT=y
> +CONFIG_MMC_HS400_SUPPORT=y
> +CONFIG_FSL_USDHC=y
> +CONFIG_MTD=y
> +CONFIG_DM_SPI_FLASH=y
> +CONFIG_SPI_FLASH_STMICRO=y

Why is SPI flash support required here?

> +CONFIG_PHY_ANEG_TIMEOUT=20000
> +CONFIG_PHY_MOTORCOMM=y
> +CONFIG_DM_ETH_PHY=y
> +CONFIG_PHY_GIGE=y
> +CONFIG_DWC_ETH_QOS=y
> +CONFIG_DWC_ETH_QOS_IMX=y
> +CONFIG_MII=y
> +CONFIG_PINCTRL=y
> +CONFIG_SPL_PINCTRL=y
> +CONFIG_PINCTRL_IMX93=y
> +CONFIG_POWER_DOMAIN=y
> +CONFIG_DM_PMIC=y
> +CONFIG_DM_PMIC_PCA9450=y
> +CONFIG_SPL_DM_PMIC_PCA9450=y
> +CONFIG_DM_REGULATOR=y
> +CONFIG_DM_REGULATOR_PCA9450=y
> +CONFIG_DM_REGULATOR_FIXED=y
> +CONFIG_DM_REGULATOR_GPIO=y
> +CONFIG_DM_RTC=y
> +CONFIG_RTC_EMULATION=y
> +CONFIG_DM_SERIAL=y
> +CONFIG_FSL_LPUART=y
> +CONFIG_SPI=y
> +CONFIG_DM_SPI=y
> +CONFIG_NXP_FSPI=y
> +CONFIG_SYSRESET=y
> +CONFIG_SYSRESET_CMD_POWEROFF=y
> +CONFIG_SYSRESET_PSCI=y
> +CONFIG_ULP_WATCHDOG=y
> +CONFIG_WDT=y
> +CONFIG_SHA384=y
> +CONFIG_LZO=y
> +CONFIG_BZIP2=y

[snip]


Regards,
Francesco



More information about the U-Boot mailing list