1################################################################################
2# Following variables defines how the NS_USER (Non Secure User - Client
3# Application), NS_KERNEL (Non Secure Kernel), S_KERNEL (Secure Kernel) and
4# S_USER (Secure User - TA) are compiled
5################################################################################
6override COMPILE_NS_USER   := 64
7override COMPILE_NS_KERNEL := 64
8override COMPILE_S_USER    := 64
9override COMPILE_S_KERNEL  := 64
10
11TFA_PLATFORM      ?= imx8mq
12OPTEE_OS_PLATFORM ?= imx-mx8mqevk
13U_BOOT_DEFCONFIG  ?= imx8mq_evk_defconfig
14U_BOOT_DT         ?= imx8mq-evk.dtb
15LINUX_DT          ?= imx8mq-evk.dtb
16MKIMAGE_DT        ?= fsl-imx8mq-evk.dtb
17MKIMAGE_SOC       ?= iMX8MQ
18
19BR2_TARGET_GENERIC_GETTY_PORT ?= ttymxc0
20BR2_TARGET_ROOTFS_EXT2 ?= y
21BR2_TARGET_ROOTFS_EXT2_4 ?= y
22
23include common.mk
24
25################################################################################
26# Paths to git projects and various binaries
27################################################################################
28ifeq ($(DEBUG),1)
29TF_A_BUILD		?= debug
30else
31TF_A_BUILD		?= release
32endif
33
34FIRMWARE_PATH		?= $(ROOT)/out-firmware
35MKIMAGE_PATH		?= $(ROOT)/imx-mkimage
36MKIMAGE_SOC_PATH	?= $(MKIMAGE_PATH)/iMX8M
37TF_A_PATH		?= $(ROOT)/trusted-firmware-a
38
39FIRMWARE_VERSION	?= firmware-imx-8.0
40FIRMWARE_BIN_SHA256_SUM ?= 63ec62f5d229cbed00918c8449173933f1c9d594c59396b8dd217e94f47138b0
41FIRMWARE_BIN		?= $(FIRMWARE_VERSION).bin
42FIRMWARE_BIN_URL	?= https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/$(FIRMWARE_BIN)
43
44BOOT_IMG		?= $(ROOT)/out/boot.img
45
46# Set the variable to include the board config snippet
47# Default value is empty, will select the imx8mq-evk board.
48# Possible values: "imx8mp-evk" or "imx8mp-verdin"
49IMX_BOARD ?=
50ifneq (,$(IMX_BOARD))
51include $(IMX_BOARD).inc.mk
52endif
53
54################################################################################
55# Targets
56################################################################################
57all: tfa u-boot linux optee-os buildroot flash-image
58clean: ddr-firmware-clean optee-os-clean tfa-clean u-boot-clean buildroot-clean
59
60include toolchain.mk
61
62################################################################################
63# ARM Trusted Firmware
64################################################################################
65TF_A_EXPORTS = CROSS_COMPILE="$(CCACHE)$(AARCH64_CROSS_COMPILE)"
66
67#	BL32=$(OPTEE_OS_HEADER_V2_BIN) \
68#	BL32_EXTRA1=$(OPTEE_OS_PAGER_V2_BIN) \
69#	BL32_EXTRA2=$(OPTEE_OS_PAGEABLE_V2_BIN) \
70
71TF_A_FLAGS += PLAT=$(TFA_PLATFORM) SPD=opteed DEBUG_CONSOLE=1 DEBUG=0 V=1
72TF_A_FLAGS += BL32=$(OPTEE_OS_PATH)/out/arm/core/tee-raw.bin
73
74tfa: optee-os
75	$(TF_A_EXPORTS) $(MAKE) -C $(TF_A_PATH) $(TF_A_FLAGS) all fip
76
77tfa-clean:
78	$(TF_A_EXPORTS) $(MAKE) -C $(TF_A_PATH) $(TF_A_FLAGS) clean
79
80################################################################################
81# U-Boot
82################################################################################
83
84U-BOOT_EXPORTS = CROSS_COMPILE="$(CCACHE)$(AARCH64_CROSS_COMPILE)"
85
86U-BOOT_DEFCONFIG_FILES := $(UBOOT_PATH)/configs/$(U_BOOT_DEFCONFIG) \
87			  $(BUILD_PATH)/kconfigs/uboot_imx8.conf
88
89$(UBOOT_PATH)/.config: $(U-BOOT_DEFCONFIG_FILES)
90	$(U-BOOT_EXPORTS) $(MAKE) -C $(UBOOT_PATH) $(U_BOOT_DEFCONFIG)
91	(cd $(UBOOT_PATH) && ARCH=arm64 scripts/kconfig/merge_config.sh \
92		$(U-BOOT_DEFCONFIG_FILES))
93
94.PHONY: u-boot-defconfig
95u-boot-defconfig: $(UBOOT_PATH)/.config
96
97.PHONY: u-boot
98u-boot: u-boot-defconfig tfa ddr-firmware
99	# Copy DDR4 firmware
100	cp $(FIRMWARE_PATH)/$(FIRMWARE_VERSION)/firmware/ddr/synopsys/lpddr4_pmu_train_*.bin \
101		$(UBOOT_PATH)
102	# Copy BL31 binary from TF-A
103	cp $(TF_A_PATH)/build/$(TFA_PLATFORM)/$(TF_A_BUILD)/bl31.bin $(UBOOT_PATH)
104	$(U-BOOT_EXPORTS) $(MAKE) -C $(UBOOT_PATH)
105
106.PHONY: u-boot-clean
107u-boot-clean:
108	cd $(UBOOT_PATH) && git clean -xdf
109
110.PHONY: u-boot-cscope
111u-boot-cscope:
112	$(U-BOOT_EXPORTS) $(MAKE) -C $(UBOOT_PATH) cscope
113
114
115################################################################################
116# Linux kernel
117################################################################################
118LINUX_DEFCONFIG_COMMON_ARCH := arm64
119LINUX_DEFCONFIG_COMMON_FILES := \
120		$(LINUX_PATH)/arch/arm64/configs/defconfig \
121		$(CURDIR)/kconfigs/imx.conf
122
123linux-defconfig: $(LINUX_PATH)/.config
124
125LINUX_COMMON_FLAGS += ARCH=arm64
126
127linux: linux-common
128
129linux-defconfig-clean: linux-defconfig-clean-common
130
131LINUX_CLEAN_COMMON_FLAGS += ARCH=arm64
132
133linux-clean: linux-clean-common
134
135LINUX_CLEANER_COMMON_FLAGS += ARCH=arm64
136
137linux-cleaner: linux-cleaner-common
138
139################################################################################
140# OP-TEE
141################################################################################
142optee-os: optee-os-common
143optee-os-clean: optee-os-clean-common
144
145################################################################################
146# DDR firmware
147################################################################################
148# This is prebuilt binaries by NXP, download them and use them. Update path if
149# it changes in the future.
150
151$(FIRMWARE_PATH)/$(FIRMWARE_BIN):
152	mkdir -p $(FIRMWARE_PATH)
153	(cd $(FIRMWARE_PATH) && wget $(FIRMWARE_BIN_URL))
154
155$(FIRMWARE_PATH)/.unpacked: $(FIRMWARE_PATH)/$(FIRMWARE_BIN)
156	(cd $(FIRMWARE_PATH) && \
157	 echo $(FIRMWARE_BIN_SHA256_SUM) $(FIRMWARE_BIN) | sha256sum -c)
158	(cd $(FIRMWARE_PATH) && \
159	 chmod 711 $(FIRMWARE_BIN) && ./$(FIRMWARE_BIN) --auto-accept)
160	touch $(FIRMWARE_PATH)/.unpacked
161
162.PHONY: ddr-firmware
163ddr-firmware: $(FIRMWARE_PATH)/.unpacked
164
165ddr-firmware-clean:
166	rm -rf $(FIRMWARE_PATH)
167
168################################################################################
169# imx-mkimage
170################################################################################
171mkimage: u-boot
172	ln -sf $(OPTEE_OS_PATH)/out/arm/core/tee-raw.bin \
173		$(MKIMAGE_SOC_PATH)/tee.bin
174	ln -sf $(TF_A_PATH)/build/$(TFA_PLATFORM)/$(TF_A_BUILD)/bl31.bin \
175		$(MKIMAGE_SOC_PATH)/
176	ln -sf $(FIRMWARE_PATH)/$(FIRMWARE_VERSION)/firmware/ddr/synopsys/lpddr4_pmu_train_*.bin \
177		$(MKIMAGE_SOC_PATH)/
178	ln -sf $(UBOOT_PATH)/u-boot-nodtb.bin $(MKIMAGE_SOC_PATH)/
179	ln -sf $(UBOOT_PATH)/spl/u-boot-spl.bin $(MKIMAGE_SOC_PATH)/
180	ln -sf $(UBOOT_PATH)/arch/arm/dts/$(U_BOOT_DT) \
181		$(MKIMAGE_SOC_PATH)/$(MKIMAGE_DT)
182	ln -sf $(UBOOT_PATH)/tools/mkimage $(MKIMAGE_SOC_PATH)/mkimage_uboot
183	# imx8mp: allow to override TEE_LOAD_ADDR
184	# https://github.com/nxp-imx/imx-mkimage/pull/3
185	sed -i 's/TEE_LOAD_ADDR =  /TEE_LOAD_ADDR ?= /' $(MKIMAGE_SOC_PATH)/soc.mak
186	$(MAKE) -C $(MKIMAGE_PATH) SOC=$(MKIMAGE_SOC) flash_spl_uboot
187#> +If you want to run with HDMI, copy signed_hdmi_imx8m.bin to imx-mkimage/iMX8M
188#> +make SOC=iMX8M flash_spl_uboot or make SOC=iMX8M flash_hdmi_spl_uboot to
189#> +generate flash.bin.
190mkimage-clean:
191	cd $(MKIMAGE_PATH) && git clean -xdf
192	rm -f $(BUILD_PATH)/mkimage_imx8
193
194$(ROOT)/out-br/images/ramdisk.img: $(ROOT)/out-br/images/rootfs.cpio.gz
195	$(UBOOT_PATH)/tools/mkimage -A arm64 -O linux -T ramdisk -C gzip \
196		-d $< $@
197
198$(ROOT)/out:
199	mkdir -p $@
200
201$(ROOT)/out/boot.scr: $(BUILD_PATH)/imx/u-boot_boot_script | $(ROOT)/out
202	$(UBOOT_PATH)/tools/mkimage -T script -C none -n 'Boot script' \
203		-d $< $@
204
205################################################################################
206# Flash images
207################################################################################
208USE_PERSISTENT_ROOTFS ?= 0
209
210# Configuration of the BOOT partition
211FLASH_PARTITIONS_BLOCK_SIZE = 512
212FLASH_PARTITION_BOOT_START_BLOCK = 16384
213FLASH_PARTITION_BOOT_SIZE_IN_BYTES = \
214	$(shell echo $$(( 64 * 1024 * 1024 )))
215FLASH_PARTITION_BOOT_SIZE_IN_BLOCKS = \
216	$(shell echo $$(( $(FLASH_PARTITION_BOOT_SIZE_IN_BYTES) / $(FLASH_PARTITIONS_BLOCK_SIZE) )))
217FLASH_PARTITIONS_TABLE = "\
218	start=$(FLASH_PARTITION_BOOT_START_BLOCK) \
219	size=$(FLASH_PARTITION_BOOT_SIZE_IN_BLOCKS) \
220	type=7\n"
221FLASH_IMAGE_SIZE = \
222	$(shell echo $$(( $(FLASH_PARTITION_BOOT_START_BLOCK) * $(FLASH_PARTITIONS_BLOCK_SIZE) \
223	+ $(FLASH_PARTITION_BOOT_SIZE_IN_BYTES) )))
224
225# Configuration of the ROOTFS partition if enabled
226ifeq ($(USE_PERSISTENT_ROOTFS),1)
227FLASH_PARTITION_ROOTFS_IMAGE_PATH = $(ROOT)/out-br/images/rootfs.ext4
228FLASH_PARTITION_ROOTFS_START_BLOCK = \
229	$(shell echo $$(( $(FLASH_PARTITION_BOOT_START_BLOCK) + $(FLASH_PARTITION_BOOT_SIZE_IN_BLOCKS) )))
230FLASH_PARTITION_ROOTFS_SIZE_IN_BYTES = \
231	$(shell stat -L --printf="%s" $(FLASH_PARTITION_ROOTFS_IMAGE_PATH))
232FLASH_PARTITION_ROOTFS_SIZE_IN_BLOCKS = \
233	$(shell echo $$(( $(FLASH_PARTITION_ROOTFS_SIZE_IN_BYTES) / $(FLASH_PARTITIONS_BLOCK_SIZE) )))
234FLASH_PARTITIONS_TABLE += "\
235	start=$(FLASH_PARTITION_ROOTFS_START_BLOCK) \
236	size=$(FLASH_PARTITION_ROOTFS_SIZE_IN_BLOCKS) \
237	type=83\n"
238FLASH_IMAGE_SIZE := $(shell echo $$(( $(FLASH_IMAGE_SIZE) + $(FLASH_PARTITION_ROOTFS_SIZE_IN_BYTES) )))
239endif
240
241.PHONY: flash-image
242flash-image: buildroot mkimage linux
243	$(MAKE) flash-image-only
244
245.PHONY: flash-image-only
246flash-image-only: $(ROOT)/out-br/images/ramdisk.img $(ROOT)/out/boot.scr
247	rm -f $(BOOT_IMG)
248	truncate -s $(FLASH_IMAGE_SIZE) $(BOOT_IMG)
249	echo -ne $(FLASH_PARTITIONS_TABLE) | sfdisk $(BOOT_IMG)
250	mformat -i $(BOOT_IMG).fat -n 64 -h 255 -T 131072 -v "BOOT IMG" -C ::
251	mcopy -i $(BOOT_IMG).fat $(LINUX_PATH)/arch/arm64/boot/Image ::
252	mcopy -i $(BOOT_IMG).fat \
253		$(LINUX_PATH)/arch/arm64/boot/dts/freescale/$(LINUX_DT) ::
254	mcopy -i $(BOOT_IMG).fat $(ROOT)/out/boot.scr ::
255
256ifeq ($(USE_PERSISTENT_ROOTFS),1)
257	dd if=$(FLASH_PARTITION_ROOTFS_IMAGE_PATH) of=$(BOOT_IMG) bs=$(FLASH_PARTITIONS_BLOCK_SIZE) \
258		seek=$(FLASH_PARTITION_ROOTFS_START_BLOCK) conv=fsync,notrunc
259else
260	mcopy -i $(BOOT_IMG).fat $(ROOT)/out-br/images/ramdisk.img ::
261endif
262
263	dd if=$(BOOT_IMG).fat of=$(BOOT_IMG) bs=$(FLASH_PARTITIONS_BLOCK_SIZE) \
264		seek=$(FLASH_PARTITION_BOOT_START_BLOCK) conv=fsync,notrunc
265	dd if=$(MKIMAGE_SOC_PATH)/flash.bin of=$(BOOT_IMG) bs=1k seek=33 \
266		conv=fsync,notrunc
267