pci_swiz_bus_io_chipdep.c revision 1.12 1 /* $NetBSD: pci_swiz_bus_io_chipdep.c,v 1.12 1996/12/02 06:46:52 cgd Exp $ */
2
3 /*
4 * Copyright (c) 1995, 1996 Carnegie-Mellon University.
5 * All rights reserved.
6 *
7 * Author: Chris G. Demetriou
8 *
9 * Permission to use, copy, modify and distribute this software and
10 * its documentation is hereby granted, provided that both the copyright
11 * notice and this permission notice appear in all copies of the
12 * software, derivative works or modified versions, and any portions
13 * thereof, and that both notices appear in supporting documentation.
14 *
15 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
17 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18 *
19 * Carnegie Mellon requests users of this software to return to
20 *
21 * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
22 * School of Computer Science
23 * Carnegie Mellon University
24 * Pittsburgh PA 15213-3890
25 *
26 * any improvements or extensions that they make and grant Carnegie the
27 * rights to redistribute these changes.
28 */
29
30 /*
31 * Common PCI Chipset "bus I/O" functions, for chipsets which have to
32 * deal with only a single PCI interface chip in a machine.
33 *
34 * uses:
35 * CHIP name of the 'chip' it's being compiled for.
36 * CHIP_IO_BASE Sparse I/O space base to use.
37 */
38
39 #include <sys/extent.h>
40
41 #define __C(A,B) __CONCAT(A,B)
42 #define __S(S) __STRING(S)
43
44 /* mapping/unmapping */
45 int __C(CHIP,_io_map) __P((void *, bus_addr_t, bus_size_t, int,
46 bus_space_handle_t *));
47 void __C(CHIP,_io_unmap) __P((void *, bus_space_handle_t,
48 bus_size_t));
49 int __C(CHIP,_io_subregion) __P((void *, bus_space_handle_t,
50 bus_size_t, bus_size_t, bus_space_handle_t *));
51
52 /* allocation/deallocation */
53 int __C(CHIP,_io_alloc) __P((void *, bus_addr_t, bus_addr_t,
54 bus_size_t, bus_size_t, bus_addr_t, int, bus_addr_t *,
55 bus_space_handle_t *));
56 void __C(CHIP,_io_free) __P((void *, bus_space_handle_t,
57 bus_size_t));
58
59 /* read (single) */
60 inline u_int8_t __C(CHIP,_io_read_1) __P((void *, bus_space_handle_t,
61 bus_size_t));
62 inline u_int16_t __C(CHIP,_io_read_2) __P((void *, bus_space_handle_t,
63 bus_size_t));
64 inline u_int32_t __C(CHIP,_io_read_4) __P((void *, bus_space_handle_t,
65 bus_size_t));
66 inline u_int64_t __C(CHIP,_io_read_8) __P((void *, bus_space_handle_t,
67 bus_size_t));
68
69 /* read multiple */
70 void __C(CHIP,_io_read_multi_1) __P((void *, bus_space_handle_t,
71 bus_size_t, u_int8_t *, bus_size_t));
72 void __C(CHIP,_io_read_multi_2) __P((void *, bus_space_handle_t,
73 bus_size_t, u_int16_t *, bus_size_t));
74 void __C(CHIP,_io_read_multi_4) __P((void *, bus_space_handle_t,
75 bus_size_t, u_int32_t *, bus_size_t));
76 void __C(CHIP,_io_read_multi_8) __P((void *, bus_space_handle_t,
77 bus_size_t, u_int64_t *, bus_size_t));
78
79 /* read region */
80 void __C(CHIP,_io_read_region_1) __P((void *, bus_space_handle_t,
81 bus_size_t, u_int8_t *, bus_size_t));
82 void __C(CHIP,_io_read_region_2) __P((void *, bus_space_handle_t,
83 bus_size_t, u_int16_t *, bus_size_t));
84 void __C(CHIP,_io_read_region_4) __P((void *, bus_space_handle_t,
85 bus_size_t, u_int32_t *, bus_size_t));
86 void __C(CHIP,_io_read_region_8) __P((void *, bus_space_handle_t,
87 bus_size_t, u_int64_t *, bus_size_t));
88
89 /* write (single) */
90 inline void __C(CHIP,_io_write_1) __P((void *, bus_space_handle_t,
91 bus_size_t, u_int8_t));
92 inline void __C(CHIP,_io_write_2) __P((void *, bus_space_handle_t,
93 bus_size_t, u_int16_t));
94 inline void __C(CHIP,_io_write_4) __P((void *, bus_space_handle_t,
95 bus_size_t, u_int32_t));
96 inline void __C(CHIP,_io_write_8) __P((void *, bus_space_handle_t,
97 bus_size_t, u_int64_t));
98
99 /* write multiple */
100 void __C(CHIP,_io_write_multi_1) __P((void *, bus_space_handle_t,
101 bus_size_t, const u_int8_t *, bus_size_t));
102 void __C(CHIP,_io_write_multi_2) __P((void *, bus_space_handle_t,
103 bus_size_t, const u_int16_t *, bus_size_t));
104 void __C(CHIP,_io_write_multi_4) __P((void *, bus_space_handle_t,
105 bus_size_t, const u_int32_t *, bus_size_t));
106 void __C(CHIP,_io_write_multi_8) __P((void *, bus_space_handle_t,
107 bus_size_t, const u_int64_t *, bus_size_t));
108
109 /* write region */
110 void __C(CHIP,_io_write_region_1) __P((void *, bus_space_handle_t,
111 bus_size_t, const u_int8_t *, bus_size_t));
112 void __C(CHIP,_io_write_region_2) __P((void *, bus_space_handle_t,
113 bus_size_t, const u_int16_t *, bus_size_t));
114 void __C(CHIP,_io_write_region_4) __P((void *, bus_space_handle_t,
115 bus_size_t, const u_int32_t *, bus_size_t));
116 void __C(CHIP,_io_write_region_8) __P((void *, bus_space_handle_t,
117 bus_size_t, const u_int64_t *, bus_size_t));
118
119 /* set multiple */
120 void __C(CHIP,_io_set_multi_1) __P((void *, bus_space_handle_t,
121 bus_size_t, u_int8_t, bus_size_t));
122 void __C(CHIP,_io_set_multi_2) __P((void *, bus_space_handle_t,
123 bus_size_t, u_int16_t, bus_size_t));
124 void __C(CHIP,_io_set_multi_4) __P((void *, bus_space_handle_t,
125 bus_size_t, u_int32_t, bus_size_t));
126 void __C(CHIP,_io_set_multi_8) __P((void *, bus_space_handle_t,
127 bus_size_t, u_int64_t, bus_size_t));
128
129 /* set region */
130 void __C(CHIP,_io_set_region_1) __P((void *, bus_space_handle_t,
131 bus_size_t, u_int8_t, bus_size_t));
132 void __C(CHIP,_io_set_region_2) __P((void *, bus_space_handle_t,
133 bus_size_t, u_int16_t, bus_size_t));
134 void __C(CHIP,_io_set_region_4) __P((void *, bus_space_handle_t,
135 bus_size_t, u_int32_t, bus_size_t));
136 void __C(CHIP,_io_set_region_8) __P((void *, bus_space_handle_t,
137 bus_size_t, u_int64_t, bus_size_t));
138
139 /* barrier */
140 void __C(CHIP,_io_barrier) __P((void *, bus_space_handle_t,
141 bus_size_t, bus_size_t, int));
142
143 static long
144 __C(CHIP,_io_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
145
146 static struct alpha_bus_space __C(CHIP,_io_space) = {
147 /* cookie */
148 NULL,
149
150 /* mapping/unmapping */
151 __C(CHIP,_io_map),
152 __C(CHIP,_io_unmap),
153 __C(CHIP,_io_subregion),
154
155 /* allocation/deallocation */
156 __C(CHIP,_io_alloc),
157 __C(CHIP,_io_free),
158
159 /* read (single) */
160 __C(CHIP,_io_read_1),
161 __C(CHIP,_io_read_2),
162 __C(CHIP,_io_read_4),
163 __C(CHIP,_io_read_8),
164
165 /* read multiple */
166 __C(CHIP,_io_read_multi_1),
167 __C(CHIP,_io_read_multi_2),
168 __C(CHIP,_io_read_multi_4),
169 __C(CHIP,_io_read_multi_8),
170
171 /* read region */
172 __C(CHIP,_io_read_region_1),
173 __C(CHIP,_io_read_region_2),
174 __C(CHIP,_io_read_region_4),
175 __C(CHIP,_io_read_region_8),
176
177 /* write (single) */
178 __C(CHIP,_io_write_1),
179 __C(CHIP,_io_write_2),
180 __C(CHIP,_io_write_4),
181 __C(CHIP,_io_write_8),
182
183 /* write multiple */
184 __C(CHIP,_io_write_multi_1),
185 __C(CHIP,_io_write_multi_2),
186 __C(CHIP,_io_write_multi_4),
187 __C(CHIP,_io_write_multi_8),
188
189 /* write region */
190 __C(CHIP,_io_write_region_1),
191 __C(CHIP,_io_write_region_2),
192 __C(CHIP,_io_write_region_4),
193 __C(CHIP,_io_write_region_8),
194
195 /* set multiple */
196 __C(CHIP,_io_set_multi_1),
197 __C(CHIP,_io_set_multi_2),
198 __C(CHIP,_io_set_multi_4),
199 __C(CHIP,_io_set_multi_8),
200
201 /* set region */
202 __C(CHIP,_io_set_region_1),
203 __C(CHIP,_io_set_region_2),
204 __C(CHIP,_io_set_region_4),
205 __C(CHIP,_io_set_region_8),
206
207 /* copy */
208 /* XXX IMPLEMENT */
209
210 /* barrier */
211 __C(CHIP,_io_barrier),
212 };
213
214 bus_space_tag_t
215 __C(CHIP,_bus_io_init)(v)
216 void *v;
217 {
218 bus_space_tag_t t = &__C(CHIP,_io_space);
219 struct extent *ex;
220
221 t->abs_cookie = v;
222
223 /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
224 ex = extent_create(__S(__C(CHIP,_bus_io)), 0x0UL, 0xffffffffUL,
225 M_DEVBUF, (caddr_t)__C(CHIP,_io_ex_storage),
226 sizeof(__C(CHIP,_io_ex_storage)), EX_NOWAIT);
227 extent_alloc_region(ex, 0, 0xffffffffUL, EX_NOWAIT);
228
229 #ifdef CHIP_IO_W1_BUS_START
230 #ifdef EXTENT_DEBUG
231 printf("io: freeing from 0x%lx to 0x%lx\n", CHIP_IO_W1_BUS_START(v),
232 CHIP_IO_W1_BUS_END(v));
233 #endif
234 extent_free(ex, CHIP_IO_W1_BUS_START(v),
235 CHIP_IO_W1_BUS_END(v) - CHIP_IO_W1_BUS_START(v) + 1, EX_NOWAIT);
236 #endif
237 #ifdef CHIP_IO_W2_BUS_START
238 #ifdef EXTENT_DEBUG
239 printf("io: freeing from 0x%lx to 0x%lx\n", CHIP_IO_W2_BUS_START(v),
240 CHIP_IO_W2_BUS_END(v));
241 #endif
242 extent_free(ex, CHIP_IO_W2_BUS_START(v),
243 CHIP_IO_W2_BUS_END(v) - CHIP_IO_W2_BUS_START(v) + 1, EX_NOWAIT);
244 #endif
245
246 #ifdef EXTENT_DEBUG
247 extent_print(ex);
248 #endif
249 CHIP_IO_EXTENT(v) = ex;
250
251 return (t);
252 }
253
254 int
255 __C(CHIP,_io_map)(v, ioaddr, iosize, cacheable, iohp)
256 void *v;
257 bus_addr_t ioaddr;
258 bus_size_t iosize;
259 int cacheable;
260 bus_space_handle_t *iohp;
261 {
262 int error;
263
264 #ifdef EXTENT_DEBUG
265 printf("io: allocating 0x%lx to 0x%lx\n", ioaddr, ioaddr + iosize - 1);
266 #endif
267 error = extent_alloc_region(CHIP_IO_EXTENT(v), ioaddr, iosize,
268 EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
269 if (error) {
270 #ifdef EXTENT_DEBUG
271 printf("io: allocation failed (%d)\n", error);
272 extent_print(CHIP_IO_EXTENT(v));
273 #endif
274 return (error);
275 }
276
277 #ifdef CHIP_IO_W1_BUS_START
278 if (ioaddr >= CHIP_IO_W1_BUS_START(v) &&
279 ioaddr <= CHIP_IO_W1_BUS_END(v)) {
280 *iohp = (ALPHA_PHYS_TO_K0SEG(CHIP_IO_W1_SYS_START(v)) >> 5) +
281 (ioaddr - CHIP_IO_W1_BUS_START(v));
282 } else
283 #endif
284 #ifdef CHIP_IO_W2_BUS_START
285 if (ioaddr >= CHIP_IO_W2_BUS_START(v) &&
286 ioaddr <= CHIP_IO_W2_BUS_END(v)) {
287 *iohp = (ALPHA_PHYS_TO_K0SEG(CHIP_IO_W2_SYS_START(v)) >> 5) +
288 (ioaddr - CHIP_IO_W2_BUS_START(v));
289 } else
290 #endif
291 {
292 printf("\n");
293 #ifdef CHIP_IO_W1_BUS_START
294 printf("%s: window[1]=0x%lx-0x%lx\n",
295 __S(__C(CHIP,_io_map)), CHIP_IO_W1_BUS_START(v),
296 CHIP_IO_W1_BUS_END(v));
297 #endif
298 #ifdef CHIP_IO_W2_BUS_START
299 printf("%s: window[2]=0x%lx-0x%lx\n",
300 __S(__C(CHIP,_io_map)), CHIP_IO_W2_BUS_START(v),
301 CHIP_IO_W2_BUS_END(v));
302 #endif
303 panic("%s: don't know how to map %lx",
304 __S(__C(CHIP,_io_map)), ioaddr);
305 }
306
307 return (0);
308 }
309
310 void
311 __C(CHIP,_io_unmap)(v, ioh, iosize)
312 void *v;
313 bus_space_handle_t ioh;
314 bus_size_t iosize;
315 {
316 bus_addr_t ioaddr;
317 int error;
318
319 #ifdef EXTENT_DEBUG
320 printf("io: freeing handle 0x%lx for 0x%lx\n", ioh, iosize);
321 #endif
322
323 ioh = ALPHA_K0SEG_TO_PHYS(ioh << 5) >> 5;
324
325 #ifdef CHIP_IO_W1_BUS_START
326 if ((ioh << 5) >= CHIP_IO_W1_SYS_START(v) &&
327 (ioh << 5) <= CHIP_IO_W1_SYS_END(v)) {
328 ioaddr = CHIP_IO_W1_BUS_START(v) +
329 (ioh - (CHIP_IO_W1_SYS_START(v) >> 5));
330 } else
331 #endif
332 #ifdef CHIP_IO_W2_BUS_START
333 if ((ioh << 5) >= CHIP_IO_W2_SYS_START(v) &&
334 (ioh << 5) <= CHIP_IO_W2_SYS_END(v)) {
335 ioaddr = CHIP_IO_W2_BUS_START(v) +
336 (ioh - (CHIP_IO_W2_SYS_START(v) >> 5));
337 } else
338 #endif
339 {
340 printf("\n");
341 #ifdef CHIP_IO_W1_BUS_START
342 printf("%s: sys window[1]=0x%lx-0x%lx\n",
343 __S(__C(CHIP,_io_map)), CHIP_IO_W1_SYS_START(v),
344 CHIP_IO_W1_SYS_END(v));
345 #endif
346 #ifdef CHIP_IO_W2_BUS_START
347 printf("%s: sys window[2]=0x%lx-0x%lx\n",
348 __S(__C(CHIP,_io_map)), CHIP_IO_W2_SYS_START(v),
349 CHIP_IO_W2_SYS_END(v));
350 #endif
351 panic("%s: don't know how to unmap %lx",
352 __S(__C(CHIP,_io_unmap)), (ioh << 5));
353 }
354
355 #ifdef EXTENT_DEBUG
356 printf("io: freeing 0x%lx to 0x%lx\n", ioaddr, ioaddr + iosize - 1);
357 #endif
358 error = extent_free(CHIP_IO_EXTENT(v), ioaddr, iosize,
359 EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
360 if (error) {
361 printf("%s: WARNING: could not unmap 0x%lx-0x%lx (error %d)\n",
362 __S(__C(CHIP,_io_unmap)), ioaddr, ioaddr + iosize - 1,
363 error);
364 #ifdef EXTENT_DEBUG
365 extent_print(CHIP_IO_EXTENT(v));
366 #endif
367 }
368 }
369
370 int
371 __C(CHIP,_io_subregion)(v, ioh, offset, size, nioh)
372 void *v;
373 bus_space_handle_t ioh, *nioh;
374 bus_size_t offset, size;
375 {
376
377 *nioh = ioh + offset;
378 return (0);
379 }
380
381 int
382 __C(CHIP,_io_alloc)(v, rstart, rend, size, align, boundary, cacheable,
383 addrp, bshp)
384 void *v;
385 bus_addr_t rstart, rend, *addrp;
386 bus_size_t size, align, boundary;
387 int cacheable;
388 bus_space_handle_t *bshp;
389 {
390
391 /* XXX XXX XXX XXX XXX XXX */
392 panic("%s not implemented", __S(__C(CHIP,_io_alloc)));
393 }
394
395 void
396 __C(CHIP,_io_free)(v, bsh, size)
397 void *v;
398 bus_space_handle_t bsh;
399 bus_size_t size;
400 {
401
402 /* XXX XXX XXX XXX XXX XXX */
403 panic("%s not implemented", __S(__C(CHIP,_io_free)));
404 }
405
406 inline u_int8_t
407 __C(CHIP,_io_read_1)(v, ioh, off)
408 void *v;
409 bus_space_handle_t ioh;
410 bus_size_t off;
411 {
412 register bus_space_handle_t tmpioh;
413 register u_int32_t *port, val;
414 register u_int8_t rval;
415 register int offset;
416
417 alpha_mb();
418
419 tmpioh = ioh + off;
420 offset = tmpioh & 3;
421 port = (u_int32_t *)((tmpioh << 5) | (0 << 3));
422 val = *port;
423 rval = ((val) >> (8 * offset)) & 0xff;
424
425 return rval;
426 }
427
428 inline u_int16_t
429 __C(CHIP,_io_read_2)(v, ioh, off)
430 void *v;
431 bus_space_handle_t ioh;
432 bus_size_t off;
433 {
434 register bus_space_handle_t tmpioh;
435 register u_int32_t *port, val;
436 register u_int16_t rval;
437 register int offset;
438
439 alpha_mb();
440
441 tmpioh = ioh + off;
442 offset = tmpioh & 3;
443 port = (u_int32_t *)((tmpioh << 5) | (1 << 3));
444 val = *port;
445 rval = ((val) >> (8 * offset)) & 0xffff;
446
447 return rval;
448 }
449
450 inline u_int32_t
451 __C(CHIP,_io_read_4)(v, ioh, off)
452 void *v;
453 bus_space_handle_t ioh;
454 bus_size_t off;
455 {
456 register bus_space_handle_t tmpioh;
457 register u_int32_t *port, val;
458 register u_int32_t rval;
459 register int offset;
460
461 alpha_mb();
462
463 tmpioh = ioh + off;
464 offset = tmpioh & 3;
465 port = (u_int32_t *)((tmpioh << 5) | (3 << 3));
466 val = *port;
467 #if 0
468 rval = ((val) >> (8 * offset)) & 0xffffffff;
469 #else
470 rval = val;
471 #endif
472
473 return rval;
474 }
475
476 inline u_int64_t
477 __C(CHIP,_io_read_8)(v, ioh, off)
478 void *v;
479 bus_space_handle_t ioh;
480 bus_size_t off;
481 {
482
483 /* XXX XXX XXX */
484 panic("%s not implemented", __S(__C(CHIP,_io_read_8)));
485 }
486
487 #define CHIP_io_read_multi_N(BYTES,TYPE) \
488 void \
489 __C(__C(CHIP,_io_read_multi_),BYTES)(v, h, o, a, c) \
490 void *v; \
491 bus_space_handle_t h; \
492 bus_size_t o, c; \
493 TYPE *a; \
494 { \
495 \
496 while (c-- > 0) { \
497 __C(CHIP,_io_barrier)(v, h, o, sizeof *a, \
498 BUS_BARRIER_READ); \
499 *a++ = __C(__C(CHIP,_io_read_),BYTES)(v, h, o); \
500 } \
501 }
502 CHIP_io_read_multi_N(1,u_int8_t)
503 CHIP_io_read_multi_N(2,u_int16_t)
504 CHIP_io_read_multi_N(4,u_int32_t)
505 CHIP_io_read_multi_N(8,u_int64_t)
506
507 #define CHIP_io_read_region_N(BYTES,TYPE) \
508 void \
509 __C(__C(CHIP,_io_read_region_),BYTES)(v, h, o, a, c) \
510 void *v; \
511 bus_space_handle_t h; \
512 bus_size_t o, c; \
513 TYPE *a; \
514 { \
515 \
516 while (c-- > 0) { \
517 *a++ = __C(__C(CHIP,_io_read_),BYTES)(v, h, o); \
518 o += sizeof *a; \
519 } \
520 }
521 CHIP_io_read_region_N(1,u_int8_t)
522 CHIP_io_read_region_N(2,u_int16_t)
523 CHIP_io_read_region_N(4,u_int32_t)
524 CHIP_io_read_region_N(8,u_int64_t)
525
526 inline void
527 __C(CHIP,_io_write_1)(v, ioh, off, val)
528 void *v;
529 bus_space_handle_t ioh;
530 bus_size_t off;
531 u_int8_t val;
532 {
533 register bus_space_handle_t tmpioh;
534 register u_int32_t *port, nval;
535 register int offset;
536
537 tmpioh = ioh + off;
538 offset = tmpioh & 3;
539 nval = val << (8 * offset);
540 port = (u_int32_t *)((tmpioh << 5) | (0 << 3));
541 *port = nval;
542 alpha_mb();
543 }
544
545 inline void
546 __C(CHIP,_io_write_2)(v, ioh, off, val)
547 void *v;
548 bus_space_handle_t ioh;
549 bus_size_t off;
550 u_int16_t val;
551 {
552 register bus_space_handle_t tmpioh;
553 register u_int32_t *port, nval;
554 register int offset;
555
556 tmpioh = ioh + off;
557 offset = tmpioh & 3;
558 nval = val << (8 * offset);
559 port = (u_int32_t *)((tmpioh << 5) | (1 << 3));
560 *port = nval;
561 alpha_mb();
562 }
563
564 inline void
565 __C(CHIP,_io_write_4)(v, ioh, off, val)
566 void *v;
567 bus_space_handle_t ioh;
568 bus_size_t off;
569 u_int32_t val;
570 {
571 register bus_space_handle_t tmpioh;
572 register u_int32_t *port, nval;
573 register int offset;
574
575 tmpioh = ioh + off;
576 offset = tmpioh & 3;
577 nval = val /*<< (8 * offset)*/;
578 port = (u_int32_t *)((tmpioh << 5) | (3 << 3));
579 *port = nval;
580 alpha_mb();
581 }
582
583 inline void
584 __C(CHIP,_io_write_8)(v, ioh, off, val)
585 void *v;
586 bus_space_handle_t ioh;
587 bus_size_t off;
588 u_int64_t val;
589 {
590
591 /* XXX XXX XXX */
592 panic("%s not implemented", __S(__C(CHIP,_io_write_8)));
593 alpha_mb();
594 }
595
596 #define CHIP_io_write_multi_N(BYTES,TYPE) \
597 void \
598 __C(__C(CHIP,_io_write_multi_),BYTES)(v, h, o, a, c) \
599 void *v; \
600 bus_space_handle_t h; \
601 bus_size_t o, c; \
602 const TYPE *a; \
603 { \
604 \
605 while (c-- > 0) { \
606 __C(__C(CHIP,_io_write_),BYTES)(v, h, o, *a++); \
607 __C(CHIP,_io_barrier)(v, h, o, sizeof *a, \
608 BUS_BARRIER_WRITE); \
609 } \
610 }
611 CHIP_io_write_multi_N(1,u_int8_t)
612 CHIP_io_write_multi_N(2,u_int16_t)
613 CHIP_io_write_multi_N(4,u_int32_t)
614 CHIP_io_write_multi_N(8,u_int64_t)
615
616 #define CHIP_io_write_region_N(BYTES,TYPE) \
617 void \
618 __C(__C(CHIP,_io_write_region_),BYTES)(v, h, o, a, c) \
619 void *v; \
620 bus_space_handle_t h; \
621 bus_size_t o, c; \
622 const TYPE *a; \
623 { \
624 \
625 while (c-- > 0) { \
626 __C(__C(CHIP,_io_write_),BYTES)(v, h, o, *a++); \
627 o += sizeof *a; \
628 } \
629 }
630 CHIP_io_write_region_N(1,u_int8_t)
631 CHIP_io_write_region_N(2,u_int16_t)
632 CHIP_io_write_region_N(4,u_int32_t)
633 CHIP_io_write_region_N(8,u_int64_t)
634
635 #define CHIP_io_set_multi_N(BYTES,TYPE) \
636 void \
637 __C(__C(CHIP,_io_set_multi_),BYTES)(v, h, o, val, c) \
638 void *v; \
639 bus_space_handle_t h; \
640 bus_size_t o, c; \
641 TYPE val; \
642 { \
643 \
644 while (c-- > 0) { \
645 __C(__C(CHIP,_io_write_),BYTES)(v, h, o, val); \
646 __C(CHIP,_io_barrier)(v, h, o, sizeof val, \
647 BUS_BARRIER_WRITE); \
648 } \
649 }
650 CHIP_io_set_multi_N(1,u_int8_t)
651 CHIP_io_set_multi_N(2,u_int16_t)
652 CHIP_io_set_multi_N(4,u_int32_t)
653 CHIP_io_set_multi_N(8,u_int64_t)
654
655 #define CHIP_io_set_region_N(BYTES,TYPE) \
656 void \
657 __C(__C(CHIP,_io_set_region_),BYTES)(v, h, o, val, c) \
658 void *v; \
659 bus_space_handle_t h; \
660 bus_size_t o, c; \
661 TYPE val; \
662 { \
663 \
664 while (c-- > 0) { \
665 __C(__C(CHIP,_io_write_),BYTES)(v, h, o, val); \
666 o += sizeof val; \
667 } \
668 }
669 CHIP_io_set_region_N(1,u_int8_t)
670 CHIP_io_set_region_N(2,u_int16_t)
671 CHIP_io_set_region_N(4,u_int32_t)
672 CHIP_io_set_region_N(8,u_int64_t)
673
674 void
675 __C(CHIP,_io_barrier)(v, h, o, l, f)
676 void *v;
677 bus_space_handle_t h;
678 bus_size_t o, l;
679 int f;
680 {
681
682 if ((f & BUS_BARRIER_READ) != 0)
683 alpha_mb();
684 else if ((f & BUS_BARRIER_WRITE) != 0)
685 alpha_wmb();
686 }
687