diff mbox series

common/board_f: Make reserve_mmu generic

Message ID 20200328182300.26005-1-ovpanait@gmail.com
State New
Headers show
Series common/board_f: Make reserve_mmu generic | expand

Commit Message

Ovidiu Panait March 28, 2020, 6:23 p.m. UTC
Introduce arch_reserve_mmu to allow for architecture-specific reserve_mmu
routines.

For ARM, move the reserve_mmu definition from common/board_f.c to
arch/arm/lib/cache.c. Define arm_reserve_mmu and make it a weak define to allow
machines to override it (in mach-versal/cpu.c and mach-zynqmp/cpu.c).

Signed-off-by: Ovidiu Panait <ovpanait at gmail.com>
---
 arch/arm/include/asm/cache.h |  2 ++
 arch/arm/lib/cache.c         | 33 +++++++++++++++++++++++++++++++++
 arch/arm/mach-versal/cpu.c   |  6 +++++-
 arch/arm/mach-zynqmp/cpu.c   |  6 +++++-
 common/board_f.c             | 32 ++++++--------------------------
 include/init.h               |  2 +-
 6 files changed, 52 insertions(+), 29 deletions(-)

Comments

Simon Glass March 29, 2020, 2:13 a.m. UTC | #1
Hi,

On Sat, 28 Mar 2020 at 12:25, Ovidiu Panait <ovpanait at gmail.com> wrote:
>
> Introduce arch_reserve_mmu to allow for architecture-specific reserve_mmu
> routines.
>
> For ARM, move the reserve_mmu definition from common/board_f.c to
> arch/arm/lib/cache.c.

Can you please do that bit in an initial patch before this one?

> Define arm_reserve_mmu and make it a weak define to allow
> machines to override it (in mach-versal/cpu.c and mach-zynqmp/cpu.c).
>
> Signed-off-by: Ovidiu Panait <ovpanait at gmail.com>
> ---
>  arch/arm/include/asm/cache.h |  2 ++
>  arch/arm/lib/cache.c         | 33 +++++++++++++++++++++++++++++++++
>  arch/arm/mach-versal/cpu.c   |  6 +++++-
>  arch/arm/mach-zynqmp/cpu.c   |  6 +++++-
>  common/board_f.c             | 32 ++++++--------------------------
>  include/init.h               |  2 +-
>  6 files changed, 52 insertions(+), 29 deletions(-)

Can you please try to use if() instead of #if as much as possible?

>
> diff --git a/arch/arm/include/asm/cache.h b/arch/arm/include/asm/cache.h
> index 950ec1e793..dbb9c554ae 100644
> --- a/arch/arm/include/asm/cache.h
> +++ b/arch/arm/include/asm/cache.h
> @@ -49,4 +49,6 @@ void dram_bank_mmu_setup(int bank);
>   */
>  #define ARCH_DMA_MINALIGN      CONFIG_SYS_CACHELINE_SIZE
>
> +int arm_reserve_mmu(void);

Function comment

> +
>  #endif /* _ASM_CACHE_H */
> diff --git a/arch/arm/lib/cache.c b/arch/arm/lib/cache.c
> index 007d4ebc49..76c10a577b 100644
> --- a/arch/arm/lib/cache.c
> +++ b/arch/arm/lib/cache.c
> @@ -10,6 +10,8 @@
>  #include <cpu_func.h>
>  #include <malloc.h>
>
> +DECLARE_GLOBAL_DATA_PTR;
> +
>  /*
>   * Flush range from all levels of d-cache/unified-cache.
>   * Affects the range [start, start + size - 1].
> @@ -118,3 +120,34 @@ void invalidate_l2_cache(void)
>         isb();
>  }
>  #endif
> +
> +int arch_reserve_mmu(void)
> +{
> +       return arm_reserve_mmu();
> +}
> +
> +__weak int arm_reserve_mmu(void)
> +{
> +#if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
> +       /* reserve TLB table */
> +       gd->arch.tlb_size = PGTABLE_SIZE;
> +       gd->relocaddr -= gd->arch.tlb_size;
> +
> +       /* round down to next 64 kB limit */
> +       gd->relocaddr &= ~(0x10000 - 1);
> +
> +       gd->arch.tlb_addr = gd->relocaddr;
> +       debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr,
> +             gd->arch.tlb_addr + gd->arch.tlb_size);
> +
> +#ifdef CONFIG_SYS_MEM_RESERVE_SECURE
> +       /*
> +        * Record allocated tlb_addr in case gd->tlb_addr to be overwritten
> +        * with location within secure ram.
> +        */
> +       gd->arch.tlb_allocated = gd->arch.tlb_addr;
> +#endif
> +#endif
> +
> +       return 0;
> +}
> diff --git a/arch/arm/mach-versal/cpu.c b/arch/arm/mach-versal/cpu.c
> index 6ee6cd43ec..6c5da8b29e 100644
> --- a/arch/arm/mach-versal/cpu.c
> +++ b/arch/arm/mach-versal/cpu.c
> @@ -10,6 +10,10 @@
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/sys_proto.h>
>
> +#if defined(CONFIG_SYS_MEM_RSVD_FOR_MMU)

