xref: /netbsd-src/sys/arch/hpcsh/include/bus_util.h (revision 5e9249a6599d70822ea01507565a57e586b31ecb)
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