28d641be43
Previous version was based on code from kernel 2.6.22 with Broadcom two trivial modifications. This updates the copy to the version from current kernel and refreshes the patch. This was tested for regressions on Netgear R6250 (BCM4708A0), D-Link DIR-885L (BCM4709C0) and Tenda AC9 (BCM47189B0). Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
101 lines
2.9 KiB
Diff
101 lines
2.9 KiB
Diff
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
|
Date: Wed, 24 Sep 2014 22:14:07 +0200
|
|
Subject: [PATCH] ARM: BCM5301X: Disable MMU and Dcache during decompression
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Broadcom devices have broken CFE (bootloader) that leaves hardware in an
|
|
invalid state. It causes problems with booting Linux. On Northstar
|
|
devices kernel was randomly hanging in ~25% of tries during early init.
|
|
Hangs used to happen at random places in the start_kernel. On BCM53573
|
|
kernel doesn't even seem to start booting.
|
|
|
|
To workaround this problem we need to do following very early:
|
|
1) Clear 2 following bits in the SCTLR register:
|
|
#define CR_M (1 << 0) /* MMU enable */
|
|
#define CR_C (1 << 2) /* Dcache enable */
|
|
2) Flush the whole D-cache
|
|
3) Disable L2 cache
|
|
|
|
Unfortunately this patch is not upstreamable as it does above things
|
|
unconditionally. We can't check if we are running on Broadcom platform
|
|
in any safe way and doing such hacks with ARCH_MULTI_V7 is unacceptable
|
|
as it could break other devices support.
|
|
|
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
|
---
|
|
|
|
--- a/arch/arm/boot/compressed/Makefile
|
|
+++ b/arch/arm/boot/compressed/Makefile
|
|
@@ -31,6 +31,11 @@ ifeq ($(CONFIG_ARCH_ACORN),y)
|
|
OBJS += ll_char_wr.o font.o
|
|
endif
|
|
|
|
+ifeq ($(CONFIG_ARCH_BCM_5301X),y)
|
|
+OBJS += head-bcm_5301x-mpcore.o
|
|
+OBJS += cache-v7-min.o
|
|
+endif
|
|
+
|
|
ifeq ($(CONFIG_ARCH_SA1100),y)
|
|
OBJS += head-sa1100.o
|
|
endif
|
|
--- /dev/null
|
|
+++ b/arch/arm/boot/compressed/head-bcm_5301x-mpcore.S
|
|
@@ -0,0 +1,37 @@
|
|
+/*
|
|
+ *
|
|
+ * Platform specific tweaks. This is merged into head.S by the linker.
|
|
+ *
|
|
+ */
|
|
+
|
|
+#include <linux/linkage.h>
|
|
+#include <asm/assembler.h>
|
|
+#include <asm/cp15.h>
|
|
+
|
|
+ .section ".start", "ax"
|
|
+
|
|
+/*
|
|
+ * This code section is spliced into the head code by the linker
|
|
+ */
|
|
+
|
|
+__plat_uncompress_start:
|
|
+
|
|
+ @ Preserve r8/r7 i.e. kernel entry values
|
|
+ mov r12, r8
|
|
+
|
|
+ @ Clear MMU enable and Dcache enable bits
|
|
+ mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR
|
|
+ bic r0, #CR_C|CR_M
|
|
+ mcr p15, 0, r0, c1, c0, 0 @ Write SCTLR
|
|
+ nop
|
|
+
|
|
+ @ Call the cache invalidation routine
|
|
+ bl v7_flush_dcache_all
|
|
+ nop
|
|
+ mov r0,#0
|
|
+ ldr r3, =0x19022000 @ L2 cache controller, control reg
|
|
+ str r0, [r3, #0x100] @ Disable L2 cache
|
|
+ nop
|
|
+
|
|
+ @ Restore
|
|
+ mov r8, r12
|
|
--- a/arch/arm/boot/compressed/cache-v7-min.S
|
|
+++ b/arch/arm/boot/compressed/cache-v7-min.S
|
|
@@ -12,6 +12,7 @@
|
|
|
|
#include <linux/linkage.h>
|
|
#include <linux/init.h>
|
|
+#include <asm/assembler.h>
|
|
|
|
__INIT
|
|
|
|
@@ -63,7 +64,7 @@ loop2:
|
|
ARM( orr r11, r11, r9, lsl r2 ) @ factor index number into r11
|
|
THUMB( lsl r6, r9, r2 )
|
|
THUMB( orr r11, r11, r6 ) @ factor index number into r11
|
|
- mcr p15, 0, r11, c7, c14, 2 @ clean & invalidate by set/way
|
|
+ mcr p15, 0, r11, c7, c6, 2 @ clean & invalidate by set/way
|
|
subs r9, r9, #1 @ decrement the index
|
|
bge loop2
|
|
subs r4, r4, #1 @ decrement the way
|