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 0c8bb1f9d44cf316122e91be7d5dbedf17213a97
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/8838
-gerrit
commit eabe160e7c7dfce53acebc123c52395f86312345
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;
}
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8943
-gerrit
commit 0cee8a9aaa64f2f48569fe04172f64a72f71923e
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Tue Mar 24 09:20:45 2015 -0500
coreboot: differentiate on early reliable writable globals
There is a big difference between the boards supported in coreboot
and the properties they provide within each stage during the bootflow.
The leads to core infrastructure relying on supporting the least
common denominator when writing APIs.
Therefore, provide PLATFORM_HAS_EARLY_WRITABLE_GLOBALS which indicates
that the platform has reliable writable global variables in the early
stages of boot. For x86 that would be romstage, and for the other
architetures which have SRAM it would encompass bootblock and romstage.
Change-Id: I2cefeaee0551ee241e138fcee0d199679002c3be
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/Kconfig | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/src/Kconfig b/src/Kconfig
index 7aee478..2625266 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -293,6 +293,25 @@ config SYSTEM_TYPE_LAPTOP
default n
bool
+config PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
+ bool
+ default y if !ARCH_X86
+ help
+ This option signals to the rest of the infrastructure that
+ the platform supports writable globals in bootblock and
+ romstage. Fox traditional x86 systems without any SRAM this
+ would mean cache-as-ram globals are migrated correctly from
+ the CAR area once memory is trained. After the migration the
+ variables are accessible using the CAR API. This behavior
+ puts such x86 systems on par with ARM and MIPS systems.
+
+config PLATFORM_NO_EARLY_WRITABLE_GLOBALS
+ bool
+ default y if !PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
+ help
+ This is just the opposite of PLATFORM_HAS_EARLY_WRITABLE_GLOBALS
+ to enable cleaner Makefiles.
+
menu "Chipset"
comment "CPU"
the following patch was just integrated into master:
commit 00903e5fc0249d822af1d9843358a3aa3675991b
Author: Ionela Voinescu <ionela.voinescu(a)imgtec.com>
Date: Fri Jan 9 13:14:20 2015 +0000
cbfs/rmodule: add architecture specific operations at stage load
Two weak functions were added so that architecture specific operations
on each segment of payload or stage can be performed.
Each architecture must define its own operations, otherwise the
behavior will default to do-nothing functions.
This patch has been updated by to fit more in line with
how program loading is currently being done. The API is the
same as the original, but all call sites to stages/payloads
have been updated. This is known to break any archs that use
rmodule loading that needs cache maintenance. That will be fixed
in a forthcoming patch. Also, the vboot paths are left as is
for easier upstreaming of the rest of the vboot patches.
Original-Change-Id: Ie29e7f9027dd430c8b4dde9848fa3413c5dbfbfa
Original-Signed-off-by: Ionela Voinescu <ionela.voinescu(a)imgtec.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/239881
Original-Reviewed-by: Vadim Bendebury <vbendeb(a)chromium.org>
(cherry picked from commit c82c21ce87a4c02bd9219548a4226a58e77beef0)
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
Change-Id: Ifcee5cd9ac5dbca991556296eb5e170b47b77af7
Reviewed-on: http://review.coreboot.org/8837
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi(a)google.com>
See http://review.coreboot.org/8837 for details.
-gerrit