[coreboot-gerrit] New patch to review for coreboot: 2a1245e tegra132: add option to bring up and init secondary cpu
Patrick Georgi (pgeorgi@google.com)
gerrit at coreboot.org
Thu Mar 26 10:48:38 CET 2015
Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9020
-gerrit
commit 2a1245ee1e7e4bb429a94a98f294c91f2b0b8bab
Author: Aaron Durbin <adurbin at chromium.org>
Date: Wed Aug 27 17:51:19 2014 -0500
tegra132: add option to bring up and init secondary cpu
Optionally bring up secondary cpu according to devicetree.
BUG=chrome-os-partner:31545
BRANCH=None
TEST=Built and enabled bringing up second core on ryu.
Change-Id: I5ede8b2f1b30a6170520cc11c18e263793cea301
Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
Original-Commit-Id: d7da2dcce9be653a3c551c33bbefb3810a6949e9
Original-Change-Id: Ia3f2c10dab2bbfd65ba883451bf4eafc26f2e7cf
Original-Signed-off-by: Aaron Durbin <adurbin at chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/214776
Original-Reviewed-by: Tom Warren <twarren at nvidia.com>
Original-Reviewed-by: Furquan Shaikh <furquan at chromium.org>
---
src/soc/nvidia/tegra132/chip.h | 1 +
src/soc/nvidia/tegra132/soc.c | 45 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 46 insertions(+)
diff --git a/src/soc/nvidia/tegra132/chip.h b/src/soc/nvidia/tegra132/chip.h
index 394f0a4..654e381 100644
--- a/src/soc/nvidia/tegra132/chip.h
+++ b/src/soc/nvidia/tegra132/chip.h
@@ -26,6 +26,7 @@
#define EINVAL 2
struct soc_nvidia_tegra132_config {
+ int bring_up_secondary_cpu;
};
#endif /* __SOC_NVIDIA_TEGRA132_CHIP_H__ */
diff --git a/src/soc/nvidia/tegra132/soc.c b/src/soc/nvidia/tegra132/soc.c
index 13050f6..024fd80 100644
--- a/src/soc/nvidia/tegra132/soc.c
+++ b/src/soc/nvidia/tegra132/soc.c
@@ -21,11 +21,15 @@
#include <console/console.h>
#include <device/device.h>
#include <arch/io.h>
+#include <arch/cpu.h>
+#include <timer.h>
#include <vendorcode/google/chromeos/chromeos.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
+#include <soc/cpu.h>
#include <soc/ramstage.h>
#include <soc/nvidia/tegra/apbmisc.h>
+#include "chip.h"
static void soc_read_resources(device_t dev)
{
@@ -56,11 +60,52 @@ static void soc_read_resources(device_t dev)
ram_resource(dev, index++, begin * KiB, size * KiB);
}
+static volatile int secondary_cpu_up;
+
+void soc_secondary_cpu_init(void)
+{
+ printk(BIOS_INFO, "CPU%d is up!\n", smp_processor_id());
+ gic_init();
+ dmb();
+ secondary_cpu_up = 1;
+}
+
+static void start_secondary_cpu(void)
+{
+ struct mono_time t1, t2;
+ const long timeout_us = 20 * USECS_PER_MSEC;
+
+ timer_monotonic_get(&t1);
+ start_cpu(1, prepare_secondary_cpu_startup());
+ /* Wait for the other core to come up. */
+ while (1) {
+ long waited_us;
+
+ timer_monotonic_get(&t2);
+ waited_us = mono_time_diff_microseconds(&t1, &t2);
+
+ if (secondary_cpu_up) {
+ printk(BIOS_INFO, "Secondary CPU start took %ld us.\n",
+ waited_us);
+ break;
+ }
+ if (waited_us > timeout_us) {
+ printk(BIOS_WARNING, "CPU startup timeout!\n");
+ break;
+ }
+ }
+}
+
static void soc_init(device_t dev)
{
+ struct soc_nvidia_tegra132_config *config = dev->chip_info;
+
printk(BIOS_INFO, "CPU: Tegra132\n");
clock_init_arm_generic_timer();
gic_init();
+
+ if (config->bring_up_secondary_cpu)
+ start_secondary_cpu();
}
static void soc_noop(device_t dev)
More information about the coreboot-gerrit
mailing list