Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/mac68k Add byte-swap and stride options to bus_spac...



details:   https://anonhg.NetBSD.org/src/rev/1898ccc2610b
branches:  trunk
changeset: 495526:1898ccc2610b
user:      briggs <briggs%NetBSD.org@localhost>
date:      Sun Jul 30 21:38:02 2000 +0000

description:
Add byte-swap and stride options to bus_space.  Allocate as normal, then
call mac68k_bus_space_handle_swapped() or mac68k_bus_space_handle_set_stride().
Stride is untested.  Swapped code works for SMC ethernet.

diffstat:

 sys/arch/mac68k/include/bus.h      |  478 ++++++++----------
 sys/arch/mac68k/mac68k/bus_space.c |  926 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 1135 insertions(+), 269 deletions(-)

diffs (truncated from 1529 to 300 lines):

diff -r d1ad3b77d241 -r 1898ccc2610b sys/arch/mac68k/include/bus.h
--- a/sys/arch/mac68k/include/bus.h     Sun Jul 30 21:36:04 2000 +0000
+++ b/sys/arch/mac68k/include/bus.h     Sun Jul 30 21:38:02 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: bus.h,v 1.13 2000/01/25 22:13:22 drochner Exp $        */
+/*     $NetBSD: bus.h,v 1.14 2000/07/30 21:38:02 briggs Exp $  */
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -80,8 +80,68 @@
 /*
  * Access methods for bus resources and address space.
  */
+#define BUS_SPACE_HANDLE_T     struct bus_space_handle_s
 typedef int    bus_space_tag_t;
-typedef u_long bus_space_handle_t;
+typedef struct bus_space_handle_s {
+       u_long  base;
+       int     swapped;
+       int     stride;
+       
+       u_int8_t        (*bsr1) __P((bus_space_tag_t t,
+                                       BUS_SPACE_HANDLE_T *h, bus_size_t o));
+       u_int16_t       (*bsr2) __P((bus_space_tag_t t,
+                                       BUS_SPACE_HANDLE_T *h, bus_size_t o));
+       u_int32_t       (*bsr4) __P((bus_space_tag_t t,
+                                       BUS_SPACE_HANDLE_T *h, bus_size_t o));
+       void            (*bsrm1) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int8_t *a, size_t c));
+       void            (*bsrm2) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+       void            (*bsrm4) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
+       void            (*bsrr1) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int8_t *a, size_t c));
+       void            (*bsrr2) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+       void            (*bsrr4) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
+       void            (*bsw1) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                 bus_size_t o, u_int8_t v));
+       void            (*bsw2) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                 bus_size_t o, u_int16_t v));
+       void            (*bsw4) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                 bus_size_t o, u_int32_t v));
+       void            (*bswm1) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int8_t *a, size_t c));
+       void            (*bswm2) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+       void            (*bswm4) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
+       void            (*bswr1) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int8_t *a, size_t c));
+       void            (*bswr2) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+       void            (*bswr4) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
+       void            (*bssm1) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int8_t v, size_t c));
+       void            (*bssm2) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int16_t v, size_t c));
+       void            (*bssm4) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int32_t v, size_t c));
+       void            (*bssr1) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int8_t v, size_t c));
+       void            (*bssr2) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int16_t v, size_t c));
+       void            (*bssr4) __P((bus_space_tag_t t, BUS_SPACE_HANDLE_T *h,
+                                  bus_size_t o, u_int32_t v, size_t c));
+} bus_space_handle_t;
+#undef BUS_SPACE_HANDLE_T
+
+void   mac68k_bus_space_handle_swapped __P((bus_space_tag_t t,
+               bus_space_handle_t *h));
+void   mac68k_bus_space_handle_set_stride __P((bus_space_tag_t t,
+               bus_space_handle_t *h, int stride));
 
 /*
  *     int bus_space_map __P((bus_space_tag_t t, bus_addr_t addr,
@@ -162,14 +222,26 @@
  * described by tag/handle/offset.
  */
 
-#define        bus_space_read_1(t, h, o)                                       \
-    ((void) t, (*(volatile u_int8_t *)((h) + (o))))
+u_int8_t mac68k_bsr1 __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                          bus_size_t offset));
+u_int8_t mac68k_bsr1_gen __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                          bus_size_t offset));
+u_int16_t mac68k_bsr2 __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                          bus_size_t offset));
+u_int16_t mac68k_bsr2_swap __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                               bus_size_t offset));
+u_int16_t mac68k_bsr2_gen __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                               bus_size_t offset));
+u_int32_t mac68k_bsr4 __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                          bus_size_t offset));
+u_int32_t mac68k_bsr4_swap __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                               bus_size_t offset));
+u_int32_t mac68k_bsr4_gen __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                               bus_size_t offset));
 
