Commit 73053d973dd6f56472309cffa5a5d15a62dd6f96

Authored by Rob Herring
Committed by Olof Johansson
1 parent 71bd98aff0

ARM: highbank: fix cache flush ordering for cpu hotplug

The L1 data cache flush needs to be after highbank_set_cpu_jump call which
pollutes the cache with the l2x0_lock. This causes other cores to deadlock
waiting for the l2x0_lock. Moving the flush of the entire data cache after
highbank_set_cpu_jump fixes the problem. Use flush_cache_louis instead of
flush_cache_all are that is sufficient to flush only the L1 data cache.
flush_cache_louis did not exist when highbank_cpu_die was originally
written.

With PL310 errata 769419 enabled, a wmb is inserted into idle which takes
the l2x0_lock. This makes the problem much more easily hit and causes
reset to hang.

Reported-by: Paolo Pisati <p.pisati@gmail.com>
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: Olof Johansson <olof@lixom.net>

Showing 1 changed file with 4 additions and 6 deletions Inline Diff

arch/arm/mach-highbank/hotplug.c
1 /* 1 /*
2 * Copyright 2011 Calxeda, Inc. 2 * Copyright 2011 Calxeda, Inc.
3 * 3 *
4 * This program is free software; you can redistribute it and/or modify it 4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License, 5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation. 6 * version 2, as published by the Free Software Foundation.
7 * 7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT 8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details. 11 * more details.
12 * 12 *
13 * You should have received a copy of the GNU General Public License along with 13 * You should have received a copy of the GNU General Public License along with
14 * this program. If not, see <http://www.gnu.org/licenses/>. 14 * this program. If not, see <http://www.gnu.org/licenses/>.
15 */ 15 */
16 #include <linux/kernel.h> 16 #include <linux/kernel.h>
17 17
18 #include <asm/cacheflush.h> 18 #include <asm/cacheflush.h>
19 19
20 #include "core.h" 20 #include "core.h"
21 #include "sysregs.h" 21 #include "sysregs.h"
22 22
23 extern void secondary_startup(void); 23 extern void secondary_startup(void);
24 24
25 /* 25 /*
26 * platform-specific code to shutdown a CPU 26 * platform-specific code to shutdown a CPU
27 * 27 *
28 */ 28 */
29 void __ref highbank_cpu_die(unsigned int cpu) 29 void __ref highbank_cpu_die(unsigned int cpu)
30 { 30 {
31 flush_cache_all();
32
33 highbank_set_cpu_jump(cpu, phys_to_virt(0)); 31 highbank_set_cpu_jump(cpu, phys_to_virt(0));
32
33 flush_cache_louis();
34 highbank_set_core_pwr(); 34 highbank_set_core_pwr();
35 35
36 cpu_do_idle(); 36 while (1)
37 37 cpu_do_idle();
38 /* We should never return from idle */
39 panic("highbank: cpu %d unexpectedly exit from shutdown\n", cpu);