1 #ifndef _SH3_BUS_UTIL_H_
2 #define _SH3_BUS_UTIL_H_
3 /*
4  * Utility macros; INTERNAL USE ONLY.
5  */
6 
7 #define   __TYPENAME(BITS)    u_int##BITS##_t
8 
9 #define _BUS_SPACE_READ(PREFIX, BYTES, BITS)                                    \
10 __TYPENAME(BITS)                                                                \
11 PREFIX##_read_##BYTES(void *, bus_space_handle_t,  bus_size_t);                 \
12 __TYPENAME(BITS)                                                                \
13 PREFIX##_read_##BYTES(void *tag, bus_space_handle_t bsh,              \
14                           bus_size_t offset)                                    \
15 {                                                                                         \
16           _BUS_SPACE_ACCESS_HOOK();                                             \
17           return *(volatile __TYPENAME(BITS) *)(bsh + offset);                  \
18 }
19 
20 #define _BUS_SPACE_READ_MULTI(PREFIX, BYTES, BITS)                              \
21 void                                                                            \
22 PREFIX##_read_multi_##BYTES(void *, bus_space_handle_t,     bus_size_t,         \
23                                   __TYPENAME(BITS) *,       bus_size_t);                  \
24 void                                                                            \
25 PREFIX##_read_multi_##BYTES(void *tag, bus_space_handle_t bsh,                  \
26                                   bus_size_t offset, __TYPENAME(BITS) *addr,    \
27                                   bus_size_t count)                                       \
28 {                                                                                         \
29           volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);                \
30           _BUS_SPACE_ACCESS_HOOK();                                             \
31           while (count--)                                                                 \
32                     *addr++ = *p;                                                         \
33 }
34 
35 #define _BUS_SPACE_READ_REGION(PREFIX, BYTES, BITS)                             \
36 void                                                                            \
37 PREFIX##_read_region_##BYTES(void *, bus_space_handle_t, bus_size_t,  \
38                                    __TYPENAME(BITS) *, bus_size_t);             \
39 void                                                                            \
40 PREFIX##_read_region_##BYTES(void *tag, bus_space_handle_t bsh,                 \
41                                    bus_size_t offset, __TYPENAME(BITS) *addr,   \
42                                    bus_size_t count)                                      \
43 {                                                                                         \
44           volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);                \
45           _BUS_SPACE_ACCESS_HOOK();                                             \
46           while (count--)                                                                 \
47                     *addr++ = *p++;                                                       \
48 }
49 
50 #define _BUS_SPACE_WRITE(PREFIX, BYTES, BITS)                                   \
51 void                                                                            \
52 PREFIX##_write_##BYTES(void *, bus_space_handle_t, bus_size_t,                  \
53                            __TYPENAME(BITS));                                   \
54 void                                                                            \
55 PREFIX##_write_##BYTES(void *tag, bus_space_handle_t bsh,             \
56                            bus_size_t offset, __TYPENAME(BITS) value) \
57 {                                                                                         \
58           _BUS_SPACE_ACCESS_HOOK();                                             \
59           *(volatile __TYPENAME(BITS) *)(bsh + offset) = value;                 \
60 }
61 
62 #define _BUS_SPACE_WRITE_MULTI(PREFIX, BYTES, BITS)                             \
63 void                                                                            \
64 PREFIX##_write_multi_##BYTES(void *, bus_space_handle_t, bus_size_t,  \
65                                    const __TYPENAME(BITS) *, bus_size_t);       \
66 void                                                                            \
67 PREFIX##_write_multi_##BYTES(void *tag, bus_space_handle_t bsh,                 \
68                                    bus_size_t offset,                                     \
69                                    const __TYPENAME(BITS) *addr,                \
70                                    bus_size_t count)                                      \
71 {                                                                                         \
72           volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);                \
73           _BUS_SPACE_ACCESS_HOOK();                                             \
74           while (count--)                                                                 \
75                     *p = *addr++;                                                         \
76 }
77 
78 #define _BUS_SPACE_WRITE_REGION(PREFIX, BYTES, BITS)                            \
79 void                                                                            \
80 PREFIX##_write_region_##BYTES(void *, bus_space_handle_t, bus_size_t, \
81                                     const __TYPENAME(BITS) *, bus_size_t);      \
82 void                                                                            \
83 PREFIX##_write_region_##BYTES(void *tag, bus_space_handle_t bsh,      \
84                                     bus_size_t offset,                          \
85                                     const __TYPENAME(BITS) *addr,               \
86                                     bus_size_t count)                                     \
87 {                                                                                         \
88           volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);                \
89           _BUS_SPACE_ACCESS_HOOK();                                             \
90           while (count--)                                                                 \
91                     *p++ = *addr++;                                                       \
92 }
93 
94 #define _BUS_SPACE_SET_MULTI(PREFIX, BYTES, BITS)                     \
95 void                                                                            \
96 PREFIX##_set_multi_##BYTES(void *, bus_space_handle_t, bus_size_t,    \
97                                  __TYPENAME(BITS), bus_size_t);                 \
98 void                                                                            \
99 PREFIX##_set_multi_##BYTES(void *tag, bus_space_handle_t bsh,                   \
100                                  bus_size_t offset, __TYPENAME(BITS) value,     \
101                                  bus_size_t count)                                        \
102 {                                                                                         \
103           volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);                \
104           _BUS_SPACE_ACCESS_HOOK();                                             \
105           while (count--)                                                                 \
106                     *p = value;                                                           \
107 }
108 
109 #define _BUS_SPACE_COPY_REGION(PREFIX, BYTES, BITS)                             \
110 void                                                                            \
111 PREFIX##_copy_region_##BYTES(void *, bus_space_handle_t, bus_size_t,  \
112                                    bus_space_handle_t, bus_size_t,              \
113                                    bus_size_t);                                 \
114 void                                                                            \
115 PREFIX##_copy_region_##BYTES(void *t, bus_space_handle_t h1,                    \
116                                    bus_size_t o1, bus_space_handle_t h2,        \
117                                    bus_size_t o2, bus_size_t c)                 \
118 {                                                                                         \
119           volatile __TYPENAME(BITS) *addr1 = (void *)(h1 + o1);                 \
120           volatile __TYPENAME(BITS) *addr2 = (void *)(h2 + o2);                 \
121           _BUS_SPACE_ACCESS_HOOK();                                             \
122                                                                                           \
123           if (addr1 >= addr2) {         /* src after dest: copy forward */      \
124                     while (c--)                                                           \
125                               *addr2++ = *addr1++;                                        \
126           } else {            /* dest after src: copy backwards */    \
127                     addr1 += c - 1;                                                       \
128                     addr2 += c - 1;                                                       \
129                     while (c--)                                                           \
130                               *addr2-- = *addr1--;                                        \
131           }                                                                               \
132 }
133 #endif /* _SH3_BUS_UTIL_H_ */
134