-#define        bus_space_read_2(t, h, o)                                       \
-    ((void) t, (*(volatile u_int16_t *)((h) + (o))))
-
-#define        bus_space_read_4(t, h, o)                                       \
-    ((void) t, (*(volatile u_int32_t *)((h) + (o))))
+#define        bus_space_read_1(t,h,o) (h).bsr1((t), &(h), (o))
+#define        bus_space_read_2(t,h,o) (h).bsr2((t), &(h), (o))
+#define        bus_space_read_4(t,h,o) (h).bsr4((t), &(h), (o))
 
 #if 0  /* Cause a link error for bus_space_read_8 */
 #define        bus_space_read_8(t, h, o)       !!! bus_space_read_8 unimplemented !!!
@@ -184,47 +256,26 @@
  * described by tag/handle/offset and copy into buffer provided.
  */
 
-#define        bus_space_read_multi_1(t, h, o, a, c) do {                      \
-       (void) t;                                                       \
-       __asm __volatile ("                                             \
-               movl    %0,a0                                   ;       \
-               movl    %1,a1                                   ;       \
-               movl    %2,d0                                   ;       \
-       1:      movb    a0@,a1@+                                ;       \
-               subql   #1,d0                                   ;       \
-               jne     1b"                                     :       \
-                                                               :       \
-                   "r" ((h) + (o)), "g" (a), "g" ((size_t)(c)) :       \
-                   "a0","a1","d0");                                    \
-} while (0)
+void mac68k_bsrm1 __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int8_t *a, size_t c));
+void mac68k_bsrm1_gen __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int8_t *a, size_t c));
+void mac68k_bsrm2 __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+void mac68k_bsrm2_swap __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+void mac68k_bsrm2_gen __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+void mac68k_bsrm4 __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
+void mac68k_bsrm4_swap __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
+void mac68k_bsrm4_gen __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
 
-#define        bus_space_read_multi_2(t, h, o, a, c) do {                      \
-       (void) t;                                                       \
-       __asm __volatile ("                                             \
-               movl    %0,a0                                   ;       \
-               movl    %1,a1                                   ;       \
-               movl    %2,d0                                   ;       \
-       1:      movw    a0@,a1@+                                ;       \
-               subql   #1,d0                                   ;       \
-               jne     1b"                                     :       \
-                                                               :       \
-                   "r" ((h) + (o)), "g" (a), "g" ((size_t)(c)) :       \
-                   "a0","a1","d0");                                    \
-} while (0)
-
-#define        bus_space_read_multi_4(t, h, o, a, c) do {                      \
-       (void) t;                                                       \
-       __asm __volatile ("                                             \
-               movl    %0,a0                                   ;       \
-               movl    %1,a1                                   ;       \
-               movl    %2,d0                                   ;       \
-       1:      movl    a0@,a1@+                                ;       \
-               subql   #1,d0                                   ;       \
-               jne     1b"                                     :       \
-                                                               :       \
-                   "r" ((h) + (o)), "g" (a), "g" ((size_t)(c)) :       \
-                   "a0","a1","d0");                                    \
-} while (0)
+#define        bus_space_read_multi_1(t, h, o, a, c) (h).bsrm1(t, &(h), o, a, c)
+#define        bus_space_read_multi_2(t, h, o, a, c) (h).bsrm2(t, &(h), o, a, c)
+#define        bus_space_read_multi_4(t, h, o, a, c) (h).bsrm4(t, &(h), o, a, c)
 
 #if 0  /* Cause a link error for bus_space_read_multi_8 */
 #define        bus_space_read_multi_8  !!! bus_space_read_multi_8 unimplemented !!!
@@ -240,47 +291,26 @@
  * buffer provided.
  */
 
-#define        bus_space_read_region_1(t, h, o, a, c) do {                     \
-       (void) t;                                                       \
-       __asm __volatile ("                                             \
-               movl    %0,a0                                   ;       \
-               movl    %1,a1                                   ;       \
-               movl    %2,d0                                   ;       \
-       1:      movb    a0@+,a1@+                               ;       \
-               subql   #1,d0                                   ;       \
-               jne     1b"                                     :       \
-                                                               :       \
-                   "r" ((h) + (o)), "g" (a), "g" ((size_t)(c)) :       \
-                   "a0","a1","d0");                                    \
-} while (0)
+void mac68k_bsrr1 __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int8_t *a, size_t c));
+void mac68k_bsrr1_gen __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int8_t *a, size_t c));
+void mac68k_bsrr2 __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+void mac68k_bsrr2_swap __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+void mac68k_bsrr2_gen __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int16_t *a, size_t c));
+void mac68k_bsrr4 __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
+void mac68k_bsrr4_swap __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
+void mac68k_bsrr4_gen __P((bus_space_tag_t t, bus_space_handle_t *h,
+                                  bus_size_t o, u_int32_t *a, size_t c));
 
