[coreboot-gerrit] Patch set updated for coreboot: 6a50da6 selfboot: store bounce buffer in struct payload

Aaron Durbin (adurbin@google.com) gerrit at coreboot.org
Wed Feb 26 16:11:53 CET 2014


Aaron Durbin (adurbin at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5299

-gerrit

commit 6a50da61b1ba080160df28e91e0b1d4d1a49327a
Author: Aaron Durbin <adurbin at chromium.org>
Date:   Mon Feb 24 22:11:45 2014 -0600

    selfboot: store bounce buffer in struct payload
    
    In order to break the dependency on selfboot for jumping to
    payload the bounce buffer location needs to be communicated.
    Therefore, add the bounce buffer to struct payload.
    
    Change-Id: I9d9396e5c5bfba7a63940227ee0bdce6cba39578
    Signed-off-by: Aaron Durbin <adurbin at chromium.org>
---
 src/include/payload_loader.h |  6 ++++--
 src/lib/selfboot.c           | 26 +++++++++++++++-----------
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/include/payload_loader.h b/src/include/payload_loader.h
index 3dde2f7..73b28bf 100644
--- a/src/include/payload_loader.h
+++ b/src/include/payload_loader.h
@@ -22,14 +22,16 @@
 #include <stdint.h>
 #include <stddef.h>
 
-struct payload_backing_store {
+struct buffer_area {
 	void *data;
 	size_t size;
 };
 
 struct payload {
 	const char *name;
-	struct payload_backing_store backing_store;
+	struct buffer_area backing_store;
+	/* Used when payload wants memory coreboot ramstage is running at. */
+	struct buffer_area bounce;
 	void *entry;
 };
 
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index bd1206f..ba07480 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -74,22 +74,22 @@ struct segment {
 
 static unsigned long bounce_size, bounce_buffer;
 
-#if CONFIG_RELOCATABLE_RAMSTAGE
-static void get_bounce_buffer(struct lb_memory *mem, unsigned long req_size)
-{
-	/* When the ramstage is relocatable there is no need for a bounce
-	 * buffer. All payloads should not overlap the ramstage.
-	 */
-	bounce_buffer = ~0UL;
-	bounce_size = 0;
-}
-#else
 static void get_bounce_buffer(struct lb_memory *mem, unsigned long req_size)
 {
 	unsigned long lb_size;
 	unsigned long mem_entries;
 	unsigned long buffer;
 	int i;
+
+	/* When the ramstage is relocatable there is no need for a bounce
+	 * buffer. All payloads should not overlap the ramstage.
+	 */
+	if (IS_ENABLED(CONFIG_RELOCATABLE_RAMSTAGE)) {
+		bounce_buffer = ~0UL;
+		bounce_size = 0;
+		return;
+	}
+
 	lb_size = lb_end - lb_start;
 	/* Plus coreboot size so I have somewhere
 	 * to place a copy to return to.
@@ -120,7 +120,6 @@ static void get_bounce_buffer(struct lb_memory *mem, unsigned long req_size)
 	bounce_buffer = buffer;
 	bounce_size = req_size;
 }
-#endif /* CONFIG_RELOCATABLE_RAMSTAGE */
 
 static int valid_area(struct lb_memory *mem, unsigned long buffer,
 	unsigned long start, unsigned long len)
@@ -417,6 +416,11 @@ static int load_self_segments(
 		printk(BIOS_ERR, "Could not find a bounce buffer...\n");
 		return 0;
 	}
+
+	/* Update the payload's bounce buffer data used when loading. */
+	payload->bounce.data = (void *)(uintptr_t)bounce_buffer;
+	payload->bounce.size = bounce_size;
+
 	for(ptr = head->next; ptr != head; ptr = ptr->next) {
 		/* Verify the memory addresses in the segment are valid */
 		if (!valid_area(mem, bounce_buffer, ptr->s_dstaddr, ptr->s_memsz))



More information about the coreboot-gerrit mailing list