Can you drop that #if?

> +#include <asm/cache.h>
> +#endif
> +
>  DECLARE_GLOBAL_DATA_PTR;
>
>  #define VERSAL_MEM_MAP_USED    5
> @@ -98,7 +102,7 @@ u64 get_page_table_size(void)
>  }
>
>  #if defined(CONFIG_SYS_MEM_RSVD_FOR_MMU)
> -int reserve_mmu(void)
> +int arm_reserve_mmu(void)
>  {
>         tcm_init(TCM_LOCK);
>         gd->arch.tlb_size = PGTABLE_SIZE;
> diff --git a/arch/arm/mach-zynqmp/cpu.c b/arch/arm/mach-zynqmp/cpu.c
> index 442427bc11..363a20b621 100644
> --- a/arch/arm/mach-zynqmp/cpu.c
> +++ b/arch/arm/mach-zynqmp/cpu.c
> @@ -12,6 +12,10 @@
>  #include <asm/io.h>
>  #include <zynqmp_firmware.h>
>
> +#ifdef CONFIG_SYS_MEM_RSVD_FOR_MMU

Can you drop this #ifdef?

> +#include <asm/cache.h>
> +#endif
> +
>  #define ZYNQ_SILICON_VER_MASK  0xF000
>  #define ZYNQ_SILICON_VER_SHIFT 12
>
> @@ -116,7 +120,7 @@ void tcm_init(u8 mode)
>  #endif
>
>  #ifdef CONFIG_SYS_MEM_RSVD_FOR_MMU
> -int reserve_mmu(void)
> +int arm_reserve_mmu(void)
>  {
>         tcm_init(TCM_LOCK);
>         gd->arch.tlb_size = PGTABLE_SIZE;
> diff --git a/common/board_f.c b/common/board_f.c
> index 82a164752a..2ab23cf239 100644
> --- a/common/board_f.c
> +++ b/common/board_f.c
> @@ -385,33 +385,15 @@ static int reserve_round_4k(void)
>         return 0;
>  }
>
> -#ifdef CONFIG_ARM
> -__weak int reserve_mmu(void)
> +__weak int arch_reserve_mmu(void)
>  {
> -#if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
> -       /* reserve TLB table */
> -       gd->arch.tlb_size = PGTABLE_SIZE;
> -       gd->relocaddr -= gd->arch.tlb_size;
> -
> -       /* round down to next 64 kB limit */
> -       gd->relocaddr &= ~(0x10000 - 1);
> -
> -       gd->arch.tlb_addr = gd->relocaddr;
> -       debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr,
> -             gd->arch.tlb_addr + gd->arch.tlb_size);
> -
> -#ifdef CONFIG_SYS_MEM_RESERVE_SECURE
> -       /*
> -        * Record allocated tlb_addr in case gd->tlb_addr to be overwritten
> -        * with location within secure ram.
> -        */
> -       gd->arch.tlb_allocated = gd->arch.tlb_addr;
> -#endif
> -#endif
> -
>         return 0;
>  }
> -#endif
> +
> +static int reserve_mmu(void)
> +{
> +       return arch_reserve_mmu();
> +}

Then can we just put arch_reserve_mmu() in the thing below and drop
this fnuction?

>
>  static int reserve_video(void)
>  {
> @@ -970,9 +952,7 @@ static const init_fnc_t init_sequence_f[] = {
>         reserve_pram,
>  #endif
>         reserve_round_4k,
> -#ifdef CONFIG_ARM
>         reserve_mmu,
> -#endif
>         reserve_video,
>         reserve_trace,
>         reserve_uboot,
> diff --git a/include/init.h b/include/init.h
> index 2a33a3fd1e..5700dc7ecb 100644
> --- a/include/init.h
> +++ b/include/init.h
> @@ -145,7 +145,7 @@ int init_cache_f_r(void);
>  int print_cpuinfo(void);
>  #endif
>  int timer_init(void);
> -int reserve_mmu(void);
> +int arch_reserve_mmu(void);

function comment

>  int misc_init_f(void);
>
>  #if defined(CONFIG_DTB_RESELECT)
> --
> 2.17.1
>

Regards,
Simon
diff mbox series

Patch

diff --git a/arch/arm/include/asm/cache.h b/arch/arm/include/asm/cache.h
index 950ec1e793..dbb9c554ae 100644
--- a/arch/arm/include/asm/cache.h
+++ b/arch/arm/include/asm/cache.h
@@ -49,4 +49,6 @@  void dram_bank_mmu_setup(int bank);
  */
 #define ARCH_DMA_MINALIGN	CONFIG_SYS_CACHELINE_SIZE
 
+int arm_reserve_mmu(void);
+
 #endif /* _ASM_CACHE_H */
diff --git a/arch/arm/lib/cache.c b/arch/arm/lib/cache.c
index 007d4ebc49..76c10a577b 100644
--- a/arch/arm/lib/cache.c
+++ b/arch/arm/lib/cache.c
@@ -10,6 +10,8 @@ 
 #include <cpu_func.h>
 #include <malloc.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 /*
  * Flush range from all levels of d-cache/unified-cache.
  * Affects the range [start, start + size - 1].
@@ -118,3 +120,34 @@  void invalidate_l2_cache(void)
 	isb();
 }
 #endif
+
+int arch_reserve_mmu(void)
+{
+	return arm_reserve_mmu();
+}
+
+__weak int arm_reserve_mmu(void)
+{
+#if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
+       /* reserve TLB table */
+       gd->arch.tlb_size = PGTABLE_SIZE;
+       gd->relocaddr -= gd->arch.tlb_size;
+
+       /* round down to next 64 kB limit */
+       gd->relocaddr &= ~(0x10000 - 1);
+
+       gd->arch.tlb_addr = gd->relocaddr;
+       debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr,
+             gd->arch.tlb_addr + gd->arch.tlb_size);
+
+#ifdef CONFIG_SYS_MEM_RESERVE_SECURE
+       /*
+        * Record allocated tlb_addr in case gd->tlb_addr to be overwritten
+        * with location within secure ram.
+        */
+       gd->arch.tlb_allocated = gd->arch.tlb_addr;
+#endif
+#endif
+
+       return 0;
+}
diff --git a/arch/arm/mach-versal/cpu.c b/arch/arm/mach-versal/cpu.c
index 6ee6cd43ec..6c5da8b29e 100644
--- a/arch/arm/mach-versal/cpu.c
+++ b/arch/arm/mach-versal/cpu.c
@@ -10,6 +10,10 @@ 
 #include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
 
