summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2018-11-08 20:56:20 -0800
committerAaron Durbin <adurbin@chromium.org>2018-11-09 18:21:27 +0000
commit890788eb6304a7b88906422a97dbb5c1bc717ee4 (patch)
tree7de88c61d83e7dbdb1442259afaf1a344f6aa0ea /src
parent97fda101e3c996d52e8f1081eae13673941e0c80 (diff)
downloadcoreboot-890788eb6304a7b88906422a97dbb5c1bc717ee4.tar.xz
arch/x86: Fix car_active for CONFIG_NO_CAR_GLOBAL_MIGRATION
Change 76ab2b7 ("arch/x86: allow global .bss objects without CAR_GLOBAL") allowed use of global .bss objects and hence moved around the macros resulting in car_active returning 0 even for those boards where CAR is actually active but do not require global migration. This resulted in boards getting stuck when doing a reset in verstage because the code flow incorrectly assumed that there was no CAR active and hence triggered a cache invalidate. This change fixes the above issue by returning 1 for car_active if ENV_CACHE_AS_RAM is set even if global migration is not required. BUG=b:109717603 TEST=Verified that board reset does not trigger cache invalidate in verstage and does not result in board hang. Change-Id: I182f3e4277c57d6c50f7fcac2be72514896b3c61 Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://review.coreboot.org/29555 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Peichao Li <peichao.wang@bitland.corp-partner.google.com> Reviewed-by: Nick Chen <nickchen@ami.corp-partner.google.com> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Justin TerAvest <teravest@chromium.org>
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/include/arch/early_variables.h20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/arch/x86/include/arch/early_variables.h b/src/arch/x86/include/arch/early_variables.h
index e95a45c55d..2cf76ad94a 100644
--- a/src/arch/x86/include/arch/early_variables.h
+++ b/src/arch/x86/include/arch/early_variables.h
@@ -79,12 +79,28 @@ static inline size_t car_object_offset(void *ptr)
}
#else
+
+/*
+ * We might end up here if:
+ * 1. ENV_CACHE_AS_RAM is not set for the stage or
+ * 2. ENV_CACHE_AS_RAM is set for the stage but CONFIG_NO_CAR_GLOBAL_MIGRATION
+ * is also set. In this case, there is no need to migrate CAR global
+ * variables. But, since we might still be running out of CAR, car_active needs
+ * to return 1 if ENV_CACHE_AS_RAM is set.
+ */
+
#define CAR_GLOBAL
static inline void *car_get_var_ptr(void *var) { return var; }
+
+#if ENV_CACHE_AS_RAM
+static inline int car_active(void) { return 1; }
+#else
static inline int car_active(void) { return 0; }
+#endif /* ENV_CACHE_AS_RAM */
+
#define car_get_var(var) (var)
#define car_sync_var(var) (var)
#define car_set_var(var, val) (var) = (val)
-#endif
+#endif /* ENV_CACHE_AS_RAM && !IS_ENABLED(CONFIG_NO_CAR_GLOBAL_MIGRATION) */
-#endif
+#endif /* ARCH_EARLY_VARIABLES_H */