[U-Boot] [PATCH 1/3] armv8/ls1043a: fixup GIC offset according to SVR and GIC400_ADDR_ALIGN_64K[GIC_ADDR]
Wenbin song
wenbin.song at nxp.com
Thu Oct 20 07:40:05 CEST 2016
The LS1043A rev1.1 silicon supports two types of GIC offset: 4K alignment
and 64K alignment. The bit GIC400_ADDR_ALIGN_64K[GIC_ADDR] is used to choose
which offset will be used.
If GIC_ADDR bit is set, 4K alignment is used, or else 64K alignment is used.
64K alignment is the default setting.
Signed-off-by: Wenbin Song <wenbin.song at nxp.com>
Signed-off-by: Mingkai Hu <mingkai.hu at nxp.com>
---
arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S | 47 +++++++++++++++++++++++
arch/arm/include/asm/arch-fsl-layerscape/config.h | 12 +++++-
2 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S b/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
index 5d0b7a4..569d2c2 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
+++ b/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
@@ -14,6 +14,40 @@
#include <asm/arch/mp.h>
#endif
+#ifdef CONFIG_LS1043A
+
+/* fixup GIC offset */
+ENTRY(fix_gic_offset)
+ ldr x0, =GICD_BASE
+ ldr x1, =GICC_BASE
+ ldr x3, =DCFG_CCSR_SVR
+ ldr w3, [x3]
+ rev w3, w3
+ ands w3, w3, #0xff
+ cmp w3, #REV1_0
+ b.eq 1f
+ ldr x3, =SCFG_GIC400_ALIGN
+ ldr w3, [x3]
+ rev w3, w3
+ tbnz w3, #GIC_ADDR_BIT, 1f
+ ret
+1:
+ ldr x0, =GICD_BASE_4K
+ ldr x1, =GICC_BASE_4K
+ ret
+ENDPROC(fix_gic_offset)
+
+ENTRY(smp_kick_all_cpus)
+ /* Kick secondary cpus up by SGI 0 interrupt */
+ mov x29, lr /* Save LR */
+ bl fix_gic_offset
+ bl gic_kick_secondary_cpus
+ mov lr, x29 /* Restore LR */
+ ret
+ENDPROC(smp_kick_all_cpus)
+
+#endif
+
ENTRY(lowlevel_init)
mov x29, lr /* Save LR */
@@ -105,15 +139,23 @@ ENTRY(lowlevel_init)
/* Initialize GIC Secure Bank Status */
#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
branch_if_slave x0, 1f
+#ifdef CONFIG_LS1043A
+ bl fix_gic_offset
+#else
ldr x0, =GICD_BASE
+#endif
bl gic_init_secure
1:
#ifdef CONFIG_GICV3
ldr x0, =GICR_BASE
bl gic_init_secure_percpu
#elif defined(CONFIG_GICV2)
+#ifdef CONFIG_LS1043A
+ bl fix_gic_offset
+#else
ldr x0, =GICD_BASE
ldr x1, =GICC_BASE
+#endif
bl gic_init_secure_percpu
#endif
#endif
@@ -335,7 +377,12 @@ ENTRY(secondary_boot_func)
#if defined(CONFIG_GICV3)
gic_wait_for_interrupt_m x0
#elif defined(CONFIG_GICV2)
+#ifdef CONFIG_LS1043A
+ bl fix_gic_offset
+ mov x0, x1
+#else
ldr x0, =GICC_BASE
+#endif
gic_wait_for_interrupt_m x0, w1
#endif
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/config.h b/arch/arm/include/asm/arch-fsl-layerscape/config.h
index 4201e0f..eb6e58d 100644
--- a/arch/arm/include/asm/arch-fsl-layerscape/config.h
+++ b/arch/arm/include/asm/arch-fsl-layerscape/config.h
@@ -172,8 +172,16 @@
#define SMMU_BASE 0x09000000
/* Generic Interrupt Controller Definitions */
-#define GICD_BASE 0x01401000
-#define GICC_BASE 0x01402000
+#define GICD_BASE 0x01410000
+#define GICC_BASE 0x01420000
+#define GICD_BASE_4K 0x01401000
+#define GICC_BASE_4K 0x01402000
+
+#define DCFG_CCSR_SVR 0x1ee00a4
+#define REV1_0 0x10
+#define REV1_1 0x11
+#define GIC_ADDR_BIT 31
+#define SCFG_GIC400_ALIGN 0x1570188
#define CONFIG_SYS_FSL_ERRATUM_A008850
#define CONFIG_SYS_FSL_ERRATUM_A009663
--
2.1.0.27.g96db324
More information about the U-Boot
mailing list