Add support for Ultra96 ZynqMP board

This commit adds support for Ultra96 board.
It relies on ultra96 flavor added to OP-TEE ZynqMP platform.
zynqmp makefile is modified in the following way:
- Default BSP rootfs is replaced by a minimal rootfs which supports
zcu10x and Ultra96 boards.
- New petalinux-package target available to generate BOOT.BIN file.

Signed-off-by: Michael Grand <michael.grand@gmail.com>
Acked-by: Joakim Bech <joakim.bech@linaro.org>
diff --git a/zynqmp.mk b/zynqmp.mk
index 7b07d9f..d19c7c0 100644
--- a/zynqmp.mk
+++ b/zynqmp.mk
@@ -1,8 +1,8 @@
 ROOT			= $(PWD)/..
 PLATFORM		?= zcu102
-PETALINUX_PATH		?= /opt/Xilinx/petalinx_2018_2
-BSP_PATH		?= ./xilinx-${PLATFORM}-v2018.2-final.bsp
-PRJ_PATH		?= $(ROOT)/xilinx-${PLATFORM}-2018.2
+PETALINUX_PATH		?= $(PETALINUX)
+BSP_PATH		?= ./xilinx-${PLATFORM}-v$(PETALINUX_VER)-final.bsp
+PRJ_PATH		?= $(ROOT)/$(PLATFORM)-$(PETALINUX_VER)
 PETALINUX_CFG_PATH	?= $(ROOT)/build/zynqmp
 OPTEE_VER		?= latest
 
@@ -20,8 +20,16 @@
 	fi
 endef
 
-.PHONY: check-petalinux
+ifeq ($(PLATFORM),ultra96-reva)
+	ZYNQMP_CONSOLE=cadence1
+else
+	ZYNQMP_CONSOLE=cadence0
+endif
 
+.PHONY: all
+all: petalinux-create petalinux-config petalinux-build petalinux-package
+
+.PHONY: check-petalinux
 check-petalinux:
 ifndef PETALINUX_VER
 	$(error You have to source Petalinux settings)
@@ -30,34 +38,61 @@
 	$(error This makefile only support Petalinux 2018.2)
 endif
 
-petalinux-create: check-petalinux
-	@cd $(ROOT) && petalinux-create -t project -s $(BSP_PATH)
-	@cd $(PRJ_PATH) && petalinux-create -t apps --template install -n optee-client --enable
-	@cd $(PRJ_PATH) && petalinux-create -t apps --template install -n optee-test --enable
-	@#
+petalinux-create: check-petalinux	
+	@cd $(ROOT) && petalinux-create -n $(PLATFORM)-$(PETALINUX_VER) \
+	    -t project -s $(BSP_PATH)
 	$(call set_cfg,CONFIG_SUBSYSTEM_ATF_COMPILE_EXTRA_SETTINGS,"SPD=opteed ZYNQMP_BL32_MEM_BASE=0x60000000 ZYNQMP_BL32_MEM_SIZE=0x80000",$(PRJ_PATH)/project-spec/configs/config)
 	$(call set_cfg,CONFIG_SUBSYSTEM_ZYNQMP_ATF_MEM_SIZE,0x16001,$(PRJ_PATH)/project-spec/configs/config)
 	@#
-	@cp $(PETALINUX_CFG_PATH)/kernel_optee.cfg $(PRJ_PATH)/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/
-	@cp $(PETALINUX_CFG_PATH)/linux-xlnx_%.bbappend $(PRJ_PATH)/project-spec/meta-user/recipes-kernel/linux/linux-xlnx_%.bbappend
-	@cp $(PETALINUX_CFG_PATH)/system-user.dtsi $(PRJ_PATH)/project-spec/meta-user/recipes-bsp/device-tree/files/
+	@# Replace BSP default rootfs by a minimal one to speed up building 
+	@# process and ease compatibility between different boards. Default
+	@# rootfs is saved in rootfs_config_full file
+	@mv $(PRJ_PATH)/project-spec/configs/rootfs_config \
+	    $(PRJ_PATH)/project-spec/configs/rootfs_config_full
+	@cp $(PETALINUX_CFG_PATH)/rootfs_config \
+	    $(PRJ_PATH)/project-spec/configs/
 	@#
+	@mkdir -p $(PRJ_PATH)/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/
+	@cp $(PETALINUX_CFG_PATH)/kernel_optee.cfg \
+	    $(PRJ_PATH)/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/
+	@cp $(PETALINUX_CFG_PATH)/linux-xlnx_%.bbappend \
+	    $(PRJ_PATH)/project-spec/meta-user/recipes-kernel/linux/linux-xlnx_%.bbappend
+	@cp $(PETALINUX_CFG_PATH)/system-user.dtsi \
+	    $(PRJ_PATH)/project-spec/meta-user/recipes-bsp/device-tree/files/
+	@#
+	@# Override default TF-A 1.4 with TF-A 1.5 because it does not work with
+	@# OP-TEE
 	@mkdir -p $(PRJ_PATH)/project-spec/meta-user/recipes-bsp/arm-trusted-firmware/
