From 277ddad25543602d59b7c889ea9f5619ca3e849e Mon Sep 17 00:00:00 2001
From: Joakim Bech <joakim.bech@linaro.org>
Date: Wed, 15 Nov 2017 09:33:21 +0100
Subject: [PATCH] fvp: Introduce grub to the FPV setup

As a first step to update EDK2 to running latest  we are introducing
grub which will be a needed component when booting UEFI without
semihosting.

This particular patch will just bulid grub, it will still not be used
when running FVP (that is enabled in later patches in this series).

Signed-off-by: Joakim Bech <joakim.bech@linaro.org>
Reviewed-by: Victor Chong <victor.chong@linaro.org>
---
 fvp.mk            | 53 +++++++++++++++++++++++++++++++++++++++++++++--
 fvp/grub/grub.cfg | 10 +++++++++
 2 files changed, 61 insertions(+), 2 deletions(-)
 create mode 100644 fvp/grub/grub.cfg

diff --git a/fvp.mk b/fvp.mk
index b890f98..5d12d19 100644
--- a/fvp.mk
+++ b/fvp.mk
@@ -23,17 +23,27 @@ FOUNDATION_PATH		?= $(ROOT)/Foundation_Platformpkg
 ifeq ($(wildcard $(FOUNDATION_PATH)),)
 $(error $(FOUNDATION_PATH) does not exist)
 endif
+GRUB_PATH		?= $(ROOT)/grub
+GRUB_CONFIG_PATH	?= $(BUILD_PATH)/fvp/grub
+OUT_PATH		?= $(ROOT)/out
+GRUB_BIN		?= $(OUT_PATH)/bootaa64.efi
 
 ################################################################################
 # Targets
 ################################################################################
-all: arm-tf edk2 linux optee-os optee-client xtest optee-examples
-clean: arm-tf-clean busybox-clean edk2-clean optee-os-clean \
+all: arm-tf edk2 grub linux optee-os optee-client xtest optee-examples
+clean: arm-tf-clean busybox-clean edk2-clean grub-clean optee-os-clean \
 	optee-client-clean optee-examples-clean
 
 
 include toolchain.mk
 
+################################################################################
+# Folders
+################################################################################
+$(OUT_PATH):
+	mkdir -p $@
+
 ################################################################################
 # ARM Trusted Firmware
 ################################################################################
@@ -145,6 +155,45 @@ filelist-tee: filelist-tee-common
 
 update_rootfs: update_rootfs-common
 
+################################################################################
+# grub
+################################################################################
+grub-flags := CC="$(CCACHE)gcc" \
+	TARGET_CC="$(AARCH64_CROSS_COMPILE)gcc" \
+	TARGET_OBJCOPY="$(AARCH64_CROSS_COMPILE)objcopy" \
+	TARGET_NM="$(AARCH64_CROSS_COMPILE)nm" \
+	TARGET_RANLIB="$(AARCH64_CROSS_COMPILE)ranlib" \
+	TARGET_STRIP="$(AARCH64_CROSS_COMPILE)strip"
+
+GRUB_MODULES += boot chain configfile echo efinet eval ext2 fat font gettext \
+		gfxterm gzio help linux loadenv lsefi normal part_gpt \
+		part_msdos read regexp search search_fs_file search_fs_uuid \
+		search_label terminal terminfo test tftp time
+
+$(GRUB_PATH)/configure: $(GRUB_PATH)/configure.ac
+	cd $(GRUB_PATH) && ./autogen.sh
+
+$(GRUB_PATH)/Makefile: $(GRUB_PATH)/configure
+	cd $(GRUB_PATH) && ./configure --target=aarch64 --enable-boot-time $(grub-flags)
+
+.PHONY: grub
+grub: $(GRUB_PATH)/Makefile | $(OUT_PATH)
+	$(MAKE) -C $(GRUB_PATH) && \
+	cd $(GRUB_PATH) && ./grub-mkimage \
+		--output=$(GRUB_BIN) \
+		--config=$(GRUB_CONFIG_PATH)/grub.cfg \
+		--format=arm64-efi \
+		--directory=grub-core \
+		--prefix=/boot/grub \
+		$(GRUB_MODULES)
+
+.PHONY: grub-clean
+grub-clean:
+	@if [ -e $(GRUB_PATH)/Makefile ]; then $(MAKE) -C $(GRUB_PATH) clean; fi
+	@rm -f $(GRUB_BIN)
+	@rm -f $(GRUB_PATH)/configure
+
+
 ################################################################################
 # Run targets
 ################################################################################
diff --git a/fvp/grub/grub.cfg b/fvp/grub/grub.cfg
new file mode 100644
index 0000000..6ddef34
--- /dev/null
+++ b/fvp/grub/grub.cfg
@@ -0,0 +1,10 @@
+set prefix='/EFI/BOOT'
+
+set default="0"
+set timeout=10
+
+menuentry 'GNU/Linux (OP-TEE)' {
+    linux /Image console=tty0 console=ttyAMA0,115200 earlycon=pl011,0x1c090000 root=/dev/disk/by-partlabel/system rootwait rw ignore_loglevel efi=noruntime
+    initrd /initrd.img
+    devicetree /foundation-v8.dtb
+}
-- 
GitLab