On 08/17/2012 01:27 PM, York Sun wrote: > Using E6500 L1 cache as initram requires L2 cache enabled. > Add l2-cache cluster enabling. > > Signed-off-by: York Sun <york...@freescale.com> > Signed-off-by: Kumar Gala <ga...@kernel.crashing.org> > --- > arch/powerpc/cpu/mpc85xx/cpu_init.c | 39 ++++++++++++++++++++++- > arch/powerpc/cpu/mpc85xx/start.S | 57 > +++++++++++++++++++++++++++++++++ > arch/powerpc/include/asm/immap_85xx.h | 43 +++++++++++++++++++++++++ > 3 files changed, 138 insertions(+), 1 deletions(-) > > diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init.c > b/arch/powerpc/cpu/mpc85xx/cpu_init.c > index 2c78905..1a2858a 100644 > --- a/arch/powerpc/cpu/mpc85xx/cpu_init.c > +++ b/arch/powerpc/cpu/mpc85xx/cpu_init.c > @@ -309,6 +309,34 @@ static void __fsl_serdes__init(void) > } > __attribute__((weak, alias("__fsl_serdes__init"))) void > fsl_serdes_init(void); > > +#ifdef CONFIG_E6500 > +int enable_cluster_l2(void)
If enabling L2 is required for the stack, how are we enabling it in C code? Is this just for non-boot clusters? > +{ > + int i = 0; > + u32 cluster; > + ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); > + struct ccsr_cluster_l2 *l2cache; > + > + cluster = in_be32(&gur->tp_cluster[i++].lower); > + if (cluster & TP_CLUSTER_EOC) > + return 0; > + > + do { > + l2cache = (void *)(CONFIG_SYS_FSL_CLUSTER_1_L2 + i * 0x40000); > + cluster = in_be32(&gur->tp_cluster[i++].lower); > + > + printf("enable l2 for cluster %d %p\n", i, l2cache); This should be a debug message (or removed), not a normal printf. > + > + out_be32(&l2cache->l2csr0, L2CSR0_L2FI|L2CSR0_L2LFC); > + while ((in_be32(&l2cache->l2csr0) & (L2CSR0_L2FI|L2CSR0_L2LFC)) > != 0) > + ; Timeout? > @@ -322,6 +350,11 @@ int cpu_init_r(void) > #ifdef CONFIG_SYS_LBC_LCRR > volatile fsl_lbc_t *lbc = LBC_BASE_ADDR; > #endif > +#ifdef CONFIG_L2_CACHE > + volatile ccsr_l2cache_t *l2cache = (void *)CONFIG_SYS_MPC85xx_L2_ADDR; > +#elif defined(CONFIG_E6500) > + struct ccsr_cluster_l2 * l2cache = (void *)CONFIG_SYS_FSL_CLUSTER_1_L2; > +#endif If CONFIG_L2_CACHE doesn't apply to e6500, then CONFIG_L2_CACHE is misnamed. > diff --git a/arch/powerpc/cpu/mpc85xx/start.S > b/arch/powerpc/cpu/mpc85xx/start.S > index 2e1d265..739127f 100644 > --- a/arch/powerpc/cpu/mpc85xx/start.S > +++ b/arch/powerpc/cpu/mpc85xx/start.S > @@ -762,6 +762,63 @@ delete_temp_tlbs: > tlbwe > #endif /* #if (CONFIG_SYS_CCSRBAR_DEFAULT != CONFIG_SYS_CCSRBAR_PHYS) */ > > +#ifdef CONFIG_E6500 > +create_ccsr_l2_tlb: > + /* > + * Create a TLB for the MMR location of CCSR > + * to access L2CSR0 register > + */ > + lis r0, FSL_BOOKE_MAS0(0, 0, 0)@h > + ori r0, r0, FSL_BOOKE_MAS0(0, 0, 0)@l > + > + lis r1, FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@h > + ori r1, r1, FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@l > + lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0xC20000, > (MAS2_I|MAS2_G))@h > + ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0xC20000, > (MAS2_I|MAS2_G))@l > + lis r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_PHYS_LOW + 0xC20000, 0, > (MAS3_SW|MAS3_SR))@h > + ori r3, r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_PHYS_LOW + 0xC20000, > 0, (MAS3_SW|MAS3_SR))@l > + lis r7, CONFIG_SYS_CCSRBAR_PHYS_HIGH@h > + ori r7, r7, CONFIG_SYS_CCSRBAR_PHYS_HIGH@l > + mtspr MAS0, r0 > + mtspr MAS1, r1 > + mtspr MAS2, r2 > + mtspr MAS3, r3 > + mtspr MAS7, r7 > + isync > + msync > + tlbwe Let's make a macro (asm, not cpp) out of this instead of copy and pasting all over the place. And stop misusing r1/r2. -Scott _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot