Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/arch/powerpc/powerpc/bus_space.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/arch/powerpc/powerpc/bus_space.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.5.12.3 retrieving revision 1.5.12.4 diff -u -p -r1.5.12.3 -r1.5.12.4 --- src/sys/arch/powerpc/powerpc/bus_space.c 2007/10/27 11:28:02 1.5.12.3 +++ src/sys/arch/powerpc/powerpc/bus_space.c 2008/02/11 14:59:29 1.5.12.4 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_space.c,v 1.5.12.3 2007/10/27 11:28:02 yamt Exp $ */ +/* $NetBSD: bus_space.c,v 1.5.12.4 2008/02/11 14:59:29 yamt Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -38,7 +38,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: bus_space.c,v 1.5.12.3 2007/10/27 11:28:02 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_space.c,v 1.5.12.4 2008/02/11 14:59:29 yamt Exp $"); #include #include @@ -53,11 +53,14 @@ __KERNEL_RCSID(0, "$NetBSD: bus_space.c, #define _POWERPC_BUS_SPACE_PRIVATE #include -#if defined (PPC_OEA) || defined (PPC_OEA64) || defined (PPC_OEA64_BRIDGE) +#if !defined (PPC_IBM4XX) #include #include #include +#include #include + +extern unsigned long oeacpufeat; #endif /* read_N */ @@ -564,29 +567,33 @@ memio_map(bus_space_tag_t t, bus_addr_t #endif pa = t->pbs_offset + bpa; -#ifdef PPC_OEA - if ((mfpvr() >> 16) != MPC601) { +#if defined (PPC_OEA) || defined(PPC_OEA601) +#ifdef PPC_OEA601 + if ((mfpvr() >> 16) == MPC601) { /* - * Let's try to BAT map this address if possible + * Map via the MPC601's I/O segments */ - register_t batu = battable[pa >> ADDR_SR_SHFT].batu; - if (BAT_VALID_P(batu, 0) && BAT_VA_MATCH_P(batu, pa) && - BAT_VA_MATCH_P(batu, pa + size - 1)) { + register_t sr = iosrtable[pa >> ADDR_SR_SHFT]; + if (SR601_VALID_P(sr) && ((pa >> ADDR_SR_SHFT) == + ((pa + size - 1) >> ADDR_SR_SHFT))) { *bshp = pa; return (0); - } - } else { + } + } else +#endif /* PPC_OEA601 */ + if ((oeacpufeat & OEACPU_NOBAT) == 0) { /* - * Same as above, but via the MPC601's I/O segments + * Let's try to BAT map this address if possible */ - register_t sr = iosrtable[pa >> ADDR_SR_SHFT]; - if (SR601_VALID_P(sr) && ((pa >> ADDR_SR_SHFT) == - ((pa + size - 1) >> ADDR_SR_SHFT))) { + register_t batu = battable[pa >> ADDR_SR_SHFT].batu; + if (BAT_VALID_P(batu, 0) && BAT_VA_MATCH_P(batu, pa) && + BAT_VA_MATCH_P(batu, pa + size - 1)) { *bshp = pa; return (0); } } -#endif +#endif /* defined (PPC_OEA) || defined(PPC_OEA601) */ + #ifndef PPC_IBM4XX if (extent_flags == 0) { extent_free(t->pbs_extent, bpa, size, EX_NOWAIT); @@ -630,17 +637,9 @@ memio_unmap(bus_space_tag_t t, bus_space size = _BUS_SPACE_STRIDE(t, size); -#if defined (PPC_OEA) && !defined (PPC_OEA64) && !defined (PPC_OEA64_BRIDGE) - if ((mfpvr() >> 16) != MPC601) { - register_t batu = battable[va >> ADDR_SR_SHFT].batu; - if (BAT_VALID_P(batu, 0) && BAT_VA_MATCH_P(batu, va) && - BAT_VA_MATCH_P(batu, va + size - 1)) { - pa = va; - va = 0; - } else { - pmap_extract(pmap_kernel(), va, &pa); - } - } else { +#if defined (PPC_OEA) || defined(PPC_OEA601) +#ifdef PPC_OEA601 + if ((mfpvr() >> 16) == MPC601) { register_t sr = iosrtable[va >> ADDR_SR_SHFT]; if (SR601_VALID_P(sr) && ((pa >> ADDR_SR_SHFT) == ((pa + size - 1) >> ADDR_SR_SHFT))) { @@ -649,10 +648,22 @@ memio_unmap(bus_space_tag_t t, bus_space } else { pmap_extract(pmap_kernel(), va, &pa); } - } + } else +#endif /* PPC_OEA601 */ + if ((oeacpufeat & OEACPU_NOBAT) == 0) { + register_t batu = battable[va >> ADDR_SR_SHFT].batu; + if (BAT_VALID_P(batu, 0) && BAT_VA_MATCH_P(batu, va) && + BAT_VA_MATCH_P(batu, va + size - 1)) { + pa = va; + va = 0; + } else { + pmap_extract(pmap_kernel(), va, &pa); + } + } else + pmap_extract(pmap_kernel(), va, &pa); #else pmap_extract(pmap_kernel(), va, &pa); -#endif +#endif /* defined (PPC_OEA) || defined(PPC_OEA601) */ bpa = pa - t->pbs_offset; if (extent_free(t->pbs_extent, bpa, size, EX_NOWAIT | extent_flags)) { @@ -698,23 +709,26 @@ memio_alloc(bus_space_tag_t t, bus_addr_ *bpap = bpa; pa = t->pbs_offset + bpa; -#if defined (PPC_OEA) && !defined (PPC_OEA64) && !defined (PPC_OEA64_BRIDGE) - if ((mfpvr() >> 16) != MPC601) { - register_t batu = battable[pa >> ADDR_SR_SHFT].batu; - if (BAT_VALID_P(batu, 0) && BAT_VA_MATCH_P(batu, pa) && - BAT_VA_MATCH_P(batu, pa + size - 1)) { - *bshp = pa; - return (0); - } - } else { +#if defined (PPC_OEA) || defined(PPC_OEA601) +#ifdef PPC_OEA601 + if ((mfpvr() >> 16) == MPC601) { register_t sr = iosrtable[pa >> ADDR_SR_SHFT]; if (SR601_VALID_P(sr) && SR601_PA_MATCH_P(sr, pa) && SR601_PA_MATCH_P(sr, pa + size - 1)) { *bshp = pa; return (0); } + } else +#endif /* PPC_OEA601 */ + if ((oeacpufeat & OEACPU_NOBAT) == 0) { + register_t batu = battable[pa >> ADDR_SR_SHFT].batu; + if (BAT_VALID_P(batu, 0) && BAT_VA_MATCH_P(batu, pa) && + BAT_VA_MATCH_P(batu, pa + size - 1)) { + *bshp = pa; + return (0); + } } -#endif +#endif /* defined (PPC_OEA) || defined(PPC_OEA601) */ *bshp = (bus_space_handle_t) mapiodev(pa, size); if (*bshp == 0) { extent_free(t->pbs_extent, bpa, size, EX_NOWAIT | extent_flags);