blob: af10859cb3bd7dcf4018a2efebb3c0ed9c047379 [file] [log] [blame]
Philip Attfield3f9250f2016-09-14 07:43:32 +02001################################################################################
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
11# Firmware package to download, for convenience later on when unpacking etc,
12# we split it up in three different variables. Note that this should be updated
13# when newer firmware packages will be used.
14RPI3_FIRMWARE_URL = https://github.com/raspberrypi/firmware/archive
15RPI3_FIRMWARE_FILE = 046effa13ebc4cc7601df4f06f4834bd0eebb0f8
16RPI3_FIRMWARE_FILE_EXT = zip
17
18-include common.mk
19
20################################################################################
21# Mandatory definition to use common.mk
22################################################################################
23ifeq ($(COMPILE_NS_USER),64)
24MULTIARCH := aarch64-linux-gnu
25else
26MULTIARCH := arm-linux-gnueabihf
27endif
28
29################################################################################
30# Paths to git projects and various binaries
31################################################################################
32ARM_TF_PATH ?= $(ROOT)/arm-trusted-firmware
33ARM_TF_OUT ?= $(ARM_TF_PATH)/build/rpi3/debug
34ARM_TF_BIN ?= $(ARM_TF_OUT)/bl31.bin
35ARM_TF_TMP ?= $(ARM_TF_OUT)/bl31.tmp
36ARM_TF_HEAD ?= $(ARM_TF_OUT)/bl31.head
37ARM_TF_BOOT ?= $(ARM_TF_OUT)/optee.bin
38
39U-BOOT_PATH ?= $(ROOT)/u-boot
40U-BOOT_BIN ?= $(U-BOOT_PATH)/u-boot.bin
41U-BOOT_JTAG_BIN ?= $(U-BOOT_PATH)/u-boot-jtag.bin
42
43RPI3_FIRMWARE_PATH ?= $(BUILD_PATH)/rpi3/firmware
44RPI3_HEAD_BIN ?= $(RPI3_FIRMWARE_PATH)/head.bin
45RPI3_BOOT_CONFIG ?= $(RPI3_FIRMWARE_PATH)/config.txt
46RPI3_UBOOT_ENV ?= $(RPI3_FIRMWARE_PATH)/uboot.env
47RPI3_STOCK_FW_PATH ?= $(ROOT)/rpi3_firmware
48
49OPTEE_OS_PAGER ?= $(OPTEE_OS_PATH)/out/arm/core/tee-pager.bin
50
51LINUX_IMAGE ?= $(LINUX_PATH)/arch/arm64/boot/Image
52LINUX_DTB ?= $(LINUX_PATH)/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb
53MODULE_OUTPUT ?= $(ROOT)/module_output
54
55################################################################################
56# Targets
57################################################################################
58all: rpi3-firmware arm-tf optee-os optee-client xtest u-boot \
59 linux update_rootfs
60all-clean: arm-tf-clean busybox-clean u-boot-clean optee-os-clean \
61 optee-client-clean rpi3-firmware-clean
62
63-include toolchain.mk
64
65################################################################################
66# ARM Trusted Firmware
67################################################################################
68ARM_TF_EXPORTS ?= \
69 CFLAGS="-O0 -gdwarf-2" \
70 CROSS_COMPILE="$(CCACHE)$(AARCH64_CROSS_COMPILE)"
71
72ARM_TF_FLAGS ?= \
73 BL32=$(OPTEE_OS_BIN) \
74 DEBUG=1 \
75 V=0 \
76 CRASH_REPORTING=1 \
77 LOG_LEVEL=40 \
78 PLAT=rpi3 \
79 SPD=opteed
80
81arm-tf: optee-os
82 $(ARM_TF_EXPORTS) $(MAKE) -C $(ARM_TF_PATH) $(ARM_TF_FLAGS) all
83 cd $(ARM_TF_OUT) && \
84 dd if=/dev/zero of=scratch bs=1c count=131072 && \
85 cat $(ARM_TF_BIN) scratch > $(ARM_TF_TMP) && \
86 dd if=$(ARM_TF_TMP) of=$(ARM_TF_HEAD) bs=1c count=131072 && \
87 cat $(ARM_TF_HEAD) $(OPTEE_OS_PAGER) > $(ARM_TF_BOOT) && \
88 rm scratch $(ARM_TF_TMP) $(ARM_TF_HEAD)
89
90arm-tf-clean:
91 $(ARM_TF_EXPORTS) $(MAKE) -C $(ARM_TF_PATH) $(ARM_TF_FLAGS) clean
92
93################################################################################
94# Das U-Boot
95################################################################################
96
97U-BOOT_EXPORTS ?= CROSS_COMPILE=$(LEGACY_AARCH64_CROSS_COMPILE) ARCH=arm64
98
99.PHONY: u-boot
100u-boot:
101 $(U-BOOT_EXPORTS) $(MAKE) -C $(U-BOOT_PATH) rpi_3_defconfig
102 $(U-BOOT_EXPORTS) $(MAKE) -C $(U-BOOT_PATH) all
103 cd $(U-BOOT_PATH) && cat $(RPI3_HEAD_BIN) $(U-BOOT_BIN) > $(U-BOOT_JTAG_BIN)
104
105u-boot-clean:
106 $(U-BOOT_EXPORTS) $(MAKE) -C $(U-BOOT_PATH) clean
107
108################################################################################
109# Busybox
110################################################################################
111BUSYBOX_COMMON_TARGET = rpi3
112BUSYBOX_CLEAN_COMMON_TARGET = rpi3 clean
113
114busybox: busybox-common
115
116busybox-clean: busybox-clean-common
117
118busybox-cleaner: busybox-cleaner-common
119################################################################################
120# Linux kernel
121################################################################################
122LINUX_DEFCONFIG_COMMON_ARCH := arm64
123LINUX_DEFCONFIG_COMMON_FILES := \
124 $(LINUX_PATH)/arch/arm64/configs/bcmrpi3_defconfig \
125 $(CURDIR)/kconfigs/rpi3.conf
126
127linux-defconfig: $(LINUX_PATH)/.config
128
129LINUX_COMMON_FLAGS += ARCH=arm64
130
131linux: linux-common
132 $(MAKE) -C $(LINUX_PATH) $(LINUX_COMMON_FLAGS) INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$(MODULE_OUTPUT) modules_install
133
134linux-defconfig-clean: linux-defconfig-clean-common
135
136LINUX_CLEAN_COMMON_FLAGS += ARCH=arm64
137
138linux-clean: linux-clean-common
139
140LINUX_CLEANER_COMMON_FLAGS += ARCH=arm64
141
142linux-cleaner: linux-cleaner-common
143
144################################################################################
145# OP-TEE
146################################################################################
147OPTEE_OS_COMMON_FLAGS += PLATFORM=rpi3
148optee-os: optee-os-common
149
150OPTEE_OS_CLEAN_COMMON_FLAGS += PLATFORM=rpi3
151optee-os-clean: optee-os-clean-common
152
153optee-client: optee-client-common
154
155optee-client-clean: optee-client-clean-common
156
157################################################################################
158# Raspberry Pi 3 firmware
159################################################################################
160.PHONY: rpi3-firmware
161rpi3-firmware:
162ifeq ("$(wildcard $(ROOT)/out/$(RPI3_FIRMWARE_FILE).$(RPI3_FIRMWARE_FILE_EXT))","")
163 echo "Downloading Raspberry Pi 3 firmware ..."
164 mkdir -p $(ROOT)/out
165 wget $(RPI3_FIRMWARE_URL)/$(RPI3_FIRMWARE_FILE).$(RPI3_FIRMWARE_FILE_EXT) -O $(ROOT)/out/$(RPI3_FIRMWARE_FILE).$(RPI3_FIRMWARE_FILE_EXT)
166 unzip -a $(ROOT)/out/$(RPI3_FIRMWARE_FILE).$(RPI3_FIRMWARE_FILE_EXT) -d $(ROOT)
167 mv $(ROOT)/firmware-$(RPI3_FIRMWARE_FILE) $(RPI3_STOCK_FW_PATH)
168endif
169
170.PHONY: rpi3-firmware-clean
171rpi3-firmware-clean:
172 rm -f $(ROOT)/out/$(RPI3_FIRMWARE_FILE).$(RPI3_FIRMWARE_FILE_EXT)
173
174################################################################################
175# xtest / optee_test
176################################################################################
177xtest: xtest-common
178
179xtest-clean: xtest-clean-common
180
181xtest-patch: xtest-patch-common
182
183################################################################################
184# hello_world
185################################################################################
186helloworld: helloworld-common
187
188helloworld-clean: helloworld-clean-common
189
190################################################################################
191# Root FS
192################################################################################
193.PHONY: filelist-tee
194filelist-tee: helloworld
195 @echo "# xtest / optee_test" > $(GEN_ROOTFS_FILELIST)
196 @find $(OPTEE_TEST_OUT_PATH) -type f -name "xtest" | sed 's/\(.*\)/file \/bin\/xtest \1 755 0 0/g' >> $(GEN_ROOTFS_FILELIST)
197 @echo "file /bin/hello_world $(HELLOWORLD_PATH)/host/hello_world 755 0 0" >> $(GEN_ROOTFS_FILELIST)
198 @echo "# TAs" >> $(GEN_ROOTFS_FILELIST)
199 @echo "dir /lib/optee_armtz 755 0 0" >> $(GEN_ROOTFS_FILELIST)
200 @find $(OPTEE_TEST_OUT_PATH) -name "*.ta" | \
201 sed 's/\(.*\)\/\(.*\)/file \/lib\/optee_armtz\/\2 \1\/\2 444 0 0/g' >> $(GEN_ROOTFS_FILELIST)
202 @echo "file /lib/optee_armtz/8aaaf200-2450-11e4-abe20002a5d5c51b.ta $(HELLOWORLD_PATH)/ta/8aaaf200-2450-11e4-abe20002a5d5c51b.ta 444 0 0" >> $(GEN_ROOTFS_FILELIST)
203 @echo "# Secure storage dir" >> $(GEN_ROOTFS_FILELIST)
204 @echo "dir /data 755 0 0" >> $(GEN_ROOTFS_FILELIST)
205 @echo "dir /data/tee 755 0 0" >> $(GEN_ROOTFS_FILELIST)
206 @echo "dir /data/tee 755 0 0" >> $(GEN_ROOTFS_FILELIST)
207 @echo "dir /usr/bin 755 0 0" >> $(GEN_ROOTFS_FILELIST)
208 @if [ -e $(OPTEE_GENDRV_MODULE) ]; then \
209 echo "# OP-TEE device" >> $(GEN_ROOTFS_FILELIST); \
210 echo "dir /lib/modules 755 0 0" >> $(GEN_ROOTFS_FILELIST); \
211 echo "dir /lib/modules/$(call KERNEL_VERSION) 755 0 0" >> $(GEN_ROOTFS_FILELIST); \
212 echo "file /lib/modules/$(call KERNEL_VERSION)/optee.ko $(OPTEE_GENDRV_MODULE) 755 0 0" >> $(GEN_ROOTFS_FILELIST); \
213 fi
214 @echo "# OP-TEE Client" >> $(GEN_ROOTFS_FILELIST)
215 @echo "file /usr/include/tee_client_api.h $(OPTEE_CLIENT_EXPORT)/include/tee_client_api.h 755 0 0" >> $(GEN_ROOTFS_FILELIST)
216 @echo "file /usr/include/teec_trace.h $(OPTEE_CLIENT_EXPORT)/include/teec_trace.h 755 0 0" >> $(GEN_ROOTFS_FILELIST)
217 @echo "file /bin/tee-supplicant $(OPTEE_CLIENT_EXPORT)/bin/tee-supplicant 755 0 0" >> $(GEN_ROOTFS_FILELIST)
218 @echo "file /lib/libteec.so.1.0 $(OPTEE_CLIENT_EXPORT)/lib/libteec.so.1.0 755 0 0" >> $(GEN_ROOTFS_FILELIST)
219 @echo "slink /lib/libteec.so.1 libteec.so.1.0 755 0 0" >> $(GEN_ROOTFS_FILELIST)
220 @echo "slink /lib/libteec.so libteec.so.1 755 0 0" >> $(GEN_ROOTFS_FILELIST)
221 @echo "dir /boot 755 0 0" >> $(GEN_ROOTFS_FILELIST)
222 @echo "file /boot/bcm2710-rpi-3-b.dtb $(LINUX_DTB) 755 0 0" >> $(GEN_ROOTFS_FILELIST)
223 @echo "file /boot/config.txt $(RPI3_BOOT_CONFIG) 755 0 0" >> $(GEN_ROOTFS_FILELIST)
224 @echo "file /boot/Image $(LINUX_IMAGE) 755 0 0" >> $(GEN_ROOTFS_FILELIST)
225 @echo "file /boot/optee.bin $(ARM_TF_BOOT) 755 0 0" >> $(GEN_ROOTFS_FILELIST)
226 @echo "file /boot/uboot.env $(RPI3_UBOOT_ENV) 755 0 0" >> $(GEN_ROOTFS_FILELIST)
227 @echo "file /boot/u-boot-jtag.bin $(U-BOOT_JTAG_BIN) 755 0 0" >> $(GEN_ROOTFS_FILELIST)
228 @cd $(MODULE_OUTPUT) && find ! -path . -type d | sed 's/\.\(.*\)/dir \1 755 0 0/g' >> $(GEN_ROOTFS_FILELIST)
229 @cd $(MODULE_OUTPUT) && find -type f | sed "s|\.\(.*\)|file \1 $(MODULE_OUTPUT)\1 755 0 0|g" >> $(GEN_ROOTFS_FILELIST)
230 @echo "file /boot/bootcode.bin $(RPI3_STOCK_FW_PATH)/boot/bootcode.bin 755 0 0" >> $(GEN_ROOTFS_FILELIST)
231 @echo "file /boot/COPYING.linux $(RPI3_STOCK_FW_PATH)/boot/COPYING.linux 755 0 0" >> $(GEN_ROOTFS_FILELIST)
232 @echo "file /boot/fixup_cd.dat $(RPI3_STOCK_FW_PATH)/boot/fixup_cd.dat 755 0 0" >> $(GEN_ROOTFS_FILELIST)
233 @echo "file /boot/fixup.dat $(RPI3_STOCK_FW_PATH)/boot/fixup.dat 755 0 0" >> $(GEN_ROOTFS_FILELIST)
234 @echo "file /boot/fixup_db.dat $(RPI3_STOCK_FW_PATH)/boot/fixup_db.dat 755 0 0" >> $(GEN_ROOTFS_FILELIST)
235 @echo "file /boot/fixup_x.dat $(RPI3_STOCK_FW_PATH)/boot/fixup_x.dat 755 0 0" >> $(GEN_ROOTFS_FILELIST)
236 @echo "file /boot/LICENCE.broadcom $(RPI3_STOCK_FW_PATH)/boot/LICENCE.broadcom 755 0 0" >> $(GEN_ROOTFS_FILELIST)
237 @echo "file /boot/start_cd.elf $(RPI3_STOCK_FW_PATH)/boot/start_cd.elf 755 0 0" >> $(GEN_ROOTFS_FILELIST)
238 @echo "file /boot/start_db.elf $(RPI3_STOCK_FW_PATH)/boot/start_db.elf 755 0 0" >> $(GEN_ROOTFS_FILELIST)
239 @echo "file /boot/start.elf $(RPI3_STOCK_FW_PATH)/boot/start.elf 755 0 0" >> $(GEN_ROOTFS_FILELIST)
240 @echo "file /boot/start_x.elf $(RPI3_STOCK_FW_PATH)/boot/start_x.elf 755 0 0" >> $(GEN_ROOTFS_FILELIST)
241
242.PHONY: update_rootfs
243update_rootfs: arm-tf busybox u-boot optee-client xtest filelist-tee linux
244 cat $(GEN_ROOTFS_PATH)/filelist-final.txt $(GEN_ROOTFS_PATH)/filelist-tee.txt > $(GEN_ROOTFS_PATH)/filelist.tmp
245 cd $(GEN_ROOTFS_PATH) && \
246 $(LINUX_PATH)/usr/gen_init_cpio $(GEN_ROOTFS_PATH)/filelist.tmp | gzip > $(GEN_ROOTFS_PATH)/filesystem.cpio.gz
247
248# Creating images etc, could wipe out a drive on the system, therefore we don't
249# want to automate that in script or make target. Instead we just simply provide
250# the steps here.
251.PHONY: img-help
252img-help:
253 @echo "$$ fdisk /dev/sdx # where sdx is the name of your sd-card"
254 @echo " > p # prints partition table"
255 @echo " > d # repeat until all partitions are deleted"
256 @echo " > n # create a new partition"
257 @echo " > p # create primary"
258 @echo " > 1 # make it the first partition"
259 @echo " > <enter> # use the default sector"
260 @echo " > +32M # create a boot partition with 32MB of space"
261 @echo " > n # create rootfs partition"
262 @echo " > p"
263 @echo " > 2"
264 @echo " > <enter>"
265 @echo " > <enter> # fill the remaining disk, adjust size to fit your needs"
266 @echo " > t # change partition type"
267 @echo " > 1 # select first partition"
268 @echo " > e # use type 'e' (FAT16)"
269 @echo " > a # make partition bootable"
270 @echo " > 1 # select first partition"
271 @echo " > p # double check everything looks right"
272 @echo " > w # write partition table to disk."
273 @echo ""
274 @echo "run the following as root"
275 @echo " $$ mkfs.vfat -F16 -n BOOT /dev/sdx1"
276 @echo " $$ mkdir -p /media/boot"
277 @echo " $$ mount /dev/sdx1 /media/boot"
278 @echo " $$ cd /media"
279 @echo " $$ gunzip -cd $(GEN_ROOTFS_PATH)/filesystem.cpio.gz | sudo cpio -idmv \"boot/*\""
280 @echo " $$ umount boot"
281 @echo ""
282 @echo "run the following as root"
283 @echo " $$ mkfs.ext4 -L rootfs /dev/sdx2"
284 @echo " $$ mkdir -p /media/rootfs"
285 @echo " $$ mount /dev/sdx2 /media/rootfs"
286 @echo " $$ cd rootfs"
287 @echo " $$ gunzip -cd $(GEN_ROOTFS_PATH)/filesystem.cpio.gz | sudo cpio -idmv"
288 @echo " $$ rm -rf /media/rootfs/boot/*"
289 @echo " $$ cd .. && umount rootfs"