-	@cp -r $(PETALINUX_CFG_PATH)/arm-trusted-firmware/* $(PRJ_PATH)/project-spec/meta-user/recipes-bsp/arm-trusted-firmware/
+	@cp -r $(PETALINUX_CFG_PATH)/arm-trusted-firmware/* \
+	    $(PRJ_PATH)/project-spec/meta-user/recipes-bsp/arm-trusted-firmware/
 	@#
+	@petalinux-create -p $(PRJ_PATH) -t apps --template install \
+	    -n optee-client --enable
+	@petalinux-create -p $(PRJ_PATH) -t apps --template install \
+	    -n optee-test --enable
 	@mkdir -p $(PRJ_PATH)/project-spec/meta-user/recipes-bsp/optee-os
-	@cp -r $(PETALINUX_CFG_PATH)/optee-os/* $(PRJ_PATH)/project-spec/meta-user/recipes-bsp/optee-os/
-	@cp -r $(PETALINUX_CFG_PATH)/optee-client/* $(PRJ_PATH)/project-spec/meta-user/recipes-apps/optee-client/
-	@cp -r $(PETALINUX_CFG_PATH)/optee-test/* $(PRJ_PATH)/project-spec/meta-user/recipes-apps/optee-test/
+	@cp -r $(PETALINUX_CFG_PATH)/optee-os/* \
+	    $(PRJ_PATH)/project-spec/meta-user/recipes-bsp/optee-os/
+	@cp -r $(PETALINUX_CFG_PATH)/optee-client/* \
+	    $(PRJ_PATH)/project-spec/meta-user/recipes-apps/optee-client/
+	@cp -r $(PETALINUX_CFG_PATH)/optee-test/* \
+	    $(PRJ_PATH)/project-spec/meta-user/recipes-apps/optee-test/
 	
-petalinux-config:
+petalinux-config: check-petalinux
 	$(call set_optee_version,$(OPTEE_VER),$(PRJ_PATH)/project-spec/meta-user/recipes-apps/optee-test/optee-test.bbappend)
 	$(call set_optee_version,$(OPTEE_VER),$(PRJ_PATH)/project-spec/meta-user/recipes-apps/optee-client/optee-client.bbappend)
 	$(call set_optee_version,$(OPTEE_VER),$(PRJ_PATH)/project-spec/meta-user/recipes-bsp/optee-os/optee-os.bbappend)
-	@cd $(PRJ_PATH) && petalinux-config --oldconfig
+	@petalinux-config -p $(PRJ_PATH) --oldconfig
 
-petalinux-build:
-	@cd $(PRJ_PATH) && petalinux-build
+petalinux-build: check-petalinux
+	@petalinux-build -p $(PRJ_PATH)
 	
-qemu:
-	@cd $(PRJ_PATH) && petalinux-boot --qemu --qemu-args "-device loader,file=${PRJ_PATH}/images/linux/bl32.elf" --kernel
+qemu: check-petalinux
+	@cd $(PRJ_PATH) && petalinux-boot --qemu \
+	    --qemu-args "-device loader,file=${PRJ_PATH}/images/linux/bl32.elf" \
+	    --kernel
+
+petalinux-package: check-petalinux
+	@cd $(PRJ_PATH) && petalinux-package --boot --pmufw --fpga --u-boot \
+	    --add ${PRJ_PATH}/images/linux/bl32.elf --cpu a53-0 \
+	    --file-attribute "exception_level=el-1, trustzone" --force
diff --git a/zynqmp/optee-os/optee-os.bb b/zynqmp/optee-os/optee-os.bb
index 6442264..67fc398 100644
--- a/zynqmp/optee-os/optee-os.bb
+++ b/zynqmp/optee-os/optee-os.bb
@@ -25,6 +25,10 @@
 OPTEE_BASE_NAME ?= "${PN}-${PKGE}-${PKGV}-${PKGR}-${DATETIME}"
 OPTEE_BASE_NAME[vardepsexclude] = "DATETIME"
 
+COMPATIBLE_MACHINE = "zynqmp"
+PLATFORM_zynqmp = "zynqmp"
+FLAVOR_zynqmp = "${@d.getVar('MACHINE').split('-')[0]}"
+
 # requires CROSS_COMPILE set by hand as there is no configure script
 export CROSS_COMPILE="${TARGET_PREFIX}"
 
@@ -44,7 +48,7 @@
 EXTRA_OEMAKE_append = " CROSS_COMPILE=${CROSS_COMPILE}"
 EXTRA_OEMAKE_append = " CROSS_COMPILE_core=${CROSS_COMPILE}"
 EXTRA_OEMAKE_append = " CROSS_COMPILE_ta_arm64=${CROSS_COMPILE}"
-EXTRA_OEMAKE_append = " PLATFORM=zynqmp"
+EXTRA_OEMAKE_append = " PLATFORM=${PLATFORM}-${FLAVOR}"
 EXTRA_OEMAKE_append = " CFG_ARM64_core=y"
 EXTRA_OEMAKE_append = " CFG_ARM32_core=n"
 EXTRA_OEMAKE_append = " CFG_USER_TA_TARGETS=ta_arm64"
diff --git a/zynqmp/rootfs_config b/zynqmp/rootfs_config
new file mode 100644
index 0000000..6b70e8d
--- /dev/null
+++ b/zynqmp/rootfs_config
@@ -0,0 +1,14 @@
+CONFIG_mtd-utils=y
+CONFIG_canutils=y
+CONFIG_openssh-sftp-server=y
+CONFIG_pciutils=y
+CONFIG_run-postinsts=y
+CONFIG_packagegroup-core-boot=y
+CONFIG_packagegroup-core-ssh-dropbear=y
+CONFIG_tcf-agent=y
+CONFIG_bridge-utils=y
+CONFIG_hellopm=y
+CONFIG_udev-extraconf=y
+CONFIG_ultra96-ap-setup=y
+CONFIG_packagegroup-base-extended=y
+CONFIG_ROOTFS_ROOT_PASSWD="root"