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)					\

Reply via email to