summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2008-10-25 03:36:21 +0000
committermarcel <marcel@FreeBSD.org>2008-10-25 03:36:21 +0000
commitc854de7273991a8ebafd7fd9971e0012013035c6 (patch)
treef52c114892f58926d1129e73197e3a5e3cae8064 /sys/powerpc
parent7a59a01ca5d01a94d5e3848c5afb3ddfa4f91d15 (diff)
downloadFreeBSD-src-c854de7273991a8ebafd7fd9971e0012013035c6.zip
FreeBSD-src-c854de7273991a8ebafd7fd9971e0012013035c6.tar.gz
In mmu_booke_mapdev(), handle mappings that cannot be represented
by a single TLB entry. The boot ROM on the MPC85555CDS is 8MB, for example, and in order to map that we need 2 4MB TLB entries.
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/booke/pmap.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c
index 9a4de40..ce09a83 100644
--- a/sys/powerpc/booke/pmap.c
+++ b/sys/powerpc/booke/pmap.c
@@ -2296,14 +2296,25 @@ mmu_booke_dev_direct_mapped(mmu_t mmu, vm_offset_t pa, vm_size_t size)
static void *
mmu_booke_mapdev(mmu_t mmu, vm_offset_t pa, vm_size_t size)
{
+ void *res;
uintptr_t va;
+ vm_size_t sz;
va = (pa >= 0x80000000) ? pa : (0xe2000000 + pa);
- if (bootverbose)
- printf("Wiring VA=%x to PA=%x (size=%x), using TLB1[%d]\n",
- va, pa, size, tlb1_idx);
- tlb1_set_entry(va, pa, size, _TLB_ENTRY_IO);
- return ((void *)va);
+ res = (void *)va;
+
+ do {
+ sz = 1 << (ilog2(size) & ~1);
+ if (bootverbose)
+ printf("Wiring VA=%x to PA=%x (size=%x), "
+ "using TLB1[%d]\n", va, pa, sz, tlb1_idx);
+ tlb1_set_entry(va, pa, sz, _TLB_ENTRY_IO);
+ size -= sz;
+ pa += sz;
+ va += sz;
+ } while (size > 0);
+
+ return (res);
}
/*
OpenPOWER on IntegriCloud