[U-Boot] [PATCH 1/3] ARMv8/layerscape: Add mmu_init API

Zhiqiang Hou zhiqiang.hou at nxp.com
Wed Jan 20 13:05:34 CET 2016


Hi Prabhakar,

Thanks for your feedback!

> -----Original Message-----
> From: Prabhakar Kushwaha
> Sent: 2016年1月19日 21:54
> To: Zhiqiang Hou <Zhiqiang.Hou at freescale.com>; u-boot at lists.denx.de;
> albert.u.boot at aribaud.net; Mingkai.hu at freescale.com; yorksun at freescale.com
> Cc: leoli at freescale.com; prabhakar at freescale.com;
> bhupesh.sharma at freescale.com; sjg at chromium.org; bmeng.cn at gmail.com;
> hs at denx.de; joe.hershberger at ni.com; marex at denx.de; Zhiqiang Hou
> <zhiqiang.hou at nxp.com>; Hou Zhiqiang <B48286 at freescale.com>
> Subject: RE: [PATCH 1/3] ARMv8/layerscape: Add mmu_init API
> 
> > -----Original Message-----
> > From: Zhiqiang Hou [mailto:Zhiqiang.Hou at freescale.com]
> > Sent: Tuesday, January 19, 2016 6:10 PM
> > To: u-boot at lists.denx.de; albert.u.boot at aribaud.net;
> > Mingkai.hu at freescale.com; yorksun at freescale.com
> > Cc: leoli at freescale.com; prabhakar at freescale.com;
> > bhupesh.sharma at freescale.com; sjg at chromium.org; bmeng.cn at gmail.com;
> > hs at denx.de; joe.hershberger at ni.com; marex at denx.de; Zhiqiang Hou
> > <zhiqiang.hou at nxp.com>; Hou Zhiqiang <B48286 at freescale.com>
> > Subject: [PATCH 1/3] ARMv8/layerscape: Add mmu_init API
> >
> > From: Hou Zhiqiang <B48286 at freescale.com>
> >
> > Expose this API to make it reuseable when u-boot turn into other EL
> > from EL3.
> >
> > Signed-off-by: Hou Zhiqiang <B48286 at freescale.com>
> > ---
> >  arch/arm/cpu/armv8/fsl-layerscape/cpu.c | 24
> > ++++++++++++++++++++++++
> >  include/common.h                        |  1 +
> >  2 files changed, 25 insertions(+)
> >
> > diff --git a/arch/arm/cpu/armv8/fsl-layerscape/cpu.c
> > b/arch/arm/cpu/armv8/fsl-layerscape/cpu.c
> > index 6ea28ed..df5670f 100644
> > --- a/arch/arm/cpu/armv8/fsl-layerscape/cpu.c
> > +++ b/arch/arm/cpu/armv8/fsl-layerscape/cpu.c
> > @@ -403,6 +403,30 @@ void enable_caches(void)
> >  	final_mmu_setup();
> >  	__asm_invalidate_tlb_all();
> >  }
> > +
> > +static void mmu_disable(void)
> > +{
> > +	if (get_sctlr() & CR_M)
> > +		set_sctlr(get_sctlr() & ~CR_M);
> > +}
> > +
> > +static void mmu_enable(void)
> > +{
> > +	if (!(get_sctlr() & CR_M))
> > +		set_sctlr(get_sctlr() | CR_M);
> > +}
> > +
> > +void mmu_init(void)
> 
> Name of function is not mapping about what it is doing.
> This function assume MMU is already enabled with early_table and it will setup
> final_mmu_setup.
> 

This function map basically with what it is doing except some I-cache operations
that will be remove from this func, and not assume the early_mmu_setup.
It assumes the relocation has been done. 

> > +{
> > +	mmu_disable();
> > +	dcache_disable();
> > +	icache_disable();
> > +	final_mmu_setup();
> > +	__asm_invalidate_tlb_all();
> > +	mmu_enable();
> > +	icache_enable();
> > +	set_sctlr(get_sctlr() | CR_C);
> > +}
> >  #endif
> 
> If I am correct board_init_r deploy final_mmu_setup via enable_caches().
> Why cannot existing framework be used.
> 

This patch aims to make final_mmu_setup() can be called flexibly in case as
When it return from PPA and execute at EL2, the MMU must be initialized
for the current EL.
Yes, the enable_caches() will call the __weak__ mmu_setup() if MMU wasn't
enabled. But for fsl layerscape platforms, the MMU has been enabled by early
mmu setup, so the __weak__ mmu_setup won't be called.

I am not know cache and mmu so much, and have some question:
For ARM:
Why there isn't a isolate API for mmu_setup, but invoke it from dcache_enable()?
If data cache won't be used, the MMU also cannot be used?

> >
> >  static inline u32 initiator_type(u32 cluster, int init_id) diff --git
> > a/include/common.h b/include/common.h index 75c78d5..57a9b30 100644
> > --- a/include/common.h
> > +++ b/include/common.h
> > @@ -757,6 +757,7 @@ void	flush_dcache_range(unsigned long start,
> > unsigned long stop);
> >  void	invalidate_dcache_range(unsigned long start, unsigned long stop);
> >  void	invalidate_dcache_all(void);
> >  void	invalidate_icache_all(void);
> > +void	mmu_init(void);
> >
> >  enum {
> >  	/* Disable caches (else flush caches but leave them active) */
> > --
> > 2.1.0.27.g96db324

Thanks,
Zhiqiang



More information about the U-Boot mailing list