Hi Yannic, On 15.08.25 10:51, Yannic Moog wrote: > Hi Benjamin, > > did you miss some of my review comments on v1? > I'll reiterate below.. > > Am Donnerstag, dem 14.08.2025 um 15:54 +0200 schrieb Benjamin Hahn: >> Add new imx8mp-libra-fpsc board. >> USB is not working yet, as the entry in the upstream devicetree is >> missing. >> Bootph tags are in u-boot.dtsi for now and will be removed when >> upstreamed. > I see the following errors on my board: > > Loading Environment from MMC... esdhc_change_pinstate 9 error > esdhc_set_timing error -38 > *** Warning - bad CRC, using default environment > > Reading from MMC(1)... In: serial@30a60000 > Out: serial@30a60000 > Err: serial@30a60000 > SEC0: RNG instantiated > Net: Invalid PHY interface > eqos_probe_resources() failed: -22 > No ethernet found. > > Please check (and fix if you determine it is not a hardware error). I don't see any of these errors on my board. > >> Signed-off-by: Benjamin Hahn <b.h...@phytec.de> >> --- >> Add support for imx8mp-libra-fpsc board. >> --- >> Changes in v2: >> - Review comments from v1 (too many to list them all) >> - removed the first two patches (devicetree is now in of_upstream) >> - added the latest version of ram timings >> - add optee support (libra is now in upstream optee) >> - add CONFIG_CMD_MMC_REG command for mmc reg read command >> - Link to v1: >> https://lore.kernel.org/r/20250725-imx8mp-libra-initial-support-v1-0-d9982df21...@phytec.de >> --- >> arch/arm/dts/imx8mp-libra-rdk-fpsc-u-boot.dtsi | 78 + >> arch/arm/mach-imx/imx8m/Kconfig | 9 + >> board/phytec/imx8mp-libra-fpsc/Kconfig | 16 + >> board/phytec/imx8mp-libra-fpsc/MAINTAINERS | 9 + >> board/phytec/imx8mp-libra-fpsc/Makefile | 10 + >> board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.c | 99 ++ >> .../phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.env | 25 + >> board/phytec/imx8mp-libra-fpsc/imximage-8mp-sd.cfg | 9 + >> board/phytec/imx8mp-libra-fpsc/lpddr4_timing.c | 1814 >> ++++++++++++++++++++ >> board/phytec/imx8mp-libra-fpsc/spl.c | 132 ++ >> configs/imx8mp-libra-fpsc_defconfig | 175 ++ >> doc/board/phytec/imx8mp-libra-fpsc.rst | 77 + > Did you forget to add this file to the toctree? Oh, yes forgot that. > >> include/configs/imx8mp-libra-fpsc.h | 27 + >> 13 files changed, 2480 insertions(+) >> >> > [...] > >> diff --git a/arch/arm/mach-imx/imx8m/Kconfig >> b/arch/arm/mach-imx/imx8m/Kconfig >> index 74416a788473..cb4508a7110e 100644 >> --- a/arch/arm/mach-imx/imx8m/Kconfig >> +++ b/arch/arm/mach-imx/imx8m/Kconfig >> @@ -345,6 +345,14 @@ config TARGET_PHYCORE_IMX8MP >> select IMX8M_LPDDR4 >> imply OF_UPSTREAM >> >> +config TARGET_IMX8MP_LIBRA_FPSC >> + bool "PHYTEC Libra i.MX 8M Plus FPSC" >> + select IMX8MP >> + select SUPPORT_SPL >> + select IMX8M_LPDDR4 > no imply OF_UPSTREAM needed? I don't know. I did not run into issues without it and it built the dts upstream devicetree also without the OF_UPSTREAM implication. > >> + help >> + i.MX8M Plus Libra FPSC is a SBC based on the NXP i.MX 8M Plus SoC. > Libra i.MX 8M Plus FPSC is an SBC based on the NXP i.MX 8M Plus SoC. I believe it is "a SBC" not "an SBC" since SBC does not start with a vocal. > >> + >> config TARGET_IMX8MM_CL_IOT_GATE >> bool "CompuLab iot-gate-imx8" >> select IMX8MM >> > [...] > >> diff --git a/board/phytec/imx8mp-libra-fpsc/MAINTAINERS >> b/board/phytec/imx8mp- >> libra-fpsc/MAINTAINERS >> new file mode 100644 >> index 000000000000..fe98eab03eb3 >> --- /dev/null >> +++ b/board/phytec/imx8mp-libra-fpsc/MAINTAINERS >> @@ -0,0 +1,9 @@ >> +Libra-i.MX 8M Plus > Libra i.MX 8M Plus FPSC > >> +M: Teresa Remmet <t.rem...@phytec.de> >> +W: >> https://www.phytec.eu/en/produkte/system-on-modules/phycore-imx-8m-plus-fpsc/ >> +S: Maintained >> +F: arch/arm/dts/imx8mp-libra-rdk-fpsc-u-boot.dtsi >> +F: board/phytec/imx8mp-libra-fpsc/ >> +F: configs/imx8mp-libra-fpsc_defconfig >> +F: include/configs/imx8mp-libra-fpsc.h >> +F: doc/board/phytec/imx8mp-libra-fpsc.rst > nit: indent error? > > [...] > >> diff --git a/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.env >> b/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.env >> new file mode 100644 >> index 000000000000..d0179bc90a27 >> --- /dev/null >> +++ b/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.env >> @@ -0,0 +1,25 @@ > What do you think about putting all the standard boot variables at the > beginning > of RAM and LOAD ADDR after that to avoid potential collisions? > See phycore-imx8mm and tauri for reference.
I guess we could do that if you believe this is a better place, I don't really have any preferences here. Since you will take it from here, it is your choice. > >> +bootmeths=script >> +boot_targets=mmc2 mmc1 ethernet >> +boot_script_dhcp=boot.scr.uimg >> +bootenv_addr_r=0x49100000 >> +console=ttymxc3,115200 >> +emmc_dev=2 /* This is needed by built-in uuu flash scripts */ >> +fdt_addr_r=0x48000000 >> +fdtoverlay_addr_r=0x49000000 >> +fit_fdtconf=conf-imx8mp-libra-rdk-fpsc.dtb >> +ip_dyn=yes >> +kernel_addr_r=0x5A080000 >> +kernel_comp_addr_r=0x60000000 >> +kernel_comp_size=0x2000000 >> +mmcautodetect=yes >> +mmcdev=CONFIG_SYS_MMC_ENV_DEV >> +mmcpart=1 >> +mmcroot=2 >> +nfsroot=/srv/nfs >> +no_bootenv=0 >> +pxefile_addr_r=0x58600000 >> +ramdisk_addr_r=0x5e000000 >> +sd_dev=1 /* This is needed by built-in uuu flash scripts */ >> +script_offset_f=0x400000 >> +script_size_f=0x2000 >> +scriptaddr=0x58500000 >> > [...] > >> diff --git a/configs/imx8mp-libra-fpsc_defconfig b/configs/imx8mp-libra- >> fpsc_defconfig >> new file mode 100644 >> index 000000000000..54e46246c4c1 >> --- /dev/null >> +++ b/configs/imx8mp-libra-fpsc_defconfig >> @@ -0,0 +1,175 @@ >> +CONFIG_ARM=y >> +CONFIG_ARCH_IMX8M=y >> +CONFIG_TEXT_BASE=0x40200000 >> +CONFIG_SYS_MALLOC_LEN=0x2000000 >> +CONFIG_SPL_GPIO=y >> +CONFIG_SPL_LIBCOMMON_SUPPORT=y >> +CONFIG_SPL_LIBGENERIC_SUPPORT=y >> +CONFIG_SF_DEFAULT_SPEED=80000000 >> +CONFIG_ENV_SIZE=0x10000 >> +CONFIG_ENV_OFFSET=0x3C0000 >> +CONFIG_ENV_SECT_SIZE=0x10000 >> +CONFIG_SYS_I2C_MXC_I2C1=y >> +CONFIG_DM_GPIO=y >> +CONFIG_DEFAULT_DEVICE_TREE="freescale/imx8mp-libra-rdk-fpsc" >> +CONFIG_IMX8M_OPTEE_LOAD_ADDR=0x7e000000 >> +CONFIG_TARGET_IMX8MP_LIBRA_FPSC=y >> +CONFIG_OF_LIBFDT_OVERLAY=y >> +CONFIG_SYS_MONITOR_LEN=524288 >> +CONFIG_SPL_MMC=y >> +CONFIG_SPL_SERIAL=y >> +CONFIG_SPL_DRIVERS_MISC=y >> +CONFIG_SPL_STACK=0x960000 >> +CONFIG_SPL_TEXT_BASE=0x920000 >> +CONFIG_SPL_HAS_BSS_LINKER_SECTION=y >> +CONFIG_SPL_BSS_START_ADDR=0x98fc00 >> +CONFIG_SPL_BSS_MAX_SIZE=0x400 >> +CONFIG_SYS_LOAD_ADDR=0x40480000 >> +CONFIG_SPL=y >> +CONFIG_ENV_OFFSET_REDUND=0x3e0000 >> +CONFIG_IMX_BOOTAUX=y >> +CONFIG_SPL_IMX_ROMAPI_LOADADDR=0x48000000 >> +# CONFIG_ANDROID_BOOT_IMAGE is not set >> +CONFIG_FIT=y >> +CONFIG_FIT_EXTERNAL_OFFSET=0x3000 >> +CONFIG_SPL_LOAD_FIT=y >> +CONFIG_BOOTSTD_FULL=y >> +CONFIG_OF_SYSTEM_SETUP=y >> +CONFIG_FDT_FIXUP_PARTITIONS=y >> +CONFIG_SYS_CBSIZE=2048 >> +CONFIG_SYS_PBSIZE=2074 >> +CONFIG_BOARD_LATE_INIT=y >> +CONFIG_SPL_MAX_SIZE=0x26000 >> +CONFIG_SPL_BOARD_INIT=y >> +CONFIG_SPL_BOOTROM_SUPPORT=y >> +CONFIG_SPL_SYS_MALLOC_SIMPLE=y >> +# 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=0x42200000 >> +CONFIG_SPL_SYS_MALLOC_SIZE=0x80000 >> +CONFIG_SPL_SYS_MMCSD_RAW_MODE=y >> +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x300 >> +CONFIG_SPL_I2C=y >> +CONFIG_SPL_NOR_SUPPORT=y >> +CONFIG_SPL_POWER=y >> +CONFIG_SPL_WATCHDOG=y >> +CONFIG_SYS_PROMPT="u-boot=> " >> +CONFIG_CMD_ERASEENV=y >> +CONFIG_CMD_EEPROM=y >> +CONFIG_SYS_I2C_EEPROM_ADDR_LEN=2 >> +CONFIG_SYS_EEPROM_SIZE=4096 >> +CONFIG_SYS_EEPROM_PAGE_WRITE_BITS=5 >> +CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS=5 >> +CONFIG_CMD_CLK=y >> +CONFIG_CMD_FUSE=y >> +CONFIG_CMD_GPIO=y >> +CONFIG_CMD_I2C=y >> +CONFIG_CMD_MMC=y >> +CONFIG_CMD_MMC_REG=y >> +CONFIG_CMD_MTD=y >> +CONFIG_CMD_SF_TEST=y >> +CONFIG_CMD_USB=y >> +CONFIG_CMD_USB_SDP=y >> +CONFIG_CMD_USB_MASS_STORAGE=y >> +CONFIG_CMD_CACHE=y >> +CONFIG_CMD_REGULATOR=y >> +CONFIG_CMD_EXT4_WRITE=y >> +CONFIG_CMD_MTDPARTS=y >> +CONFIG_OF_CONTROL=y >> +CONFIG_SPL_OF_CONTROL=y >> +CONFIG_OF_UPSTREAM=y >> +CONFIG_ENV_OVERWRITE=y >> +CONFIG_ENV_IS_IN_MMC=y >> +CONFIG_ENV_IS_IN_SPI_FLASH=y >> +CONFIG_ENV_REDUNDANT=y >> +CONFIG_ENV_RELOC_GD_ENV_ADDR=y >> +CONFIG_ENV_MMC_DEVICE_INDEX=2 >> +CONFIG_NET_RANDOM_ETHADDR=y >> +CONFIG_SPL_DM=y >> +CONFIG_CLK_COMPOSITE_CCF=y >> +CONFIG_SPL_CLK_IMX8MP=y >> +CONFIG_CLK_IMX8MP=y >> +CONFIG_FSL_CAAM=y >> +CONFIG_USB_FUNCTION_FASTBOOT=y >> +CONFIG_FASTBOOT_BUF_ADDR=0x42800000 >> +CONFIG_FASTBOOT_BUF_SIZE=0x13000000 >> +CONFIG_FASTBOOT_FLASH=y >> +CONFIG_FASTBOOT_UUU_SUPPORT=y >> +CONFIG_FASTBOOT_FLASH_MMC_DEV=2 >> +CONFIG_FASTBOOT_MMC_BOOT_SUPPORT=y >> +CONFIG_FASTBOOT_MMC_BOOT1_NAME="mmc2boot0" >> +CONFIG_FASTBOOT_MMC_BOOT2_NAME="mmc2boot1" >> +CONFIG_FASTBOOT_MMC_USER_SUPPORT=y >> +CONFIG_FASTBOOT_MMC_USER_NAME="mmc2" >> +CONFIG_MXC_GPIO=y >> +CONFIG_DM_I2C=y >> +# CONFIG_SPL_DM_I2C is not set >> +CONFIG_SPL_SYS_I2C_LEGACY=y >> +CONFIG_I2C_EEPROM=y >> +CONFIG_SYS_I2C_EEPROM_ADDR=0x51 >> +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_MTD=y >> +CONFIG_DM_SPI_FLASH=y >> +CONFIG_SPI_FLASH_BAR=y >> +CONFIG_SPI_FLASH_MACRONIX=y >> +CONFIG_SPI_FLASH_SPANSION=y >> +CONFIG_SPI_FLASH_STMICRO=y >> +CONFIG_SPI_FLASH_SST=y >> +CONFIG_SPI_FLASH_WINBOND=y >> +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set >> +CONFIG_SPI_FLASH_MTD=y >> +CONFIG_PHY_TI_DP83867=y >> +CONFIG_DM_ETH_PHY=y >> +CONFIG_PHY_GIGE=y >> +CONFIG_DWC_ETH_QOS=y >> +CONFIG_DWC_ETH_QOS_IMX=y >> +CONFIG_FEC_MXC=y >> +CONFIG_RGMII=y >> +CONFIG_MII=y >> +CONFIG_PHY_IMX8MQ_USB=y >> +CONFIG_PINCTRL=y >> +CONFIG_SPL_PINCTRL=y >> +CONFIG_PINCTRL_IMX8M=y >> +CONFIG_SPL_POWER_LEGACY=y >> +CONFIG_POWER_DOMAIN=y >> +CONFIG_IMX8M_POWER_DOMAIN=y >> +CONFIG_IMX8MP_HSIOMIX_BLKCTRL=y >> +CONFIG_POWER_PCA9450=y >> +CONFIG_DM_REGULATOR=y >> +CONFIG_DM_REGULATOR_FIXED=y >> +CONFIG_DM_REGULATOR_GPIO=y >> +CONFIG_SPL_POWER_I2C=y >> +CONFIG_DM_RNG=y >> +CONFIG_DM_SERIAL=y >> +CONFIG_MXC_UART=y >> +CONFIG_SPI=y >> +CONFIG_DM_SPI=y >> +CONFIG_NXP_FSPI=y >> +CONFIG_SYSRESET=y >> +CONFIG_SPL_SYSRESET=y >> +CONFIG_SYSRESET_PSCI=y >> +CONFIG_SYSRESET_WATCHDOG=y >> +CONFIG_TEE=y >> +CONFIG_OPTEE=y > You enabled TEE and OPTEE here, but doc says OP-TEE is optional. > > You can technically get away with it when you compile tf-a without SPD=opteed, > but I don't think that's the spirit when we turn on TEE configs. > >> +CONFIG_DM_THERMAL=y >> +CONFIG_USB=y >> +CONFIG_DM_USB_GADGET=y >> +CONFIG_USB_XHCI_HCD=y >> +CONFIG_USB_XHCI_DWC3=y >> +CONFIG_USB_XHCI_DWC3_OF_SIMPLE=y >> +CONFIG_USB_EHCI_HCD=y >> +CONFIG_USB_DWC3=y >> +CONFIG_USB_DWC3_GENERIC=y >> +CONFIG_USB_GADGET=y >> +CONFIG_USB_GADGET_MANUFACTURER="PHYTEC" >> +CONFIG_USB_GADGET_VENDOR_NUM=0x0525 >> +CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5 >> +CONFIG_IMX_WATCHDOG=y >> diff --git a/doc/board/phytec/imx8mp-libra-fpsc.rst >> b/doc/board/phytec/imx8mp- >> libra-fpsc.rst >> new file mode 100644 >> index 000000000000..8c38fdd9203c >> --- /dev/null >> +++ b/doc/board/phytec/imx8mp-libra-fpsc.rst >> @@ -0,0 +1,77 @@ >> +.. SPDX-License-Identifier: GPL-2.0+ >> + >> +Libra i.MX 8M Plus FPSC >> +======================= >> + >> +The Libra i.MX 8M Plus FPSC is a SBC based with the phyCORE-i.MX 8M Plus >> FPSC >> +SoM. >> +The phyCORE-i.MX 8M Plus FPSC with 2GB of main memory is supported. >> + >> +Quick Start >> +----------- >> + >> +- Build the ARM Trusted firmware binary >> +- Build the OP-TEE binary (optional) >> +- Get ddr firmware >> +- Build U-Boot >> +- Boot >> + >> +Build the ARM Trusted firmware binary >> +------------------------------------- >> + >> +.. code-block:: bash >> + >> + $ git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git >> + $ cd trusted-firmware-a >> + $ export CROSS_COMPILE=aarch64-linux-gnu- >> + $ export IMX_BOOT_UART_BASE=0x30A60000 >> + $ # with optee >> + $ make PLAT=imx8mp SPD=opteed BL32_BASE=0x7e000000 bl31 >> + >> +Build the OP-TEE binary >> +---------------------------------- > line too long > >> + >> +.. code-block:: bash >> + >> + $ git clone https://github.com/OP-TEE/optee_os.git >> + $ cd optee_os >> + $ make CFG_TEE_BENCHMARK=n \ >> + CROSS_COMPILE=aarch64-linux-gnu- \ >> + O=out/arm \ >> + PLATFORM=imx-mx8mp_libra_fpsc >> + >> +Get the ddr firmware >> +-------------------- >> + >> +.. code-block:: bash >> + >> + $ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.19.bin >> + $ chmod +x firmware-imx-8.19.bin >> + $ ./firmware-imx-8.19.bin > Why use such an old version of the firmware? I did not find a downloadlink for the .bin file of a newer version, so I tested with the old version and it worked. You can of course add the newer version if you like. > >> + >> +Build U-Boot for SD card >> +------------------------ >> + >> +Copy binaries >> +^^^^^^^^^^^^^ >> + >> +.. code-block:: bash >> + >> + $ cp <TF-A dir>/build/imx8mp/release/bl31.bin . >> + $ cp <OP-TEE dir>/out/arm/core/tee-raw.bin tee.bin >> + $ cp firmware-imx-8.19/firmware/ddr/synopsys/lpddr4*.bin . >> + >> +Build U-Boot >> +^^^^^^^^^^^^ >> + >> +.. code-block:: bash >> + >> + $ make imx8mp-libra-fpsc_defconfig > make imx8mp-libra-fpsc_defconfig flash.bin ? > > One command fewer to copy/execute. If it works, sure I guess. Benjamin > > Yannic > >> + $ make flash.bin >> + >> +Flash SD card >> +^^^^^^^^^^^^^ >> + >> +.. code-block:: bash >> + >> + $ sudo dd if=flash.bin of=/dev/sd[x] bs=1024 seek=32 conv=fsync >> > [...] > >> --- >> base-commit: 021783860f7e628f7c4e0c101707cd4250e6d61f >> change-id: 20250725-imx8mp-libra-initial-support-d94282386ff6 >> >> Best regards,