Module Name: src Committed By: cliff Date: Sun Nov 15 23:09:45 UTC 2009
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: bus_space_alignstride_chipdep.c Log Message: - use (intptr_t) as needed to make int to pointer casts work for N32 and N64 - in BS(map), when not _LP64, if the bus address cannot "fit" in KSEG0/KSEG1, then use uvm_km_alloc() and pmap_kenter_pa() to make page table mappings. To generate a diff of this commit: cvs rdiff -u -r1.10.18.4 -r1.10.18.5 \ 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.4 src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c:1.10.18.5 --- src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c:1.10.18.4 Mon Nov 9 09:59:27 2009 +++ src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c Sun Nov 15 23:09:45 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.4 2009/11/09 09:59:27 cliff Exp $ */ +/* $NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.5 2009/11/15 23:09:45 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.4 2009/11/09 09:59:27 cliff Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.5 2009/11/15 23:09:45 cliff Exp $"); #ifdef CHIP_EXTENT #include <sys/extent.h> @@ -742,20 +742,43 @@ mapit: #endif /* CHIP_EXTENT */ + + addr = mbst.mbst_sys_start + (addr - mbst.mbst_bus_start); + #ifdef _LP64 if (flags & BUS_SPACE_MAP_CACHEABLE) - *hp = MIPS_PHYS_TO_XKPHYS_CACHED(mbst.mbst_sys_start + - (addr - mbst.mbst_bus_start)); + *hp = MIPS_PHYS_TO_XKPHYS_CACHED(addr); else - *hp = MIPS_PHYS_TO_XKPHYS_UNCACHED(mbst.mbst_sys_start + - (addr - mbst.mbst_bus_start)); + *hp = MIPS_PHYS_TO_XKPHYS_UNCACHED(addr); #else - if (flags & BUS_SPACE_MAP_CACHEABLE) - *hp = MIPS_PHYS_TO_KSEG0(mbst.mbst_sys_start + - (addr - mbst.mbst_bus_start)); - else - *hp = MIPS_PHYS_TO_KSEG1(mbst.mbst_sys_start + - (addr - mbst.mbst_bus_start)); + if (((addr + size) & ~MIPS_PHYS_MASK) != 0) { + vaddr_t va; + paddr_t pa; + int s; + + size = round_page((addr % PAGE_SIZE) + size); + va = uvm_km_alloc(kernel_map, size, PAGE_SIZE, + UVM_KMF_VAONLY | UVM_KMF_NOWAIT); + if (va == 0) + return ENOMEM; + *hp = va + (addr & PAGE_MASK); + pa = trunc_page(addr); + + s = splhigh(); + while (size != 0) { + pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE); + pa += PAGE_SIZE; + va += PAGE_SIZE; + size -= PAGE_SIZE; + } + pmap_update(pmap_kernel()); + splx(s); + } else { + if (flags & BUS_SPACE_MAP_CACHEABLE) + *hp = MIPS_PHYS_TO_KSEG0(addr); + else + *hp = MIPS_PHYS_TO_KSEG1(addr); + } #endif return (0); @@ -1251,7 +1274,7 @@ volatile uint8_t *ptr; #endif /* CHIP_ACCESS_SIZE > 1 */ - ptr = (void *)(h + CHIP_OFF8(off)); + ptr = (void *)(intptr_t)(h + CHIP_OFF8(off)); return *ptr & 0xff; } @@ -1264,7 +1287,7 @@ volatile uint16_t *ptr; #endif /* CHIP_ACCESS_SIZE > 2 */ - ptr = (void *)(h + CHIP_OFF16(off)); + ptr = (void *)(intptr_t)(h + CHIP_OFF16(off)); return *ptr & 0xffff; } @@ -1277,7 +1300,7 @@ volatile uint32_t *ptr; #endif - ptr = (void *)(h + CHIP_OFF32(off)); + ptr = (void *)(intptr_t)(h + CHIP_OFF32(off)); return *ptr & 0xffffffff; } @@ -1286,7 +1309,7 @@ { volatile uint64_t *ptr; - ptr = (void *)(h + CHIP_OFF64(off)); + ptr = (void *)(intptr_t)(h + CHIP_OFF64(off)); return *ptr; } @@ -1333,7 +1356,7 @@ volatile uint8_t *ptr; #endif /* CHIP_ACCESS_SIZE > 1 */ - ptr = (void *)(h + CHIP_OFF8(off)); + ptr = (void *)(intptr_t)(h + CHIP_OFF8(off)); *ptr = val; } @@ -1347,7 +1370,7 @@ volatile uint16_t *ptr; #endif /* CHIP_ACCESS_SIZE > 2 */ - ptr = (void *)(h + CHIP_OFF16(off)); + ptr = (void *)(intptr_t)(h + CHIP_OFF16(off)); *ptr = val; } @@ -1361,7 +1384,7 @@ volatile uint32_t *ptr; #endif /* CHIP_ACCESS_SIZE > 4 */ - ptr = (void *)(h + CHIP_OFF32(off)); + ptr = (void *)(intptr_t)(h + CHIP_OFF32(off)); *ptr = val; } @@ -1371,7 +1394,7 @@ { volatile uint64_t *ptr; - ptr = (void *)(h + CHIP_OFF64(off)); + ptr = (void *)(intptr_t)(h + CHIP_OFF64(off)); *ptr = val; }