1*49110545Sleo /* $NetBSD: be_bus.c,v 1.4 2000/01/19 13:12:54 leo Exp $ */ 2fe41c75bSleo 3fe41c75bSleo /*- 4243c5f7bSleo * Copyright (c) 1998 The NetBSD Foundation, Inc. 5fe41c75bSleo * All rights reserved. 6fe41c75bSleo * 7fe41c75bSleo * This code is derived from software contributed to The NetBSD Foundation 8fe41c75bSleo * by Leo Weppelman. 9fe41c75bSleo * 10fe41c75bSleo * Redistribution and use in source and binary forms, with or without 11fe41c75bSleo * modification, are permitted provided that the following conditions 12fe41c75bSleo * are met: 13fe41c75bSleo * 1. Redistributions of source code must retain the above copyright 14fe41c75bSleo * notice, this list of conditions and the following disclaimer. 15fe41c75bSleo * 2. Redistributions in binary form must reproduce the above copyright 16fe41c75bSleo * notice, this list of conditions and the following disclaimer in the 17fe41c75bSleo * documentation and/or other materials provided with the distribution. 18fe41c75bSleo * 3. All advertising materials mentioning features or use of this software 19fe41c75bSleo * must display the following acknowledgement: 20fe41c75bSleo * This product includes software developed by the NetBSD 21fe41c75bSleo * Foundation, Inc. and its contributors. 22fe41c75bSleo * 4. Neither the name of The NetBSD Foundation nor the names of its 23fe41c75bSleo * contributors may be used to endorse or promote products derived 24fe41c75bSleo * from this software without specific prior written permission. 25fe41c75bSleo * 26fe41c75bSleo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27fe41c75bSleo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28fe41c75bSleo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29fe41c75bSleo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30fe41c75bSleo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31fe41c75bSleo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32fe41c75bSleo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33fe41c75bSleo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34fe41c75bSleo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35fe41c75bSleo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36fe41c75bSleo * POSSIBILITY OF SUCH DAMAGE. 37fe41c75bSleo */ 38fe41c75bSleo #include <sys/types.h> 39fe41c75bSleo #include <sys/param.h> 40fe41c75bSleo #include <sys/systm.h> 41fe41c75bSleo #include <sys/malloc.h> 42fe41c75bSleo #include <machine/cpu.h> 43fe41c75bSleo #include <machine/bus.h> 44fe41c75bSleo 45fe41c75bSleo /* 46fe41c75bSleo * This file contains the common functions for using a big endian (linear) 47fe41c75bSleo * bus on a big endian atari. 48fe41c75bSleo */ 49fe41c75bSleo 50fe41c75bSleo /* Autoconf detection stuff */ 51fe41c75bSleo static int beb_bus_space_peek_1 __P((bus_space_tag_t, 52fe41c75bSleo bus_space_handle_t, bus_size_t)); 53fe41c75bSleo static int beb_bus_space_peek_2 __P((bus_space_tag_t, 54fe41c75bSleo bus_space_handle_t, bus_size_t)); 55fe41c75bSleo static int beb_bus_space_peek_4 __P((bus_space_tag_t, 56fe41c75bSleo bus_space_handle_t, bus_size_t)); 57fe41c75bSleo static int beb_bus_space_peek_8 __P((bus_space_tag_t, 58fe41c75bSleo bus_space_handle_t, bus_size_t)); 59fe41c75bSleo 60fe41c75bSleo /* read (single) */ 61fe41c75bSleo static u_int8_t beb_bus_space_read_1 __P((bus_space_tag_t, 62fe41c75bSleo bus_space_handle_t, bus_size_t)); 63fe41c75bSleo static u_int16_t beb_bus_space_read_2 __P((bus_space_tag_t, 64fe41c75bSleo bus_space_handle_t, bus_size_t)); 65fe41c75bSleo static u_int32_t beb_bus_space_read_4 __P((bus_space_tag_t, 66fe41c75bSleo bus_space_handle_t, bus_size_t)); 67fe41c75bSleo static u_int64_t beb_bus_space_read_8 __P((bus_space_tag_t, 68fe41c75bSleo bus_space_handle_t, bus_size_t)); 69fe41c75bSleo 70fe41c75bSleo /* write (single) */ 71fe41c75bSleo static void beb_bus_space_write_1 __P((bus_space_tag_t, 72fe41c75bSleo bus_space_handle_t, bus_size_t, u_int8_t)); 73fe41c75bSleo static void beb_bus_space_write_2 __P((bus_space_tag_t, 74fe41c75bSleo bus_space_handle_t, bus_size_t, u_int16_t)); 75fe41c75bSleo static void beb_bus_space_write_4 __P((bus_space_tag_t, 76fe41c75bSleo bus_space_handle_t, bus_size_t, u_int32_t)); 77fe41c75bSleo static void beb_bus_space_write_8 __P((bus_space_tag_t, 78fe41c75bSleo bus_space_handle_t, bus_size_t, u_int64_t)); 79fe41c75bSleo 80fe41c75bSleo /* read multiple */ 81fe41c75bSleo static void beb_bus_space_read_multi_1 __P((bus_space_tag_t, 82fe41c75bSleo bus_space_handle_t, bus_size_t, u_int8_t *, 83fe41c75bSleo bus_size_t)); 84fe41c75bSleo static void beb_bus_space_read_multi_2 __P((bus_space_tag_t, 85fe41c75bSleo bus_space_handle_t, bus_size_t, u_int16_t *, 86fe41c75bSleo bus_size_t)); 87fe41c75bSleo static void beb_bus_space_read_multi_4 __P((bus_space_tag_t, 88fe41c75bSleo bus_space_handle_t, bus_size_t, u_int32_t *, 89fe41c75bSleo bus_size_t)); 90fe41c75bSleo static void beb_bus_space_read_multi_8 __P((bus_space_tag_t, 91fe41c75bSleo bus_space_handle_t, bus_size_t, u_int64_t *, 92fe41c75bSleo bus_size_t)); 93fe41c75bSleo 94fe41c75bSleo /* write multiple */ 95fe41c75bSleo static void beb_bus_space_write_multi_1 __P((bus_space_tag_t, 96fe41c75bSleo bus_space_handle_t, bus_size_t, 97fe41c75bSleo const u_int8_t *, bus_size_t)); 98fe41c75bSleo static void beb_bus_space_write_multi_2 __P((bus_space_tag_t, 99fe41c75bSleo bus_space_handle_t, bus_size_t, 100fe41c75bSleo const u_int16_t *, bus_size_t)); 101fe41c75bSleo static void beb_bus_space_write_multi_4 __P((bus_space_tag_t, 102fe41c75bSleo bus_space_handle_t, bus_size_t, 103fe41c75bSleo const u_int32_t *, bus_size_t)); 104fe41c75bSleo static void beb_bus_space_write_multi_8 __P((bus_space_tag_t, 105fe41c75bSleo bus_space_handle_t, bus_size_t, 106fe41c75bSleo const u_int64_t *, bus_size_t)); 107fe41c75bSleo 108fe41c75bSleo /* read region */ 109fe41c75bSleo static void beb_bus_space_read_region_1 __P((bus_space_tag_t, 110fe41c75bSleo bus_space_handle_t, bus_size_t, u_int8_t *, 111fe41c75bSleo bus_size_t)); 112fe41c75bSleo static void beb_bus_space_read_region_2 __P((bus_space_tag_t, 113fe41c75bSleo bus_space_handle_t, bus_size_t, u_int16_t *, 114fe41c75bSleo bus_size_t)); 115fe41c75bSleo static void beb_bus_space_read_region_4 __P((bus_space_tag_t, 116fe41c75bSleo bus_space_handle_t, bus_size_t, u_int32_t *, 117fe41c75bSleo bus_size_t)); 118fe41c75bSleo static void beb_bus_space_read_region_8 __P((bus_space_tag_t, 119fe41c75bSleo bus_space_handle_t, bus_size_t, u_int64_t *, 120fe41c75bSleo bus_size_t)); 121fe41c75bSleo 122fe41c75bSleo /* read region */ 123fe41c75bSleo static void beb_bus_space_write_region_1 __P((bus_space_tag_t, 124fe41c75bSleo bus_space_handle_t, bus_size_t, 125fe41c75bSleo const u_int8_t *, bus_size_t)); 126fe41c75bSleo static void beb_bus_space_write_region_2 __P((bus_space_tag_t, 127fe41c75bSleo bus_space_handle_t, bus_size_t, 128fe41c75bSleo const u_int16_t *, bus_size_t)); 129fe41c75bSleo static void beb_bus_space_write_region_4 __P((bus_space_tag_t, 130fe41c75bSleo bus_space_handle_t, bus_size_t, 131fe41c75bSleo const u_int32_t *, bus_size_t)); 132fe41c75bSleo static void beb_bus_space_write_region_8 __P((bus_space_tag_t, 133fe41c75bSleo bus_space_handle_t, bus_size_t, 134fe41c75bSleo const u_int64_t *, bus_size_t)); 135fe41c75bSleo 136fe41c75bSleo /* set multi */ 137fe41c75bSleo static void beb_bus_space_set_multi_1 __P((bus_space_tag_t, 138fe41c75bSleo bus_space_handle_t, bus_size_t, u_int8_t, 139fe41c75bSleo bus_size_t)); 140fe41c75bSleo static void beb_bus_space_set_multi_2 __P((bus_space_tag_t, 141fe41c75bSleo bus_space_handle_t, bus_size_t, u_int16_t, 142fe41c75bSleo bus_size_t)); 143fe41c75bSleo static void beb_bus_space_set_multi_4 __P((bus_space_tag_t, 144fe41c75bSleo bus_space_handle_t, bus_size_t, u_int32_t, 145fe41c75bSleo bus_size_t)); 146fe41c75bSleo static void beb_bus_space_set_multi_8 __P((bus_space_tag_t, 147fe41c75bSleo bus_space_handle_t, bus_size_t, u_int64_t, 148fe41c75bSleo bus_size_t)); 149fe41c75bSleo 150fe41c75bSleo /* set region */ 151fe41c75bSleo static void beb_bus_space_set_region_1 __P((bus_space_tag_t, 152fe41c75bSleo bus_space_handle_t, bus_size_t, u_int8_t, 153fe41c75bSleo bus_size_t)); 154fe41c75bSleo static void beb_bus_space_set_region_2 __P((bus_space_tag_t, 155fe41c75bSleo bus_space_handle_t, bus_size_t, u_int16_t, 156fe41c75bSleo bus_size_t)); 157fe41c75bSleo static void beb_bus_space_set_region_4 __P((bus_space_tag_t, 158fe41c75bSleo bus_space_handle_t, bus_size_t, u_int32_t, 159fe41c75bSleo bus_size_t)); 160fe41c75bSleo static void beb_bus_space_set_region_8 __P((bus_space_tag_t, 161fe41c75bSleo bus_space_handle_t, bus_size_t, u_int64_t, 162fe41c75bSleo bus_size_t)); 163fe41c75bSleo 164fe41c75bSleo /* 165fe41c75bSleo * Don't force a function call overhead on these primitives... 166fe41c75bSleo */ 167fe41c75bSleo #define __read_1(h, o) *((u_int8_t *)((h) + (o))) 168fe41c75bSleo #define __read_2(h, o) *((u_int16_t *)((h) + (o))) 169fe41c75bSleo #define __read_4(h, o) *((u_int32_t *)((h) + (o))) 170fe41c75bSleo #define __read_8(h, o) *((u_int64_t *)((h) + (o))) 171fe41c75bSleo 172fe41c75bSleo #define __write_1(h, o, v) *((u_int8_t *)((h) + (o))) = (v) 173fe41c75bSleo #define __write_2(h, o, v) *((u_int16_t *)((h) + (o))) = (v) 174fe41c75bSleo #define __write_4(h, o, v) *((u_int32_t *)((h) + (o))) = (v) 175fe41c75bSleo #define __write_8(h, o, v) *((u_int64_t *)((h) + (o))) = (v) 176fe41c75bSleo 177fe41c75bSleo bus_space_tag_t 178*49110545Sleo beb_alloc_bus_space_tag(storage) 179*49110545Sleo bus_space_tag_t storage; 180fe41c75bSleo { 181fe41c75bSleo bus_space_tag_t beb_t; 182fe41c75bSleo 183*49110545Sleo /* 184*49110545Sleo * Allow the caller to specify storage space for the tag. This 185*49110545Sleo * is used during console config (when malloc() can't be used). 186*49110545Sleo */ 187*49110545Sleo if (storage != NULL) 188*49110545Sleo beb_t = storage; 189*49110545Sleo else { 190fe41c75bSleo if ((beb_t = malloc(sizeof(*beb_t), M_TEMP, M_NOWAIT)) == NULL) 191fe41c75bSleo return(NULL); 192*49110545Sleo } 193fe41c75bSleo bzero(beb_t, sizeof(*beb_t)); 194fe41c75bSleo 195fe41c75bSleo beb_t->abs_p_1 = beb_bus_space_peek_1; 196fe41c75bSleo beb_t->abs_p_2 = beb_bus_space_peek_2; 197fe41c75bSleo beb_t->abs_p_4 = beb_bus_space_peek_4; 198fe41c75bSleo beb_t->abs_p_8 = beb_bus_space_peek_8; 199fe41c75bSleo beb_t->abs_r_1 = beb_bus_space_read_1; 200fe41c75bSleo beb_t->abs_r_2 = beb_bus_space_read_2; 201fe41c75bSleo beb_t->abs_r_4 = beb_bus_space_read_4; 202fe41c75bSleo beb_t->abs_r_8 = beb_bus_space_read_8; 203fe41c75bSleo beb_t->abs_rs_1 = beb_bus_space_read_1; 204fe41c75bSleo beb_t->abs_rs_2 = beb_bus_space_read_2; 205fe41c75bSleo beb_t->abs_rs_4 = beb_bus_space_read_4; 206fe41c75bSleo beb_t->abs_rs_8 = beb_bus_space_read_8; 207fe41c75bSleo beb_t->abs_rm_1 = beb_bus_space_read_multi_1; 208fe41c75bSleo beb_t->abs_rm_2 = beb_bus_space_read_multi_2; 209fe41c75bSleo beb_t->abs_rm_4 = beb_bus_space_read_multi_4; 210fe41c75bSleo beb_t->abs_rm_8 = beb_bus_space_read_multi_8; 211fe41c75bSleo beb_t->abs_rms_1 = beb_bus_space_read_multi_1; 212fe41c75bSleo beb_t->abs_rms_2 = beb_bus_space_read_multi_2; 213fe41c75bSleo beb_t->abs_rms_4 = beb_bus_space_read_multi_4; 214fe41c75bSleo beb_t->abs_rms_8 = beb_bus_space_read_multi_8; 215fe41c75bSleo beb_t->abs_rr_1 = beb_bus_space_read_region_1; 216fe41c75bSleo beb_t->abs_rr_2 = beb_bus_space_read_region_2; 217fe41c75bSleo beb_t->abs_rr_4 = beb_bus_space_read_region_4; 218fe41c75bSleo beb_t->abs_rr_8 = beb_bus_space_read_region_8; 219ef7f5080Sleo beb_t->abs_rrs_1 = beb_bus_space_read_region_1; 220ef7f5080Sleo beb_t->abs_rrs_2 = beb_bus_space_read_region_2; 221ef7f5080Sleo beb_t->abs_rrs_4 = beb_bus_space_read_region_4; 222ef7f5080Sleo beb_t->abs_rrs_8 = beb_bus_space_read_region_8; 223fe41c75bSleo beb_t->abs_w_1 = beb_bus_space_write_1; 224fe41c75bSleo beb_t->abs_w_2 = beb_bus_space_write_2; 225fe41c75bSleo beb_t->abs_w_4 = beb_bus_space_write_4; 226fe41c75bSleo beb_t->abs_w_8 = beb_bus_space_write_8; 227fe41c75bSleo beb_t->abs_ws_1 = beb_bus_space_write_1; 228fe41c75bSleo beb_t->abs_ws_2 = beb_bus_space_write_2; 229fe41c75bSleo beb_t->abs_ws_4 = beb_bus_space_write_4; 230fe41c75bSleo beb_t->abs_ws_8 = beb_bus_space_write_8; 231fe41c75bSleo beb_t->abs_wm_1 = beb_bus_space_write_multi_1; 232fe41c75bSleo beb_t->abs_wm_2 = beb_bus_space_write_multi_2; 233fe41c75bSleo beb_t->abs_wm_4 = beb_bus_space_write_multi_4; 234fe41c75bSleo beb_t->abs_wm_8 = beb_bus_space_write_multi_8; 235fe41c75bSleo beb_t->abs_wms_1 = beb_bus_space_write_multi_1; 236fe41c75bSleo beb_t->abs_wms_2 = beb_bus_space_write_multi_2; 237fe41c75bSleo beb_t->abs_wms_4 = beb_bus_space_write_multi_4; 238fe41c75bSleo beb_t->abs_wms_8 = beb_bus_space_write_multi_8; 239fe41c75bSleo beb_t->abs_wr_1 = beb_bus_space_write_region_1; 240fe41c75bSleo beb_t->abs_wr_2 = beb_bus_space_write_region_2; 241fe41c75bSleo beb_t->abs_wr_4 = beb_bus_space_write_region_4; 242fe41c75bSleo beb_t->abs_wr_8 = beb_bus_space_write_region_8; 243ef7f5080Sleo beb_t->abs_wrs_1 = beb_bus_space_write_region_1; 244ef7f5080Sleo beb_t->abs_wrs_2 = beb_bus_space_write_region_2; 245ef7f5080Sleo beb_t->abs_wrs_4 = beb_bus_space_write_region_4; 246ef7f5080Sleo beb_t->abs_wrs_8 = beb_bus_space_write_region_8; 247fe41c75bSleo beb_t->abs_sm_1 = beb_bus_space_set_multi_1; 248fe41c75bSleo beb_t->abs_sm_2 = beb_bus_space_set_multi_2; 249fe41c75bSleo beb_t->abs_sm_4 = beb_bus_space_set_multi_4; 250fe41c75bSleo beb_t->abs_sm_8 = beb_bus_space_set_multi_8; 251fe41c75bSleo beb_t->abs_sr_1 = beb_bus_space_set_region_1; 252fe41c75bSleo beb_t->abs_sr_2 = beb_bus_space_set_region_2; 253fe41c75bSleo beb_t->abs_sr_4 = beb_bus_space_set_region_4; 254fe41c75bSleo beb_t->abs_sr_8 = beb_bus_space_set_region_8; 255fe41c75bSleo 256fe41c75bSleo return(beb_t); 257fe41c75bSleo } 258fe41c75bSleo 259fe41c75bSleo 260fe41c75bSleo /* 261fe41c75bSleo * The various access functions 262fe41c75bSleo */ 263fe41c75bSleo 264fe41c75bSleo /* 265fe41c75bSleo * int bus_space_peek_N __P((bus_space_tag_t tag, 266fe41c75bSleo * bus_space_handle_t sh, bus_size_t offset)); 267fe41c75bSleo * 268fe41c75bSleo * Check if the address is suitable for reading N-byte quantities. 269fe41c75bSleo */ 270fe41c75bSleo static int 271fe41c75bSleo beb_bus_space_peek_1(t, h, o) 272fe41c75bSleo bus_space_tag_t t; 273fe41c75bSleo bus_space_handle_t h; 274fe41c75bSleo bus_size_t o; 275fe41c75bSleo { 276fe41c75bSleo return(!badbaddr((caddr_t)(h + o), 1)); 277fe41c75bSleo } 278fe41c75bSleo 279fe41c75bSleo static int 280fe41c75bSleo beb_bus_space_peek_2(t, h, o) 281fe41c75bSleo bus_space_tag_t t; 282fe41c75bSleo bus_space_handle_t h; 283fe41c75bSleo bus_size_t o; 284fe41c75bSleo { 285fe41c75bSleo return(!badbaddr((caddr_t)(h + o), 2)); 286fe41c75bSleo } 287fe41c75bSleo 288fe41c75bSleo static int 289fe41c75bSleo beb_bus_space_peek_4(t, h, o) 290fe41c75bSleo bus_space_tag_t t; 291fe41c75bSleo bus_space_handle_t h; 292fe41c75bSleo bus_size_t o; 293fe41c75bSleo { 294fe41c75bSleo return(!badbaddr((caddr_t)(h + o), 4)); 295fe41c75bSleo } 296fe41c75bSleo 297fe41c75bSleo static int 298fe41c75bSleo beb_bus_space_peek_8(t, h, o) 299fe41c75bSleo bus_space_tag_t t; 300fe41c75bSleo bus_space_handle_t h; 301fe41c75bSleo bus_size_t o; 302fe41c75bSleo { 303fe41c75bSleo return(!badbaddr((caddr_t)(h + o), 8)); 304fe41c75bSleo } 305fe41c75bSleo 306fe41c75bSleo /* 307fe41c75bSleo * u_intX_t bus_space_read_N __P((bus_space_tag_t tag, 308fe41c75bSleo * bus_space_handle_t bsh, bus_size_t offset)); 309fe41c75bSleo * 310fe41c75bSleo * Return an 1, 2, 4, or 8 byte value read from the bus_space described 311fe41c75bSleo * by tag/handle at `offset'. The value is converted to host-endian. 312fe41c75bSleo */ 313fe41c75bSleo static u_int8_t 314fe41c75bSleo beb_bus_space_read_1(t, h, o) 315fe41c75bSleo bus_space_tag_t t; 316fe41c75bSleo bus_space_handle_t h; 317fe41c75bSleo bus_size_t o; 318fe41c75bSleo { 319fe41c75bSleo return(__read_1(h, o)); 320fe41c75bSleo } 321fe41c75bSleo 322fe41c75bSleo static u_int16_t 323fe41c75bSleo beb_bus_space_read_2(t, h, o) 324fe41c75bSleo bus_space_tag_t t; 325fe41c75bSleo bus_space_handle_t h; 326fe41c75bSleo bus_size_t o; 327fe41c75bSleo { 328fe41c75bSleo return(__read_2(h, o)); 329fe41c75bSleo } 330fe41c75bSleo 331fe41c75bSleo static u_int32_t 332fe41c75bSleo beb_bus_space_read_4(t, h, o) 333fe41c75bSleo bus_space_tag_t t; 334fe41c75bSleo bus_space_handle_t h; 335fe41c75bSleo bus_size_t o; 336fe41c75bSleo { 337fe41c75bSleo return(__read_4(h, o)); 338fe41c75bSleo } 339fe41c75bSleo 340fe41c75bSleo static u_int64_t 341fe41c75bSleo beb_bus_space_read_8(t, h, o) 342fe41c75bSleo bus_space_tag_t t; 343fe41c75bSleo bus_space_handle_t h; 344fe41c75bSleo bus_size_t o; 345fe41c75bSleo { 346fe41c75bSleo return(__read_8(h, o)); 347fe41c75bSleo } 348fe41c75bSleo 349fe41c75bSleo /* 350fe41c75bSleo * u_intX_t bus_space_write_N __P((bus_space_tag_t tag, 351fe41c75bSleo * bus_space_handle_t bsh, bus_size_t offset, u_intX_t val)); 352fe41c75bSleo * 353fe41c75bSleo * Write an 1, 2, 4, or 8 byte value to the bus_space described by tag/handle 354fe41c75bSleo * at `offset'. The value `val' is converted from host to bus endianness 355fe41c75bSleo * before being written. 356fe41c75bSleo */ 357fe41c75bSleo static void 358fe41c75bSleo beb_bus_space_write_1(t, h, o, v) 359fe41c75bSleo bus_space_tag_t t; 360fe41c75bSleo bus_space_handle_t h; 361fe41c75bSleo bus_size_t o; 362fe41c75bSleo u_int8_t v; 363fe41c75bSleo { 364fe41c75bSleo __write_1(h, o, v); 365fe41c75bSleo } 366fe41c75bSleo 367fe41c75bSleo static void 368fe41c75bSleo beb_bus_space_write_2(t, h, o, v) 369fe41c75bSleo bus_space_tag_t t; 370fe41c75bSleo bus_space_handle_t h; 371fe41c75bSleo bus_size_t o; 372fe41c75bSleo u_int16_t v; 373fe41c75bSleo { 374fe41c75bSleo __write_2(h, o, v); 375fe41c75bSleo } 376fe41c75bSleo 377fe41c75bSleo static void 378fe41c75bSleo beb_bus_space_write_4(t, h, o, v) 379fe41c75bSleo bus_space_tag_t t; 380fe41c75bSleo bus_space_handle_t h; 381fe41c75bSleo bus_size_t o; 382fe41c75bSleo u_int32_t v; 383fe41c75bSleo { 384fe41c75bSleo __write_4(h, o, v); 385fe41c75bSleo } 386fe41c75bSleo 387fe41c75bSleo static void 388fe41c75bSleo beb_bus_space_write_8(t, h, o, v) 389fe41c75bSleo bus_space_tag_t t; 390fe41c75bSleo bus_space_handle_t h; 391fe41c75bSleo bus_size_t o; 392fe41c75bSleo u_int64_t v; 393fe41c75bSleo { 394fe41c75bSleo __write_8(h, o, v); 395fe41c75bSleo } 396fe41c75bSleo 397fe41c75bSleo /* 398fe41c75bSleo * void bus_space_read_multi_N __P((bus_space_tag_t tag, 399fe41c75bSleo * bus_space_handle_t bsh, bus_size_t offset, u_intX_t *address, 400fe41c75bSleo * bus_size_t count)); 401fe41c75bSleo * 402fe41c75bSleo * Read 'count' 1, 2, 4, or 8 byte values from the bus_space described by 403fe41c75bSleo * tag/handle at `offset' and store them in the address range starting at 404fe41c75bSleo * 'address'. The values are converted to cpu endian order before being 405fe41c75bSleo * being stored. 406fe41c75bSleo */ 407fe41c75bSleo static void 408fe41c75bSleo beb_bus_space_read_multi_1(t, h, o, a, c) 409fe41c75bSleo bus_space_tag_t t; 410fe41c75bSleo bus_space_handle_t h; 411fe41c75bSleo bus_size_t o, c; 412fe41c75bSleo u_int8_t *a; 413fe41c75bSleo { 414fe41c75bSleo for (; c; a++, c--) 415fe41c75bSleo *a = __read_1(h, o); 416fe41c75bSleo } 417fe41c75bSleo static void 418fe41c75bSleo beb_bus_space_read_multi_2(t, h, o, a, c) 419fe41c75bSleo bus_space_tag_t t; 420fe41c75bSleo bus_space_handle_t h; 421fe41c75bSleo bus_size_t o, c; 422fe41c75bSleo u_int16_t *a; 423fe41c75bSleo { 424fe41c75bSleo for (; c; a++, c--) 425fe41c75bSleo *a = __read_2(h, o); 426fe41c75bSleo } 427fe41c75bSleo 428fe41c75bSleo static void 429fe41c75bSleo beb_bus_space_read_multi_4(t, h, o, a, c) 430fe41c75bSleo bus_space_tag_t t; 431fe41c75bSleo bus_space_handle_t h; 432fe41c75bSleo bus_size_t o, c; 433fe41c75bSleo u_int32_t *a; 434fe41c75bSleo { 435fe41c75bSleo for (; c; a++, c--) 436fe41c75bSleo *a = __read_4(h, o); 437fe41c75bSleo } 438fe41c75bSleo 439fe41c75bSleo static void 440fe41c75bSleo beb_bus_space_read_multi_8(t, h, o, a, c) 441fe41c75bSleo bus_space_tag_t t; 442fe41c75bSleo bus_space_handle_t h; 443fe41c75bSleo bus_size_t o, c; 444fe41c75bSleo u_int64_t *a; 445fe41c75bSleo { 446fe41c75bSleo for (; c; a++, c--) 447fe41c75bSleo *a = __read_8(h, o); 448fe41c75bSleo } 449fe41c75bSleo 450fe41c75bSleo /* 451fe41c75bSleo * void bus_space_write_multi_N __P((bus_space_tag_t tag, 452fe41c75bSleo * bus_space_handle_t bsh, bus_size_t offset, 453fe41c75bSleo * const u_intX_t *address, bus_size_t count)); 454fe41c75bSleo * 455fe41c75bSleo * Write 'count' 1, 2, 4, or 8 byte values from the address range starting 456fe41c75bSleo * at 'address' to the bus_space described by tag/handle at `offset'. 457fe41c75bSleo * The values are converted to bus endian order before being written to 458fe41c75bSleo * the bus. 459fe41c75bSleo */ 460fe41c75bSleo static void 461fe41c75bSleo beb_bus_space_write_multi_1(t, h, o, a, c) 462fe41c75bSleo bus_space_tag_t t; 463fe41c75bSleo bus_space_handle_t h; 464fe41c75bSleo bus_size_t o, c; 465fe41c75bSleo const u_int8_t *a; 466fe41c75bSleo { 467fe41c75bSleo for (; c; a++, c--) 468fe41c75bSleo __write_1(h, o, *a); 469fe41c75bSleo } 470fe41c75bSleo 471fe41c75bSleo static void 472fe41c75bSleo beb_bus_space_write_multi_2(t, h, o, a, c) 473fe41c75bSleo bus_space_tag_t t; 474fe41c75bSleo bus_space_handle_t h; 475fe41c75bSleo bus_size_t o, c; 476fe41c75bSleo const u_int16_t *a; 477fe41c75bSleo { 478fe41c75bSleo for (; c; a++, c--) 479fe41c75bSleo __write_2(h, o, *a); 480fe41c75bSleo } 481fe41c75bSleo 482fe41c75bSleo static void 483fe41c75bSleo beb_bus_space_write_multi_4(t, h, o, a, c) 484fe41c75bSleo bus_space_tag_t t; 485fe41c75bSleo bus_space_handle_t h; 486fe41c75bSleo bus_size_t o, c; 487fe41c75bSleo const u_int32_t *a; 488fe41c75bSleo { 489fe41c75bSleo for (; c; a++, c--) 490fe41c75bSleo __write_4(h, o, *a); 491fe41c75bSleo } 492fe41c75bSleo 493fe41c75bSleo static void 494fe41c75bSleo beb_bus_space_write_multi_8(t, h, o, a, c) 495fe41c75bSleo bus_space_tag_t t; 496fe41c75bSleo bus_space_handle_t h; 497fe41c75bSleo bus_size_t o, c; 498fe41c75bSleo const u_int64_t *a; 499fe41c75bSleo { 500fe41c75bSleo for (; c; a++, c--) 501fe41c75bSleo __write_8(h, o, *a); 502fe41c75bSleo } 503fe41c75bSleo 504fe41c75bSleo /* 505fe41c75bSleo * void bus_space_read_region_N __P((bus_space_tag_t tag, 506fe41c75bSleo * bus_space_handle_t bsh, bus_size_t offset, 507fe41c75bSleo * u_intN_t *addr, bus_size_t count)); 508fe41c75bSleo * 509fe41c75bSleo * Read `count' 1, 2, 4, or 8 byte quantities from bus space 510fe41c75bSleo * described by tag/handle and starting at `offset' and copy into 511fe41c75bSleo * buffer provided. 512fe41c75bSleo */ 513fe41c75bSleo static void 514fe41c75bSleo beb_bus_space_read_region_1(t, h, o, a, c) 515fe41c75bSleo bus_space_tag_t t; 516fe41c75bSleo bus_space_handle_t h; 517fe41c75bSleo bus_size_t o, c; 518fe41c75bSleo u_int8_t *a; 519fe41c75bSleo { 520fe41c75bSleo for (; c; a++, o++, c--) 521fe41c75bSleo *a = __read_1(h, o); 522fe41c75bSleo } 523fe41c75bSleo 524fe41c75bSleo static void 525fe41c75bSleo beb_bus_space_read_region_2(t, h, o, a, c) 526fe41c75bSleo bus_space_tag_t t; 527fe41c75bSleo bus_space_handle_t h; 528fe41c75bSleo bus_size_t o, c; 529fe41c75bSleo u_int16_t *a; 530fe41c75bSleo { 531fe41c75bSleo for (; c; a++, o += 2, c--) 532fe41c75bSleo *a = __read_2(h, o); 533fe41c75bSleo } 534fe41c75bSleo 535fe41c75bSleo static void 536fe41c75bSleo beb_bus_space_read_region_4(t, h, o, a, c) 537fe41c75bSleo bus_space_tag_t t; 538fe41c75bSleo bus_space_handle_t h; 539fe41c75bSleo bus_size_t o, c; 540fe41c75bSleo u_int32_t *a; 541fe41c75bSleo { 542fe41c75bSleo for (; c; a++, o += 4, c--) 543fe41c75bSleo *a = __read_4(h, o); 544fe41c75bSleo } 545fe41c75bSleo 546fe41c75bSleo static void 547fe41c75bSleo beb_bus_space_read_region_8(t, h, o, a, c) 548fe41c75bSleo bus_space_tag_t t; 549fe41c75bSleo bus_space_handle_t h; 550fe41c75bSleo bus_size_t o, c; 551fe41c75bSleo u_int64_t *a; 552fe41c75bSleo { 553fe41c75bSleo for (; c; a++, o += 8, c--) 554fe41c75bSleo *a = __read_8(h, o); 555fe41c75bSleo } 556fe41c75bSleo 557fe41c75bSleo /* 558fe41c75bSleo * void bus_space_write_region_N __P((bus_space_tag_t tag, 559fe41c75bSleo * bus_space_handle_t bsh, bus_size_t offset, 560fe41c75bSleo * u_intN_t *addr, bus_size_t count)); 561fe41c75bSleo * 562fe41c75bSleo * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided 563fe41c75bSleo * into the bus space described by tag/handle and starting at `offset'. 564fe41c75bSleo */ 565fe41c75bSleo static void 566fe41c75bSleo beb_bus_space_write_region_1(t, h, o, a, c) 567fe41c75bSleo bus_space_tag_t t; 568fe41c75bSleo bus_space_handle_t h; 569fe41c75bSleo bus_size_t o, c; 570fe41c75bSleo const u_int8_t *a; 571fe41c75bSleo { 572fe41c75bSleo for (; c; a++, o++, c--) 573fe41c75bSleo __write_1(h, o, *a); 574fe41c75bSleo } 575fe41c75bSleo 576fe41c75bSleo static void 577fe41c75bSleo beb_bus_space_write_region_2(t, h, o, a, c) 578fe41c75bSleo bus_space_tag_t t; 579fe41c75bSleo bus_space_handle_t h; 580fe41c75bSleo bus_size_t o, c; 581fe41c75bSleo const u_int16_t *a; 582fe41c75bSleo { 583fe41c75bSleo for (; c; a++, o += 2, c--) 584fe41c75bSleo __write_2(h, o, *a); 585fe41c75bSleo } 586fe41c75bSleo 587fe41c75bSleo static void 588fe41c75bSleo beb_bus_space_write_region_4(t, h, o, a, c) 589fe41c75bSleo bus_space_tag_t t; 590fe41c75bSleo bus_space_handle_t h; 591fe41c75bSleo bus_size_t o, c; 592fe41c75bSleo const u_int32_t *a; 593fe41c75bSleo { 594fe41c75bSleo for (; c; a++, o += 4, c--) 595fe41c75bSleo __write_4(h, o, *a); 596fe41c75bSleo } 597fe41c75bSleo 598fe41c75bSleo static void 599fe41c75bSleo beb_bus_space_write_region_8(t, h, o, a, c) 600fe41c75bSleo bus_space_tag_t t; 601fe41c75bSleo bus_space_handle_t h; 602fe41c75bSleo bus_size_t o, c; 603fe41c75bSleo const u_int64_t *a; 604fe41c75bSleo { 605fe41c75bSleo for (; c; a++, o += 8, c--) 606fe41c75bSleo __write_8(h, o, *a); 607fe41c75bSleo } 608fe41c75bSleo 609fe41c75bSleo /* 610fe41c75bSleo * void bus_space_set_multi_N __P((bus_space_tag_t tag, 611fe41c75bSleo * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 612fe41c75bSleo * bus_size_t count)); 613fe41c75bSleo * 614fe41c75bSleo * Write the 1, 2, 4, or 8 byte value `val' to bus space described 615fe41c75bSleo * by tag/handle/offset `count' times. 616fe41c75bSleo */ 617fe41c75bSleo 618fe41c75bSleo static void 619fe41c75bSleo beb_bus_space_set_multi_1(t, h, o, v, c) 620fe41c75bSleo bus_space_tag_t t; 621fe41c75bSleo bus_space_handle_t h; 622fe41c75bSleo bus_size_t o, c; 623fe41c75bSleo u_int8_t v; 624fe41c75bSleo { 625fe41c75bSleo for (; c; c--) 626fe41c75bSleo __write_1(h, o, v); 627fe41c75bSleo } 628fe41c75bSleo 629fe41c75bSleo static void 630fe41c75bSleo beb_bus_space_set_multi_2(t, h, o, v, c) 631fe41c75bSleo bus_space_tag_t t; 632fe41c75bSleo bus_space_handle_t h; 633fe41c75bSleo bus_size_t o, c; 634fe41c75bSleo u_int16_t v; 635fe41c75bSleo { 636fe41c75bSleo for (; c; c--) 637fe41c75bSleo __write_2(h, o, v); 638fe41c75bSleo } 639fe41c75bSleo 640fe41c75bSleo static void 641fe41c75bSleo beb_bus_space_set_multi_4(t, h, o, v, c) 642fe41c75bSleo bus_space_tag_t t; 643fe41c75bSleo bus_space_handle_t h; 644fe41c75bSleo bus_size_t o, c; 645fe41c75bSleo u_int32_t v; 646fe41c75bSleo { 647fe41c75bSleo for (; c; c--) 648fe41c75bSleo __write_4(h, o, v); 649fe41c75bSleo } 650fe41c75bSleo 651fe41c75bSleo static void 652fe41c75bSleo beb_bus_space_set_multi_8(t, h, o, v, c) 653fe41c75bSleo bus_space_tag_t t; 654fe41c75bSleo bus_space_handle_t h; 655fe41c75bSleo bus_size_t o, c; 656fe41c75bSleo u_int64_t v; 657fe41c75bSleo { 658fe41c75bSleo for (; c; c--) 659fe41c75bSleo __write_8(h, o, v); 660fe41c75bSleo } 661fe41c75bSleo 662fe41c75bSleo /* 663fe41c75bSleo * void bus_space_set_region_N __P((bus_space_tag_t tag, 664fe41c75bSleo * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 665fe41c75bSleo * bus_size_t count)); 666fe41c75bSleo * 667fe41c75bSleo * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 668fe41c75bSleo * by tag/handle starting at `offset'. 669fe41c75bSleo */ 670fe41c75bSleo static void 671fe41c75bSleo beb_bus_space_set_region_1(t, h, o, v, c) 672fe41c75bSleo bus_space_tag_t t; 673fe41c75bSleo bus_space_handle_t h; 674fe41c75bSleo bus_size_t o, c; 675fe41c75bSleo u_int8_t v; 676fe41c75bSleo { 677fe41c75bSleo for (; c; o++, c--) 678fe41c75bSleo __write_1(h, o, v); 679fe41c75bSleo } 680fe41c75bSleo 681fe41c75bSleo static void 682fe41c75bSleo beb_bus_space_set_region_2(t, h, o, v, c) 683fe41c75bSleo bus_space_tag_t t; 684fe41c75bSleo bus_space_handle_t h; 685fe41c75bSleo bus_size_t o, c; 686fe41c75bSleo u_int16_t v; 687fe41c75bSleo { 688fe41c75bSleo for (; c; o += 2, c--) 689fe41c75bSleo __write_2(h, o, v); 690fe41c75bSleo } 691fe41c75bSleo 692fe41c75bSleo static void 693fe41c75bSleo beb_bus_space_set_region_4(t, h, o, v, c) 694fe41c75bSleo bus_space_tag_t t; 695fe41c75bSleo bus_space_handle_t h; 696fe41c75bSleo bus_size_t o, c; 697fe41c75bSleo u_int32_t v; 698fe41c75bSleo { 699fe41c75bSleo for (; c; o += 4, c--) 700fe41c75bSleo __write_4(h, o, v); 701fe41c75bSleo } 702fe41c75bSleo 703fe41c75bSleo static void 704fe41c75bSleo beb_bus_space_set_region_8(t, h, o, v, c) 705fe41c75bSleo bus_space_tag_t t; 706fe41c75bSleo bus_space_handle_t h; 707fe41c75bSleo bus_size_t o, c; 708fe41c75bSleo u_int64_t v; 709fe41c75bSleo { 710fe41c75bSleo for (; c; o += 8, c--) 711fe41c75bSleo __write_8(h, o, v); 712fe41c75bSleo } 713