1/*
2 * Copyright 2022, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _FBSD_MACHINE_GENERIC_BUS_H_
6#define _FBSD_MACHINE_GENERIC_BUS_H_
7
8
9#include <machine/_bus.h>
10
11
12#define	BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
13
14#define	BUS_SPACE_MAXADDR_24BIT	0xFFFFFFUL
15#define	BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFFUL
16#define	BUS_SPACE_MAXSIZE_24BIT	0xFFFFFFUL
17#define	BUS_SPACE_MAXSIZE_32BIT	0xFFFFFFFFUL
18
19#define	BUS_SPACE_MAXADDR 	0xFFFFFFFFFFFFFFFFUL
20#define	BUS_SPACE_MAXSIZE 	0xFFFFFFFFFFFFFFFFUL
21
22#define BUS_SPACE_INVALID_DATA	(~0)
23#define BUS_SPACE_UNRESTRICTED	(~0)
24
25
26static __inline u_int8_t
27bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
28	bus_size_t offset)
29{
30	if (tag != BUS_SPACE_TAG_MEM)
31		return BUS_SPACE_INVALID_DATA;
32	return (*(volatile u_int8_t *)(handle + offset));
33}
34
35
36static __inline u_int16_t
37bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle,
38	bus_size_t offset)
39{
40	if (tag != BUS_SPACE_TAG_MEM)
41		return BUS_SPACE_INVALID_DATA;
42	return (*(volatile u_int16_t *)(handle + offset));
43}
44
45
46static __inline u_int32_t
47bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle,
48	bus_size_t offset)
49{
50	if (tag != BUS_SPACE_TAG_MEM)
51		return BUS_SPACE_INVALID_DATA;
52	return (*(volatile u_int32_t *)(handle + offset));
53}
54
55
56static __inline uint64_t
57bus_space_read_8(bus_space_tag_t tag, bus_space_handle_t handle,
58	bus_size_t offset)
59{
60	if (tag != BUS_SPACE_TAG_MEM)
61		return BUS_SPACE_INVALID_DATA;
62	return (*(volatile uint64_t *)(handle + offset));
63}
64
65
66static __inline void
67bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh,
68	bus_size_t offset, u_int8_t value)
69{
70	if (tag != BUS_SPACE_TAG_MEM)
71		return;
72	*(volatile u_int8_t *)(bsh + offset) = value;
73}
74
75
76static __inline void
77bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh,
78	bus_size_t offset, u_int16_t value)
79{
80	if (tag != BUS_SPACE_TAG_MEM)
81		return;
82	*(volatile u_int16_t *)(bsh + offset) = value;
83}
84
85
86static __inline void
87bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh,
88	bus_size_t offset, u_int32_t value)
89{
90	if (tag != BUS_SPACE_TAG_MEM)
91		return;
92	*(volatile u_int32_t *)(bsh + offset) = value;
93}
94
95
96static __inline void
97bus_space_write_8(bus_space_tag_t tag, bus_space_handle_t bsh,
98	bus_size_t offset, uint64_t value)
99{
100	if (tag != BUS_SPACE_TAG_MEM)
101		return;
102	*(volatile uint64_t *)(bsh + offset) = value;
103}
104
105
106static __inline void
107bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
108	bus_size_t offset, u_int8_t *addr, size_t count)
109{
110	for (; count > 0; offset += 1, addr++, count--)
111		*addr = bus_space_read_1(tag, bsh, offset);
112}
113
114
115static __inline void
116bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
117	bus_size_t offset, u_int16_t *addr, size_t count)
118{
119	for (; count > 0; offset += 2, addr++, count--)
120		*addr = bus_space_read_2(tag, bsh, offset);
121}
122
123
124static __inline void
125bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
126	bus_size_t offset, u_int32_t *addr, size_t count)
127{
128	for (; count > 0; offset += 4, addr++, count--)
129		*addr = bus_space_read_4(tag, bsh, offset);
130}
131
132
133static __inline void
134bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
135	bus_size_t offset, const u_int8_t *addr, size_t count)
136{
137	for (; count > 0; addr++, count--)
138		bus_space_write_1(tag, bsh, offset, *addr);
139}
140
141
142static __inline void
143bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
144	bus_size_t offset, const u_int16_t *addr, size_t count)
145{
146	for (; count > 0; addr++, count--)
147		bus_space_write_2(tag, bsh, offset, *addr);
148}
149
150
151static __inline void
152bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
153	bus_size_t offset, const u_int32_t *addr, size_t count)
154{
155	for (; count > 0; addr++, count--)
156		bus_space_write_4(tag, bsh, offset, *addr);
157}
158
159
160static __inline void
161bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
162	bus_size_t offset, const u_int8_t *addr, size_t count)
163{
164	for (; count > 0; offset += 1, addr++, count--)
165		bus_space_write_1(tag, bsh, offset, *addr);
166}
167
168
169static __inline void
170bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
171	bus_size_t offset, const u_int16_t *addr, size_t count)
172{
173	for (; count > 0; offset += 2, addr++, count--)
174		bus_space_write_2(tag, bsh, offset, *addr);
175}
176
177
178static __inline void
179bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
180	bus_size_t offset, const u_int32_t *addr, size_t count)
181{
182	for (; count > 0; offset += 4, addr++, count--)
183		bus_space_write_4(tag, bsh, offset, *addr);
184}
185
186
187static __inline void
188bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
189	bus_size_t offset, u_int8_t value, size_t count)
190{
191	for (; count > 0; count--)
192		bus_space_write_1(tag, bsh, offset, value);
193}
194
195
196static __inline void
197bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
198	bus_size_t offset, u_int16_t value, size_t count)
199{
200	for (; count > 0; count--)
201		bus_space_write_2(tag, bsh, offset, value);
202}
203
204
205static __inline void
206bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
207	bus_size_t offset, u_int32_t value, size_t count)
208{
209	for (; count > 0; count--)
210		bus_space_write_4(tag, bsh, offset, value);
211}
212
213
214#define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
215#define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
216
217
218static __inline void
219bus_space_barrier(bus_space_tag_t tag __unused, bus_space_handle_t bsh __unused,
220	bus_size_t offset __unused, bus_size_t len __unused, int flags)
221{
222	__compiler_membar();
223}
224
225
226#include <machine/bus_dma.h>
227
228/* Assume stream accesses are the same as normal accesses. */
229#define	bus_space_read_stream_1(t, h, o)	bus_space_read_1((t), (h), (o))
230#define	bus_space_read_stream_2(t, h, o)	bus_space_read_2((t), (h), (o))
231#define	bus_space_read_stream_4(t, h, o)	bus_space_read_4((t), (h), (o))
232
233#define	bus_space_read_multi_stream_1(t, h, o, a, c) \
234	bus_space_read_multi_1((t), (h), (o), (a), (c))
235#define	bus_space_read_multi_stream_2(t, h, o, a, c) \
236	bus_space_read_multi_2((t), (h), (o), (a), (c))
237#define	bus_space_read_multi_stream_4(t, h, o, a, c) \
238	bus_space_read_multi_4((t), (h), (o), (a), (c))
239
240#define	bus_space_write_stream_1(t, h, o, v) \
241	bus_space_write_1((t), (h), (o), (v))
242#define	bus_space_write_stream_2(t, h, o, v) \
243	bus_space_write_2((t), (h), (o), (v))
244#define	bus_space_write_stream_4(t, h, o, v) \
245	bus_space_write_4((t), (h), (o), (v))
246
247#define	bus_space_write_multi_stream_1(t, h, o, a, c) \
248	bus_space_write_multi_1((t), (h), (o), (a), (c))
249#define	bus_space_write_multi_stream_2(t, h, o, a, c) \
250	bus_space_write_multi_2((t), (h), (o), (a), (c))
251#define	bus_space_write_multi_stream_4(t, h, o, a, c) \
252	bus_space_write_multi_4((t), (h), (o), (a), (c))
253
254#define	bus_space_set_multi_stream_1(t, h, o, v, c) \
255	bus_space_set_multi_1((t), (h), (o), (v), (c))
256#define	bus_space_set_multi_stream_2(t, h, o, v, c) \
257	bus_space_set_multi_2((t), (h), (o), (v), (c))
258#define	bus_space_set_multi_stream_4(t, h, o, v, c) \
259	bus_space_set_multi_4((t), (h), (o), (v), (c))
260
261#define	bus_space_read_region_stream_1(t, h, o, a, c) \
262	bus_space_read_region_1((t), (h), (o), (a), (c))
263#define	bus_space_read_region_stream_2(t, h, o, a, c) \
264	bus_space_read_region_2((t), (h), (o), (a), (c))
265#define	bus_space_read_region_stream_4(t, h, o, a, c) \
266	bus_space_read_region_4((t), (h), (o), (a), (c))
267
268#define	bus_space_write_region_stream_1(t, h, o, a, c) \
269	bus_space_write_region_1((t), (h), (o), (a), (c))
270#define	bus_space_write_region_stream_2(t, h, o, a, c) \
271	bus_space_write_region_2((t), (h), (o), (a), (c))
272#define	bus_space_write_region_stream_4(t, h, o, a, c) \
273	bus_space_write_region_4((t), (h), (o), (a), (c))
274
275#define	bus_space_set_region_stream_1(t, h, o, v, c) \
276	bus_space_set_region_1((t), (h), (o), (v), (c))
277#define	bus_space_set_region_stream_2(t, h, o, v, c) \
278	bus_space_set_region_2((t), (h), (o), (v), (c))
279#define	bus_space_set_region_stream_4(t, h, o, v, c) \
280	bus_space_set_region_4((t), (h), (o), (v), (c))
281
282#define	bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c) \
283	bus_space_copy_region_1((t), (h1), (o1), (h2), (o2), (c))
284#define	bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \
285	bus_space_copy_region_2((t), (h1), (o1), (h2), (o2), (c))
286#define	bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \
287	bus_space_copy_region_4((t), (h1), (o1), (h2), (o2), (c))
288
289
290#endif /* _FBSD_MACHINE_GENERIC_BUS_H_ */
291