Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8986
-gerrit
commit 803a498db961deccae71aa5cb34f3958698511a6
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Tue Mar 24 11:33:03 2015 -0500
baytrail: select PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
This platform supports PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
in that CAR region can be migrated and the data can be maintained
across the CAR tear down boundary.
Change-Id: I232613ebb641eb9d8fc61af4ba8d2e9b66ec5e51
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/soc/intel/baytrail/Kconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/soc/intel/baytrail/Kconfig b/src/soc/intel/baytrail/Kconfig
index 214a1ac..fbd2b01 100644
--- a/src/soc/intel/baytrail/Kconfig
+++ b/src/soc/intel/baytrail/Kconfig
@@ -21,6 +21,7 @@ config CPU_SPECIFIC_OPTIONS
select HAVE_HARD_RESET
select MMCONF_SUPPORT
select MMCONF_SUPPORT_DEFAULT
+ select PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
select RELOCATABLE_MODULES
select RELOCATABLE_RAMSTAGE
select PARALLEL_MP
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8984
-gerrit
commit 083f660a23b136b41cfb8a615013faeaccc48c47
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Wed Mar 25 10:44:53 2015 -0500
broadwell: select PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
This platform supports PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
in that CAR region can be migrated and the data can be maintained
across the CAR tear down boundary.
Change-Id: Iff3372fabc684bf8742e8f7fbfde9fbc105a7aa7
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/soc/intel/broadwell/Kconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/soc/intel/broadwell/Kconfig b/src/soc/intel/broadwell/Kconfig
index c147663..c81fa6e 100644
--- a/src/soc/intel/broadwell/Kconfig
+++ b/src/soc/intel/broadwell/Kconfig
@@ -29,6 +29,7 @@ config CPU_SPECIFIC_OPTIONS
select IOAPIC
select MMCONF_SUPPORT
select MMCONF_SUPPORT_DEFAULT
+ select PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
select RELOCATABLE_MODULES
select RELOCATABLE_RAMSTAGE
select REG_SCRIPT
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8985
-gerrit
commit 62b6422decb51671b659268884cc74c6e7d1a1ac
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Wed Mar 25 10:45:20 2015 -0500
haswell: select PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
This platform supports PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
in that CAR region can be migrated and the data can be maintained
across the CAR tear down boundary.
Change-Id: If131e26b719828647b9fe66f30fc0c87dbcb185f
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/cpu/intel/haswell/Kconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/cpu/intel/haswell/Kconfig b/src/cpu/intel/haswell/Kconfig
index 741b677..7352c63 100644
--- a/src/cpu/intel/haswell/Kconfig
+++ b/src/cpu/intel/haswell/Kconfig
@@ -17,6 +17,7 @@ config CPU_SPECIFIC_OPTIONS
select TSC_CONSTANT_RATE
select SMM_TSEG
select SMM_MODULES
+ select PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
select RELOCATABLE_MODULES
select RELOCATABLE_RAMSTAGE
select SUPPORT_CPU_UCODE_IN_CBFS
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8835
-gerrit
commit 7bcb8214e2877047d4286f97c662f92f7e30cff3
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Fri Mar 20 10:58:41 2015 -0500
loading: move ramstage cache function declarations
The functions related to caching ramstage were in cbfs.h.
Now that the loading code is separate move those declarations
to the common program_loading.h.
Change-Id: Ib22ef8a9c66e1d2b53388bceb8386baa6302d28b
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/include/cbfs.h | 38 --------------------------------------
src/include/program_loading.h | 36 ++++++++++++++++++++++++++++++++++++
src/lib/ramstage_cache.c | 2 +-
3 files changed, 37 insertions(+), 39 deletions(-)
diff --git a/src/include/cbfs.h b/src/include/cbfs.h
index 2db3c94..c0e3d80 100644
--- a/src/include/cbfs.h
+++ b/src/include/cbfs.h
@@ -79,43 +79,5 @@ int run_address(void *f);
/* Defined in individual arch / board implementation. */
int init_default_cbfs_media(struct cbfs_media *media);
-#if defined(__PRE_RAM__)
-struct romstage_handoff;
-struct cbmem_entry;
-
-#if CONFIG_RELOCATABLE_RAMSTAGE && defined(__PRE_RAM__)
-/* The cache_loaded_ramstage() and load_cached_ramstage() functions are defined
- * to be weak so that board and chipset code may override them. Their job is to
- * cache and load the ramstage for quick S3 resume. By default a copy of the
- * relocated ramstage is saved using the cbmem infrastructure. These
- * functions are only valid during romstage. */
-
-/* The implementer of cache_loaded_ramstage() may use the romstage_handoff
- * structure to store information, but note that the handoff variable can be
- * NULL. The ramstage cbmem_entry represents the region occupied by the loaded
- * ramstage. */
-void cache_loaded_ramstage(struct romstage_handoff *handoff,
- const struct cbmem_entry *ramstage, void *entry_point);
-/* Return NULL on error or entry point on success. The ramstage cbmem_entry is
- * the region where to load the cached contents to. */
-void * load_cached_ramstage(struct romstage_handoff *handoff,
- const struct cbmem_entry *ramstage);
-#else /* CONFIG_RELOCATABLE_RAMSTAGE */
-
-static inline void cache_loaded_ramstage(struct romstage_handoff *handoff,
- const struct cbmem_entry *ramstage, void *entry_point)
-{
-}
-
-static inline void *
-load_cached_ramstage(struct romstage_handoff *handoff,
- const struct cbmem_entry *ramstage)
-{
- return NULL;
-}
-
-#endif /* CONFIG_RELOCATABLE_RAMSTAGE */
-#endif /* defined(__PRE_RAM__) */
-
#endif
diff --git a/src/include/program_loading.h b/src/include/program_loading.h
index 21d2c1e..e071db9 100644
--- a/src/include/program_loading.h
+++ b/src/include/program_loading.h
@@ -40,8 +40,44 @@ void run_romstage(void);
* RAMSTAGE LOADING *
************************/
+struct romstage_handoff;
struct cbmem_entry;
+#if defined(__PRE_RAM__)
+#if CONFIG_RELOCATABLE_RAMSTAGE
+/* The cache_loaded_ramstage() and load_cached_ramstage() functions are defined
+ * to be weak so that board and chipset code may override them. Their job is to
+ * cache and load the ramstage for quick S3 resume. By default a copy of the
+ * relocated ramstage is saved using the cbmem infrastructure. These
+ * functions are only valid during romstage. */
+
+/* The implementer of cache_loaded_ramstage() may use the romstage_handoff
+ * structure to store information, but note that the handoff variable can be
+ * NULL. The ramstage cbmem_entry represents the region occupied by the loaded
+ * ramstage. */
+void cache_loaded_ramstage(struct romstage_handoff *handoff,
+ const struct cbmem_entry *ramstage, void *entry_point);
+/* Return NULL on error or entry point on success. The ramstage cbmem_entry is
+ * the region where to load the cached contents to. */
+void * load_cached_ramstage(struct romstage_handoff *handoff,
+ const struct cbmem_entry *ramstage);
+#else /* CONFIG_RELOCATABLE_RAMSTAGE */
+
+static inline void cache_loaded_ramstage(struct romstage_handoff *handoff,
+ const struct cbmem_entry *ramstage, void *entry_point)
+{
+}
+
+static inline void *
+load_cached_ramstage(struct romstage_handoff *handoff,
+ const struct cbmem_entry *ramstage)
+{
+ return NULL;
+}
+
+#endif /* CONFIG_RELOCATABLE_RAMSTAGE */
+#endif /* defined(__PRE_RAM__) */
+
/* Run ramstage from romstage. */
void run_ramstage(void);
diff --git a/src/lib/ramstage_cache.c b/src/lib/ramstage_cache.c
index 814d807..d61f1c1 100644
--- a/src/lib/ramstage_cache.c
+++ b/src/lib/ramstage_cache.c
@@ -19,8 +19,8 @@
#include <stddef.h>
#include <string.h>
-#include <cbfs.h>
#include <console/console.h>
+#include <program_loading.h>
#include <ramstage_cache.h>
#include <romstage_handoff.h>
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8838
-gerrit
commit 4f7032643c9c29711864f7b6a7646539f77d20a0
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Fri Mar 20 09:42:05 2015 -0500
program loading: provide one cache maintenance callback
Instead of having 2 different functions to call when a program
is loaded provide a single callback with flags parameter. The
previous callbacks for cache management routines did this:
for_each_program_segment:
arch_program_segment_loaded(start, size);
arch_program_loaded();
Now, use one callback instead:
for_each_program_segment:
arch_segment_loaded(start, size, SEG_FINAL?);
Change-Id: I3811cba92e3355d172f605e4444f053321b07a2a
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/include/program_loading.h | 12 ++++++++----
src/lib/arch_ops.c | 10 +++-------
src/lib/cbfs.c | 3 +--
src/lib/rmodule.c | 5 ++---
src/lib/selfboot.c | 17 +++++++++--------
5 files changed, 23 insertions(+), 24 deletions(-)
diff --git a/src/include/program_loading.h b/src/include/program_loading.h
index ca61c16..85ccd3c 100644
--- a/src/include/program_loading.h
+++ b/src/include/program_loading.h
@@ -23,11 +23,15 @@
#include <stdint.h>
#include <stddef.h>
-/* For each segment of a program loaded this function is called*/
-void arch_program_segment_loaded(uintptr_t start, size_t size);
+enum {
+ /* Last segment of program. Can be used to take different actions for
+ * cache maintenance of a program load. */
+ SEG_FINAL = 1 << 0,
+};
-/* Upon completion of loading a program this function is called */
-void arch_program_loaded(void);
+/* Called for each segment of a program loaded. The PROG_FLAG_FINAL will be
+ * set on the last segment loaded. */
+void arch_segment_loaded(uintptr_t start, size_t size, int flags);
/************************
* ROMSTAGE LOADING *
diff --git a/src/lib/arch_ops.c b/src/lib/arch_ops.c
index f02b342..b9f5719 100644
--- a/src/lib/arch_ops.c
+++ b/src/lib/arch_ops.c
@@ -2,6 +2,7 @@
* This file is part of the coreboot project.
*
* Copyright (C) 2014 Imagination Technologies
+ * Copyright 2015 Google Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,14 +21,9 @@
#include <program_loading.h>
/* For each segment of a program loaded this function is called*/
-__attribute__ ((weak)) void arch_program_segment_loaded(uintptr_t start,
- size_t size)
+void __attribute__ ((weak)) arch_segment_loaded(uintptr_t start, size_t size,
+ int flags)
{
/* do nothing */
}
-/* Upon completion of loading a program this function is called */
-__attribute__ ((weak)) void arch_program_loaded(void)
-{
- /* do nothing */
-}
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index c0a61b4..a214b45 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -112,8 +112,7 @@ void *cbfs_load_stage_by_offset(struct cbfs_media *media, ssize_t offset)
media->unmap(media, data);
}
- arch_program_segment_loaded(stage.load, stage.memlen);
- arch_program_loaded();
+ arch_segment_loaded(stage.load, stage.memlen, SEG_FINAL);
DEBUG("stage loaded\n");
return (void *)(uintptr_t)stage.entry;
diff --git a/src/lib/rmodule.c b/src/lib/rmodule.c
index c2bf33c..791029a 100644
--- a/src/lib/rmodule.c
+++ b/src/lib/rmodule.c
@@ -200,9 +200,8 @@ int rmodule_load(void *base, struct rmodule *module)
return -1;
rmodule_clear_bss(module);
- arch_program_segment_loaded((uintptr_t)module->location,
- rmodule_memory_size(module));
- arch_program_loaded();
+ arch_segment_loaded((uintptr_t)module->location,
+ rmodule_memory_size(module), SEG_FINAL);
return 0;
}
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index fe73c0c..b29a34e 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -314,9 +314,16 @@ static int load_self_segments(
struct payload *payload)
{
struct segment *ptr;
+ struct segment *last_non_empty;
const unsigned long one_meg = (1UL << 20);
unsigned long bounce_high = lb_end;
+ /* Determine last non-empty loaded segment. */
+ last_non_empty = NULL;
+ for(ptr = head->next; ptr != head; ptr = ptr->next)
+ if (ptr->s_filesz != 0)
+ last_non_empty = ptr;
+
for(ptr = head->next; ptr != head; ptr = ptr->next) {
if (bootmem_region_targets_usable_ram(ptr->s_dstaddr,
ptr->s_memsz))
@@ -442,17 +449,11 @@ static int load_self_segments(
* Each architecture can perform additonal operations
* on the loaded segment
*/
- arch_program_segment_loaded((uintptr_t)dest,
- ptr->s_memsz);
+ arch_segment_loaded((uintptr_t)dest, ptr->s_memsz,
+ last_non_empty == ptr ? SEG_FINAL : 0);
}
}
- /*
- * Each architecture can perform additonal operations once the entire
- * program is loaded
- */
- arch_program_loaded();
-
return 1;
}