aboutsummaryrefslogtreecommitdiff
path: root/src/arch/arm64/cpu.c
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2015-10-15 12:15:31 -0700
committerJulius Werner <jwerner@chromium.org>2015-11-07 03:29:14 +0100
commitb3f6ad35221984419ee0998f47b778d669d1636e (patch)
tree306fc113435cb78c63d2950db33af8f577754d51 /src/arch/arm64/cpu.c
parent1148786c05d97b4c646c11e770b275809b562953 (diff)
arm64: Remove SMP support
As ARM Trusted Firmware is the only first class citizen for booting arm64 multi-processor in coreboot remove SMP support. If SoCs want to bring up MP then ATF needs to be ported and integrated. Change-Id: Ife24d53eed9b7a5a5d8c69a64d7a20a55a4163db Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: http://review.coreboot.org/11909 Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'src/arch/arm64/cpu.c')
-rw-r--r--src/arch/arm64/cpu.c224
1 files changed, 0 insertions, 224 deletions
diff --git a/src/arch/arm64/cpu.c b/src/arch/arm64/cpu.c
deleted file mode 100644
index 1501181364..0000000000
--- a/src/arch/arm64/cpu.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright 2013 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
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <arch/lib_helpers.h>
-#include <cpu/cpu.h>
-#include <console/console.h>
-#include <smp/node.h>
-#include "cpu-internal.h"
-
-struct cpu_info cpu_infos[CONFIG_MAX_CPUS];
-struct cpu_info *bsp_cpu_info;
-
-struct cpu_info *cpu_info(void)
-{
- return cpu_info_for_cpu(smp_processor_id());
-}
-
-size_t cpus_online(void)
-{
- int i;
- size_t num = 0;
-
- for (i = 0; i < ARRAY_SIZE(cpu_infos); i++) {
- if (cpu_online(cpu_info_for_cpu(i)))
- num++;
- }
-
- return num;
-}
-
-static inline int action_queue_empty(struct cpu_action_queue *q)
-{
- return load_acquire_exclusive(&q->todo) == NULL;
-}
-
-static inline int action_completed(struct cpu_action_queue *q,
- struct cpu_action *action)
-{
- return load_acquire(&q->completed) == action;
-}
-
-static inline void wait_for_action_queue_slot(struct cpu_action_queue *q)
-{
- while (!action_queue_empty(q))
- wfe();
-}
-
-static void wait_for_action_complete(struct cpu_action_queue *q,
- struct cpu_action *a)
-{
- while (!action_completed(q, a))
- wfe();
-}
-
-static struct cpu_action *wait_for_action(struct cpu_action_queue *q,
- struct cpu_action *local)
-{
- struct cpu_action *action;
-
- while (action_queue_empty(q))
- wfe();
-
- /*
- * Keep original address, but use a local copy for async processing.
- */
- do {
- action = load_acquire_exclusive(&q->todo);
- *local = *action;
- } while (!store_release_exclusive(&q->todo, NULL));
-
- return action;
-}
-
-static void queue_action(struct cpu_action_queue *q, struct cpu_action *action)
-{
- do {
- wait_for_action_queue_slot(q);
- if (load_acquire_exclusive(&q->todo) != NULL)
- continue;
- } while (!store_release_exclusive(&q->todo, action));
-}
-
-static void action_queue_complete(struct cpu_action_queue *q,
- struct cpu_action *action)
-{
- /* Mark completion and send events to waiters. */
- store_release(&q->completed, action);
- sev();
-}
-
-static void action_run(struct cpu_action *action)
-{
- action->run(action->arg);
-}
-
-static void action_run_on_cpu(struct cpu_info *ci, struct cpu_action *action,
- int sync)
-{
- struct cpu_action_queue *q = &ci->action_queue;
-
- /* Don't run actions on non-online cpus. */
- if (!cpu_online(ci))
- return;
-
- if (ci->id == smp_processor_id()) {
- action->run(action->arg);
- return;
- }
-
- queue_action(q, action);
- /* Wait for CPU to pick it up. Empty slot means it was picked up. */
- wait_for_action_queue_slot(q);
- /* Wait for completion if requested. */
- if (sync)
- wait_for_action_complete(q, action);
-}
-
-static int __arch_run_on_cpu(unsigned int cpu, struct cpu_action *action,
- int sync)
-{
- struct cpu_info *ci;
-
- if (cpu >= CONFIG_MAX_CPUS)
- return -1;
-
- ci = cpu_info_for_cpu(cpu);
-
- action_run_on_cpu(ci, action, sync);
-
- return 0;
-}
-
-int arch_run_on_cpu(unsigned int cpu, struct cpu_action *action)
-{
- return __arch_run_on_cpu(cpu, action, 1);
-}
-
-int arch_run_on_cpu_async(unsigned int cpu, struct cpu_action *action)
-{
- return __arch_run_on_cpu(cpu, action, 0);
-}
-
-static int __arch_run_on_all_cpus(struct cpu_action *action, int sync)
-{
- int i;
-
- for (i = 0; i < CONFIG_MAX_CPUS; i++)
- action_run_on_cpu(cpu_info_for_cpu(i), action, sync);
-
- return 0;
-}
-
-static int __arch_run_on_all_cpus_but_self(struct cpu_action *action, int sync)
-{
- int i;
- struct cpu_info *me = cpu_info();
-
- for (i = 0; i < CONFIG_MAX_CPUS; i++) {
- struct cpu_info *ci = cpu_info_for_cpu(i);
- if (ci == me)
- continue;
- action_run_on_cpu(ci, action, sync);
- }
-
- return 0;
-}
-
-int arch_run_on_all_cpus(struct cpu_action *action)
-{
- return __arch_run_on_all_cpus(action, 1);
-}
-
-int arch_run_on_all_cpus_async(struct cpu_action *action)
-{
- return __arch_run_on_all_cpus(action, 0);
-}
-
-int arch_run_on_all_cpus_but_self(struct cpu_action *action)
-{
- return __arch_run_on_all_cpus_but_self(action, 1);
-}
-
-int arch_run_on_all_cpus_but_self_async(struct cpu_action *action)
-{
- return __arch_run_on_all_cpus_but_self(action, 0);
-}
-
-
-void arch_cpu_wait_for_action(void)
-{
- struct cpu_info *ci = cpu_info();
- struct cpu_action_queue *q = &ci->action_queue;
-
- while (1) {
- struct cpu_action *orig;
- struct cpu_action action;
-
- orig = wait_for_action(q, &action);
-
- action_run(&action);
- action_queue_complete(q, orig);
- }
-}
-
-#if IS_ENABLED(CONFIG_SMP)
-int boot_cpu(void)
-{
- return cpu_is_bsp();
-}
-#endif