summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorArthur Heymans <arthur@aheymans.xyz>2019-10-23 17:25:58 +0200
committerPatrick Georgi <pgeorgi@google.com>2019-11-01 11:44:51 +0000
commit340e4b80904feb6c5c21497fc52966854fa5ee79 (patch)
tree4026de0ec0cc41f51dd121a0be76642a8d0a286d /src/lib
parent44874482fec69a849b06c378aa3eb69e75425256 (diff)
lib/cbmem_top: Add a common cbmem_top implementation
This adds a common cbmem_top implementation to all coreboot target. In romstage a static variable will be used to cache the result of cbmem_top_romstage. In ramstage if CONFIG_RAMSTAGE_CBMEM_TOP_ARG is set a global variable needs to be populated by the stage entry with the value passed via the calling arguments. if CONFIG_RAMSTAGE_CBMEM_TOP_ARG is not set the same implementation as will be used as in romstage. Change-Id: Ie767542ee25483acc9a56785ce20a885e9a63098 Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-on: https://review.coreboot.org/c/coreboot/+/36273 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Kconfig6
-rw-r--r--src/lib/imd_cbmem.c23
2 files changed, 29 insertions, 0 deletions
diff --git a/src/lib/Kconfig b/src/lib/Kconfig
index cb1e4a5cc8..b94ac495b7 100644
--- a/src/lib/Kconfig
+++ b/src/lib/Kconfig
@@ -24,6 +24,12 @@ config RAMSTAGE_LIBHWBASE
help
Selected by features that require `libhwbase` in ramstage.
+config RAMSTAGE_CBMEM_TOP_ARG
+ bool
+ help
+ Select this if stages run after romstage get the cbmem_top
+ pointer as the function arguments when called from romstage.
+
config FLATTENED_DEVICE_TREE
bool
help
diff --git a/src/lib/imd_cbmem.c b/src/lib/imd_cbmem.c
index be135c22e8..cbd4b8f887 100644
--- a/src/lib/imd_cbmem.c
+++ b/src/lib/imd_cbmem.c
@@ -13,6 +13,7 @@
* GNU General Public License for more details.
*/
+#include <assert.h>
#include <boot/coreboot_tables.h>
#include <bootstate.h>
#include <bootmem.h>
@@ -44,6 +45,28 @@
(!CONFIG(ARCH_X86) || ENV_RAMSTAGE || ENV_POSTCAR || \
!CONFIG(CAR_GLOBAL_MIGRATION))
+/* The program loader passes on cbmem_top and the program entry point
+ has to fill in the _cbmem_top_ptr symbol based on the calling arguments. */
+uintptr_t _cbmem_top_ptr;
+
+void *cbmem_top(void)
+{
+ if (ENV_ROMSTAGE
+ || ((ENV_POSTCAR || ENV_RAMSTAGE)
+ && !CONFIG(RAMSTAGE_CBMEM_TOP_ARG))) {
+ MAYBE_STATIC_BSS void *top = NULL;
+ if (top)
+ return top;
+ top = cbmem_top_chipset();
+ return top;
+ }
+ if ((ENV_POSTCAR || ENV_RAMSTAGE) && CONFIG(RAMSTAGE_CBMEM_TOP_ARG))
+ return (void *)_cbmem_top_ptr;
+
+ dead_code();
+}
+
+
static inline struct imd *cbmem_get_imd(void)
{
if (CAN_USE_GLOBALS) {