From 409d17dee7b407729a29c067ab064c78be18841e Mon Sep 17 00:00:00 2001 From: Patrick Georgi Date: Tue, 17 Jan 2012 15:52:05 +0100 Subject: [PATCH] libpayload: Allow using CBFS functions on images in RAM Two new functions allow switching the CBFS functions from using RAM or ROM, with ROM as default. Change-Id: I04d67ad622d25c5728ae9a63f5b8a3dc9bbacce6 Signed-off-by: Patrick Georgi Reviewed-on: http://review.coreboot.org/550 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer --- payloads/libpayload/include/cbfs.h | 2 ++ payloads/libpayload/libcbfs/cbfs.c | 31 ++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/payloads/libpayload/include/cbfs.h b/payloads/libpayload/include/cbfs.h index 681caeb493..8b8b0243ef 100644 --- a/payloads/libpayload/include/cbfs.h +++ b/payloads/libpayload/include/cbfs.h @@ -1,2 +1,4 @@ #include #include "cbfs_core.h" +void setup_cbfs_from_ram(void* start, uint32_t size); +void setup_cbfs_from_flash(void); diff --git a/payloads/libpayload/libcbfs/cbfs.c b/payloads/libpayload/libcbfs/cbfs.c index c7173e0cb3..7da2d58364 100644 --- a/payloads/libpayload/libcbfs/cbfs.c +++ b/payloads/libpayload/libcbfs/cbfs.c @@ -40,18 +40,18 @@ #define ERROR(x...) printf(x) #define LOG(x...) -uint32_t host_virt_to_phys(void *addr); -void *host_phys_to_virt(uint32_t addr); +static uint32_t host_virt_to_phys(void *addr); +static void *host_phys_to_virt(uint32_t addr); uint32_t romstart(void); uint32_t romend(void); #include -uint32_t host_virt_to_phys(void *addr) { +static uint32_t host_virt_to_phys(void *addr) { return virt_to_phys(addr); } -void *host_phys_to_virt(uint32_t addr) { +static void *host_phys_to_virt(uint32_t addr) { return phys_to_virt(addr); } #undef virt_to_phys @@ -76,3 +76,26 @@ uint32_t romend(void) #include "cbfs_core.c" +static uint32_t ram_cbfs_offset; + +static uint32_t ram_virt_to_phys(void *addr) { + return (uint32_t)addr - ram_cbfs_offset; +} + +static void *ram_phys_to_virt(uint32_t addr) { + return (void*)addr + ram_cbfs_offset; +} + +void setup_cbfs_from_ram(void* start, uint32_t size) +{ + /* assumes rollover */ + ram_cbfs_offset = (uint32_t)start + size; + virt_to_phys = ram_virt_to_phys; + phys_to_virt = ram_phys_to_virt; +} + +void setup_cbfs_from_flash() +{ + virt_to_phys = host_virt_to_phys; + phys_to_virt = host_phys_to_virt; +}