diff options
Diffstat (limited to 'cpu/mpc85xx/tlb.c')
| -rw-r--r-- | cpu/mpc85xx/tlb.c | 40 | 
1 files changed, 39 insertions, 1 deletions
diff --git a/cpu/mpc85xx/tlb.c b/cpu/mpc85xx/tlb.c index a2d16ae2f..25fa9ee8f 100644 --- a/cpu/mpc85xx/tlb.c +++ b/cpu/mpc85xx/tlb.c @@ -26,6 +26,11 @@  #include <common.h>  #include <asm/processor.h>  #include <asm/mmu.h> +#ifdef CONFIG_ADDR_MAP +#include <addr_map.h> +#endif + +DECLARE_GLOBAL_DATA_PTR;  void set_tlb(u8 tlb, u32 epn, u64 rpn,  	     u8 perms, u8 wimge, @@ -47,6 +52,11 @@ void set_tlb(u8 tlb, u32 epn, u64 rpn,  	mtspr(MAS7, _mas7);  #endif  	asm volatile("isync;msync;tlbwe;isync"); + +#ifdef CONFIG_ADDR_MAP +	if ((tlb == 1) && (gd->flags & GD_FLG_RELOC)) +		addrmap_set_entry(epn, rpn, (1UL << ((tsize * 2) + 10)), esel); +#endif  }  void disable_tlb(u8 esel) @@ -67,6 +77,11 @@ void disable_tlb(u8 esel)  	mtspr(MAS7, _mas7);  #endif  	asm volatile("isync;msync;tlbwe;isync"); + +#ifdef CONFIG_ADDR_MAP +	if (gd->flags & GD_FLG_RELOC) +		addrmap_set_entry(0, 0, 0, esel); +#endif  }  void invalidate_tlb(u8 tlb) @@ -91,6 +106,29 @@ void init_tlbs(void)  	return ;  } +#ifdef CONFIG_ADDR_MAP +void init_addr_map(void) +{ +	int i; + +	for (i = 0; i < num_tlb_entries; i++) { +		if (tlb_table[i].tlb == 0) +			continue; + +		addrmap_set_entry(tlb_table[i].epn, +			tlb_table[i].rpn, +			(1UL << ((tlb_table[i].tsize * 2) + 10)), +			tlb_table[i].esel); +	} + +	return ; +} +#endif + +#ifndef CONFIG_SYS_DDR_TLB_START +#define CONFIG_SYS_DDR_TLB_START 8 +#endif +  unsigned int setup_ddr_tlbs(unsigned int memsize_in_meg)  {  	unsigned int tlb_size; @@ -137,7 +175,7 @@ unsigned int setup_ddr_tlbs(unsigned int memsize_in_meg)  	 * Configure DDR TLB1 entries.  	 * Starting at TLB1 8, use no more than 8 TLB1 entries.  	 */ -	ram_tlb_index = 8; +	ram_tlb_index = CONFIG_SYS_DDR_TLB_START;  	ram_tlb_address = (unsigned int)CONFIG_SYS_DDR_SDRAM_BASE;  	while (ram_tlb_address < (memsize_in_meg * 1024 * 1024)  	      && ram_tlb_index < 16) {  |