On 10/21/2016 03:28 AM, Wenbin song wrote:
> The LS1043A rev1.1 silicon supports two types of GIC offset: 4K alignment
> and 64K alignment. The bit SCFG_GIC400_ALIGN[GIC_ADDR_BIT] is used to choose
> which offset will be used.
>
> If GIC_ADDR_BIT bit is set, 4K alignment is used, or else 64K alignment is 
> used.
> 64K alignment is the default setting.
>
> Overriding the weekly smp_kick_all_cpus, the new impletment is able to detect
> GIC offset.
>
> Signed-off-by: Wenbin Song <wenbin.s...@nxp.com>
> Signed-off-by: Mingkai Hu <mingkai...@nxp.com>
> ---
> Changes in v3:
>       Add description about smp_kick_all_cpus on commit message.
>       Rename the macros on commit message to match with them used in the 
> change.
>       Replace CONFIG_LS1043A with HAS_FEATURE_GIC4K_ALIGN.                    
> Changes in v2:
>       None
> ---
>  arch/arm/cpu/armv8/fsl-layerscape/Kconfig         |  4 ++
>  arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S      | 47 
> +++++++++++++++++++++++
>  arch/arm/include/asm/arch-fsl-layerscape/config.h | 12 +++++-
>  3 files changed, 61 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Kconfig 
> b/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> index 94ec8d5..c66c497 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> @@ -12,6 +12,7 @@ config ARCH_LS1043A
>       select SYS_FSL_DDR_VER_50
>       select SYS_FSL_ERRATUM_A010315
>       select SYS_FSL_ERRATUM_A010539
> +     select HAS_FEATURE_GIC4K_ALIGN
>
>  config ARCH_LS1046A
>       bool
> @@ -135,4 +136,7 @@ config SYS_FSL_DDR4
>       help
>         Enable Freescale DDR4 controller.
>
> +config HAS_FEATURE_GIC4K_ALIGN
> +       bool
> +
>  endmenu
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S 
> b/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
> index 5d0b7a4..f0da559 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_HAS_FEATURE_GIC4K_ALIGN
> +
> +/* fixup GIC offset */
> +ENTRY(fix_gic_offset)

Nitpick. It would be easier to understand if you have some comments to 
show the input and output of such function.

> +     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_HAS_FEATURE_GIC4K_ALIGN
> +     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_HAS_FEATURE_GIC4K_ALIGN
> +     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_HAS_FEATURE_GIC4K_ALIGN
> +     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
>

Reviewed-by: York Sun <york....@nxp.com>
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to