aboutsummaryrefslogtreecommitdiff
path: root/src/lib/ramstage_cache.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2015-03-20 13:00:20 -0500
committerAaron Durbin <adurbin@google.com>2015-04-03 14:51:51 +0200
commit3948e5392bbfd685e6e2f9abfb16c46a2eae18b9 (patch)
tree480a94bff1f7c2587dfc5943d45dfc8c66ec971b /src/lib/ramstage_cache.c
parent3b631615f6c382965e239704b1f417c6a67b6730 (diff)
program loading: introduce struct prog
The struct prog serves as way to consolidate program loading. This abstraction can be used to perform more complicated execution paths such as running a program on a separate CPU after it has been loaded. Currently t124 and t132 need to do that in the boot path. Follow on patches will allow the platform to decide how to execute a particular program. Note: the vboot path is largely untouched because it's already broken in the coreboot.org tree. After getting all the necessary patches pushed then vboot will be fixed. Change-Id: Ic6e6fe28c5660fb41edee5fd8661eaf58222f883 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/8839 Tested-by: build bot (Jenkins) Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com> Reviewed-by: Marc Jones <marc.jones@se-eng.com>
Diffstat (limited to 'src/lib/ramstage_cache.c')
-rw-r--r--src/lib/ramstage_cache.c55
1 files changed, 31 insertions, 24 deletions
diff --git a/src/lib/ramstage_cache.c b/src/lib/ramstage_cache.c
index d61f1c16e6..1dd40c7d5e 100644
--- a/src/lib/ramstage_cache.c
+++ b/src/lib/ramstage_cache.c
@@ -27,8 +27,7 @@
#if CONFIG_CACHE_RELOCATED_RAMSTAGE_OUTSIDE_CBMEM
void cache_loaded_ramstage(struct romstage_handoff *handoff,
- const struct cbmem_entry *ramstage,
- void *entry_point)
+ struct prog *ramstage)
{
struct ramstage_cache *cache;
uint32_t total_size;
@@ -36,8 +35,8 @@ void cache_loaded_ramstage(struct romstage_handoff *handoff,
void *ramstage_base;
long cache_size = 0;
- ramstage_size = cbmem_entry_size(ramstage);
- ramstage_base = cbmem_entry_start(ramstage);
+ ramstage_size = prog_size(ramstage);
+ ramstage_base = prog_start(ramstage);
cache = ramstage_cache_location(&cache_size);
@@ -56,7 +55,7 @@ void cache_loaded_ramstage(struct romstage_handoff *handoff,
}
cache->magic = RAMSTAGE_CACHE_MAGIC;
- cache->entry_point = (uint32_t)entry_point;
+ cache->entry_point = (uint32_t)prog_entry(ramstage);
cache->load_address = (uint32_t)ramstage_base;
cache->size = ramstage_size;
@@ -68,11 +67,11 @@ void cache_loaded_ramstage(struct romstage_handoff *handoff,
if (handoff == NULL)
return;
- handoff->ramstage_entry_point = (uint32_t)entry_point;
+ handoff->ramstage_entry_point = cache->entry_point;
}
-void *load_cached_ramstage(struct romstage_handoff *handoff,
- const struct cbmem_entry *ramstage)
+void load_cached_ramstage(struct romstage_handoff *handoff,
+ struct prog *ramstage)
{
struct ramstage_cache *cache;
long size = 0;
@@ -82,14 +81,15 @@ void *load_cached_ramstage(struct romstage_handoff *handoff,
if (!ramstage_cache_is_valid(cache)) {
printk(BIOS_DEBUG, "Invalid ramstage cache found.\n");
ramstage_cache_invalid(cache);
- return NULL;
+ return;
}
printk(BIOS_DEBUG, "Loading ramstage from %p.\n", cache);
- memcpy((void *)cache->load_address, &cache->program[0], cache->size);
+ prog_set_area(ramstage, (void *)cache->load_address, cache->size);
+ prog_set_entry(ramstage, (void *)cache->entry_point, NULL);
- return (void *)cache->entry_point;
+ memcpy((void *)cache->load_address, &cache->program[0], cache->size);
}
#else
@@ -97,7 +97,7 @@ void *load_cached_ramstage(struct romstage_handoff *handoff,
/* Cache relocated ramstage in CBMEM. */
void cache_loaded_ramstage(struct romstage_handoff *handoff,
- const struct cbmem_entry *ramstage, void *entry_point)
+ struct prog *ramstage)
{
uint32_t ramstage_size;
const struct cbmem_entry *entry;
@@ -105,7 +105,7 @@ void cache_loaded_ramstage(struct romstage_handoff *handoff,
if (handoff == NULL)
return;
- ramstage_size = cbmem_entry_size(ramstage);
+ ramstage_size = prog_size(ramstage);
/* cbmem_entry_add() does a find() before add(). */
entry = cbmem_entry_add(CBMEM_ID_RAMSTAGE_CACHE, ramstage_size);
@@ -113,30 +113,37 @@ void cache_loaded_ramstage(struct romstage_handoff *handoff,
return;
/* Keep track of the entry point in the handoff structure. */
- handoff->ramstage_entry_point = (uint32_t)entry_point;
+ handoff->ramstage_entry_point = (uint32_t)prog_entry(ramstage);
- memcpy(cbmem_entry_start(entry), cbmem_entry_start(ramstage),
- ramstage_size);
+ memcpy(cbmem_entry_start(entry), prog_start(ramstage), ramstage_size);
}
-void *load_cached_ramstage(struct romstage_handoff *handoff,
- const struct cbmem_entry *ramstage)
+void load_cached_ramstage(struct romstage_handoff *handoff,
+ struct prog *ramstage)
{
const struct cbmem_entry *entry_cache;
+ const struct cbmem_entry *entry_dest;
if (handoff == NULL)
- return NULL;
+ return;
entry_cache = cbmem_entry_find(CBMEM_ID_RAMSTAGE_CACHE);
if (entry_cache == NULL)
- return NULL;
+ return;
- /* Load the cached ramstage copy into the to-be-run region. */
- memcpy(cbmem_entry_start(ramstage), cbmem_entry_start(entry_cache),
- cbmem_entry_size(ramstage));
+ entry_dest = cbmem_entry_find(CBMEM_ID_RAMSTAGE);
+
+ if (entry_dest == NULL)
+ return;
- return (void *)handoff->ramstage_entry_point;
+ prog_set_area(ramstage, cbmem_entry_start(entry_dest),
+ cbmem_entry_size(entry_dest));
+ prog_set_entry(ramstage, (void *)handoff->ramstage_entry_point, NULL);
+
+ /* Load the cached ramstage copy into the to-be-run region. */
+ memcpy(prog_start(ramstage), cbmem_entry_start(entry_cache),
+ prog_size(ramstage));
}
#endif