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)							\
11PREFIX##_read_##BYTES(void *, bus_space_handle_t,  bus_size_t);		\
12__TYPENAME(BITS)							\
13PREFIX##_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)			\
21void								\
22PREFIX##_read_multi_##BYTES(void *, bus_space_handle_t,	bus_size_t,	\
23			    __TYPENAME(BITS) *,	bus_size_t);		\
24void								\
25PREFIX##_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)			\
36void								\
37PREFIX##_read_region_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
38			     __TYPENAME(BITS) *, bus_size_t);		\
39void								\
40PREFIX##_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)				\
51void								\
52PREFIX##_write_##BYTES(void *, bus_space_handle_t, bus_size_t,		\
53		       __TYPENAME(BITS));				\
54void								\
55PREFIX##_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)			\
63void								\
64PREFIX##_write_multi_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
65			     const __TYPENAME(BITS) *, bus_size_t);	\
66void								\
67PREFIX##_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)			\
79void								\
80PREFIX##_write_region_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
81			      const __TYPENAME(BITS) *, bus_size_t);	\
82void								\
83PREFIX##_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)			\
95void								\
96PREFIX##_set_multi_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
97			   __TYPENAME(BITS), bus_size_t);		\
98void								\
99PREFIX##_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)			\
110void								\
111PREFIX##_copy_region_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
112			     bus_space_handle_t, bus_size_t,		\
113			     bus_size_t);				\
114void								\
115PREFIX##_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