Module Name: src
Committed By: cliff
Date: Mon Nov 9 09:59:27 UTC 2009
Modified Files:
src/sys/arch/mips/mips [matt-nb5-mips64]:
bus_space_alignstride_chipdep.c
Log Message:
revamp read_[1,2,4,8] and write_[1,2,4,8] functions
- fix bug in read_8 when Little Endian, Access Size 1, Stride 0
- fix bug in write_1 when Little Endian, Access Size 4, Stride 0
- fix bug in read_8 when Little Endian, Access Size 4, Stride 0
- fix bug in read_2 when Big Endian, Access Size 1, Stride 0
- fix bug in read_4 when Big Endian, Access Size 1, Stride 0
- fix bug in read_8 when Big Endian, Access Size 1, Stride 0
- fix bug in write_1 when Big Endian, Access Size 4, Stride 0
- fix bug in write_2 when Big Endian, Access Size 4, Stride 0
- fix bug in read_8 when Big Endian, Access Size 4, Stride 0
To generate a diff of this commit:
cvs rdiff -u -r1.10.18.3 -r1.10.18.4 \
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.3 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.3 Tue Sep 22 07:20:39 2009
+++ src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c Mon Nov 9 09:59:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.3 2009/09/22 07:20:39 cliff Exp $ */
+/* $NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.4 2009/11/09 09:59: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.3 2009/09/22 07:20:39 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_space_alignstride_chipdep.c,v 1.10.18.4 2009/11/09 09:59:27 cliff Exp $");
#ifdef CHIP_EXTENT
#include <sys/extent.h>
@@ -384,6 +384,7 @@
#define CHIP_OFF64(o) (o)
#endif
+
void
__BS(init)(bus_space_tag_t t, void *v)
{
@@ -978,9 +979,15 @@
#else /* CHIP_ACCESS_SIZE > 1 */
volatile uint8_t *ptr;
#endif /* CHIP_ACCESS_SIZE > 1 */
+ uint8_t r;
+ int shift;
- ptr = (void *)(h + CHIP_OFF8(off));
- return (uint8_t)(CHIP_SWAP_ACCESS(*ptr) & 0xff);
+ h += CHIP_OFF8(off);
+ shift = (off & (CHIP_ACCESS_SIZE - 1)) * 8;
+ ptr = (void *)(h & ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1)));
+ r = (uint8_t)(CHIP_SWAP_ACCESS(*ptr) >> shift);
+
+ return r;
}
inline uint16_t
@@ -991,9 +998,16 @@
#else /* CHIP_ACCESS_SIZE > 2 */
volatile uint16_t *ptr;
#endif /* CHIP_ACCESS_SIZE > 2 */
+ uint16_t r;
+ int shift;
- ptr = (void *)(h + CHIP_OFF16(off));
- return (uint16_t)(CHIP_SWAP_ACCESS(*ptr) & 0xffff);
+ KASSERT((off & 1) == 0);
+ h += CHIP_OFF16(off);
+ shift = (off & (CHIP_ACCESS_SIZE - 1)) * 8;
+ ptr = (void *)(h & ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1)));
+ r = (uint16_t)CHIP_SWAP16(*ptr >> shift);
+
+ return r;
}
inline uint32_t
@@ -1004,18 +1018,32 @@
#else /* CHIP_ACCESS_SIZE > 4 */
volatile uint32_t *ptr;
#endif
+ uint32_t r;
+ int shift;
- ptr = (void *)(h + CHIP_OFF32(off));
- return (uint32_t)(CHIP_SWAP_ACCESS(*ptr) & 0xffffffff);
+ KASSERT((off & 3) == 0);
+ h += CHIP_OFF32(off);
+ shift = (off & (CHIP_ACCESS_SIZE - 1)) * 8;
+ ptr = (void *)(h & ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1)));
+ r = (uint32_t)CHIP_SWAP32(*ptr >> shift);
+
+ return r;
}
inline uint64_t
__BS(read_8)(void *v, bus_space_handle_t h, bus_size_t off)
{
volatile uint64_t *ptr;
+ volatile uint64_t r;
+ int shift;
- ptr = (void *)(h + CHIP_OFF64(off));
- return CHIP_SWAP64(*ptr);
+ KASSERT((off & 7) == 0);
+ h += CHIP_OFF64(off);
+ shift = (off & (CHIP_ACCESS_SIZE - 1)) * 8;
+ ptr = (void *)(h & ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1)));
+ r = CHIP_SWAP64(*ptr >> shift);
+
+ return r;
}
@@ -1052,6 +1080,7 @@
CHIP_read_region_N(4,uint32_t)
CHIP_read_region_N(8,uint64_t)
+
inline void
__BS(write_1)(void *v, bus_space_handle_t h, bus_size_t off, uint8_t val)
{
@@ -1060,9 +1089,12 @@
#else /* CHIP_ACCESS_SIZE > 1 */
volatile uint8_t *ptr;
#endif /* CHIP_ACCESS_SIZE > 1 */
+ int shift;
- ptr = (void *)(h + CHIP_OFF8(off));
- *ptr = CHIP_SWAP_ACCESS((CHIP_TYPE)val);
+ h += CHIP_OFF8(off);
+ shift = (off & (CHIP_ACCESS_SIZE - 1)) * 8;
+ ptr = (void *)(h & ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1)));
+ *ptr = CHIP_SWAP_ACCESS(((CHIP_TYPE)val) << shift);
}
inline void
@@ -1073,10 +1105,14 @@
#else /* CHIP_ACCESS_SIZE > 2 */
volatile uint16_t *ptr;
#endif /* CHIP_ACCESS_SIZE > 2 */
+ int shift;
- ptr = (void *)(h + CHIP_OFF16(off));
+ KASSERT((off & 1) == 0);
+ h += CHIP_OFF16(off);
+ shift = (off & (CHIP_ACCESS_SIZE - 1)) * 8;
+ ptr = (void *)(h & ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1)));
if (CHIP_ACCESS_SIZE > 2)
- *ptr = CHIP_SWAP_ACCESS((CHIP_TYPE)val);
+ *ptr = (CHIP_TYPE)(CHIP_SWAP16(val)) << shift;
else
*ptr = CHIP_SWAP16(val);
}
@@ -1089,21 +1125,29 @@
#else /* CHIP_ACCESS_SIZE > 4 */
volatile uint32_t *ptr;
#endif /* CHIP_ACCESS_SIZE > 4 */
+ int shift;
- ptr = (void *)(h + CHIP_OFF32(off));
- if (CHIP_ACCESS_SIZE > 4)
- *ptr = CHIP_SWAP_ACCESS((CHIP_TYPE)val);
- else
- *ptr = CHIP_SWAP32(val);
+ KASSERT((off & 3) == 0);
+ h += CHIP_OFF32(off);
+ shift = (off & (CHIP_ACCESS_SIZE - 1)) * 8;
+ ptr = (void *)(h & ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1)));
+ if (CHIP_ACCESS_SIZE > 4)
+ *ptr = (CHIP_TYPE)(CHIP_SWAP32(val)) << shift;
+ else
+ *ptr = CHIP_SWAP32(val);
}
inline void
__BS(write_8)(void *v, bus_space_handle_t h, bus_size_t off, uint64_t val)
{
volatile uint64_t *ptr;
+ int shift;
- ptr = (void *)(h + CHIP_OFF64(off));
- *ptr = CHIP_SWAP64(val);
+ KASSERT((off & 7) == 0);
+ h += CHIP_OFF64(off);
+ shift = (off & (CHIP_ACCESS_SIZE - 1)) * 8;
+ ptr = (void *)(h & ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1)));
+ *ptr = CHIP_SWAP64(val) << shift;
}
#define CHIP_write_multi_N(BYTES,TYPE) \