On Jul 24, 2009, at 1:18 PM, Peter Tyser wrote: > Previously, when CONFIG_MP was defined Boot Page Translation was > unconditionally enabled and secondary cores were put in a spin loop at > address 0xfffff000. The 0xfffffxxx address range (ie the Boot Page) > was > being remapped to SDRAM via the BPTR register. > > This change puts secondary cores into spin loops at their 'true' > address > in SDRAM and doesn't require Boot Page Translation to always be > enabled. > The main advantage of this change is that Boot Page Translation can be > disabled after the secondary cores are brought up which allows the > memory region at 0xfffffxxx to be used for other peripherals, etc. > > By default, Boot Page Translation remains enabled while U-Boot > executes. > A new CONFIG_MPC8xxx_DISABLE_BPTR define has been added which causes > Boot Page Translation to be disabled for those boards which wish to > use > the 0xfffffxxx address range as part of their normal memory map. > > Signed-off-by: Peter Tyser <pty...@xes-inc.com> > --- > This is very similar to "85xx: Fix mapping of 0xfffffxxx when > CONFIG_MP" > The 2 differences are: > > - Boot page translation is only disabled when > CONFIG_MPC8xxx_DISABLT_BPTR > is defined. > > - Instead of zeroing out BPTR when disabling translation, this > patch only disables translation, but maintins the translation > address. This should make it easier to properly re-enable > translation if need be. > > cpu/mpc85xx/mp.c | 22 ++++++++++++++++++++-- > cpu/mpc85xx/release.S | 30 +++++++++++++++++++++++++----- > 2 files changed, 45 insertions(+), 7 deletions(-) > > diff --git a/cpu/mpc85xx/mp.c b/cpu/mpc85xx/mp.c > index 76f02a4..53fc3be 100644 > --- a/cpu/mpc85xx/mp.c > +++ b/cpu/mpc85xx/mp.c > @@ -129,7 +129,7 @@ ulong get_spin_addr(void) > > ulong addr = > (ulong)&__spin_table - (ulong)&__secondary_start_page; > - addr += 0xfffff000; > + addr += determine_mp_bootpg();
where is determine_mp_bootpg() defined? > > > return addr; > } > @@ -137,7 +137,8 @@ ulong get_spin_addr(void) > static void pq3_mp_up(unsigned long bootpg) > { > u32 up, cpu_up_mask, whoami; > - u32 *table = (u32 *)get_spin_addr(); > + /* The table is at 0xfffffxxx due to boot page translation below */ > + u32 *table = (u32 *)(0xfffff000 | get_spin_addr()); > volatile u32 bpcr; > volatile ccsr_local_ecm_t *ecm = (void *) > (CONFIG_SYS_MPC85xx_ECM_ADDR); > volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); > @@ -146,6 +147,8 @@ static void pq3_mp_up(unsigned long bootpg) > int timeout = 10; > > whoami = in_be32(&pic->whoami); > + > + /* Translate 0xfffffxxx 'bootpg' address range to SDRAM */ > out_be32(&ecm->bptr, 0x80000000 | (bootpg >> 12)); > > /* disable time base at the platform */ > @@ -194,6 +197,17 @@ static void pq3_mp_up(unsigned long bootpg) > > devdisr &= ~(MPC85xx_DEVDISR_TB0 | MPC85xx_DEVDISR_TB1); > out_be32(&gur->devdisr, devdisr); > + > +#ifdef CONFIG_MPC8xxx_DISABLE_BPTR > + /* > + * Disabling Boot Page Translation allows the memory region > 0xfffff000 > + * to 0xffffffff to be used normally. Leaving Boot Page Translation > + * enabled remaps 0xfffff000 to SDRAM which makes that memory region > + * unusable for normal operation but it does allow OSes to easily > + * reset a processor core to put it back into U-Boot's spinloop. > + */ > + out_be32(&ecm->bptr, in_be32(&ecm->bptr) & ~0x80000000); use clrbits_be32 > > +#endif > } > > void cpu_mp_lmb_reserve(struct lmb *lmb) > @@ -206,9 +220,13 @@ void cpu_mp_lmb_reserve(struct lmb *lmb) > void setup_mp(void) > { > extern ulong __secondary_start_page; > + extern ulong __bootpg_addr; > ulong fixup = (ulong)&__secondary_start_page; > u32 bootpg = determine_mp_bootpg(); > > + /* Store the bootpg's SDRAM address for use by secondary CPU cores > */ > + __bootpg_addr = bootpg; > + > memcpy((void *)bootpg, (void *)fixup, 4096); > flush_cache(bootpg, 4096); > > diff --git a/cpu/mpc85xx/release.S b/cpu/mpc85xx/release.S > index fbefc2c..6799633 100644 > --- a/cpu/mpc85xx/release.S > +++ b/cpu/mpc85xx/release.S > @@ -114,23 +114,38 @@ __secondary_start_page: > stw r3,ENTRY_R6_UPPER(r10) > stw r3,ENTRY_R6_LOWER(r10) > > + /* load r13 with the address of the 'bootpg' in SDRAM */ > + lis r13,toreset(__bootpg_addr)@h > + ori r13,r13,toreset(__bootpg_addr)@l > + lwz r13,0(r13) > + > /* setup mapping for AS = 1, and jump there */ > lis r11,(MAS0_TLBSEL(1)|MAS0_ESEL(1))@h > mtspr SPRN_MAS0,r11 > lis r11,(MAS1_VALID|MAS1_IPROT)@h > ori r11,r11,(MAS1_TS|MAS1_TSIZE(BOOKE_PAGESZ_4K))@l > mtspr SPRN_MAS1,r11 > - lis r11,(0xfffff000|MAS2_I)@h > - ori r11,r11,(0xfffff000|MAS2_I)@l > + oris r11,r13,(MAS2_I)@h > + ori r11,r13,(MAS2_I)@l > mtspr SPRN_MAS2,r11 > - lis r11,(0xfffff000|MAS3_SX|MAS3_SW|MAS3_SR)@h > - ori r11,r11,(0xfffff000|MAS3_SX|MAS3_SW|MAS3_SR)@l > + oris r11,r13,(MAS3_SX|MAS3_SW|MAS3_SR)@h > + ori r11,r13,(MAS3_SX|MAS3_SW|MAS3_SR)@l > mtspr SPRN_MAS3,r11 > tlbwe > > bl 1f > 1: mflr r11 > - addi r11,r11,28 > + /* > + * OR in 0xfff to create a mask of the bootpg SDRAM address. We use > + * this mask to fixup the cpu spin table and the address that we > want > + * to jump to, eg change them from 0xfffffxxx to 0x7ffffxxx if the > + * bootpg is at 0x7ffff000 in SDRAM. > + */ > + ori r13,r13,0xfff > + and r11, r11, r13 > + and r10, r10, r13 > + > + addi r11,r11,(2f-1b) > mfmsr r13 > ori r12,r13,MSR_IS|msr...@l > > @@ -200,6 +215,11 @@ __secondary_start_page: > mtspr SPRN_SRR1,r13 > rfi > > + /* Allocate some space for the SDRAM address of the bootpg */ > + .globl __bootpg_addr > +__bootpg_addr: > + .long 0 > + > .align L1_CACHE_SHIFT > .globl __spin_table > __spin_table: > -- > 1.6.2.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot