vboot: make vboot workbuf available to payload

Create a new cbtable entry called VBOOT_WORKBUF for
storing a pointer to the vboot workbuf within the
vboot_working_data structure.

BUG=b:124141368, b:124192753
TEST=Build and deploy to eve
TEST=util/lint/checkpatch.pl -g origin/master..HEAD
TEST=util/abuild/abuild -B -e -y -c 50 -p none -x
BRANCH=none

Change-Id: Id68f43c282939d9e1b419e927a14fe8baa290d91
Signed-off-by: Joel Kitching <kitching@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/31887
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index 960ab0f..6e44f5d 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -32,6 +32,7 @@
 #include <cbmem.h>
 #include <bootmem.h>
 #include <spi_flash.h>
+#include <security/vboot/misc.h>
 #include <security/vboot/vbnv_layout.h>
 #if CONFIG(USE_OPTION_TABLE)
 #include <option_table.h>
@@ -206,8 +207,8 @@
 	vbnv->range_size = VBOOT_VBNV_BLOCK_SIZE;
 #endif
 }
+#endif /* CONFIG_CHROMEOS */
 
-#if CONFIG(VBOOT)
 static void lb_vboot_handoff(struct lb_header *header)
 {
 	void *addr;
@@ -223,10 +224,18 @@
 	vbho->range_start = (intptr_t)addr;
 	vbho->range_size = size;
 }
-#else
-static inline void lb_vboot_handoff(struct lb_header *header) {}
-#endif /* CONFIG_VBOOT */
-#endif /* CONFIG_CHROMEOS */
+
+static void lb_vboot_workbuf(struct lb_header *header)
+{
+	struct lb_range *vbwb;
+	struct vboot_working_data *wd = vboot_get_working_data();
+
+	vbwb = (struct lb_range *)lb_new_record(header);
+	vbwb->tag = LB_TAB_VBOOT_WORKBUF;
+	vbwb->size = sizeof(*vbwb);
+	vbwb->range_start = (uintptr_t)wd + wd->buffer_offset;
+	vbwb->range_size = wd->buffer_size;
+}
 
 __weak uint32_t board_id(void) { return UNDEFINED_STRAPPING_ID; }
 __weak uint32_t ram_code(void) { return UNDEFINED_STRAPPING_ID; }
@@ -535,11 +544,16 @@
 
 	/* pass along VBNV offsets in CMOS */
 	lb_vbnv(head);
-
-	/* pass along the vboot_handoff address. */
-	lb_vboot_handoff(head);
 #endif
 
+	if (CONFIG(VBOOT)) {
+		/* pass along the vboot_handoff address. */
+		lb_vboot_handoff(head);
+
+		/* pass along the vboot workbuf address. */
+		lb_vboot_workbuf(head);
+	}
+
 	/* Add strapping IDs if available */
 	lb_board_id(head);
 	lb_ram_code(head);