payloads/external: Add memtest86+ v6 as secondary payload

This adds a Kconfig option to select memtest86+ version 6 as a secondary
payload and sets that as the default.  The coreboot version 5 code may
still be selected and used if desired.

Compiling for 32 bit requires glibc from multilib installed, if the host
system is running on 64 bit, as header files, e.g. gnu/stubs-32.h, are
required from there. So introduce a new choice menu which allows to
choose between 32 and 64 bit.

By default, the stable 6.20 version is selected instead of the top of
the main branch.

TEST=Build both V5 and V6, boot them in QEMU

Signed-off-by: Martin Roth <gaumless@gmail.com>
Signed-off-by: Felix Singer <felixsinger@posteo.net>
Change-Id: Ie0eedc25fcf37b925b072ca809c019a599a20392
Reviewed-on: https://review.coreboot.org/c/coreboot/+/69277
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
diff --git a/payloads/external/Makefile.inc b/payloads/external/Makefile.inc
index 8222dc8..779b3f4 100644
--- a/payloads/external/Makefile.inc
+++ b/payloads/external/Makefile.inc
@@ -304,8 +304,14 @@
 
 # Memtest86+
 
+ifeq ($(CONFIG_MEMTEST86PLUS_V6),y)
+memtest_dir:=memtest86plus_v6
+else
+memtest_dir:=memtest86plus_v5
+endif
+
 cbfs-files-$(CONFIG_MEMTEST_SECONDARY_PAYLOAD) += img/memtest
-img/memtest-file := payloads/external/Memtest86Plus/memtest86plus/memtest
+img/memtest-file := payloads/external/Memtest86Plus/$(memtest_dir)/memtest
 img/memtest-type := payload
 img/memtest-compression := $(CBFS_SECONDARY_PAYLOAD_COMPRESS_FLAG)
 
@@ -315,7 +321,7 @@
 		SERIAL_BAUD_RATE=$(CONFIG_TTYS0_BAUD)
 endif
 
-payloads/external/Memtest86Plus/memtest86plus/memtest: $(DOTCONFIG)
+payloads/external/Memtest86Plus/$(memtest_dir)/memtest: $(DOTCONFIG)
 	$(MAKE) -C payloads/external/Memtest86Plus all \
 		CC="$(CC_x86_32)" \
 		LD="$(LD_x86_32)" \
@@ -325,6 +331,8 @@
 		CONFIG_MEMTEST_REVISION_ID=$(CONFIG_MEMTEST_REVISION_ID) \
 		CONFIG_MEMTEST_MAIN=$(CONFIG_MEMTEST_MAIN) \
 		CONFIG_MEMTEST_STABLE=$(CONFIG_MEMTEST_STABLE) \
+		CONFIG_MEMTEST86PLUS_V5=$(CONFIG_MEMTEST86PLUS_V5) \
+		CONFIG_MEMTEST86PLUS_V6=$(CONFIG_MEMTEST86PLUS_V6) \
 		$(MEMTEST_SERIAL_OPTIONS) \
 		MFLAGS= MAKEFLAGS=
 
diff --git a/payloads/external/Memtest86Plus/Kconfig.secondary b/payloads/external/Memtest86Plus/Kconfig.secondary
index 98a0d06..d357399 100644
--- a/payloads/external/Memtest86Plus/Kconfig.secondary
+++ b/payloads/external/Memtest86Plus/Kconfig.secondary
@@ -1,8 +1,32 @@
 if MEMTEST_SECONDARY_PAYLOAD
 
+comment "Memtest86+"
+
 choice
-	prompt "Memtest86+ version"
-	default MEMTEST_STABLE
+	prompt "Memtest86+ 5/6"
+
+config MEMTEST86PLUS_V6
+	bool "Memtest86+ V6"
+
+config MEMTEST86PLUS_V5
+	bool "Memtest86+ V5"
+
+endchoice
+
+choice
+	prompt "Target architecture"
+	depends on MEMTEST86PLUS_V6
+
+config MEMTEST86PLUS_ARCH_64
+	bool "64 bit"
+
+config MEMTEST86PLUS_ARCH_32
+	bool "32 bit"
+
+endchoice
+
+choice
+	prompt "Memtest86+ revision"
 	depends on MEMTEST_SECONDARY_PAYLOAD
 
 config MEMTEST_STABLE
