Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/arm/include/bus.h
39478 views
1
/* $NetBSD: bus.h,v 1.11 2003/07/28 17:35:54 thorpej Exp $ */
2
3
/*-
4
* Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
5
* All rights reserved.
6
*
7
* This code is derived from software contributed to The NetBSD Foundation
8
* by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9
* NASA Ames Research Center.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
*
20
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
* POSSIBILITY OF SUCH DAMAGE.
31
*/
32
33
/*-
34
* SPDX-License-Identifier: BSD-4-Clause
35
*
36
* Copyright (c) 1996 Charles M. Hannum. All rights reserved.
37
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
38
*
39
* Redistribution and use in source and binary forms, with or without
40
* modification, are permitted provided that the following conditions
41
* are met:
42
* 1. Redistributions of source code must retain the above copyright
43
* notice, this list of conditions and the following disclaimer.
44
* 2. Redistributions in binary form must reproduce the above copyright
45
* notice, this list of conditions and the following disclaimer in the
46
* documentation and/or other materials provided with the distribution.
47
* 3. All advertising materials mentioning features or use of this software
48
* must display the following acknowledgement:
49
* This product includes software developed by Christopher G. Demetriou
50
* for the NetBSD Project.
51
* 4. The name of the author may not be used to endorse or promote products
52
* derived from this software without specific prior written permission
53
*
54
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
55
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
56
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
57
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
58
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
59
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
60
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
61
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
63
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64
*/
65
66
#ifndef _MACHINE_BUS_H_
67
#define _MACHINE_BUS_H_
68
69
#include <machine/_bus.h>
70
71
/*
72
* int bus_space_map (bus_space_tag_t t, bus_addr_t addr,
73
* bus_size_t size, int flags, bus_space_handle_t *bshp);
74
*
75
* Map a region of bus space.
76
*/
77
78
#define BUS_SPACE_MAP_CACHEABLE 0x01
79
#define BUS_SPACE_MAP_LINEAR 0x02
80
#define BUS_SPACE_MAP_PREFETCHABLE 0x04
81
82
/*
83
* Bus space for ARM.
84
*
85
* The functions used most often are grouped together at the beginning to ensure
86
* that all the data fits into a single cache line. The inline implementations
87
* of single read/write access these values a lot.
88
*/
89
struct bus_space {
90
/* Read/write single and barrier: the most commonly used functions. */
91
uint8_t (*bs_r_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
92
uint32_t (*bs_r_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
93
void (*bs_w_1)(bus_space_tag_t, bus_space_handle_t,
94
bus_size_t, uint8_t);
95
void (*bs_w_4)(bus_space_tag_t, bus_space_handle_t,
96
bus_size_t, uint32_t);
97
void (*bs_barrier)(bus_space_tag_t, bus_space_handle_t,
98
bus_size_t, bus_size_t, int);
99
100
/* Backlink to parent (if copied), and implementation private data. */
101
struct bus_space *bs_parent;
102
void *bs_privdata;
103
104
/* mapping/unmapping */
105
int (*bs_map) (bus_space_tag_t, bus_addr_t, bus_size_t,
106
int, bus_space_handle_t *);
107
void (*bs_unmap) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
108
int (*bs_subregion) (bus_space_tag_t, bus_space_handle_t,
109
bus_size_t, bus_size_t, bus_space_handle_t *);
110
111
/* allocation/deallocation */
112
int (*bs_alloc) (bus_space_tag_t, bus_addr_t, bus_addr_t,
113
bus_size_t, bus_size_t, bus_size_t, int,
114
bus_addr_t *, bus_space_handle_t *);
115
void (*bs_free) (bus_space_tag_t, bus_space_handle_t,
116
bus_size_t);
117
118
/* Read single, the less commonly used functions. */
119
uint16_t (*bs_r_2) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
120
uint64_t (*bs_r_8) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
121
122
/* read multiple */
123
void (*bs_rm_1) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
124
uint8_t *, bus_size_t);
125
void (*bs_rm_2) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
126
uint16_t *, bus_size_t);
127
void (*bs_rm_4) (bus_space_tag_t, bus_space_handle_t,
128
bus_size_t, uint32_t *, bus_size_t);
129
void (*bs_rm_8) (bus_space_tag_t, bus_space_handle_t,
130
bus_size_t, uint64_t *, bus_size_t);
131
132
/* read region */
133
void (*bs_rr_1) (bus_space_tag_t, bus_space_handle_t,
134
bus_size_t, uint8_t *, bus_size_t);
135
void (*bs_rr_2) (bus_space_tag_t, bus_space_handle_t,
136
bus_size_t, uint16_t *, bus_size_t);
137
void (*bs_rr_4) (bus_space_tag_t, bus_space_handle_t,
138
bus_size_t, uint32_t *, bus_size_t);
139
void (*bs_rr_8) (bus_space_tag_t, bus_space_handle_t,
140
bus_size_t, uint64_t *, bus_size_t);
141
142
/* Write single, the less commonly used functions. */
143
void (*bs_w_2) (bus_space_tag_t, bus_space_handle_t,
144
bus_size_t, uint16_t);
145
void (*bs_w_8) (bus_space_tag_t, bus_space_handle_t,
146
bus_size_t, uint64_t);
147
148
/* write multiple */
149
void (*bs_wm_1) (bus_space_tag_t, bus_space_handle_t,
150
bus_size_t, const uint8_t *, bus_size_t);
151
void (*bs_wm_2) (bus_space_tag_t, bus_space_handle_t,
152
bus_size_t, const uint16_t *, bus_size_t);
153
void (*bs_wm_4) (bus_space_tag_t, bus_space_handle_t,
154
bus_size_t, const uint32_t *, bus_size_t);
155
void (*bs_wm_8) (bus_space_tag_t, bus_space_handle_t,
156
bus_size_t, const uint64_t *, bus_size_t);
157
158
/* write region */
159
void (*bs_wr_1) (bus_space_tag_t, bus_space_handle_t,
160
bus_size_t, const uint8_t *, bus_size_t);
161
void (*bs_wr_2) (bus_space_tag_t, bus_space_handle_t,
162
bus_size_t, const uint16_t *, bus_size_t);
163
void (*bs_wr_4) (bus_space_tag_t, bus_space_handle_t,
164
bus_size_t, const uint32_t *, bus_size_t);
165
void (*bs_wr_8) (bus_space_tag_t, bus_space_handle_t,
166
bus_size_t, const uint64_t *, bus_size_t);
167
168
/* set multiple */
169
void (*bs_sm_1) (bus_space_tag_t, bus_space_handle_t,
170
bus_size_t, uint8_t, bus_size_t);
171
void (*bs_sm_2) (bus_space_tag_t, bus_space_handle_t,
172
bus_size_t, uint16_t, bus_size_t);
173
void (*bs_sm_4) (bus_space_tag_t, bus_space_handle_t,
174
bus_size_t, uint32_t, bus_size_t);
175
void (*bs_sm_8) (bus_space_tag_t, bus_space_handle_t,
176
bus_size_t, uint64_t, bus_size_t);
177
178
/* set region */
179
void (*bs_sr_1) (bus_space_tag_t, bus_space_handle_t,
180
bus_size_t, uint8_t, bus_size_t);
181
void (*bs_sr_2) (bus_space_tag_t, bus_space_handle_t,
182
bus_size_t, uint16_t, bus_size_t);
183
void (*bs_sr_4) (bus_space_tag_t, bus_space_handle_t,
184
bus_size_t, uint32_t, bus_size_t);
185
void (*bs_sr_8) (bus_space_tag_t, bus_space_handle_t,
186
bus_size_t, uint64_t, bus_size_t);
187
188
/* copy */
189
void (*bs_c_1) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
190
bus_space_handle_t, bus_size_t, bus_size_t);
191
void (*bs_c_2) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
192
bus_space_handle_t, bus_size_t, bus_size_t);
193
void (*bs_c_4) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
194
bus_space_handle_t, bus_size_t, bus_size_t);
195
void (*bs_c_8) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
196
bus_space_handle_t, bus_size_t, bus_size_t);
197
198
/* read stream (single) */
199
uint8_t (*bs_r_1_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
200
uint16_t (*bs_r_2_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
201
uint32_t (*bs_r_4_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
202
uint64_t (*bs_r_8_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t);
203
204
/* read multiple stream */
205
void (*bs_rm_1_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
206
uint8_t *, bus_size_t);
207
void (*bs_rm_2_s) (bus_space_tag_t, bus_space_handle_t, bus_size_t,
208
uint16_t *, bus_size_t);
209
void (*bs_rm_4_s) (bus_space_tag_t, bus_space_handle_t,
210
bus_size_t, uint32_t *, bus_size_t);
211
void (*bs_rm_8_s) (bus_space_tag_t, bus_space_handle_t,
212
bus_size_t, uint64_t *, bus_size_t);
213
214
/* read region stream */
215
void (*bs_rr_1_s) (bus_space_tag_t, bus_space_handle_t,
216
bus_size_t, uint8_t *, bus_size_t);
217
void (*bs_rr_2_s) (bus_space_tag_t, bus_space_handle_t,
218
bus_size_t, uint16_t *, bus_size_t);
219
void (*bs_rr_4_s) (bus_space_tag_t, bus_space_handle_t,
220
bus_size_t, uint32_t *, bus_size_t);
221
void (*bs_rr_8_s) (bus_space_tag_t, bus_space_handle_t,
222
bus_size_t, uint64_t *, bus_size_t);
223
224
/* write stream (single) */
225
void (*bs_w_1_s) (bus_space_tag_t, bus_space_handle_t,
226
bus_size_t, uint8_t);
227
void (*bs_w_2_s) (bus_space_tag_t, bus_space_handle_t,
228
bus_size_t, uint16_t);
229
void (*bs_w_4_s) (bus_space_tag_t, bus_space_handle_t,
230
bus_size_t, uint32_t);
231
void (*bs_w_8_s) (bus_space_tag_t, bus_space_handle_t,
232
bus_size_t, uint64_t);
233
234
/* write multiple stream */
235
void (*bs_wm_1_s) (bus_space_tag_t, bus_space_handle_t,
236
bus_size_t, const uint8_t *, bus_size_t);
237
void (*bs_wm_2_s) (bus_space_tag_t, bus_space_handle_t,
238
bus_size_t, const uint16_t *, bus_size_t);
239
void (*bs_wm_4_s) (bus_space_tag_t, bus_space_handle_t,
240
bus_size_t, const uint32_t *, bus_size_t);
241
void (*bs_wm_8_s) (bus_space_tag_t, bus_space_handle_t,
242
bus_size_t, const uint64_t *, bus_size_t);
243
244
/* write region stream */
245
void (*bs_wr_1_s) (bus_space_tag_t, bus_space_handle_t,
246
bus_size_t, const uint8_t *, bus_size_t);
247
void (*bs_wr_2_s) (bus_space_tag_t, bus_space_handle_t,
248
bus_size_t, const uint16_t *, bus_size_t);
249
void (*bs_wr_4_s) (bus_space_tag_t, bus_space_handle_t,
250
bus_size_t, const uint32_t *, bus_size_t);
251
void (*bs_wr_8_s) (bus_space_tag_t, bus_space_handle_t,
252
bus_size_t, const uint64_t *, bus_size_t);
253
};
254
255
/*
256
* Utility macros; INTERNAL USE ONLY.
257
*/
258
#define __bs_c(a,b) __CONCAT(a,b)
259
#define __bs_opname(op,size) __bs_c(__bs_c(__bs_c(bs_,op),_),size)
260
261
#define __bs_nonsingle(type, sz, t, h, o, a, c) \
262
(*(t)->__bs_opname(type,sz))((t), h, o, a, c)
263
#define __bs_set(type, sz, t, h, o, v, c) \
264
(*(t)->__bs_opname(type,sz))((t), h, o, v, c)
265
#define __bs_copy(sz, t, h1, o1, h2, o2, cnt) \
266
(*(t)->__bs_opname(c,sz))((t), h1, o1, h2, o2, cnt)
267
268
#define __bs_opname_s(op,size) __bs_c(__bs_c(__bs_c(__bs_c(bs_,op),_),size),_s)
269
#define __bs_rs_s(sz, t, h, o) \
270
(*(t)->__bs_opname_s(r,sz))((t), h, o)
271
#define __bs_ws_s(sz, t, h, o, v) \
272
(*(t)->__bs_opname_s(w,sz))((t), h, o, v)
273
#define __bs_nonsingle_s(type, sz, t, h, o, a, c) \
274
(*(t)->__bs_opname_s(type,sz))((t), h, o, a, c)
275
276
#define __generate_inline_bs_rs(IFN, MBR, TYP) \
277
static inline TYP \
278
IFN(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) \
279
{ \
280
\
281
if (__predict_true(t->MBR == NULL)) \
282
return (*(volatile TYP *)(h + o)); \
283
else \
284
return (t->MBR(t, h, o)); \
285
}
286
287
#define __generate_inline_bs_ws(IFN, MBR, TYP) \
288
static inline void \
289
IFN(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, TYP v)\
290
{ \
291
\
292
if (__predict_true(t->MBR == NULL)) \
293
*(volatile TYP *)(h + o) = v; \
294
else \
295
t->MBR(t, h, o, v); \
296
}
297
298
/*
299
* Mapping and unmapping operations.
300
*/
301
#define bus_space_map(t, a, s, c, hp) \
302
(*(t)->bs_map)((t), (a), (s), (c), (hp))
303
#define bus_space_unmap(t, h, s) \
304
(*(t)->bs_unmap)((t), (h), (s))
305
#define bus_space_subregion(t, h, o, s, hp) \
306
(*(t)->bs_subregion)((t), (h), (o), (s), (hp))
307
308
/*
309
* Allocation and deallocation operations.
310
*/
311
#define bus_space_alloc(t, rs, re, s, a, b, c, ap, hp) \
312
(*(t)->bs_alloc)((t), (rs), (re), (s), (a), (b), \
313
(c), (ap), (hp))
314
#define bus_space_free(t, h, s) \
315
(*(t)->bs_free)((t), (h), (s))
316
317
/*
318
* Bus barrier operations.
319
*/
320
#define bus_space_barrier(t, h, o, l, f) \
321
(*(t)->bs_barrier)((t), (h), (o), (l), (f))
322
323
#define BUS_SPACE_BARRIER_READ 0x01
324
#define BUS_SPACE_BARRIER_WRITE 0x02
325
326
/*
327
* Bus read (single) operations.
328
*/
329
__generate_inline_bs_rs(bus_space_read_1, bs_r_1, uint8_t);
330
__generate_inline_bs_rs(bus_space_read_2, bs_r_2, uint16_t);
331
__generate_inline_bs_rs(bus_space_read_4, bs_r_4, uint32_t);
332
__generate_inline_bs_rs(bus_space_read_8, bs_r_8, uint64_t);
333
334
__generate_inline_bs_rs(bus_space_read_stream_1, bs_r_1_s, uint8_t);
335
__generate_inline_bs_rs(bus_space_read_stream_2, bs_r_2_s, uint16_t);
336
__generate_inline_bs_rs(bus_space_read_stream_4, bs_r_4_s, uint32_t);
337
__generate_inline_bs_rs(bus_space_read_stream_8, bs_r_8_s, uint64_t);
338
339
/*
340
* Bus read multiple operations.
341
*/
342
#define bus_space_read_multi_1(t, h, o, a, c) \
343
__bs_nonsingle(rm,1,(t),(h),(o),(a),(c))
344
#define bus_space_read_multi_2(t, h, o, a, c) \
345
__bs_nonsingle(rm,2,(t),(h),(o),(a),(c))
346
#define bus_space_read_multi_4(t, h, o, a, c) \
347
__bs_nonsingle(rm,4,(t),(h),(o),(a),(c))
348
#define bus_space_read_multi_8(t, h, o, a, c) \
349
__bs_nonsingle(rm,8,(t),(h),(o),(a),(c))
350
351
#define bus_space_read_multi_stream_1(t, h, o, a, c) \
352
__bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c))
353
#define bus_space_read_multi_stream_2(t, h, o, a, c) \
354
__bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c))
355
#define bus_space_read_multi_stream_4(t, h, o, a, c) \
356
__bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c))
357
#define bus_space_read_multi_stream_8(t, h, o, a, c) \
358
__bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c))
359
360
/*
361
* Bus read region operations.
362
*/
363
#define bus_space_read_region_1(t, h, o, a, c) \
364
__bs_nonsingle(rr,1,(t),(h),(o),(a),(c))
365
#define bus_space_read_region_2(t, h, o, a, c) \
366
__bs_nonsingle(rr,2,(t),(h),(o),(a),(c))
367
#define bus_space_read_region_4(t, h, o, a, c) \
368
__bs_nonsingle(rr,4,(t),(h),(o),(a),(c))
369
#define bus_space_read_region_8(t, h, o, a, c) \
370
__bs_nonsingle(rr,8,(t),(h),(o),(a),(c))
371
372
#define bus_space_read_region_stream_1(t, h, o, a, c) \
373
__bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c))
374
#define bus_space_read_region_stream_2(t, h, o, a, c) \
375
__bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c))
376
#define bus_space_read_region_stream_4(t, h, o, a, c) \
377
__bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c))
378
#define bus_space_read_region_stream_8(t, h, o, a, c) \
379
__bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c))
380
381
/*
382
* Bus write (single) operations.
383
*/
384
__generate_inline_bs_ws(bus_space_write_1, bs_w_1, uint8_t);
385
__generate_inline_bs_ws(bus_space_write_2, bs_w_2, uint16_t);
386
__generate_inline_bs_ws(bus_space_write_4, bs_w_4, uint32_t);
387
__generate_inline_bs_ws(bus_space_write_8, bs_w_8, uint64_t);
388
389
__generate_inline_bs_ws(bus_space_write_stream_1, bs_w_1_s, uint8_t);
390
__generate_inline_bs_ws(bus_space_write_stream_2, bs_w_2_s, uint16_t);
391
__generate_inline_bs_ws(bus_space_write_stream_4, bs_w_4_s, uint32_t);
392
__generate_inline_bs_ws(bus_space_write_stream_8, bs_w_8_s, uint64_t);
393
394
/*
395
* Bus write multiple operations.
396
*/
397
#define bus_space_write_multi_1(t, h, o, a, c) \
398
__bs_nonsingle(wm,1,(t),(h),(o),(a),(c))
399
#define bus_space_write_multi_2(t, h, o, a, c) \
400
__bs_nonsingle(wm,2,(t),(h),(o),(a),(c))
401
#define bus_space_write_multi_4(t, h, o, a, c) \
402
__bs_nonsingle(wm,4,(t),(h),(o),(a),(c))
403
#define bus_space_write_multi_8(t, h, o, a, c) \
404
__bs_nonsingle(wm,8,(t),(h),(o),(a),(c))
405
406
#define bus_space_write_multi_stream_1(t, h, o, a, c) \
407
__bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c))
408
#define bus_space_write_multi_stream_2(t, h, o, a, c) \
409
__bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c))
410
#define bus_space_write_multi_stream_4(t, h, o, a, c) \
411
__bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c))
412
#define bus_space_write_multi_stream_8(t, h, o, a, c) \
413
__bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c))
414
415
/*
416
* Bus write region operations.
417
*/
418
#define bus_space_write_region_1(t, h, o, a, c) \
419
__bs_nonsingle(wr,1,(t),(h),(o),(a),(c))
420
#define bus_space_write_region_2(t, h, o, a, c) \
421
__bs_nonsingle(wr,2,(t),(h),(o),(a),(c))
422
#define bus_space_write_region_4(t, h, o, a, c) \
423
__bs_nonsingle(wr,4,(t),(h),(o),(a),(c))
424
#define bus_space_write_region_8(t, h, o, a, c) \
425
__bs_nonsingle(wr,8,(t),(h),(o),(a),(c))
426
427
#define bus_space_write_region_stream_1(t, h, o, a, c) \
428
__bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c))
429
#define bus_space_write_region_stream_2(t, h, o, a, c) \
430
__bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c))
431
#define bus_space_write_region_stream_4(t, h, o, a, c) \
432
__bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c))
433
#define bus_space_write_region_stream_8(t, h, o, a, c) \
434
__bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c))
435
436
/*
437
* Set multiple operations.
438
*/
439
#define bus_space_set_multi_1(t, h, o, v, c) \
440
__bs_set(sm,1,(t),(h),(o),(v),(c))
441
#define bus_space_set_multi_2(t, h, o, v, c) \
442
__bs_set(sm,2,(t),(h),(o),(v),(c))
443
#define bus_space_set_multi_4(t, h, o, v, c) \
444
__bs_set(sm,4,(t),(h),(o),(v),(c))
445
#define bus_space_set_multi_8(t, h, o, v, c) \
446
__bs_set(sm,8,(t),(h),(o),(v),(c))
447
448
/*
449
* Set region operations.
450
*/
451
#define bus_space_set_region_1(t, h, o, v, c) \
452
__bs_set(sr,1,(t),(h),(o),(v),(c))
453
#define bus_space_set_region_2(t, h, o, v, c) \
454
__bs_set(sr,2,(t),(h),(o),(v),(c))
455
#define bus_space_set_region_4(t, h, o, v, c) \
456
__bs_set(sr,4,(t),(h),(o),(v),(c))
457
#define bus_space_set_region_8(t, h, o, v, c) \
458
__bs_set(sr,8,(t),(h),(o),(v),(c))
459
460
/*
461
* Copy operations.
462
*/
463
#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \
464
__bs_copy(1, t, h1, o1, h2, o2, c)
465
#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \
466
__bs_copy(2, t, h1, o1, h2, o2, c)
467
#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \
468
__bs_copy(4, t, h1, o1, h2, o2, c)
469
#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \
470
__bs_copy(8, t, h1, o1, h2, o2, c)
471
472
/*
473
* Macros to provide prototypes for all the functions used in the
474
* bus_space structure
475
*/
476
477
#define bs_map_proto(f) \
478
int __bs_c(f,_bs_map) (bus_space_tag_t t, bus_addr_t addr, \
479
bus_size_t size, int cacheable, bus_space_handle_t *bshp);
480
481
#define bs_unmap_proto(f) \
482
void __bs_c(f,_bs_unmap) (bus_space_tag_t t, bus_space_handle_t bsh, \
483
bus_size_t size);
484
485
#define bs_subregion_proto(f) \
486
int __bs_c(f,_bs_subregion) (bus_space_tag_t t, bus_space_handle_t bsh, \
487
bus_size_t offset, bus_size_t size, \
488
bus_space_handle_t *nbshp);
489
490
#define bs_alloc_proto(f) \
491
int __bs_c(f,_bs_alloc) (bus_space_tag_t t, bus_addr_t rstart, \
492
bus_addr_t rend, bus_size_t size, bus_size_t align, \
493
bus_size_t boundary, int cacheable, bus_addr_t *addrp, \
494
bus_space_handle_t *bshp);
495
496
#define bs_free_proto(f) \
497
void __bs_c(f,_bs_free) (bus_space_tag_t t, bus_space_handle_t bsh, \
498
bus_size_t size);
499
500
#define bs_mmap_proto(f) \
501
int __bs_c(f,_bs_mmap) (struct cdev *, vm_offset_t, vm_paddr_t *, int);
502
503
#define bs_barrier_proto(f) \
504
void __bs_c(f,_bs_barrier) (bus_space_tag_t t, bus_space_handle_t bsh, \
505
bus_size_t offset, bus_size_t len, int flags);
506
507
#define bs_r_1_proto(f) \
508
uint8_t __bs_c(f,_bs_r_1) (bus_space_tag_t t, bus_space_handle_t bsh, \
509
bus_size_t offset);
510
511
#define bs_r_2_proto(f) \
512
uint16_t __bs_c(f,_bs_r_2) (bus_space_tag_t t, bus_space_handle_t bsh, \
513
bus_size_t offset);
514
515
#define bs_r_4_proto(f) \
516
uint32_t __bs_c(f,_bs_r_4) (bus_space_tag_t t, bus_space_handle_t bsh, \
517
bus_size_t offset);
518
519
#define bs_r_8_proto(f) \
520
uint64_t __bs_c(f,_bs_r_8) (bus_space_tag_t t, bus_space_handle_t bsh, \
521
bus_size_t offset);
522
523
#define bs_r_1_s_proto(f) \
524
uint8_t __bs_c(f,_bs_r_1_s) (bus_space_tag_t t, bus_space_handle_t bsh, \
525
bus_size_t offset);
526
527
#define bs_r_2_s_proto(f) \
528
uint16_t __bs_c(f,_bs_r_2_s) (bus_space_tag_t t, bus_space_handle_t bsh, \
529
bus_size_t offset);
530
531
#define bs_r_4_s_proto(f) \
532
uint32_t __bs_c(f,_bs_r_4_s) (bus_space_tag_t t, bus_space_handle_t bsh, \
533
bus_size_t offset);
534
535
#define bs_w_1_proto(f) \
536
void __bs_c(f,_bs_w_1) (bus_space_tag_t t, bus_space_handle_t bsh, \
537
bus_size_t offset, uint8_t value);
538
539
#define bs_w_2_proto(f) \
540
void __bs_c(f,_bs_w_2) (bus_space_tag_t t, bus_space_handle_t bsh, \
541
bus_size_t offset, uint16_t value);
542
543
#define bs_w_4_proto(f) \
544
void __bs_c(f,_bs_w_4) (bus_space_tag_t t, bus_space_handle_t bsh, \
545
bus_size_t offset, uint32_t value);
546
547
#define bs_w_8_proto(f) \
548
void __bs_c(f,_bs_w_8) (bus_space_tag_t t, bus_space_handle_t bsh, \
549
bus_size_t offset, uint64_t value);
550
551
#define bs_w_1_s_proto(f) \
552
void __bs_c(f,_bs_w_1_s) (bus_space_tag_t t, bus_space_handle_t bsh, \
553
bus_size_t offset, uint8_t value);
554
555
#define bs_w_2_s_proto(f) \
556
void __bs_c(f,_bs_w_2_s) (bus_space_tag_t t, bus_space_handle_t bsh, \
557
bus_size_t offset, uint16_t value);
558
559
#define bs_w_4_s_proto(f) \
560
void __bs_c(f,_bs_w_4_s) (bus_space_tag_t t, bus_space_handle_t bsh, \
561
bus_size_t offset, uint32_t value);
562
563
#define bs_rm_1_proto(f) \
564
void __bs_c(f,_bs_rm_1) (bus_space_tag_t t, bus_space_handle_t bsh, \
565
bus_size_t offset, uint8_t *addr, bus_size_t count);
566
567
#define bs_rm_2_proto(f) \
568
void __bs_c(f,_bs_rm_2) (bus_space_tag_t t, bus_space_handle_t bsh, \
569
bus_size_t offset, uint16_t *addr, bus_size_t count);
570
571
#define bs_rm_4_proto(f) \
572
void __bs_c(f,_bs_rm_4) (bus_space_tag_t t, bus_space_handle_t bsh, \
573
bus_size_t offset, uint32_t *addr, bus_size_t count);
574
575
#define bs_rm_8_proto(f) \
576
void __bs_c(f,_bs_rm_8) (bus_space_tag_t t, bus_space_handle_t bsh, \
577
bus_size_t offset, uint64_t *addr, bus_size_t count);
578
579
#define bs_wm_1_proto(f) \
580
void __bs_c(f,_bs_wm_1) (bus_space_tag_t t, bus_space_handle_t bsh, \
581
bus_size_t offset, const uint8_t *addr, bus_size_t count);
582
583
#define bs_wm_2_proto(f) \
584
void __bs_c(f,_bs_wm_2) (bus_space_tag_t t, bus_space_handle_t bsh, \
585
bus_size_t offset, const uint16_t *addr, bus_size_t count);
586
587
#define bs_wm_4_proto(f) \
588
void __bs_c(f,_bs_wm_4) (bus_space_tag_t t, bus_space_handle_t bsh, \
589
bus_size_t offset, const uint32_t *addr, bus_size_t count);
590
591
#define bs_wm_8_proto(f) \
592
void __bs_c(f,_bs_wm_8) (bus_space_tag_t t, bus_space_handle_t bsh, \
593
bus_size_t offset, const uint64_t *addr, bus_size_t count);
594
595
#define bs_rr_1_proto(f) \
596
void __bs_c(f, _bs_rr_1) (bus_space_tag_t t, bus_space_handle_t bsh, \
597
bus_size_t offset, uint8_t *addr, bus_size_t count);
598
599
#define bs_rr_2_proto(f) \
600
void __bs_c(f, _bs_rr_2) (bus_space_tag_t t, bus_space_handle_t bsh, \
601
bus_size_t offset, uint16_t *addr, bus_size_t count);
602
603
#define bs_rr_4_proto(f) \
604
void __bs_c(f, _bs_rr_4) (bus_space_tag_t t, bus_space_handle_t bsh, \
605
bus_size_t offset, uint32_t *addr, bus_size_t count);
606
607
#define bs_rr_8_proto(f) \
608
void __bs_c(f, _bs_rr_8) (bus_space_tag_t t, bus_space_handle_t bsh, \
609
bus_size_t offset, uint64_t *addr, bus_size_t count);
610
611
#define bs_wr_1_proto(f) \
612
void __bs_c(f, _bs_wr_1) (bus_space_tag_t t, bus_space_handle_t bsh, \
613
bus_size_t offset, const uint8_t *addr, bus_size_t count);
614
615
#define bs_wr_2_proto(f) \
616
void __bs_c(f, _bs_wr_2) (bus_space_tag_t t, bus_space_handle_t bsh, \
617
bus_size_t offset, const uint16_t *addr, bus_size_t count);
618
619
#define bs_wr_4_proto(f) \
620
void __bs_c(f, _bs_wr_4) (bus_space_tag_t t, bus_space_handle_t bsh, \
621
bus_size_t offset, const uint32_t *addr, bus_size_t count);
622
623
#define bs_wr_8_proto(f) \
624
void __bs_c(f, _bs_wr_8) (bus_space_tag_t t, bus_space_handle_t bsh, \
625
bus_size_t offset, const uint64_t *addr, bus_size_t count);
626
627
#define bs_sm_1_proto(f) \
628
void __bs_c(f,_bs_sm_1) (bus_space_tag_t t, bus_space_handle_t bsh, \
629
bus_size_t offset, uint8_t value, bus_size_t count);
630
631
#define bs_sm_2_proto(f) \
632
void __bs_c(f,_bs_sm_2) (bus_space_tag_t t, bus_space_handle_t bsh, \
633
bus_size_t offset, uint16_t value, bus_size_t count);
634
635
#define bs_sm_4_proto(f) \
636
void __bs_c(f,_bs_sm_4) (bus_space_tag_t t, bus_space_handle_t bsh, \
637
bus_size_t offset, uint32_t value, bus_size_t count);
638
639
#define bs_sm_8_proto(f) \
640
void __bs_c(f,_bs_sm_8) (bus_space_tag_t t, bus_space_handle_t bsh, \
641
bus_size_t offset, uint64_t value, bus_size_t count);
642
643
#define bs_sr_1_proto(f) \
644
void __bs_c(f,_bs_sr_1) (bus_space_tag_t t, bus_space_handle_t bsh, \
645
bus_size_t offset, uint8_t value, bus_size_t count);
646
647
#define bs_sr_2_proto(f) \
648
void __bs_c(f,_bs_sr_2) (bus_space_tag_t t, bus_space_handle_t bsh, \
649
bus_size_t offset, uint16_t value, bus_size_t count);
650
651
#define bs_sr_4_proto(f) \
652
void __bs_c(f,_bs_sr_4) (bus_space_tag_t t, bus_space_handle_t bsh, \
653
bus_size_t offset, uint32_t value, bus_size_t count);
654
655
#define bs_sr_8_proto(f) \
656
void __bs_c(f,_bs_sr_8) (bus_space_tag_t t, bus_space_handle_t bsh, \
657
bus_size_t offset, uint64_t value, bus_size_t count);
658
659
#define bs_c_1_proto(f) \
660
void __bs_c(f,_bs_c_1) (bus_space_tag_t t, bus_space_handle_t bsh1, \
661
bus_size_t offset1, bus_space_handle_t bsh2, \
662
bus_size_t offset2, bus_size_t count);
663
664
#define bs_c_2_proto(f) \
665
void __bs_c(f,_bs_c_2) (bus_space_tag_t t, bus_space_handle_t bsh1, \
666
bus_size_t offset1, bus_space_handle_t bsh2, \
667
bus_size_t offset2, bus_size_t count);
668
669
#define bs_c_4_proto(f) \
670
void __bs_c(f,_bs_c_4) (bus_space_tag_t t, bus_space_handle_t bsh1, \
671
bus_size_t offset1, bus_space_handle_t bsh2, \
672
bus_size_t offset2, bus_size_t count);
673
674
#define bs_c_8_proto(f) \
675
void __bs_c(f,_bs_c_8) (bus_space_tag_t t, bus_space_handle_t bsh1, \
676
bus_size_t offset1, bus_space_handle_t bsh2, \
677
bus_size_t offset2, bus_size_t count);
678
679
#define bs_protos(f) \
680
bs_map_proto(f); \
681
bs_unmap_proto(f); \
682
bs_subregion_proto(f); \
683
bs_alloc_proto(f); \
684
bs_free_proto(f); \
685
bs_mmap_proto(f); \
686
bs_barrier_proto(f); \
687
bs_r_1_proto(f); \
688
bs_r_2_proto(f); \
689
bs_r_4_proto(f); \
690
bs_r_8_proto(f); \
691
bs_r_1_s_proto(f); \
692
bs_r_2_s_proto(f); \
693
bs_r_4_s_proto(f); \
694
bs_w_1_proto(f); \
695
bs_w_2_proto(f); \
696
bs_w_4_proto(f); \
697
bs_w_8_proto(f); \
698
bs_w_1_s_proto(f); \
699
bs_w_2_s_proto(f); \
700
bs_w_4_s_proto(f); \
701
bs_rm_1_proto(f); \
702
bs_rm_2_proto(f); \
703
bs_rm_4_proto(f); \
704
bs_rm_8_proto(f); \
705
bs_wm_1_proto(f); \
706
bs_wm_2_proto(f); \
707
bs_wm_4_proto(f); \
708
bs_wm_8_proto(f); \
709
bs_rr_1_proto(f); \
710
bs_rr_2_proto(f); \
711
bs_rr_4_proto(f); \
712
bs_rr_8_proto(f); \
713
bs_wr_1_proto(f); \
714
bs_wr_2_proto(f); \
715
bs_wr_4_proto(f); \
716
bs_wr_8_proto(f); \
717
bs_sm_1_proto(f); \
718
bs_sm_2_proto(f); \
719
bs_sm_4_proto(f); \
720
bs_sm_8_proto(f); \
721
bs_sr_1_proto(f); \
722
bs_sr_2_proto(f); \
723
bs_sr_4_proto(f); \
724
bs_sr_8_proto(f); \
725
bs_c_1_proto(f); \
726
bs_c_2_proto(f); \
727
bs_c_4_proto(f); \
728
bs_c_8_proto(f);
729
730
void generic_bs_unimplemented(void);
731
#define BS_UNIMPLEMENTED (void *)generic_bs_unimplemented
732
733
#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
734
735
#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF
736
#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
737
#define BUS_SPACE_MAXADDR 0xFFFFFFFF
738
#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF
739
#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
740
#define BUS_SPACE_MAXSIZE 0xFFFFFFFF
741
742
#define BUS_SPACE_UNRESTRICTED (~0)
743
744
#define BUS_PEEK_FUNC(width, type) \
745
static inline int \
746
bus_space_peek_##width(bus_space_tag_t tag, \
747
bus_space_handle_t hnd, bus_size_t offset, type *value) \
748
{ \
749
type tmp; \
750
tmp = bus_space_read_##width(tag, hnd, offset); \
751
*value = (type)tmp; \
752
return (0); \
753
}
754
BUS_PEEK_FUNC(1, uint8_t)
755
BUS_PEEK_FUNC(2, uint16_t)
756
BUS_PEEK_FUNC(4, uint32_t)
757
BUS_PEEK_FUNC(8, uint64_t)
758
759
#define BUS_POKE_FUNC(width, type) \
760
static inline int \
761
bus_space_poke_##width(bus_space_tag_t tag, \
762
bus_space_handle_t hnd, bus_size_t offset, type value) \
763
{ \
764
bus_space_write_##width(tag, hnd, offset, value); \
765
return (0); \
766
}
767
BUS_POKE_FUNC(1, uint8_t)
768
BUS_POKE_FUNC(2, uint16_t)
769
BUS_POKE_FUNC(4, uint32_t)
770
BUS_POKE_FUNC(8, uint64_t)
771
772
#include <machine/bus_dma.h>
773
774
/*
775
* Get the physical address of a bus space memory-mapped resource.
776
* Doing this as a macro is a temporary solution until a more robust fix is
777
* designed. It also serves to mark the locations needing that fix.
778
*/
779
#define BUS_SPACE_PHYSADDR(res, offs) \
780
((u_int)(rman_get_start(res)+(offs)))
781
782
#endif /* _MACHINE_BUS_H_ */
783
784