+#if defined(CONFIG_SYS_MEM_RSVD_FOR_MMU)
+#include <asm/cache.h>
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 #define VERSAL_MEM_MAP_USED	5
@@ -98,7 +102,7 @@  u64 get_page_table_size(void)
 }
 
 #if defined(CONFIG_SYS_MEM_RSVD_FOR_MMU)
-int reserve_mmu(void)
+int arm_reserve_mmu(void)
 {
 	tcm_init(TCM_LOCK);
 	gd->arch.tlb_size = PGTABLE_SIZE;
diff --git a/arch/arm/mach-zynqmp/cpu.c b/arch/arm/mach-zynqmp/cpu.c
index 442427bc11..363a20b621 100644
--- a/arch/arm/mach-zynqmp/cpu.c
+++ b/arch/arm/mach-zynqmp/cpu.c
@@ -12,6 +12,10 @@ 
 #include <asm/io.h>
 #include <zynqmp_firmware.h>
 
+#ifdef CONFIG_SYS_MEM_RSVD_FOR_MMU
+#include <asm/cache.h>
+#endif
+
 #define ZYNQ_SILICON_VER_MASK	0xF000
 #define ZYNQ_SILICON_VER_SHIFT	12
 
@@ -116,7 +120,7 @@  void tcm_init(u8 mode)
 #endif
 
 #ifdef CONFIG_SYS_MEM_RSVD_FOR_MMU
-int reserve_mmu(void)
+int arm_reserve_mmu(void)
 {
 	tcm_init(TCM_LOCK);
 	gd->arch.tlb_size = PGTABLE_SIZE;
diff --git a/common/board_f.c b/common/board_f.c
index 82a164752a..2ab23cf239 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -385,33 +385,15 @@  static int reserve_round_4k(void)
 	return 0;
 }
 
-#ifdef CONFIG_ARM
-__weak int reserve_mmu(void)
+__weak int arch_reserve_mmu(void)
 {
-#if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
-	/* reserve TLB table */
-	gd->arch.tlb_size = PGTABLE_SIZE;
-	gd->relocaddr -= gd->arch.tlb_size;
-
-	/* round down to next 64 kB limit */
-	gd->relocaddr &= ~(0x10000 - 1);
-
-	gd->arch.tlb_addr = gd->relocaddr;
-	debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr,
-	      gd->arch.tlb_addr + gd->arch.tlb_size);
-
-#ifdef CONFIG_SYS_MEM_RESERVE_SECURE
-	/*
-	 * Record allocated tlb_addr in case gd->tlb_addr to be overwritten
-	 * with location within secure ram.
-	 */
-	gd->arch.tlb_allocated = gd->arch.tlb_addr;
-#endif
-#endif
-
 	return 0;
 }
-#endif
+
+static int reserve_mmu(void)
+{
+	return arch_reserve_mmu();
+}
 
 static int reserve_video(void)
 {
@@ -970,9 +952,7 @@  static const init_fnc_t init_sequence_f[] = {
 	reserve_pram,
 #endif
 	reserve_round_4k,
-#ifdef CONFIG_ARM
 	reserve_mmu,
-#endif
 	reserve_video,
 	reserve_trace,
 	reserve_uboot,
diff --git a/include/init.h b/include/init.h
index 2a33a3fd1e..5700dc7ecb 100644
--- a/include/init.h
+++ b/include/init.h
@@ -145,7 +145,7 @@  int init_cache_f_r(void);
 int print_cpuinfo(void);
 #endif
 int timer_init(void);
-int reserve_mmu(void);
+int arch_reserve_mmu(void);
 int misc_init_f(void);
 
 #if defined(CONFIG_DTB_RESELECT)