mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	Update bmips cleanup patches with upstream submission and backport a few bmips fixes. Signed-off-by: Jonas Gorski <jogo@openwrt.org> SVN-Revision: 39267
		
			
				
	
	
		
			59 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From ff5fadaff39180dc0b652753b5614a564711be29 Mon Sep 17 00:00:00 2001
 | 
						|
From: Florian Fainelli <florian@openwrt.org>
 | 
						|
Date: Wed, 24 Jul 2013 17:12:11 +0100
 | 
						|
Subject: [PATCH] MIPS: BMIPS: fix slave CPU booting when physical CPU is not 0
 | 
						|
 | 
						|
The current BMIPS SMP code assumes that the slave CPU is physical and
 | 
						|
logical CPU 1, but on some systems such as BCM3368, the slave CPU is
 | 
						|
physical CPU0. Fix the code to read the physical CPU (thread ID) we are
 | 
						|
running this code on, and adjust the relocation vector address based on
 | 
						|
it. This allows bringing up the second CPU on BCM3368 for instance.
 | 
						|
 | 
						|
Signed-off-by: Florian Fainelli <florian@openwrt.org>
 | 
						|
Cc: linux-mips@linux-mips.org
 | 
						|
Cc: cernekee@gmail.com
 | 
						|
Cc: jogo@openwrt.org
 | 
						|
Cc: blogic@openwrt.org
 | 
						|
Patchwork: https://patchwork.linux-mips.org/patch/5621/
 | 
						|
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
 | 
						|
---
 | 
						|
 arch/mips/kernel/bmips_vec.S |  6 +++++-
 | 
						|
 arch/mips/kernel/smp-bmips.c | 10 ++++++++--
 | 
						|
 2 files changed, 13 insertions(+), 3 deletions(-)
 | 
						|
 | 
						|
--- a/arch/mips/kernel/bmips_vec.S
 | 
						|
+++ b/arch/mips/kernel/bmips_vec.S
 | 
						|
@@ -56,7 +56,11 @@ LEAF(bmips_smp_movevec)
 | 
						|
 	/* set up CPU1 CBR; move BASE to 0xa000_0000 */
 | 
						|
 	li	k0, 0xff400000
 | 
						|
 	mtc0	k0, $22, 6
 | 
						|
-	li	k1, CKSEG1 | BMIPS_RELO_VECTOR_CONTROL_1
 | 
						|
+	/* set up relocation vector address based on thread ID */
 | 
						|
+	mfc0	k1, $22, 3
 | 
						|
+	srl	k1, 16
 | 
						|
+	andi	k1, 0x8000
 | 
						|
+	or	k1, CKSEG1 | BMIPS_RELO_VECTOR_CONTROL_0
 | 
						|
 	or	k0, k1
 | 
						|
 	li	k1, 0xa0080000
 | 
						|
 	sw	k1, 0(k0)
 | 
						|
--- a/arch/mips/kernel/smp-bmips.c
 | 
						|
+++ b/arch/mips/kernel/smp-bmips.c
 | 
						|
@@ -196,9 +196,15 @@ static void bmips_init_secondary(void)
 | 
						|
 #if defined(CONFIG_CPU_BMIPS4350) || defined(CONFIG_CPU_BMIPS4380)
 | 
						|
 	void __iomem *cbr = BMIPS_GET_CBR();
 | 
						|
 	unsigned long old_vec;
 | 
						|
+	unsigned long relo_vector;
 | 
						|
+	int boot_cpu;
 | 
						|
 
 | 
						|
-	old_vec = __raw_readl(cbr + BMIPS_RELO_VECTOR_CONTROL_1);
 | 
						|
-	__raw_writel(old_vec & ~0x20000000, cbr + BMIPS_RELO_VECTOR_CONTROL_1);
 | 
						|
+	boot_cpu = !!(read_c0_brcm_cmt_local() & (1 << 31));
 | 
						|
+	relo_vector = boot_cpu ? BMIPS_RELO_VECTOR_CONTROL_0 :
 | 
						|
+			  BMIPS_RELO_VECTOR_CONTROL_1;
 | 
						|
+
 | 
						|
+	old_vec = __raw_readl(cbr + relo_vector);
 | 
						|
+	__raw_writel(old_vec & ~0x20000000, cbr + relo_vector);
 | 
						|
 
 | 
						|
 	clear_c0_cause(smp_processor_id() ? C_SW1 : C_SW0);
 | 
						|
 #elif defined(CONFIG_CPU_BMIPS5000)
 |