Module Name: src
Committed By: cliff
Date: Wed Nov 18 01:14:28 UTC 2009
Modified Files:
src/sys/arch/mips/mips [matt-nb5-mips64]:
bus_space_alignstride_chipdep.c
Log Message:
- in BS(unmap), if handle is for addr mapped in page table,
free up the pmap and uvm resources. Otherwise manage
kseg[0,1] mapped handle as usual.
- also in BS(unmamp), use bus_addr_t addr (not the handle)
when calculating offset in extent.
- use PRIxBUSADDR, PRIxBUSSIZE and PRIxBSH formats as needed
- use function names instead of "xxx" in printfs
To generate a diff of this commit:
cvs rdiff -u -r1.10.18.7 -r1.10.18.8 \
src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c
diff -u src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c:1.10.18.7 src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c:1.10.18.8
--- src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c:1.10.18.7 Tue Nov 17 07:56:27 2009
+++ src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c Wed Nov 18 01:14:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.7 2009/11/17 07:56:27 matt Exp $ */
+/* $NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.8 2009/11/18 01:14:27 cliff Exp $ */
/*-
* Copyright (c) 1998, 2000, 2001 The NetBSD Foundation, Inc.
@@ -81,7 +81,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.7 2009/11/17 07:56:27 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.8 2009/11/18 01:14:27 cliff Exp $");
#ifdef CHIP_EXTENT
#include <sys/extent.h>
@@ -563,14 +563,15 @@
*/
if (CHIP_W1_BUS_START(v) == (bus_addr_t) -1) {
#ifdef EXTENT_DEBUG
- printf("xxx: this space is disabled\n");
+ printf("%s: this space is disabled\n", __S(__BS(init)));
#endif
return;
}
#ifdef EXTENT_DEBUG
- printf("xxx: freeing from 0x%x to 0x%x\n", CHIP_W1_BUS_START(v),
- CHIP_W1_BUS_END(v));
+ printf("%s: freeing from %#"PRIxBUSADDR" to %#"PRIxBUSADDR"\n",
+ __S(__BS(init)), (bus_addr_t)CHIP_W1_BUS_START(v),
+ (bus_addr_t)CHIP_W1_BUS_END(v));
#endif
extent_free(ex, CHIP_W1_BUS_START(v),
CHIP_W1_BUS_END(v) - CHIP_W1_BUS_START(v) + 1, EX_NOWAIT);
@@ -728,13 +729,14 @@
goto mapit;
#ifdef EXTENT_DEBUG
- printf("xxx: allocating 0x%lx to 0x%lx\n", addr, addr + size - 1);
+ printf("%s: allocating %#"PRIxBUSADDR" to %#"PRIxBUSADDR"\n",
+ __S(__BS(map)), addr, addr + size - 1);
#endif
error = extent_alloc_region(CHIP_EXTENT(v), addr, size,
EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
if (error) {
#ifdef EXTENT_DEBUG
- printf("xxx: allocation failed (%d)\n", error);
+ printf("%s: allocation failed (%d)\n", __S(__BS(map)), error);
extent_print(CHIP_EXTENT(v));
#endif
return (error);
@@ -761,6 +763,10 @@
UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
if (va == 0)
return ENOMEM;
+
+ /* check use of handle_is_kseg2 in BS(unmap) */
+ KASSERT((va & ~MIPS_PHYS_MASK) == MIPS_KSEG2_START);
+
*hp = va + (addr & PAGE_MASK);
pa = trunc_page(addr);
@@ -787,40 +793,76 @@
void
__BS(unmap)(void *v, bus_space_handle_t h, bus_size_t size, int acct)
{
+ bus_addr_t addr = 0; /* initialize to appease gcc */
+ bool handle_is_kseg2;
+
+ /* determine if h is addr obtained from uvm_km_alloc */
+ handle_is_kseg2 = ((h & ~MIPS_PHYS_MASK) == MIPS_KSEG2_START);
+
+#if 0
+ printf("%s:%d: is_kseg2 %d\n", __func__, __LINE__, handle_is_kseg2);
+#endif
+
+ if (handle_is_kseg2 == true) {
+ paddr_t pa;
+ vaddr_t va = (vaddr_t)trunc_page(h);
+ vsize_t sz = (vsize_t)round_page((h % PAGE_SIZE) + size);
+ int s;
+
+ s = splhigh();
+
+ if (pmap_extract(pmap_kernel(), (vaddr_t)h, &pa) == false)
+ panic("%s: pmap_extract failed", __func__);
+ addr = (bus_addr_t)pa;
+#if 0
+ printf("%s:%d: addr %#"PRIxBUSADDR", sz %#"PRIxVSIZE"\n",
+ __func__, __LINE__, addr, sz);
+#endif
+ /* sanity check: this is why we couldn't map w/ kseg[0,1] */
+ KASSERT (((addr + sz) & ~MIPS_PHYS_MASK) != 0);
+
+ pmap_kremove(va, sz);
+ pmap_update(pmap_kernel());
+ uvm_km_free(kernel_map, va, sz, UVM_KMF_VAONLY);
+
+ splx(s);
+ }
+
#ifdef CHIP_EXTENT
- bus_addr_t addr;
- int error;
if (acct == 0)
return;
#ifdef EXTENT_DEBUG
- printf("xxx: freeing handle 0x%lx for 0x%lx\n", h, size);
+ printf("%s: freeing handle %#"PRIxBSH" for %#"PRIxBUSSIZE"\n",
+ __S(__BS(unmap)), h, size);
#endif
+ if (handle_is_kseg2 == false) {
#ifdef _LP64
- KASSERT(MIPS_XKPHYS_P(h));
- h = MIPS_XKPHYS_TO_PHYS(h);
+ KASSERT(MIPS_XKPHYS_P(h));
+ addr = MIPS_XKPHYS_TO_PHYS(h);
#else
- if (MIPS_KSEG0_P(h))
- h = MIPS_KSEG0_TO_PHYS(h);
- else
- h = MIPS_KSEG1_TO_PHYS(h);
+ if (MIPS_KSEG0_P(h))
+ addr = MIPS_KSEG0_TO_PHYS(h);
+ else
+ addr = MIPS_KSEG1_TO_PHYS(h);
#endif
+ }
#ifdef CHIP_W1_BUS_START
- if (h >= CHIP_W1_SYS_START(v) && h <= CHIP_W1_SYS_END(v)) {
- addr = CHIP_W1_BUS_START(v) + (h - CHIP_W1_SYS_START(v));
+ if (addr >= CHIP_W1_SYS_START(v) && addr <= CHIP_W1_SYS_END(v)) {
+ addr = CHIP_W1_BUS_START(v) + (addr - CHIP_W1_SYS_START(v));
} else
#endif
#ifdef CHIP_W2_BUS_START
- if (h >= CHIP_W2_SYS_START(v) && h <= CHIP_W2_SYS_END(v)) {
- addr = CHIP_W2_BUS_START(v) + (h - CHIP_W2_SYS_START(v));
+ if (addr >= CHIP_W2_SYS_START(v) && addr <= CHIP_W2_SYS_END(v)) {
+ addr = CHIP_W2_BUS_START(v) + (addr - CHIP_W2_SYS_START(v));
} else
#endif
#ifdef CHIP_W3_BUS_START
- if (h >= CHIP_W3_SYS_START(v) && h <= CHIP_W3_SYS_END(v)) {
- addr = CHIP_W3_BUS_START(v) + (h - CHIP_W3_SYS_START(v));
+ if (addr >= CHIP_W3_SYS_START(v) && addr <= CHIP_W3_SYS_END(v)) {
+ addr = CHIP_W3_BUS_START(v) + (addr - CHIP_W3_SYS_START(v));
} else
#endif
{
@@ -837,21 +879,22 @@
#endif
#ifdef CHIP_W3_BUS_START
printf("%s: sys window[3]=0x%lx-0x%lx\n",
- __S(__BS(map)), (u_long)CHIP_W3_SYS_START(v),
+ __S(__BS(unmap)), (u_long)CHIP_W3_SYS_START(v),
(u_long)CHIP_W3_SYS_END(v));
#endif
panic("%s: don't know how to unmap %#"PRIxBSH, __S(__BS(unmap)), h);
}
#ifdef EXTENT_DEBUG
- printf("xxx: freeing 0x%lx to 0x%lx\n", addr, addr + size - 1);
+ printf("%s: freeing %#"PRIxBUSADDR" to %#"PRIxBUSADDR"\n",
+ __S(__BS(unmap)), addr, addr + size - 1);
#endif
- error = extent_free(CHIP_EXTENT(v), addr, size,
+ int error = extent_free(CHIP_EXTENT(v), addr, size,
EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
if (error) {
- printf("%s: WARNING: could not unmap %#"PRIxBUSADDR"-%#"PRIxBUSADDR" (error %d)\n",
- __S(__BS(unmap)), addr, addr + size - 1,
- error);
+ printf("%s: WARNING: could not unmap"
+ " %#"PRIxBUSADDR"-%#"PRIxBUSADDR" (error %d)\n",
+ __S(__BS(unmap)), addr, addr + size - 1, error);
#ifdef EXTENT_DEBUG
extent_print(CHIP_EXTENT(v));
#endif
@@ -891,7 +934,8 @@
* Do the requested allocation.
*/
#ifdef EXTENT_DEBUG
- printf("xxx: allocating from 0x%lx to 0x%lx\n", rstart, rend);
+ printf("%s: allocating from %#"PRIxBUSADDR" to %#"PRIxBUSADDR"\n",
+ __S(__BS(alloc)), rstart, rend);
#endif
error = extent_alloc_subregion(CHIP_EXTENT(v), rstart, rend, size,
align, boundary,
@@ -899,14 +943,15 @@
&addr);
if (error) {
#ifdef EXTENT_DEBUG
- printf("xxx: allocation failed (%d)\n", error);
+ printf("%s: allocation failed (%d)\n", __S(__BS(alloc)), error);
extent_print(CHIP_EXTENT(v));
#endif
return (error);
}
#ifdef EXTENT_DEBUG
- printf("xxx: allocated 0x%lx to 0x%lx\n", addr, addr + size - 1);
+ printf("%s: allocated 0x%lx to %#"PRIxBUSSIZE"\n",
+ __S(__BS(alloc)), addr, addr + size - 1);
#endif
error = __BS(translate)(v, addr, size, flags, &mbst);