Skip to contentSkip to conversation

firmware-imx: add support for iMX8M firmware

PATCH New Erik Larsson 2 participants 8 messages Apr 12, 2018 Arm i.MX and Layerscape

lore
Share & tools
lore
#0 lore raw

PATCH 1/4 firmware-imx: add support for iMX8M firmware

---
 package/freescale-imx/firmware-imx/Config.in       |  2 +-
 package/freescale-imx/firmware-imx/firmware-imx.mk | 28 ++++++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
package/freescale-imx/firmware-imx/Config.in +1 -1
index fca280a..56d5b80 100644
@@ -1,6 +1,6 @@
 config BR2_PACKAGE_FIRMWARE_IMX
 	bool "firmware-imx"
-	depends on BR2_arm # Only relevant for i.MX
+	depends on BR2_arm || BR2_aarch64 # Only relevant for i.MX
 	help
 	  Firmware blobs for the Freescale i.MX SoCs.
 
package/freescale-imx/firmware-imx/firmware-imx.mk +28 -0
index d5387b3..93a4c1a 100644
@@ -18,6 +18,33 @@ define FIRMWARE_IMX_EXTRACT_CMDS
 	$(call FREESCALE_IMX_EXTRACT_HELPER,$(FIRMWARE_IMX_DL_DIR)/$(FIRMWARE_IMX_SOURCE))
 endef
 
+ifeq ($(BR2_PACKAGE_FREESCALE_IMX_PLATFORM_IMX8M),y)
+FIRMWARE_IMX_INSTALL_IMAGES = YES
+define FIRMWARE_IMX_PREPARE_LPDDR4_FW
+	(cd $(@D)/firmware/ddr/synopsys/ && \
+		$(TARGET_OBJCOPY) -I binary -O binary --pad-to 0x8000 --gap-fill=0x0 \
+			lpddr4_pmu_train_$(1)_imem.bin \
+			lpddr4_pmu_train_$(1)_imem_pad.bin && \
+		$(TARGET_OBJCOPY) -I binary -O binary --pad-to 0x4000 --gap-fill=0x0 \
+			lpddr4_pmu_train_$(1)_dmem.bin \
+			lpddr4_pmu_train_$(1)_dmem_pad.bin && \
+		cat lpddr4_pmu_train_$(1)_imem_pad.bin lpddr4_pmu_train_$(1)_dmem_pad.bin > \
+			lpddr4_pmu_train_$(1)_fw.bin \
+	)
+endef
+
+define FIRMWARE_IMX_INSTALL_IMAGES_CMDS
+	# Create padded versions of lpddr4_pmu_* and generate lpddr4_pmu_train_fw.bin.
+	# lpddr4_pmu_train_fw.bin isneeded when generating imx-boot-imx8mqevk-sd.bin
+	# which is done in post-image script.
+	$(call FIRMWARE_IMX_PREPARE_LPDDR4_FW,1d)
+	$(call FIRMWARE_IMX_PREPARE_LPDDR4_FW,2d)
+	cat $(@D)/firmware/ddr/synopsys/lpddr4_pmu_train_1d_fw.bin \
+		$(@D)/firmware/ddr/synopsys/lpddr4_pmu_train_2d_fw.bin > \
+		$(BINARIES_DIR)/lpddr4_pmu_train_fw.bin
+	cp $(@D)/firmware/hdmi/cadence/signed_hdmi_imx8m.bin $(BINARIES_DIR)/signed_hdmi_imx8m.bin
+endef
+else
 define FIRMWARE_IMX_INSTALL_TARGET_CMDS
 	mkdir -p $(TARGET_DIR)/lib/firmware/imx
 	for blobdir in $(FIRMWARE_IMX_BLOBS); do \
@@ -27,5 +54,6 @@ define FIRMWARE_IMX_INSTALL_TARGET_CMDS
 	mv $(TARGET_DIR)/lib/firmware/imx/epdc/epdc_ED060XH2C1.fw.nonrestricted \
 		$(TARGET_DIR)/lib/firmware/imx/epdc/epdc_ED060XH2C1.fw
 endef
+endif
 
 $(eval $(generic-package))
Signature · 1 line
2.7.4
#1 lore raw

PATCH 2/4 imx: make post-image.sh arm64 compatible

---
 board/freescale/common/imx/post-image.sh | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
board/freescale/common/imx/post-image.sh +4 -2
index b239743..70d2c9c 100755
@@ -7,10 +7,10 @@
 #
 dtb_list()
 {
-	local DTB_LIST="$(sed -n 's/^BR2_LINUX_KERNEL_INTREE_DTS_NAME="\([a-z0-9 \-]*\)"$/\1/p' ${BR2_CONFIG})"
+	local DTB_LIST="$(sed -n 's/^BR2_LINUX_KERNEL_INTREE_DTS_NAME="\([\/a-z0-9 \-]*\)"$/\1/p' ${BR2_CONFIG})"
 
 	for dt in $DTB_LIST; do
-		echo -n "\"$dt.dtb\", "
+		echo -n "\"`basename $dt`.dtb\", "
 	done
 }
 
@@ -23,6 +23,8 @@ linux_image()
 {
 	if grep -Eq "^BR2_LINUX_KERNEL_UIMAGE=y$" ${BR2_CONFIG}; then
 		echo "\"uImage\""
+	elif grep -Eq "^BR2_LINUX_KERNEL_IMAGE=y$" ${BR2_CONFIG}; then
+		echo "\"Image\""
 	else
 		echo "\"zImage\""
 	fi
Signature · 1 line
2.7.4
#2 lore raw

PATCH 2/4 imx: make post-image.sh arm64 compatible

Hello,

Quoted 5 lines · Erik Larsson
---
 board/freescale/common/imx/post-image.sh | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

I've applied after adding more details in the commit log and tweaking the commit title. See
https://git.buildroot.org/buildroot/commit/?id=4755bf2bd43a7b4c3bf4f88be790240a01b3116f.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
#3 lore raw

PATCH 3/4 imx: add imx8 boot preparation script

In reply to Erik Larsson

Add a new script, imx8-prepare-boot.sh, that finalize the boot file for a specific iMX8 board. Currently only imx8mqevk is available and supported.

Also add genimage template for iMX8.

---
 .../common/imx/genimage.cfg.template_imx8          | 40 ++++++++++++++++++++++
 .../common/imx/imx8-bootloader-prepare.sh          | 16 +++++++++
 board/freescale/common/imx/post-image.sh           |  4 ++-
 3 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 board/freescale/common/imx/genimage.cfg.template_imx8
 create mode 100755 board/freescale/common/imx/imx8-bootloader-prepare.sh
board/freescale/common/imx/genimage.cfg.template_imx8 new file +40 -0
new file mode 100644
index 0000000..fdb6450
@@ -0,0 +1,40 @@
+# Minimal SD card image for the Freescale iMX8 boards
+#
+# We mimic the .sdcard Freescale's image format:
+# * the SD card must have 33 kB free space at the beginning,
+# * U-Boot is integrated into imx8-boot-sd.bin and is dumped as is,
+# * a FAT partition at offset 32MB is containing Image and DTB files
+# * a single root filesystem partition is required (ext2, ext3 or ext4)
+#
+
+image boot.vfat {
+  vfat {
+    files = {
+      %FILES%
+    }
+  }
+  size = 32M
+}
+
+image sdcard.img {
+  hdimage {
+  }
+
+  partition imx-boot {
+    in-partition-table = "no"
+    image = "imx8-boot-sd.bin"
+    offset = 33K
+  }
+
+  partition boot {
+    partition-type = 0xC
+    bootable = "true"
+    image = "boot.vfat"
+    offset = 8M
+  }
+
+  partition rootfs {
+    partition-type = 0x83
+    image = "rootfs.ext2"
+  }
+}
board/freescale/common/imx/imx8-bootloader-prepare.sh new file +16 -0
new file mode 100755
index 0000000..2648147
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+main ()
+{
+	# Currently we support imx8mqevk.
+	cat ${BINARIES_DIR}/u-boot-spl.bin ${BINARIES_DIR}/lpddr4_pmu_train_fw.bin > ${BINARIES_DIR}/u-boot-spl-ddr.bin
+	BL31=${BINARIES_DIR}/bl31.bin BL33=${BINARIES_DIR}/u-boot.bin ${HOST_DIR}/bin/mkimage_fit_atf.sh ${BINARIES_DIR}/fsl-imx8mq-evk.dtb > ${BINARIES_DIR}/u-boot.its
+	${HOST_DIR}/bin/mkimage -E -p 0x3000 -f ${BINARIES_DIR}/u-boot.its ${BINARIES_DIR}/u-boot.itb
+	rm -f ${BINARIES_DIR}/u-boot.its
+
+	${HOST_DIR}/bin/mkimage_imx8 -fit -signed_hdmi ${BINARIES_DIR}/signed_hdmi_imx8m.bin -loader ${BINARIES_DIR}/u-boot-spl-ddr.bin 0x7E1000 -second_loader ${BINARIES_DIR}/u-boot.itb 0x40200000 0x60000 -out ${BINARIES_DIR}/imx8-boot-sd.bin
+
+	exit $?
+}
+
+main $@
board/freescale/common/imx/post-image.sh +3 -1
index 70d2c9c..264c8a4 100755
@@ -32,7 +32,9 @@ linux_image()
 
 genimage_type()
 {
-	if grep -Eq "^BR2_TARGET_UBOOT_SPL=y$" ${BR2_CONFIG}; then
+	if grep -Eq "^BR2_PACKAGE_FREESCALE_IMX_PLATFORM_IMX8M=y$" ${BR2_CONFIG}; then
+		echo "genimage.cfg.template_imx8"
+	elif grep -Eq "^BR2_TARGET_UBOOT_SPL=y$" ${BR2_CONFIG}; then
 		echo "genimage.cfg.template_spl"
 	else
 		echo "genimage.cfg.template"
Signature · 1 line
2.7.4
#4 lore raw

PATCH 3/4 imx: add imx8 boot preparation script

Hello,

Quoted 5 lines · Erik Larsson

Add a new script, imx8-prepare-boot.sh, that finalize the boot file for a specific iMX8 board. Currently only imx8mqevk is available and supported.

Also add genimage template for iMX8.

This commit was doing two fairly unrelated things: adding the bootloader preparation script, and adding the genimage template, so I've split this commit into two, and applied to master. Thanks!

Quoted 7 lines
board/freescale/common/imx/imx8-bootloader-prepare.sh new file +1 -0
new file mode 100755
index 0000000..2648147
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash

board/freescale/common/imx/imx8-bootloader-prepare.sh line 11

Quoted 10 lines
board/freescale/common/imx/imx8-bootloader-prepare.sh new file +10 -0
+
+main ()
+{
+	# Currently we support imx8mqevk.
+	cat ${BINARIES_DIR}/u-boot-spl.bin ${BINARIES_DIR}/lpddr4_pmu_train_fw.bin > ${BINARIES_DIR}/u-boot-spl-ddr.bin
+	BL31=${BINARIES_DIR}/bl31.bin BL33=${BINARIES_DIR}/u-boot.bin ${HOST_DIR}/bin/mkimage_fit_atf.sh ${BINARIES_DIR}/fsl-imx8mq-evk.dtb > ${BINARIES_DIR}/u-boot.its
+	${HOST_DIR}/bin/mkimage -E -p 0x3000 -f ${BINARIES_DIR}/u-boot.its ${BINARIES_DIR}/u-boot.itb
+	rm -f ${BINARIES_DIR}/u-boot.its
+
+	${HOST_DIR}/bin/mkimage_imx8 -fit -signed_hdmi ${BINARIES_DIR}/signed_hdmi_imx8m.bin -loader ${BINARIES_DIR}/u-boot-spl-ddr.bin 0x7E1000 -second_loader ${BINARIES_DIR}/u-boot.itb 0x40200000 0x60000 -out ${BINARIES_DIR}/imx8-boot-sd.bin

Thinking more about this, perhaps moving forward we will want to do this in the U-Boot package directly. But I'd like to wait and see how mainline U-Boot will handle i.MX8 platforms in terms of image creation.

Best regards,

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
#5 lore raw

PATCH 4/4 configs/freescale_imx8mqevk: new defconfig

In reply to Erik Larsson
---
 board/freescale/imx8mqevk/readme.txt  | 81 +++++++++++++++++++++++++++++++++++
 configs/freescale_imx8mqevk_defconfig | 41 ++++++++++++++++++
 2 files changed, 122 insertions(+)
 create mode 100644 board/freescale/imx8mqevk/readme.txt
 create mode 100644 configs/freescale_imx8mqevk_defconfig
board/freescale/imx8mqevk/readme.txt new file +81 -0
new file mode 100644
index 0000000..98af9ea
@@ -0,0 +1,81 @@
+***************************
+Freescale i.MX8mq EVK board
+***************************
+
+This file documents the Buildroot support for the Freescale i.MX8mq EVK board.
+
+Hardware support
+================
+
+Currently only basic support for hardware is avialable, currently no
+support for GPU, VPU and other HW features.
+
+Build
+=====
+
+First, configure Buildroot for the i.MX8mq EVK board:
+
+  make freescale_imx8mqevk_defconfig
+
+Build all components:
+
+  make
+
+You will find in output/images/ the following files:
+  - bl31.bin
+  - boot.vfat
+  - fsl-imx8mq-evk.dtb
+  - Image
+  - imx-boot-imx8mqevk-sd.bin
+  - lpddr4_pmu_train_fw.bin
+  - rootfs.ext2
+  - rootfs.ext4
+  - rootfs.tar
+  - sdcard.img
+  - signed_hdmi_imx8m.bin
+  - u-boot.bin
+  - u-boot.imx
+  - u-boot-nodtb.bin
+  - u-boot-spl-ddr.bin
+
+Create a bootable SD card
+=========================
+
+To determine the device associated to the SD card have a look in the
+/proc/partitions file:
+
+  cat /proc/partitions
+
+Buildroot prepares a bootable "sdcard.img" image in the output/images/
+directory, ready to be dumped on a SD card. Launch the following
+command as root:
+
+  dd if=output/images/sdcard.img of=/dev/<your-sd-device>
+
+*** WARNING! This will destroy all the card content. Use with care! ***
+
+For details about the medium image layout, see the definition in
+board/freescale/common/imx/genimage.cfg.template_imx8.
+
+Boot the i.MX8mq EVK board
+==========================
+
+To boot your newly created system:
+- insert the SD card in the SD slot of the board;
+- put a micro USB cable into the Debug USB Port and connect using a terminal
+  emulator at 115200 bps, 8n1;
+- power on the board.
+
+Enable HDMI output
+==================
+
+To enable HDMI output at boot you must provide the video kernel boot argument.
+To set the video boot argument from U-Boot run after stoping in U-Boot prompt:
+
+setenv mmcargs 'setenv bootargs console=${console} root=${mmcroot} video=HDMI-A-1:1920x1080-32 at 60'
+saveenv
+reset
+
+Change screen resolution to suit your connected display.
+
+Enjoy!
configs/freescale_imx8mqevk_defconfig new file +41 -0

41 lines not on this page · raw message

Signature · 1 line
2.7.4
#6 lore raw

PATCH 4/4 configs/freescale_imx8mqevk: new defconfig

Hello,

Quoted 8 lines · Erik Larsson
---
 board/freescale/imx8mqevk/readme.txt  | 81 +++++++++++++++++++++++++++++++++++
 configs/freescale_imx8mqevk_defconfig | 41 ++++++++++++++++++
 2 files changed, 122 insertions(+)
 create mode 100644 board/freescale/imx8mqevk/readme.txt
 create mode 100644 configs/freescale_imx8mqevk_defconfig

Applied to master, thanks.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
#7 lore raw

PATCH 1/4 firmware-imx: add support for iMX8M firmware

In reply to Erik Larsson

Hello,

package/freescale-imx/firmware-imx/firmware-imx.mk define FIRMWARE_IMX_EXTRACT_CMDS · line 33

Quoted 13 lines · Erik Larsson
package/freescale-imx/firmware-imx/firmware-imx.mk +13 -0
+ifeq ($(BR2_PACKAGE_FREESCALE_IMX_PLATFORM_IMX8M),y)
+FIRMWARE_IMX_INSTALL_IMAGES = YES
+define FIRMWARE_IMX_PREPARE_LPDDR4_FW
+	(cd $(@D)/firmware/ddr/synopsys/ && \
+		$(TARGET_OBJCOPY) -I binary -O binary --pad-to 0x8000 --gap-fill=0x0 \
+			lpddr4_pmu_train_$(1)_imem.bin \
+			lpddr4_pmu_train_$(1)_imem_pad.bin && \
+		$(TARGET_OBJCOPY) -I binary -O binary --pad-to 0x4000 --gap-fill=0x0 \
+			lpddr4_pmu_train_$(1)_dmem.bin \
+			lpddr4_pmu_train_$(1)_dmem_pad.bin && \
+		cat lpddr4_pmu_train_$(1)_imem_pad.bin lpddr4_pmu_train_$(1)_dmem_pad.bin > \
+			lpddr4_pmu_train_$(1)_fw.bin \
+	)

It was still a bit annoying that we had to have all those commands inside a single command, so I've instead introduced a FIRMWARE_IMX_DDRFW_DIR variable, set to $(@D)/firmware/ddr/synopsys/ and used that everywhere. To me it makes the whole thing more readable.

Applied to master with this change.

Thanks!

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com