0b3455a71e
With commit 384a290
(ARM: gic: use a private mapping for CPU target
interfaces), wake-up IPIs now go to all cores as the gic cpu interface
numbering may not follow core numbering. This broke secondary boot on
highbank since the boot address was already set for all secondary cores,
this caused all cores to boot before the kernel was ready.
Fix this by moving the setting of the jump address to
highbank_boot_secondary instead of highbank_smp_prepare_cpus and
highbank_cpu_die. Also, clear the address when we boot. This prevents
cores from booting before they are actually triggered and is also necessary
to get suspend/resume to work.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
Signed-off-by: Olof Johansson <olof@lixom.net>
41 lines
1.1 KiB
C
41 lines
1.1 KiB
C
/*
|
|
* Copyright 2011 Calxeda, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include <linux/kernel.h>
|
|
|
|
#include <asm/cacheflush.h>
|
|
|
|
#include "core.h"
|
|
#include "sysregs.h"
|
|
|
|
extern void secondary_startup(void);
|
|
|
|
/*
|
|
* platform-specific code to shutdown a CPU
|
|
*
|
|
*/
|
|
void __ref highbank_cpu_die(unsigned int cpu)
|
|
{
|
|
flush_cache_all();
|
|
|
|
highbank_set_cpu_jump(cpu, phys_to_virt(0));
|
|
highbank_set_core_pwr();
|
|
|
|
cpu_do_idle();
|
|
|
|
/* We should never return from idle */
|
|
panic("highbank: cpu %d unexpectedly exit from shutdown\n", cpu);
|
|
}
|