-#define        bus_space_read_region_2(t, h, o, a, c) do {                     \
-       (void) t;                                                       \
-       __asm __volatile ("                                             \
-               movl    %0,a0                                   ;       \
-               movl    %1,a1                                   ;       \
-               movl    %2,d0                                   ;       \
-       1:      movw    a0@+,a1@+                               ;       \
-               subql   #1,d0                                   ;       \
-               jne     1b"                                     :       \
-                                                               :       \
-                   "r" ((h) + (o)), "g" (a), "g" ((size_t)(c)) :       \
-                   "a0","a1","d0");                                    \
-} while (0)
-
-#define        bus_space_read_region_4(t, h, o, a, c) do {                     \
-       (void) t;                                                       \
-       __asm __volatile ("                                             \
-               movl    %0,a0                                   ;       \
-               movl    %1,a1                                   ;       \
-               movl    %2,d0                                   ;       \
-       1:      movl    a0@+,a1@+                               ;       \
-               subql   #1,d0                                   ;       \
-               jne     1b"                                     :       \
-                                                               :       \
-                   "r" ((h) + (o)), "g" (a), "g" ((size_t)(c)) :       \
-                   "a0","a1","d0");                                    \
-} while (0)
+#define        bus_space_read_region_1(t, h, o, a, c) (h).bsrr1(t,&(h),o,a,c)
+#define        bus_space_read_region_2(t, h, o, a, c) (h).bsrr2(t,&(h),o,a,c)
+#define        bus_space_read_region_4(t, h, o, a, c) (h).bsrr4(t,&(h),o,a,c)
 
 #if 0  /* Cause a link error for bus_space_read_region_8 */
 #define        bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!!
@@ -295,14 +325,26 @@
  * described by tag/handle/offset.
  */
 
-#define        bus_space_write_1(t, h, o, v)                                   \
-    ((void) t, ((void)(*(volatile u_int8_t *)((h) + (o)) = (v))))
+void mac68k_bsw1 __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                          bus_size_t offset, u_int8_t v));
+void mac68k_bsw1_gen __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                          bus_size_t offset, u_int8_t v));
+void mac68k_bsw2 __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                          bus_size_t offset, u_int16_t v));
+void mac68k_bsw2_swap __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                               bus_size_t offset, u_int16_t v));
+void mac68k_bsw2_gen __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                               bus_size_t offset, u_int16_t v));
+void mac68k_bsw4 __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                          bus_size_t offset, u_int32_t v));
+void mac68k_bsw4_swap __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                               bus_size_t offset, u_int32_t v));
+void mac68k_bsw4_gen __P((bus_space_tag_t tag, bus_space_handle_t *bsh,
+                               bus_size_t offset, u_int32_t v));
 
-#define        bus_space_write_2(t, h, o, v)                                   \
-    ((void) t, ((void)(*(volatile u_int16_t *)((h) + (o)) = (v))))
-
-#define        bus_space_write_4(t, h, o, v)                                   \
-    ((void) t, ((void)(*(volatile u_int32_t *)((h) + (o)) = (v))))
+#define        bus_space_write_1(t, h, o, v) (h).bsw1(t, &(h), o, v)
+#define        bus_space_write_2(t, h, o, v) (h).bsw2(t, &(h), o, v)
+#define        bus_space_write_4(t, h, o, v) (h).bsw4(t, &(h), o, v)
 
 #if 0  /* Cause a link error for bus_space_write_8 */
 #define        bus_space_write_8       !!! bus_space_write_8 not implemented !!!
@@ -317,47 +359,26 @@
  * provided to bus space described by tag/handle/offset.
  */
 
-#define        bus_space_write_multi_1(t, h, o, a, c) do {                     \
-       (void) t;                                                       \
-       __asm __volatile ("                                             \
-               movl    %0,a0                                   ;       \
-               movl    %1,a1                                   ;       \
-               movl    %2,d0                                   ;       \
-       1:      movb    a1@+,a0@                                ;       \
-               subql   #1,d0                                   ;       \
-               jne     1b"                                     :       \
-                                                               :       \
-                   "r" ((h) + (o)), "g" (a), "g" ((size_t)(c)) :       \
-                   "a0","a1","d0");                                    \
-} while (0)
+void mac68k_bswm1 __P((bus_space_tag_t t, bus_space_handle_t *h,
+                          bus_size_t o, u_int8_t *a, size_t c));



Home | Main Index | Thread Index | Old Index