soc/amd/picasso: Refactor transfer buffer check

The transfer buffer check had gotten large enough to deserve a function
of its own, so break it out.

BUG=None
TEST=Build
Branch=Zork

Signed-off-by: Martin Roth <martinroth@chromium.org>
Change-Id: Idf46f8edb6b70c63f623522e2bcd2f22d6d4790b
Reviewed-on: https://review.coreboot.org/c/coreboot/+/46112
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com>
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/soc/amd/picasso/bootblock/vboot_bootblock.c b/src/soc/amd/picasso/bootblock/vboot_bootblock.c
new file mode 100644
index 0000000..4c3ae4a
--- /dev/null
+++ b/src/soc/amd/picasso/bootblock/vboot_bootblock.c
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <amdblocks/reset.h>
+#include <console/console.h>
+#include <pc80/mc146818rtc.h>
+#include <security/vboot/vbnv.h>
+#include <security/vboot/symbols.h>
+#include <soc/psp_transfer.h>
+#include <2struct.h>
+
+void verify_psp_transfer_buf(void)
+{
+	if (*(uint32_t *)_vboot2_work == VB2_SHARED_DATA_MAGIC) {
+		cmos_write(0x00, CMOS_RECOVERY_BYTE);
+		return;
+	}
+
+	/*
+	 * If CMOS is valid and the system has already been rebooted once, but
+	 * still returns here, instead of rebooting to verstage again, assume
+	 * that the system is in a reboot loop and halt.
+	 */
+	if ((!vbnv_cmos_failed()) && cmos_read(CMOS_RECOVERY_BYTE) ==
+			CMOS_RECOVERY_MAGIC_VAL)
+		die("Error: Reboot into recovery was unsuccessful.  Halting.");
+
+	printk(BIOS_ERR, "ERROR: VBOOT workbuf not valid.\n");
+	printk(BIOS_DEBUG, "Signature: %#08x\n", *(uint32_t *)_vboot2_work);
+	cmos_init(0);
+	cmos_write(CMOS_RECOVERY_MAGIC_VAL, CMOS_RECOVERY_BYTE);
+	warm_reset();
+}