HACK: ARM: Lock L2 cache early to fix boot failure on golden
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index fd94e27..f642b010 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -48,6 +48,8 @@
OBJS += head-sharpsl.o
endif
+OBJS += head-golden.o
+
ifeq ($(CONFIG_CPU_ENDIAN_BE32),y)
ifeq ($(CONFIG_CPU_CP15),y)
OBJS += big-endian.o
diff --git a/arch/arm/boot/compressed/head-golden.S b/arch/arm/boot/compressed/head-golden.S
new file mode 100644
index 0000000..755425c
--- /dev/null
+++ b/arch/arm/boot/compressed/head-golden.S
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * linux/arch/arm/boot/compressed/head-golden.S
+ *
+ * Golden specific tweaks. This is merged into head.S by the linker.
+ *
+ */
+
+#include <linux/linkage.h>
+
+/* for l2cc enable and clean_invalidate */
+#define L2X0_CTRL 0x100
+#define L2X0_CLEAN_INV_WAY 0x7FC
+#define L2X0_WAY_MASK 0xFFFF
+#define L2X0_DATA_LOCKDOWN_WAY 0x900
+#define L2X0_INST_LOCKDOWN_WAY 0x904
+
+ .section ".start", "ax"
+
+__golden_start:
+
+ @ Preserve r8/r7 i.e. kernel entry values
+
+ ldr r3, .U8500_L2CC_BASE
+
+ @ if ((readl(U8500_L2CC_BASE + L2X0_CTRL) & 1) == 1)
+ ldr r2, [r3, #L2X0_CTRL]
+ tst r2, #1
+ beq 99f
+
+ @ writel(L2X0_WAY_MASK, U8500_L2CC_BASE + L2X0_CLEAN_INV_WAY);
+ mov r2, #L2X0_WAY_MASK
+ str r2, [r3, #L2X0_CLEAN_INV_WAY]
+
+ @ while (readl(U8500_L2CC_BASE + L2X0_CLEAN_INV_WAY)
+ @ & L2X0_WAY_MASK)
+1: ldr r1, [r3, #L2X0_CLEAN_INV_WAY]
+ tst r1, r2
+ bne 1b
+
+ @ writel(L2X0_WAY_MASK, U8500_L2CC_BASE + L2X0_DATA_LOCKDOWN_WAY);
+ str r2, [r3, #L2X0_DATA_LOCKDOWN_WAY]
+ @ writel(L2X0_WAY_MASK, U8500_L2CC_BASE + L2X0_INST_LOCKDOWN_WAY);
+ str r2, [r3, #L2X0_INST_LOCKDOWN_WAY]
+ b 99f
+
+.U8500_L2CC_BASE:
+ .word 0xa0412000
+
+99: