summaryrefslogtreecommitdiff
path: root/src/soc/intel
diff options
context:
space:
mode:
authorPatrick Rudolph <patrick.rudolph@9elements.com>2021-01-11 09:21:58 +0100
committerPatrick Georgi <pgeorgi@google.com>2021-01-15 11:20:41 +0000
commitce51b34186b6eb7356c1bab752dcaccc66d96ab2 (patch)
treeaa38f2f800f7017725cf5d9a7827a2101b4758a5 /src/soc/intel
parentbc15e0195832e40b37df9fd6e658659e2982cfbd (diff)
cpu/x86/mpinit: Serialize microcode updates for HT threads
This change affects Intel CPUs only. As most platforms are doing uCode update using FIT, they aren't affected by this code either. Update microcode in MP-init using a single spinlock when running on a Hyper-Threading enabled CPU on pre FIT platforms. This will slow down the MP-init boot flow. Intel SDM and various BWGs specify to use a semaphore to update microcode on one thread per core on Hyper-Threading enabled CPUs. Due to this complex code would be necessary to determine the core #ID, initializing and picking the right semaphore out of CONFIG_MAX_CPUS / 2. Instead use the existing global spinlock already present in MPinit code. Assuming that only pre-FIT platforms with Hyper-Threading enabled and at most 8 threads will ever run into this condition, the boot delay is negligible. This change is a counterproposal to the previous published patch series being much more unsophisticated. Change-Id: I27bf5177859c12e92d6ce7a2966c965d7262b472 Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/49303 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Diffstat (limited to 'src/soc/intel')
-rw-r--r--src/soc/intel/baytrail/cpu.c2
-rw-r--r--src/soc/intel/braswell/cpu.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/src/soc/intel/baytrail/cpu.c b/src/soc/intel/baytrail/cpu.c
index 2029017e1f..e624240d92 100644
--- a/src/soc/intel/baytrail/cpu.c
+++ b/src/soc/intel/baytrail/cpu.c
@@ -149,7 +149,7 @@ static void get_microcode_info(const void **microcode, int *parallel)
const struct pattrs *pattrs = pattrs_get();
*microcode = pattrs->microcode_patch;
- *parallel = 1;
+ *parallel = !intel_ht_supported();
}
static void per_cpu_smm_trigger(void)
diff --git a/src/soc/intel/braswell/cpu.c b/src/soc/intel/braswell/cpu.c
index 04bf1082c3..0c6f463438 100644
--- a/src/soc/intel/braswell/cpu.c
+++ b/src/soc/intel/braswell/cpu.c
@@ -152,7 +152,7 @@ static void get_microcode_info(const void **microcode, int *parallel)
const struct pattrs *pattrs = pattrs_get();
*microcode = pattrs->microcode_patch;
- *parallel = 1;
+ *parallel = !intel_ht_supported();
}
static void per_cpu_smm_trigger(void)