diff options
author | Wolfgang Denk <wd@denx.de> | 2009-08-18 11:57:04 (GMT) |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2009-08-18 11:57:04 (GMT) |
commit | 2bcbd429f44e32ead38a33f372e4c027e66710f9 (patch) | |
tree | 379423f44ae69ff1cc6d267139a60605a27d46f8 | |
parent | 9af019f579e6090ade0adb8e883bf28d16f0563a (diff) | |
parent | e393e2e9bc5cd3d5484e193d1380e7cd7587ab5c (diff) | |
download | u-boot-2bcbd429f44e32ead38a33f372e4c027e66710f9.tar.xz |
Merge branch 'master' of git://git.denx.de/u-boot-mpc85xx
-rw-r--r-- | cpu/mpc85xx/tlb.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/cpu/mpc85xx/tlb.c b/cpu/mpc85xx/tlb.c index 46925f1..43ef1ff 100644 --- a/cpu/mpc85xx/tlb.c +++ b/cpu/mpc85xx/tlb.c @@ -110,15 +110,31 @@ void init_tlbs(void) void init_addr_map(void) { int i; + unsigned int max_cam = (mfspr(SPRN_TLB1CFG) >> 16) & 0xff; - for (i = 0; i < num_tlb_entries; i++) { - if (tlb_table[i].tlb == 0) + /* walk all the entries */ + for (i = 0; i < max_cam; i++) { + unsigned long epn; + u32 tsize, _mas1; + phys_addr_t rpn; + + mtspr(MAS0, FSL_BOOKE_MAS0(1, i, 0)); + + asm volatile("tlbre;isync"); + _mas1 = mfspr(MAS1); + + /* if the entry isn't valid skip it */ + if (!(_mas1 & MAS1_VALID)) continue; - addrmap_set_entry(tlb_table[i].epn, - tlb_table[i].rpn, - (1UL << ((tlb_table[i].tsize * 2) + 10)), - tlb_table[i].esel); + tsize = (_mas1 >> 8) & 0xf; + epn = mfspr(MAS2) & MAS2_EPN; + rpn = mfspr(MAS3) & MAS3_RPN; +#ifdef CONFIG_ENABLE_36BIT_PHYS + rpn |= ((phys_addr_t)mfspr(MAS7)) << 32; +#endif + + addrmap_set_entry(epn, rpn, (1UL << ((tsize * 2) + 10)), i); } return ; |