Re-work pmap_bootstrap_mapping() to pmap_map_device() to provide a
way for bus_space(9) to efficiently map device memory. (Although at the moment, it doesn't quite work as efficiently as it will down the line ...) Fix a pool_init() botch. Add a debug aid: dump_kipt(). This can be called from ddb(4) in order to (partially) dump the contents of the kernel IPT.
This commit is contained in:
parent
2774f9d77b
commit
d8f6a57b15
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pmap.c,v 1.1 2002/07/05 13:32:05 scw Exp $ */
|
||||
/* $NetBSD: pmap.c,v 1.2 2002/08/26 10:21:04 scw Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2002 Wasabi Systems, Inc.
|
||||
|
@ -806,25 +806,29 @@ pmap_bootstrap(vaddr_t avail, struct mem_region *mr)
|
|||
* mappings. Particularly the big page support.
|
||||
*/
|
||||
vaddr_t
|
||||
pmap_bootstrap_mapping(paddr_t pa, u_int len)
|
||||
pmap_map_device(paddr_t pa, u_int len)
|
||||
{
|
||||
vaddr_t va;
|
||||
ptel_t *ptelp;
|
||||
ptel_t ptel, pgsize;
|
||||
ptel_t ptel;
|
||||
int idx;
|
||||
|
||||
/*
|
||||
* Steal some KVA
|
||||
*/
|
||||
va = pmap_kva_avail_start;
|
||||
len = sh5_round_page(len);
|
||||
pmap_kva_avail_start += len;
|
||||
|
||||
if (pmap_initialized == 0) {
|
||||
/*
|
||||
* Steal some KVA
|
||||
*/
|
||||
va = pmap_kva_avail_start;
|
||||
pmap_kva_avail_start += len;
|
||||
} else
|
||||
va = uvm_km_valloc(kernel_map, len);
|
||||
|
||||
/*
|
||||
* Get the index into pmap_kernel_ipt.
|
||||
*/
|
||||
if ((idx = kva_to_iptidx(va)) < 0)
|
||||
panic("pmap_bootstrap_mapping: Invalid KVA %p", (void *)va);
|
||||
panic("pmap_map_device: Invalid KVA %p", (void *)va);
|
||||
|
||||
ptelp = &pmap_kernel_ipt[idx];
|
||||
ptel = (ptel_t)(pa & SH5_PTEL_PPN_MASK) |
|
||||
|
@ -836,21 +840,38 @@ pmap_bootstrap_mapping(paddr_t pa, u_int len)
|
|||
* regions of device memory, for example.
|
||||
*/
|
||||
while (len) {
|
||||
if (len >= 0x20000000)
|
||||
#if 0
|
||||
ptel_t pgsize, pgend, mask;
|
||||
if (len >= 0x20000000) {
|
||||
pgsize = SH5_PTEL_SZ_512MB; /* Impossible?!?! */
|
||||
else
|
||||
if (len >= 0x100000)
|
||||
pgend = ptel + 0x20000000;
|
||||
mask = SH5_PTEL_PPN_MASK & ~(0x20000000 - 1);
|
||||
} else
|
||||
if (len >= 0x100000) {
|
||||
pgsize = SH5_PTEL_SZ_1MB;
|
||||
else
|
||||
if (len >= 0x10000)
|
||||
pgend = ptel + 0x100000;
|
||||
mask = SH5_PTEL_PPN_MASK & ~(0x100000 - 1);
|
||||
} else
|
||||
if (len >= 0x10000) {
|
||||
pgsize = SH5_PTEL_SZ_64KB;
|
||||
else
|
||||
pgend = ptel + 0x10000;
|
||||
mask = SH5_PTEL_PPN_MASK & ~(0x10000 - 1);
|
||||
} else {
|
||||
pgsize = SH5_PTEL_SZ_4KB;
|
||||
pgend = ptel + 0x1000;
|
||||
mask = SH5_PTEL_PPN_MASK & ~(0x1000 - 1);
|
||||
}
|
||||
|
||||
*ptelp++ = ptel | pgsize;
|
||||
|
||||
len -= NBPG;
|
||||
while (ptel < pgend && len) {
|
||||
*ptelp++ = (ptel & mask) | pgsize;
|
||||
ptel += NBPG;
|
||||
len -= NBPG;
|
||||
}
|
||||
#else
|
||||
*ptelp++ = ptel | SH5_PTEL_SZ_4KB;
|
||||
ptel += NBPG;
|
||||
len -= NBPG;
|
||||
#endif
|
||||
}
|
||||
|
||||
return (va);
|
||||
|
@ -867,7 +888,7 @@ pmap_init(void)
|
|||
sizeof(void *), 0, 0, "pmap_pl", NULL);
|
||||
|
||||
pool_init(&pmap_mpvo_pool, sizeof(struct pvo_entry),
|
||||
sizeof(struct pvo_entry), 0, 0, "pmap_mpvopl", NULL);
|
||||
0, 0, 0, "pmap_mpvopl", NULL);
|
||||
|
||||
pool_setlowat(&pmap_mpvo_pool, 1008);
|
||||
|
||||
|
@ -1894,3 +1915,21 @@ pmap_unmap_poolpage(vaddr_t va)
|
|||
panic("pmap_unmap_poolpage: non-kseg0 page: va = 0x%lx", va);
|
||||
return (0);
|
||||
}
|
||||
|
||||
void dump_kipt(void);
|
||||
void
|
||||
dump_kipt(void)
|
||||
{
|
||||
u_int va;
|
||||
ptel_t *pt;
|
||||
|
||||
printf("\nKernel KSEG1 mappings:\n\n");
|
||||
|
||||
for (pt = &pmap_kernel_ipt[0], va = SH5_KSEG1_BASE;
|
||||
pt != &pmap_kernel_ipt[KERNEL_IPT_SIZE]; pt++, va += NBPG) {
|
||||
if (*pt && *pt < 0x80000000u)
|
||||
printf("KVA: 0x%08x -> PTEL: 0x%08x\n", va, (u_int)*pt);
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue