85xx: Fix relocation of CCSRBAR
PATCH 1/2 85xx: Fix relocation of CCSRBAR
If the virtual address for CCSRBAR is the same after relocation but the physical address is changing we'd end up having two TLB entries with the same VA. Instead we new us the new CCSRBAR virt address + 4k as a temp virt address to access the old CCSRBAR to relocate it.
Signed-off-by Kumar Gala <[email protected]>
--- cpu/mpc85xx/cpu_init.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-)
cpu/mpc85xx/cpu_init.c +5 -4
@@ -140,14 +140,15 @@ void cpu_init_early_f(void)#if (CONFIG_SYS_CCSRBAR_DEFAULT !=CONFIG_SYS_CCSRBAR_PHYS ) {u32 temp; +volatile u32 *ccsr_virt = + (volatile u32 *)(CONFIG_SYS_CCSRBAR +0x1000 ); -set_tlb (0 ,CONFIG_SYS_CCSRBAR_DEFAULT ,CONFIG_SYS_CCSRBAR_DEFAULT , +set_tlb (0 , (u32 )ccsr_virt,CONFIG_SYS_CCSRBAR_DEFAULT ,MAS3_SX |MAS3_SW |MAS3_SR ,MAS2_I |MAS2_G ,1 ,1 ,BOOKE_PAGESZ_4K ,0 ); - temp =in_be32 ((volatile u32 *)CONFIG_SYS_CCSRBAR_DEFAULT ); -out_be32 ((volatile u32 *)CONFIG_SYS_CCSRBAR_DEFAULT ,CONFIG_SYS_CCSRBAR_PHYS >>12 ); - + temp =in_be32 (ccsr_virt); +out_be32 (ccsr_virt,CONFIG_SYS_CCSRBAR_PHYS >>12 ); temp =in_be32 ((volatile u32 *)CONFIG_SYS_CCSRBAR ); }#endif
Signature · 1 line
1.5.6.5
PATCH 2/2 85xx: init gd as early as possible
Moved up the initialization of GD so C code like set_tlb() can use gd->flags to determine if we've relocated or not in the future.
Signed-off-by Kumar Gala <[email protected]>
--- cpu/mpc85xx/cpu_init.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-)
cpu/mpc85xx/cpu_init.c +6 -6
@@ -132,6 +132,12 @@ void config_8560_ioports (volatile ccsr_cpm_t * cpm)/* We run cpu_init_early_f in AS = 1 */ void cpu_init_early_f (void ) { +/* Pointer is writable since we allocated a register for it */ + gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR +CONFIG_SYS_GBL_DATA_OFFSET ); + +/* Clear initial global data */ +memset ((void *) gd,0 ,sizeof (gd_t)); +set_tlb (0 ,CONFIG_SYS_CCSRBAR ,CONFIG_SYS_CCSRBAR_PHYS ,MAS3_SX |MAS3_SW |MAS3_SR ,MAS2_I |MAS2_G ,1 ,0 ,BOOKE_PAGESZ_4K ,0 );
@@ -153,12 +159,6 @@ void cpu_init_early_f(void) }#endif -/* Pointer is writable since we allocated a register for it */ - gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR +CONFIG_SYS_GBL_DATA_OFFSET ); - -/* Clear initial global data */ -memset ((void *) gd,0 ,sizeof (gd_t)); -init_laws ();invalidate_tlb (0 );init_tlbs ();
Signature · 1 line
1.5.6.5