@@ -19,12 +43,13 @@
 	  This option will fetch the newest version of the Memtest86+ code,
 	  updating as new changes are committed.  This makes the build
 	  non-reproducible, as it can fetch different code each time.
+
 config MEMTEST_REVISION
 	bool "git revision"
 	help
 	  Select this option if you have a specific commit or branch
 	  that you want to use as the revision from which to
-	  build Memtest86+.  This makes the build
+	  build Memtest86+. Using a branch version makes the build
 	  non-reproducible, as it can fetch different code each time.
 
 	  You will be able to specify the name of a branch or a commit id
diff --git a/payloads/external/Memtest86Plus/Makefile b/payloads/external/Memtest86Plus/Makefile
index fe24e2c78..8f32058 100644
--- a/payloads/external/Memtest86Plus/Makefile
+++ b/payloads/external/Memtest86Plus/Makefile
@@ -1,14 +1,32 @@
 ## SPDX-License-Identifier: GPL-2.0-only
 
+project_name=Memtest86+
+
+ifeq ($(CONFIG_MEMTEST86PLUS_V6),y)
+project_dir=$(CURDIR)/memtest86plus_v6
+
+ifeq ($(MEMTEST86PLUS_ARCH_64),y)
+build_dir=$(project_dir)/build64
+else
+build_dir=$(project_dir)/build32
+endif
+project_git_repo=https://github.com/memtest86plus/memtest86plus.git
+TAG-$(CONFIG_MEMTEST_MAIN)=origin/main
+NAME-$(CONFIG_MEMTEST_MAIN)=Main
+TAG-$(CONFIG_MEMTEST_STABLE)=v6.20
+NAME-$(CONFIG_MEMTEST_STABLE)=Stable
+TAG-$(CONFIG_MEMTEST_REVISION)=$(CONFIG_MEMTEST_REVISION_ID)
+else
+project_dir=$(CURDIR)/memtest86plus_v5
+
+build_dir=$(project_dir)
+project_git_repo=https://review.coreboot.org/memtest86plus.git
 TAG-$(CONFIG_MEMTEST_MAIN)=origin/main
 NAME-$(CONFIG_MEMTEST_MAIN)=Main
 TAG-$(CONFIG_MEMTEST_STABLE)=0bd34c22604660e4283316331f3e7bf8a3863753
 NAME-$(CONFIG_MEMTEST_STABLE)=Stable
 TAG-$(CONFIG_MEMTEST_REVISION)=$(CONFIG_MEMTEST_REVISION_ID)
-
-project_name=Memtest86+
-project_dir=$(CURDIR)/memtest86plus
-project_git_repo=https://review.coreboot.org/memtest86plus.git
+endif
 
 all: build
 
@@ -25,7 +43,7 @@
 endif
 	false
 endif
-	-cd $(project_dir); git show $(TAG-y) >/dev/null 2>&1 ; \
+	-cd $(project_dir) 2>/dev/null; git show $(TAG-y) >/dev/null 2>&1 ; \
 		if [ $$? -ne 0 ] || [ "$(TAG-y)" = "origin/main" ]; then \
 		echo "    Fetching new commits from the $(project_name) git repo"; \
 		git fetch; fi
@@ -39,10 +57,13 @@
 
 build: checkout
 	echo "    MAKE       $(project_name) $(NAME-y)"
-	$(MAKE) -C $(project_dir) all
+	$(MAKE) -C $(build_dir) all
+ifeq ($(CONFIG_MEMTEST86PLUS_V6),y)
+	cp $(build_dir)/memtest.bin $(project_dir)/memtest
+endif
 
 clean:
-	test -d $(project_dir) && $(MAKE) -C $(project_dir) clean || exit 0
+	test -d $(build_dir) && $(MAKE) -C $(build_dir) clean || exit 0
 
 distclean:
 	rm -rf $(project_dir)
@@ -50,4 +71,4 @@
 print-repo-info:
 	echo "$(project_git_repo) $(project_dir)"
 
-.PHONY: all build checkout clean distclean fetch print-repo-info
+.PHONY: all build checkout check_version clean distclean fetch print-repo-info