summaryrefslogtreecommitdiff
path: root/sys/arch/hpcsh/include/bus_util.h
blob: e81a6e2c499832ec6901dcb94ad19ace364bab8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef _SH3_BUS_UTIL_H_
#define _SH3_BUS_UTIL_H_
/*
 * Utility macros; INTERNAL USE ONLY.
 */

#define	__TYPENAME(BITS)	u_int##BITS##_t

#define _BUS_SPACE_READ(PREFIX, BYTES, BITS)				\
__TYPENAME(BITS)							\
PREFIX##_read_##BYTES(void *, bus_space_handle_t,  bus_size_t);		\
__TYPENAME(BITS)							\
PREFIX##_read_##BYTES(void *tag, bus_space_handle_t bsh,		\
		      bus_size_t offset)				\
{									\
	_BUS_SPACE_ACCESS_HOOK();					\
	return *(volatile __TYPENAME(BITS) *)(bsh + offset);		\
}

#define _BUS_SPACE_READ_MULTI(PREFIX, BYTES, BITS)			\
void								\
PREFIX##_read_multi_##BYTES(void *, bus_space_handle_t,	bus_size_t,	\
			    __TYPENAME(BITS) *,	bus_size_t);		\
void								\
PREFIX##_read_multi_##BYTES(void *tag, bus_space_handle_t bsh,		\
			    bus_size_t offset, __TYPENAME(BITS) *addr,	\
			    bus_size_t count)				\
{									\
	volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);		\
	_BUS_SPACE_ACCESS_HOOK();					\
	while (count--)							\
		*addr++ = *p;						\
}

#define _BUS_SPACE_READ_REGION(PREFIX, BYTES, BITS)			\
void								\
PREFIX##_read_region_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
			     __TYPENAME(BITS) *, bus_size_t);		\
void								\
PREFIX##_read_region_##BYTES(void *tag, bus_space_handle_t bsh,		\
			     bus_size_t offset, __TYPENAME(BITS) *addr,	\
			     bus_size_t count)				\
{									\
	volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);		\
	_BUS_SPACE_ACCESS_HOOK();					\
	while (count--)							\
		*addr++ = *p++;						\
}

#define _BUS_SPACE_WRITE(PREFIX, BYTES, BITS)				\
void								\
PREFIX##_write_##BYTES(void *, bus_space_handle_t, bus_size_t,		\
		       __TYPENAME(BITS));				\
void								\
PREFIX##_write_##BYTES(void *tag, bus_space_handle_t bsh,		\
		       bus_size_t offset, __TYPENAME(BITS) value)	\
{									\
	_BUS_SPACE_ACCESS_HOOK();					\
	*(volatile __TYPENAME(BITS) *)(bsh + offset) = value;		\
}

#define _BUS_SPACE_WRITE_MULTI(PREFIX, BYTES, BITS)			\
void								\
PREFIX##_write_multi_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
			     const __TYPENAME(BITS) *, bus_size_t);	\
void								\
PREFIX##_write_multi_##BYTES(void *tag, bus_space_handle_t bsh,		\
			     bus_size_t offset,				\
			     const __TYPENAME(BITS) *addr,		\
			     bus_size_t count)				\
{									\
	volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);		\
	_BUS_SPACE_ACCESS_HOOK();					\
	while (count--)							\
		*p = *addr++;						\
}

#define _BUS_SPACE_WRITE_REGION(PREFIX, BYTES, BITS)			\
void								\
PREFIX##_write_region_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
			      const __TYPENAME(BITS) *, bus_size_t);	\
void								\
PREFIX##_write_region_##BYTES(void *tag, bus_space_handle_t bsh,	\
			      bus_size_t offset,			\
			      const __TYPENAME(BITS) *addr,		\
			      bus_size_t count)				\
{									\
	volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);		\
	_BUS_SPACE_ACCESS_HOOK();					\
	while (count--)							\
		*p++ = *addr++;						\
}

#define _BUS_SPACE_SET_MULTI(PREFIX, BYTES, BITS)			\
void								\
PREFIX##_set_multi_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
			   __TYPENAME(BITS), bus_size_t);		\
void								\
PREFIX##_set_multi_##BYTES(void *tag, bus_space_handle_t bsh,		\
			   bus_size_t offset, __TYPENAME(BITS) value,	\
			   bus_size_t count)				\
{									\
	volatile __TYPENAME(BITS) *p = (void *)(bsh + offset);		\
	_BUS_SPACE_ACCESS_HOOK();					\
	while (count--)							\
		*p = value;						\
}

#define _BUS_SPACE_COPY_REGION(PREFIX, BYTES, BITS)			\
void								\
PREFIX##_copy_region_##BYTES(void *, bus_space_handle_t, bus_size_t,	\
			     bus_space_handle_t, bus_size_t,		\
			     bus_size_t);				\
void								\
PREFIX##_copy_region_##BYTES(void *t, bus_space_handle_t h1,		\
			     bus_size_t o1, bus_space_handle_t h2,	\
			     bus_size_t o2, bus_size_t c)		\
{									\
	volatile __TYPENAME(BITS) *addr1 = (void *)(h1 + o1);		\
	volatile __TYPENAME(BITS) *addr2 = (void *)(h2 + o2);		\
	_BUS_SPACE_ACCESS_HOOK();					\
									\
	if (addr1 >= addr2) {	/* src after dest: copy forward */	\
		while (c--)						\
			*addr2++ = *addr1++;				\
	} else {		/* dest after src: copy backwards */	\
		addr1 += c - 1;						\
		addr2 += c - 1;						\
		while (c--)						\
			*addr2-- = *addr1--;				\
	}								\
}
#endif /* _SH3_BUS_UTIL_H_ */