Home | History | Annotate | Line # | Download | only in pci
pci_swiz_bus_io_chipdep.c revision 1.13
      1 /*	$NetBSD: pci_swiz_bus_io_chipdep.c,v 1.13 1996/12/02 07:07:21 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 /* barrier */
     60 inline void	__C(CHIP,_io_barrier) __P((void *, bus_space_handle_t,
     61 		    bus_size_t, bus_size_t, int));
     62 
     63 /* read (single) */
     64 inline u_int8_t	__C(CHIP,_io_read_1) __P((void *, bus_space_handle_t,
     65 		    bus_size_t));
     66 inline u_int16_t __C(CHIP,_io_read_2) __P((void *, bus_space_handle_t,
     67 		    bus_size_t));
     68 inline u_int32_t __C(CHIP,_io_read_4) __P((void *, bus_space_handle_t,
     69 		    bus_size_t));
     70 inline u_int64_t __C(CHIP,_io_read_8) __P((void *, bus_space_handle_t,
     71 		    bus_size_t));
     72 
     73 /* read multiple */
     74 void		__C(CHIP,_io_read_multi_1) __P((void *, bus_space_handle_t,
     75 		    bus_size_t, u_int8_t *, bus_size_t));
     76 void		__C(CHIP,_io_read_multi_2) __P((void *, bus_space_handle_t,
     77 		    bus_size_t, u_int16_t *, bus_size_t));
     78 void		__C(CHIP,_io_read_multi_4) __P((void *, bus_space_handle_t,
     79 		    bus_size_t, u_int32_t *, bus_size_t));
     80 void		__C(CHIP,_io_read_multi_8) __P((void *, bus_space_handle_t,
     81 		    bus_size_t, u_int64_t *, bus_size_t));
     82 
     83 /* read region */
     84 void		__C(CHIP,_io_read_region_1) __P((void *, bus_space_handle_t,
     85 		    bus_size_t, u_int8_t *, bus_size_t));
     86 void		__C(CHIP,_io_read_region_2) __P((void *, bus_space_handle_t,
     87 		    bus_size_t, u_int16_t *, bus_size_t));
     88 void		__C(CHIP,_io_read_region_4) __P((void *, bus_space_handle_t,
     89 		    bus_size_t, u_int32_t *, bus_size_t));
     90 void		__C(CHIP,_io_read_region_8) __P((void *, bus_space_handle_t,
     91 		    bus_size_t, u_int64_t *, bus_size_t));
     92 
     93 /* write (single) */
     94 inline void	__C(CHIP,_io_write_1) __P((void *, bus_space_handle_t,
     95 		    bus_size_t, u_int8_t));
     96 inline void	__C(CHIP,_io_write_2) __P((void *, bus_space_handle_t,
     97 		    bus_size_t, u_int16_t));
     98 inline void	__C(CHIP,_io_write_4) __P((void *, bus_space_handle_t,
     99 		    bus_size_t, u_int32_t));
    100 inline void	__C(CHIP,_io_write_8) __P((void *, bus_space_handle_t,
    101 		    bus_size_t, u_int64_t));
    102 
    103 /* write multiple */
    104 void		__C(CHIP,_io_write_multi_1) __P((void *, bus_space_handle_t,
    105 		    bus_size_t, const u_int8_t *, bus_size_t));
    106 void		__C(CHIP,_io_write_multi_2) __P((void *, bus_space_handle_t,
    107 		    bus_size_t, const u_int16_t *, bus_size_t));
    108 void		__C(CHIP,_io_write_multi_4) __P((void *, bus_space_handle_t,
    109 		    bus_size_t, const u_int32_t *, bus_size_t));
    110 void		__C(CHIP,_io_write_multi_8) __P((void *, bus_space_handle_t,
    111 		    bus_size_t, const u_int64_t *, bus_size_t));
    112 
    113 /* write region */
    114 void		__C(CHIP,_io_write_region_1) __P((void *, bus_space_handle_t,
    115 		    bus_size_t, const u_int8_t *, bus_size_t));
    116 void		__C(CHIP,_io_write_region_2) __P((void *, bus_space_handle_t,
    117 		    bus_size_t, const u_int16_t *, bus_size_t));
    118 void		__C(CHIP,_io_write_region_4) __P((void *, bus_space_handle_t,
    119 		    bus_size_t, const u_int32_t *, bus_size_t));
    120 void		__C(CHIP,_io_write_region_8) __P((void *, bus_space_handle_t,
    121 		    bus_size_t, const u_int64_t *, bus_size_t));
    122 
    123 /* set multiple */
    124 void		__C(CHIP,_io_set_multi_1) __P((void *, bus_space_handle_t,
    125 		    bus_size_t, u_int8_t, bus_size_t));
    126 void		__C(CHIP,_io_set_multi_2) __P((void *, bus_space_handle_t,
    127 		    bus_size_t, u_int16_t, bus_size_t));
    128 void		__C(CHIP,_io_set_multi_4) __P((void *, bus_space_handle_t,
    129 		    bus_size_t, u_int32_t, bus_size_t));
    130 void		__C(CHIP,_io_set_multi_8) __P((void *, bus_space_handle_t,
    131 		    bus_size_t, u_int64_t, bus_size_t));
    132 
    133 /* set region */
    134 void		__C(CHIP,_io_set_region_1) __P((void *, bus_space_handle_t,
    135 		    bus_size_t, u_int8_t, bus_size_t));
    136 void		__C(CHIP,_io_set_region_2) __P((void *, bus_space_handle_t,
    137 		    bus_size_t, u_int16_t, bus_size_t));
    138 void		__C(CHIP,_io_set_region_4) __P((void *, bus_space_handle_t,
    139 		    bus_size_t, u_int32_t, bus_size_t));
    140 void		__C(CHIP,_io_set_region_8) __P((void *, bus_space_handle_t,
    141 		    bus_size_t, u_int64_t, bus_size_t));
    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 	/* barrier */
    160 	__C(CHIP,_io_barrier),
    161 
    162 	/* read (single) */
    163 	__C(CHIP,_io_read_1),
    164 	__C(CHIP,_io_read_2),
    165 	__C(CHIP,_io_read_4),
    166 	__C(CHIP,_io_read_8),
    167 
    168 	/* read multiple */
    169 	__C(CHIP,_io_read_multi_1),
    170 	__C(CHIP,_io_read_multi_2),
    171 	__C(CHIP,_io_read_multi_4),
    172 	__C(CHIP,_io_read_multi_8),
    173 
    174 	/* read region */
    175 	__C(CHIP,_io_read_region_1),
    176 	__C(CHIP,_io_read_region_2),
    177 	__C(CHIP,_io_read_region_4),
    178 	__C(CHIP,_io_read_region_8),
    179 
    180 	/* write (single) */
    181 	__C(CHIP,_io_write_1),
    182 	__C(CHIP,_io_write_2),
    183 	__C(CHIP,_io_write_4),
    184 	__C(CHIP,_io_write_8),
    185 
    186 	/* write multiple */
    187 	__C(CHIP,_io_write_multi_1),
    188 	__C(CHIP,_io_write_multi_2),
    189 	__C(CHIP,_io_write_multi_4),
    190 	__C(CHIP,_io_write_multi_8),
    191 
    192 	/* write region */
    193 	__C(CHIP,_io_write_region_1),
    194 	__C(CHIP,_io_write_region_2),
    195 	__C(CHIP,_io_write_region_4),
    196 	__C(CHIP,_io_write_region_8),
    197 
    198 	/* set multiple */
    199 	__C(CHIP,_io_set_multi_1),
    200 	__C(CHIP,_io_set_multi_2),
    201 	__C(CHIP,_io_set_multi_4),
    202 	__C(CHIP,_io_set_multi_8),
    203 
    204 	/* set region */
    205 	__C(CHIP,_io_set_region_1),
    206 	__C(CHIP,_io_set_region_2),
    207 	__C(CHIP,_io_set_region_4),
    208 	__C(CHIP,_io_set_region_8),
    209 
    210 	/* copy */
    211 	/* XXX IMPLEMENT */
    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 void
    407 __C(CHIP,_io_barrier)(v, h, o, l, f)
    408 	void *v;
    409 	bus_space_handle_t h;
    410 	bus_size_t o, l;
    411 	int f;
    412 {
    413 
    414 	if ((f & BUS_BARRIER_READ) != 0)
    415 		alpha_mb();
    416 	else if ((f & BUS_BARRIER_WRITE) != 0)
    417 		alpha_wmb();
    418 }
    419 
    420 inline u_int8_t
    421 __C(CHIP,_io_read_1)(v, ioh, off)
    422 	void *v;
    423 	bus_space_handle_t ioh;
    424 	bus_size_t off;
    425 {
    426 	register bus_space_handle_t tmpioh;
    427 	register u_int32_t *port, val;
    428 	register u_int8_t rval;
    429 	register int offset;
    430 
    431 	alpha_mb();
    432 
    433 	tmpioh = ioh + off;
    434 	offset = tmpioh & 3;
    435 	port = (u_int32_t *)((tmpioh << 5) | (0 << 3));
    436 	val = *port;
    437 	rval = ((val) >> (8 * offset)) & 0xff;
    438 
    439 	return rval;
    440 }
    441 
    442 inline u_int16_t
    443 __C(CHIP,_io_read_2)(v, ioh, off)
    444 	void *v;
    445 	bus_space_handle_t ioh;
    446 	bus_size_t off;
    447 {
    448 	register bus_space_handle_t tmpioh;
    449 	register u_int32_t *port, val;
    450 	register u_int16_t rval;
    451 	register int offset;
    452 
    453 	alpha_mb();
    454 
    455 	tmpioh = ioh + off;
    456 	offset = tmpioh & 3;
    457 	port = (u_int32_t *)((tmpioh << 5) | (1 << 3));
    458 	val = *port;
    459 	rval = ((val) >> (8 * offset)) & 0xffff;
    460 
    461 	return rval;
    462 }
    463 
    464 inline u_int32_t
    465 __C(CHIP,_io_read_4)(v, ioh, off)
    466 	void *v;
    467 	bus_space_handle_t ioh;
    468 	bus_size_t off;
    469 {
    470 	register bus_space_handle_t tmpioh;
    471 	register u_int32_t *port, val;
    472 	register u_int32_t rval;
    473 	register int offset;
    474 
    475 	alpha_mb();
    476 
    477 	tmpioh = ioh + off;
    478 	offset = tmpioh & 3;
    479 	port = (u_int32_t *)((tmpioh << 5) | (3 << 3));
    480 	val = *port;
    481 #if 0
    482 	rval = ((val) >> (8 * offset)) & 0xffffffff;
    483 #else
    484 	rval = val;
    485 #endif
    486 
    487 	return rval;
    488 }
    489 
    490 inline u_int64_t
    491 __C(CHIP,_io_read_8)(v, ioh, off)
    492 	void *v;
    493 	bus_space_handle_t ioh;
    494 	bus_size_t off;
    495 {
    496 
    497 	/* XXX XXX XXX */
    498 	panic("%s not implemented", __S(__C(CHIP,_io_read_8)));
    499 }
    500 
    501 #define CHIP_io_read_multi_N(BYTES,TYPE)				\
    502 void									\
    503 __C(__C(CHIP,_io_read_multi_),BYTES)(v, h, o, a, c)			\
    504 	void *v;							\
    505 	bus_space_handle_t h;						\
    506 	bus_size_t o, c;						\
    507 	TYPE *a;							\
    508 {									\
    509 									\
    510 	while (c-- > 0) {						\
    511 		__C(CHIP,_io_barrier)(v, h, o, sizeof *a,		\
    512 		    BUS_BARRIER_READ);					\
    513 		*a++ = __C(__C(CHIP,_io_read_),BYTES)(v, h, o);		\
    514 	}								\
    515 }
    516 CHIP_io_read_multi_N(1,u_int8_t)
    517 CHIP_io_read_multi_N(2,u_int16_t)
    518 CHIP_io_read_multi_N(4,u_int32_t)
    519 CHIP_io_read_multi_N(8,u_int64_t)
    520 
    521 #define CHIP_io_read_region_N(BYTES,TYPE)				\
    522 void									\
    523 __C(__C(CHIP,_io_read_region_),BYTES)(v, h, o, a, c)			\
    524 	void *v;							\
    525 	bus_space_handle_t h;						\
    526 	bus_size_t o, c;						\
    527 	TYPE *a;							\
    528 {									\
    529 									\
    530 	while (c-- > 0) {						\
    531 		*a++ = __C(__C(CHIP,_io_read_),BYTES)(v, h, o);		\
    532 		o += sizeof *a;						\
    533 	}								\
    534 }
    535 CHIP_io_read_region_N(1,u_int8_t)
    536 CHIP_io_read_region_N(2,u_int16_t)
    537 CHIP_io_read_region_N(4,u_int32_t)
    538 CHIP_io_read_region_N(8,u_int64_t)
    539 
    540 inline void
    541 __C(CHIP,_io_write_1)(v, ioh, off, val)
    542 	void *v;
    543 	bus_space_handle_t ioh;
    544 	bus_size_t off;
    545 	u_int8_t val;
    546 {
    547 	register bus_space_handle_t tmpioh;
    548 	register u_int32_t *port, nval;
    549 	register int offset;
    550 
    551 	tmpioh = ioh + off;
    552 	offset = tmpioh & 3;
    553         nval = val << (8 * offset);
    554         port = (u_int32_t *)((tmpioh << 5) | (0 << 3));
    555         *port = nval;
    556         alpha_mb();
    557 }
    558 
    559 inline void
    560 __C(CHIP,_io_write_2)(v, ioh, off, val)
    561 	void *v;
    562 	bus_space_handle_t ioh;
    563 	bus_size_t off;
    564 	u_int16_t val;
    565 {
    566 	register bus_space_handle_t tmpioh;
    567 	register u_int32_t *port, nval;
    568 	register int offset;
    569 
    570 	tmpioh = ioh + off;
    571 	offset = tmpioh & 3;
    572         nval = val << (8 * offset);
    573         port = (u_int32_t *)((tmpioh << 5) | (1 << 3));
    574         *port = nval;
    575         alpha_mb();
    576 }
    577 
    578 inline void
    579 __C(CHIP,_io_write_4)(v, ioh, off, val)
    580 	void *v;
    581 	bus_space_handle_t ioh;
    582 	bus_size_t off;
    583 	u_int32_t val;
    584 {
    585 	register bus_space_handle_t tmpioh;
    586 	register u_int32_t *port, nval;
    587 	register int offset;
    588 
    589 	tmpioh = ioh + off;
    590 	offset = tmpioh & 3;
    591         nval = val /*<< (8 * offset)*/;
    592         port = (u_int32_t *)((tmpioh << 5) | (3 << 3));
    593         *port = nval;
    594         alpha_mb();
    595 }
    596 
    597 inline void
    598 __C(CHIP,_io_write_8)(v, ioh, off, val)
    599 	void *v;
    600 	bus_space_handle_t ioh;
    601 	bus_size_t off;
    602 	u_int64_t val;
    603 {
    604 
    605 	/* XXX XXX XXX */
    606 	panic("%s not implemented", __S(__C(CHIP,_io_write_8)));
    607 	alpha_mb();
    608 }
    609 
    610 #define CHIP_io_write_multi_N(BYTES,TYPE)				\
    611 void									\
    612 __C(__C(CHIP,_io_write_multi_),BYTES)(v, h, o, a, c)			\
    613 	void *v;							\
    614 	bus_space_handle_t h;						\
    615 	bus_size_t o, c;						\
    616 	const TYPE *a;							\
    617 {									\
    618 									\
    619 	while (c-- > 0) {						\
    620 		__C(__C(CHIP,_io_write_),BYTES)(v, h, o, *a++);		\
    621 		__C(CHIP,_io_barrier)(v, h, o, sizeof *a,		\
    622 		    BUS_BARRIER_WRITE);					\
    623 	}								\
    624 }
    625 CHIP_io_write_multi_N(1,u_int8_t)
    626 CHIP_io_write_multi_N(2,u_int16_t)
    627 CHIP_io_write_multi_N(4,u_int32_t)
    628 CHIP_io_write_multi_N(8,u_int64_t)
    629 
    630 #define CHIP_io_write_region_N(BYTES,TYPE)				\
    631 void									\
    632 __C(__C(CHIP,_io_write_region_),BYTES)(v, h, o, a, c)			\
    633 	void *v;							\
    634 	bus_space_handle_t h;						\
    635 	bus_size_t o, c;						\
    636 	const TYPE *a;							\
    637 {									\
    638 									\
    639 	while (c-- > 0) {						\
    640 		__C(__C(CHIP,_io_write_),BYTES)(v, h, o, *a++);		\
    641 		o += sizeof *a;						\
    642 	}								\
    643 }
    644 CHIP_io_write_region_N(1,u_int8_t)
    645 CHIP_io_write_region_N(2,u_int16_t)
    646 CHIP_io_write_region_N(4,u_int32_t)
    647 CHIP_io_write_region_N(8,u_int64_t)
    648 
    649 #define CHIP_io_set_multi_N(BYTES,TYPE)					\
    650 void									\
    651 __C(__C(CHIP,_io_set_multi_),BYTES)(v, h, o, val, c)			\
    652 	void *v;							\
    653 	bus_space_handle_t h;						\
    654 	bus_size_t o, c;						\
    655 	TYPE val;							\
    656 {									\
    657 									\
    658 	while (c-- > 0) {						\
    659 		__C(__C(CHIP,_io_write_),BYTES)(v, h, o, val);		\
    660 		__C(CHIP,_io_barrier)(v, h, o, sizeof val,		\
    661 		    BUS_BARRIER_WRITE);					\
    662 	}								\
    663 }
    664 CHIP_io_set_multi_N(1,u_int8_t)
    665 CHIP_io_set_multi_N(2,u_int16_t)
    666 CHIP_io_set_multi_N(4,u_int32_t)
    667 CHIP_io_set_multi_N(8,u_int64_t)
    668 
    669 #define CHIP_io_set_region_N(BYTES,TYPE)				\
    670 void									\
    671 __C(__C(CHIP,_io_set_region_),BYTES)(v, h, o, val, c)			\
    672 	void *v;							\
    673 	bus_space_handle_t h;						\
    674 	bus_size_t o, c;						\
    675 	TYPE val;							\
    676 {									\
    677 									\
    678 	while (c-- > 0) {						\
    679 		__C(__C(CHIP,_io_write_),BYTES)(v, h, o, val);		\
    680 		o += sizeof val;					\
    681 	}								\
    682 }
    683 CHIP_io_set_region_N(1,u_int8_t)
    684 CHIP_io_set_region_N(2,u_int16_t)
    685 CHIP_io_set_region_N(4,u_int32_t)
    686 CHIP_io_set_region_N(8,u_int64_t)
    687