be_bus.c revision 1.11
11.11Stsutsui/* $NetBSD: be_bus.c,v 1.11 2009/03/05 13:21:44 tsutsui Exp $ */ 21.1Sleo 31.1Sleo/*- 41.2Sleo * Copyright (c) 1998 The NetBSD Foundation, Inc. 51.1Sleo * All rights reserved. 61.1Sleo * 71.1Sleo * This code is derived from software contributed to The NetBSD Foundation 81.1Sleo * by Leo Weppelman. 91.1Sleo * 101.1Sleo * Redistribution and use in source and binary forms, with or without 111.1Sleo * modification, are permitted provided that the following conditions 121.1Sleo * are met: 131.1Sleo * 1. Redistributions of source code must retain the above copyright 141.1Sleo * notice, this list of conditions and the following disclaimer. 151.1Sleo * 2. Redistributions in binary form must reproduce the above copyright 161.1Sleo * notice, this list of conditions and the following disclaimer in the 171.1Sleo * documentation and/or other materials provided with the distribution. 181.1Sleo * 191.1Sleo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 201.1Sleo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 211.1Sleo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221.1Sleo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 231.1Sleo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241.1Sleo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251.1Sleo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261.1Sleo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271.1Sleo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281.1Sleo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291.1Sleo * POSSIBILITY OF SUCH DAMAGE. 301.1Sleo */ 311.5Slukem 321.5Slukem#include <sys/cdefs.h> 331.11Stsutsui__KERNEL_RCSID(0, "$NetBSD: be_bus.c,v 1.11 2009/03/05 13:21:44 tsutsui Exp $"); 341.5Slukem 351.1Sleo#include <sys/types.h> 361.1Sleo#include <sys/param.h> 371.1Sleo#include <sys/systm.h> 381.1Sleo#include <sys/malloc.h> 391.1Sleo#include <machine/cpu.h> 401.1Sleo#include <machine/bus.h> 411.1Sleo 421.1Sleo/* 431.1Sleo * This file contains the common functions for using a big endian (linear) 441.1Sleo * bus on a big endian atari. 451.1Sleo */ 461.1Sleo 471.1Sleo /* Autoconf detection stuff */ 481.11Stsutsuistatic int beb_bus_space_peek_1(bus_space_tag_t, 491.11Stsutsui bus_space_handle_t, bus_size_t); 501.11Stsutsuistatic int beb_bus_space_peek_2(bus_space_tag_t, 511.11Stsutsui bus_space_handle_t, bus_size_t); 521.11Stsutsuistatic int beb_bus_space_peek_4(bus_space_tag_t, 531.11Stsutsui bus_space_handle_t, bus_size_t); 541.11Stsutsuistatic int beb_bus_space_peek_8(bus_space_tag_t, 551.11Stsutsui bus_space_handle_t, bus_size_t); 561.1Sleo 571.1Sleo /* read (single) */ 581.11Stsutsuistatic u_int8_t beb_bus_space_read_1(bus_space_tag_t, 591.11Stsutsui bus_space_handle_t, bus_size_t); 601.11Stsutsuistatic u_int16_t beb_bus_space_read_2(bus_space_tag_t, 611.11Stsutsui bus_space_handle_t, bus_size_t); 621.11Stsutsuistatic u_int32_t beb_bus_space_read_4(bus_space_tag_t, 631.11Stsutsui bus_space_handle_t, bus_size_t); 641.11Stsutsuistatic u_int64_t beb_bus_space_read_8(bus_space_tag_t, 651.11Stsutsui bus_space_handle_t, bus_size_t); 661.1Sleo 671.1Sleo /* write (single) */ 681.11Stsutsuistatic void beb_bus_space_write_1(bus_space_tag_t, 691.11Stsutsui bus_space_handle_t, bus_size_t, u_int8_t); 701.11Stsutsuistatic void beb_bus_space_write_2(bus_space_tag_t, 711.11Stsutsui bus_space_handle_t, bus_size_t, u_int16_t); 721.11Stsutsuistatic void beb_bus_space_write_4(bus_space_tag_t, 731.11Stsutsui bus_space_handle_t, bus_size_t, u_int32_t); 741.11Stsutsuistatic void beb_bus_space_write_8(bus_space_tag_t, 751.11Stsutsui bus_space_handle_t, bus_size_t, u_int64_t); 761.1Sleo 771.1Sleo /* read multiple */ 781.11Stsutsuistatic void beb_bus_space_read_multi_1(bus_space_tag_t, 791.1Sleo bus_space_handle_t, bus_size_t, u_int8_t *, 801.11Stsutsui bus_size_t); 811.11Stsutsuistatic void beb_bus_space_read_multi_2(bus_space_tag_t, 821.1Sleo bus_space_handle_t, bus_size_t, u_int16_t *, 831.11Stsutsui bus_size_t); 841.11Stsutsuistatic void beb_bus_space_read_multi_4(bus_space_tag_t, 851.1Sleo bus_space_handle_t, bus_size_t, u_int32_t *, 861.11Stsutsui bus_size_t); 871.11Stsutsuistatic void beb_bus_space_read_multi_8(bus_space_tag_t, 881.1Sleo bus_space_handle_t, bus_size_t, u_int64_t *, 891.11Stsutsui bus_size_t); 901.1Sleo 911.1Sleo /* write multiple */ 921.11Stsutsuistatic void beb_bus_space_write_multi_1(bus_space_tag_t, 931.1Sleo bus_space_handle_t, bus_size_t, 941.11Stsutsui const u_int8_t *, bus_size_t); 951.11Stsutsuistatic void beb_bus_space_write_multi_2(bus_space_tag_t, 961.1Sleo bus_space_handle_t, bus_size_t, 971.11Stsutsui const u_int16_t *, bus_size_t); 981.11Stsutsuistatic void beb_bus_space_write_multi_4(bus_space_tag_t, 991.1Sleo bus_space_handle_t, bus_size_t, 1001.11Stsutsui const u_int32_t *, bus_size_t); 1011.11Stsutsuistatic void beb_bus_space_write_multi_8(bus_space_tag_t, 1021.1Sleo bus_space_handle_t, bus_size_t, 1031.11Stsutsui const u_int64_t *, bus_size_t); 1041.1Sleo 1051.1Sleo /* read region */ 1061.11Stsutsuistatic void beb_bus_space_read_region_1(bus_space_tag_t, 1071.1Sleo bus_space_handle_t, bus_size_t, u_int8_t *, 1081.11Stsutsui bus_size_t); 1091.11Stsutsuistatic void beb_bus_space_read_region_2(bus_space_tag_t, 1101.1Sleo bus_space_handle_t, bus_size_t, u_int16_t *, 1111.11Stsutsui bus_size_t); 1121.11Stsutsuistatic void beb_bus_space_read_region_4(bus_space_tag_t, 1131.1Sleo bus_space_handle_t, bus_size_t, u_int32_t *, 1141.11Stsutsui bus_size_t); 1151.11Stsutsuistatic void beb_bus_space_read_region_8(bus_space_tag_t, 1161.1Sleo bus_space_handle_t, bus_size_t, u_int64_t *, 1171.11Stsutsui bus_size_t); 1181.1Sleo 1191.1Sleo /* read region */ 1201.11Stsutsuistatic void beb_bus_space_write_region_1(bus_space_tag_t, 1211.1Sleo bus_space_handle_t, bus_size_t, 1221.11Stsutsui const u_int8_t *, bus_size_t); 1231.11Stsutsuistatic void beb_bus_space_write_region_2(bus_space_tag_t, 1241.1Sleo bus_space_handle_t, bus_size_t, 1251.11Stsutsui const u_int16_t *, bus_size_t); 1261.11Stsutsuistatic void beb_bus_space_write_region_4(bus_space_tag_t, 1271.1Sleo bus_space_handle_t, bus_size_t, 1281.11Stsutsui const u_int32_t *, bus_size_t); 1291.11Stsutsuistatic void beb_bus_space_write_region_8(bus_space_tag_t, 1301.1Sleo bus_space_handle_t, bus_size_t, 1311.11Stsutsui const u_int64_t *, bus_size_t); 1321.1Sleo 1331.1Sleo /* set multi */ 1341.11Stsutsuistatic void beb_bus_space_set_multi_1(bus_space_tag_t, 1351.1Sleo bus_space_handle_t, bus_size_t, u_int8_t, 1361.11Stsutsui bus_size_t); 1371.11Stsutsuistatic void beb_bus_space_set_multi_2(bus_space_tag_t, 1381.1Sleo bus_space_handle_t, bus_size_t, u_int16_t, 1391.11Stsutsui bus_size_t); 1401.11Stsutsuistatic void beb_bus_space_set_multi_4(bus_space_tag_t, 1411.1Sleo bus_space_handle_t, bus_size_t, u_int32_t, 1421.11Stsutsui bus_size_t); 1431.11Stsutsuistatic void beb_bus_space_set_multi_8(bus_space_tag_t, 1441.1Sleo bus_space_handle_t, bus_size_t, u_int64_t, 1451.11Stsutsui bus_size_t); 1461.1Sleo 1471.1Sleo /* set region */ 1481.11Stsutsuistatic void beb_bus_space_set_region_1(bus_space_tag_t, 1491.1Sleo bus_space_handle_t, bus_size_t, u_int8_t, 1501.11Stsutsui bus_size_t); 1511.11Stsutsuistatic void beb_bus_space_set_region_2(bus_space_tag_t, 1521.1Sleo bus_space_handle_t, bus_size_t, u_int16_t, 1531.11Stsutsui bus_size_t); 1541.11Stsutsuistatic void beb_bus_space_set_region_4(bus_space_tag_t, 1551.1Sleo bus_space_handle_t, bus_size_t, u_int32_t, 1561.11Stsutsui bus_size_t); 1571.11Stsutsuistatic void beb_bus_space_set_region_8(bus_space_tag_t, 1581.1Sleo bus_space_handle_t, bus_size_t, u_int64_t, 1591.11Stsutsui bus_size_t); 1601.1Sleo 1611.1Sleo/* 1621.1Sleo * Don't force a function call overhead on these primitives... 1631.1Sleo */ 1641.10Stsutsui#define __read_1(h, o) *((volatile u_int8_t *)((h) + (o))) 1651.10Stsutsui#define __read_2(h, o) *((volatile u_int16_t *)((h) + (o))) 1661.10Stsutsui#define __read_4(h, o) *((volatile u_int32_t *)((h) + (o))) 1671.10Stsutsui#define __read_8(h, o) *((volatile u_int64_t *)((h) + (o))) 1681.10Stsutsui 1691.10Stsutsui#define __write_1(h, o, v) *((volatile u_int8_t *)((h) + (o))) = (v) 1701.10Stsutsui#define __write_2(h, o, v) *((volatile u_int16_t *)((h) + (o))) = (v) 1711.10Stsutsui#define __write_4(h, o, v) *((volatile u_int32_t *)((h) + (o))) = (v) 1721.10Stsutsui#define __write_8(h, o, v) *((volatile u_int64_t *)((h) + (o))) = (v) 1731.1Sleo 1741.1Sleobus_space_tag_t 1751.4Sleobeb_alloc_bus_space_tag(storage) 1761.4Sleobus_space_tag_t storage; 1771.1Sleo{ 1781.1Sleo bus_space_tag_t beb_t; 1791.1Sleo 1801.4Sleo /* 1811.4Sleo * Allow the caller to specify storage space for the tag. This 1821.4Sleo * is used during console config (when malloc() can't be used). 1831.4Sleo */ 1841.4Sleo if (storage != NULL) 1851.4Sleo beb_t = storage; 1861.4Sleo else { 1871.4Sleo if ((beb_t = malloc(sizeof(*beb_t), M_TEMP, M_NOWAIT)) == NULL) 1881.1Sleo return(NULL); 1891.4Sleo } 1901.1Sleo bzero(beb_t, sizeof(*beb_t)); 1911.1Sleo 1921.1Sleo beb_t->abs_p_1 = beb_bus_space_peek_1; 1931.1Sleo beb_t->abs_p_2 = beb_bus_space_peek_2; 1941.1Sleo beb_t->abs_p_4 = beb_bus_space_peek_4; 1951.1Sleo beb_t->abs_p_8 = beb_bus_space_peek_8; 1961.1Sleo beb_t->abs_r_1 = beb_bus_space_read_1; 1971.1Sleo beb_t->abs_r_2 = beb_bus_space_read_2; 1981.1Sleo beb_t->abs_r_4 = beb_bus_space_read_4; 1991.1Sleo beb_t->abs_r_8 = beb_bus_space_read_8; 2001.1Sleo beb_t->abs_rs_1 = beb_bus_space_read_1; 2011.1Sleo beb_t->abs_rs_2 = beb_bus_space_read_2; 2021.1Sleo beb_t->abs_rs_4 = beb_bus_space_read_4; 2031.1Sleo beb_t->abs_rs_8 = beb_bus_space_read_8; 2041.1Sleo beb_t->abs_rm_1 = beb_bus_space_read_multi_1; 2051.1Sleo beb_t->abs_rm_2 = beb_bus_space_read_multi_2; 2061.1Sleo beb_t->abs_rm_4 = beb_bus_space_read_multi_4; 2071.1Sleo beb_t->abs_rm_8 = beb_bus_space_read_multi_8; 2081.1Sleo beb_t->abs_rms_1 = beb_bus_space_read_multi_1; 2091.1Sleo beb_t->abs_rms_2 = beb_bus_space_read_multi_2; 2101.1Sleo beb_t->abs_rms_4 = beb_bus_space_read_multi_4; 2111.1Sleo beb_t->abs_rms_8 = beb_bus_space_read_multi_8; 2121.1Sleo beb_t->abs_rr_1 = beb_bus_space_read_region_1; 2131.1Sleo beb_t->abs_rr_2 = beb_bus_space_read_region_2; 2141.1Sleo beb_t->abs_rr_4 = beb_bus_space_read_region_4; 2151.1Sleo beb_t->abs_rr_8 = beb_bus_space_read_region_8; 2161.3Sleo beb_t->abs_rrs_1 = beb_bus_space_read_region_1; 2171.3Sleo beb_t->abs_rrs_2 = beb_bus_space_read_region_2; 2181.3Sleo beb_t->abs_rrs_4 = beb_bus_space_read_region_4; 2191.3Sleo beb_t->abs_rrs_8 = beb_bus_space_read_region_8; 2201.1Sleo beb_t->abs_w_1 = beb_bus_space_write_1; 2211.1Sleo beb_t->abs_w_2 = beb_bus_space_write_2; 2221.1Sleo beb_t->abs_w_4 = beb_bus_space_write_4; 2231.1Sleo beb_t->abs_w_8 = beb_bus_space_write_8; 2241.1Sleo beb_t->abs_ws_1 = beb_bus_space_write_1; 2251.1Sleo beb_t->abs_ws_2 = beb_bus_space_write_2; 2261.1Sleo beb_t->abs_ws_4 = beb_bus_space_write_4; 2271.1Sleo beb_t->abs_ws_8 = beb_bus_space_write_8; 2281.1Sleo beb_t->abs_wm_1 = beb_bus_space_write_multi_1; 2291.1Sleo beb_t->abs_wm_2 = beb_bus_space_write_multi_2; 2301.1Sleo beb_t->abs_wm_4 = beb_bus_space_write_multi_4; 2311.1Sleo beb_t->abs_wm_8 = beb_bus_space_write_multi_8; 2321.1Sleo beb_t->abs_wms_1 = beb_bus_space_write_multi_1; 2331.1Sleo beb_t->abs_wms_2 = beb_bus_space_write_multi_2; 2341.1Sleo beb_t->abs_wms_4 = beb_bus_space_write_multi_4; 2351.1Sleo beb_t->abs_wms_8 = beb_bus_space_write_multi_8; 2361.1Sleo beb_t->abs_wr_1 = beb_bus_space_write_region_1; 2371.1Sleo beb_t->abs_wr_2 = beb_bus_space_write_region_2; 2381.1Sleo beb_t->abs_wr_4 = beb_bus_space_write_region_4; 2391.1Sleo beb_t->abs_wr_8 = beb_bus_space_write_region_8; 2401.3Sleo beb_t->abs_wrs_1 = beb_bus_space_write_region_1; 2411.3Sleo beb_t->abs_wrs_2 = beb_bus_space_write_region_2; 2421.3Sleo beb_t->abs_wrs_4 = beb_bus_space_write_region_4; 2431.3Sleo beb_t->abs_wrs_8 = beb_bus_space_write_region_8; 2441.1Sleo beb_t->abs_sm_1 = beb_bus_space_set_multi_1; 2451.1Sleo beb_t->abs_sm_2 = beb_bus_space_set_multi_2; 2461.1Sleo beb_t->abs_sm_4 = beb_bus_space_set_multi_4; 2471.1Sleo beb_t->abs_sm_8 = beb_bus_space_set_multi_8; 2481.1Sleo beb_t->abs_sr_1 = beb_bus_space_set_region_1; 2491.1Sleo beb_t->abs_sr_2 = beb_bus_space_set_region_2; 2501.1Sleo beb_t->abs_sr_4 = beb_bus_space_set_region_4; 2511.1Sleo beb_t->abs_sr_8 = beb_bus_space_set_region_8; 2521.1Sleo 2531.1Sleo return(beb_t); 2541.1Sleo} 2551.1Sleo 2561.1Sleo 2571.1Sleo/* 2581.1Sleo * The various access functions 2591.1Sleo */ 2601.1Sleo 2611.1Sleo/* 2621.11Stsutsui * int bus_space_peek_N(bus_space_tag_t tag, 2631.11Stsutsui * bus_space_handle_t sh, bus_size_t offset); 2641.1Sleo * 2651.1Sleo * Check if the address is suitable for reading N-byte quantities. 2661.1Sleo */ 2671.1Sleostatic int 2681.1Sleobeb_bus_space_peek_1(t, h, o) 2691.1Sleo bus_space_tag_t t; 2701.1Sleo bus_space_handle_t h; 2711.1Sleo bus_size_t o; 2721.1Sleo{ 2731.8Schristos return(!badbaddr((void *)(h + o), 1)); 2741.1Sleo} 2751.1Sleo 2761.1Sleostatic int 2771.1Sleobeb_bus_space_peek_2(t, h, o) 2781.1Sleo bus_space_tag_t t; 2791.1Sleo bus_space_handle_t h; 2801.1Sleo bus_size_t o; 2811.1Sleo{ 2821.8Schristos return(!badbaddr((void *)(h + o), 2)); 2831.1Sleo} 2841.1Sleo 2851.1Sleostatic int 2861.1Sleobeb_bus_space_peek_4(t, h, o) 2871.1Sleo bus_space_tag_t t; 2881.1Sleo bus_space_handle_t h; 2891.1Sleo bus_size_t o; 2901.1Sleo{ 2911.8Schristos return(!badbaddr((void *)(h + o), 4)); 2921.1Sleo} 2931.1Sleo 2941.1Sleostatic int 2951.1Sleobeb_bus_space_peek_8(t, h, o) 2961.1Sleo bus_space_tag_t t; 2971.1Sleo bus_space_handle_t h; 2981.1Sleo bus_size_t o; 2991.1Sleo{ 3001.8Schristos return(!badbaddr((void *)(h + o), 8)); 3011.1Sleo} 3021.1Sleo 3031.1Sleo/* 3041.11Stsutsui * u_intX_t bus_space_read_N(bus_space_tag_t tag, 3051.11Stsutsui * bus_space_handle_t bsh, bus_size_t offset); 3061.1Sleo * 3071.1Sleo * Return an 1, 2, 4, or 8 byte value read from the bus_space described 3081.1Sleo * by tag/handle at `offset'. The value is converted to host-endian. 3091.1Sleo */ 3101.1Sleostatic u_int8_t 3111.1Sleobeb_bus_space_read_1(t, h, o) 3121.1Sleo bus_space_tag_t t; 3131.1Sleo bus_space_handle_t h; 3141.1Sleo bus_size_t o; 3151.1Sleo{ 3161.1Sleo return(__read_1(h, o)); 3171.1Sleo} 3181.1Sleo 3191.1Sleostatic u_int16_t 3201.1Sleobeb_bus_space_read_2(t, h, o) 3211.1Sleo bus_space_tag_t t; 3221.1Sleo bus_space_handle_t h; 3231.1Sleo bus_size_t o; 3241.1Sleo{ 3251.1Sleo return(__read_2(h, o)); 3261.1Sleo} 3271.1Sleo 3281.1Sleostatic u_int32_t 3291.1Sleobeb_bus_space_read_4(t, h, o) 3301.1Sleo bus_space_tag_t t; 3311.1Sleo bus_space_handle_t h; 3321.1Sleo bus_size_t o; 3331.1Sleo{ 3341.1Sleo return(__read_4(h, o)); 3351.1Sleo} 3361.1Sleo 3371.1Sleostatic u_int64_t 3381.1Sleobeb_bus_space_read_8(t, h, o) 3391.1Sleo bus_space_tag_t t; 3401.1Sleo bus_space_handle_t h; 3411.1Sleo bus_size_t o; 3421.1Sleo{ 3431.1Sleo return(__read_8(h, o)); 3441.1Sleo} 3451.1Sleo 3461.1Sleo/* 3471.11Stsutsui * u_intX_t bus_space_write_N(bus_space_tag_t tag, 3481.11Stsutsui * bus_space_handle_t bsh, bus_size_t offset, u_intX_t val); 3491.1Sleo * 3501.1Sleo * Write an 1, 2, 4, or 8 byte value to the bus_space described by tag/handle 3511.1Sleo * at `offset'. The value `val' is converted from host to bus endianness 3521.1Sleo * before being written. 3531.1Sleo */ 3541.1Sleostatic void 3551.1Sleobeb_bus_space_write_1(t, h, o, v) 3561.1Sleo bus_space_tag_t t; 3571.1Sleo bus_space_handle_t h; 3581.1Sleo bus_size_t o; 3591.1Sleo u_int8_t v; 3601.1Sleo{ 3611.1Sleo __write_1(h, o, v); 3621.1Sleo} 3631.1Sleo 3641.1Sleostatic void 3651.1Sleobeb_bus_space_write_2(t, h, o, v) 3661.1Sleo bus_space_tag_t t; 3671.1Sleo bus_space_handle_t h; 3681.1Sleo bus_size_t o; 3691.1Sleo u_int16_t v; 3701.1Sleo{ 3711.1Sleo __write_2(h, o, v); 3721.1Sleo} 3731.1Sleo 3741.1Sleostatic void 3751.1Sleobeb_bus_space_write_4(t, h, o, v) 3761.1Sleo bus_space_tag_t t; 3771.1Sleo bus_space_handle_t h; 3781.1Sleo bus_size_t o; 3791.1Sleo u_int32_t v; 3801.1Sleo{ 3811.1Sleo __write_4(h, o, v); 3821.1Sleo} 3831.1Sleo 3841.1Sleostatic void 3851.1Sleobeb_bus_space_write_8(t, h, o, v) 3861.1Sleo bus_space_tag_t t; 3871.1Sleo bus_space_handle_t h; 3881.1Sleo bus_size_t o; 3891.1Sleo u_int64_t v; 3901.1Sleo{ 3911.1Sleo __write_8(h, o, v); 3921.1Sleo} 3931.1Sleo 3941.1Sleo/* 3951.11Stsutsui * void bus_space_read_multi_N(bus_space_tag_t tag, 3961.1Sleo * bus_space_handle_t bsh, bus_size_t offset, u_intX_t *address, 3971.11Stsutsui * bus_size_t count); 3981.1Sleo * 3991.1Sleo * Read 'count' 1, 2, 4, or 8 byte values from the bus_space described by 4001.1Sleo * tag/handle at `offset' and store them in the address range starting at 4011.6Swiz * 'address'. The values are converted to CPU endian order before being 4021.1Sleo * being stored. 4031.1Sleo */ 4041.1Sleostatic void 4051.1Sleobeb_bus_space_read_multi_1(t, h, o, a, c) 4061.1Sleo bus_space_tag_t t; 4071.1Sleo bus_space_handle_t h; 4081.1Sleo bus_size_t o, c; 4091.1Sleo u_int8_t *a; 4101.1Sleo{ 4111.1Sleo for (; c; a++, c--) 4121.1Sleo *a = __read_1(h, o); 4131.1Sleo} 4141.1Sleostatic void 4151.1Sleobeb_bus_space_read_multi_2(t, h, o, a, c) 4161.1Sleo bus_space_tag_t t; 4171.1Sleo bus_space_handle_t h; 4181.1Sleo bus_size_t o, c; 4191.1Sleo u_int16_t *a; 4201.1Sleo{ 4211.1Sleo for (; c; a++, c--) 4221.1Sleo *a = __read_2(h, o); 4231.1Sleo} 4241.1Sleo 4251.1Sleostatic void 4261.1Sleobeb_bus_space_read_multi_4(t, h, o, a, c) 4271.1Sleo bus_space_tag_t t; 4281.1Sleo bus_space_handle_t h; 4291.1Sleo bus_size_t o, c; 4301.1Sleo u_int32_t *a; 4311.1Sleo{ 4321.1Sleo for (; c; a++, c--) 4331.1Sleo *a = __read_4(h, o); 4341.1Sleo} 4351.1Sleo 4361.1Sleostatic void 4371.1Sleobeb_bus_space_read_multi_8(t, h, o, a, c) 4381.1Sleo bus_space_tag_t t; 4391.1Sleo bus_space_handle_t h; 4401.1Sleo bus_size_t o, c; 4411.1Sleo u_int64_t *a; 4421.1Sleo{ 4431.1Sleo for (; c; a++, c--) 4441.1Sleo *a = __read_8(h, o); 4451.1Sleo} 4461.1Sleo 4471.1Sleo/* 4481.11Stsutsui * void bus_space_write_multi_N(bus_space_tag_t tag, 4491.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 4501.11Stsutsui * const u_intX_t *address, bus_size_t count); 4511.1Sleo * 4521.1Sleo * Write 'count' 1, 2, 4, or 8 byte values from the address range starting 4531.1Sleo * at 'address' to the bus_space described by tag/handle at `offset'. 4541.1Sleo * The values are converted to bus endian order before being written to 4551.1Sleo * the bus. 4561.1Sleo */ 4571.1Sleostatic void 4581.1Sleobeb_bus_space_write_multi_1(t, h, o, a, c) 4591.1Sleo bus_space_tag_t t; 4601.1Sleo bus_space_handle_t h; 4611.1Sleo bus_size_t o, c; 4621.1Sleo const u_int8_t *a; 4631.1Sleo{ 4641.1Sleo for (; c; a++, c--) 4651.1Sleo __write_1(h, o, *a); 4661.1Sleo} 4671.1Sleo 4681.1Sleostatic void 4691.1Sleobeb_bus_space_write_multi_2(t, h, o, a, c) 4701.1Sleo bus_space_tag_t t; 4711.1Sleo bus_space_handle_t h; 4721.1Sleo bus_size_t o, c; 4731.1Sleo const u_int16_t *a; 4741.1Sleo{ 4751.1Sleo for (; c; a++, c--) 4761.1Sleo __write_2(h, o, *a); 4771.1Sleo} 4781.1Sleo 4791.1Sleostatic void 4801.1Sleobeb_bus_space_write_multi_4(t, h, o, a, c) 4811.1Sleo bus_space_tag_t t; 4821.1Sleo bus_space_handle_t h; 4831.1Sleo bus_size_t o, c; 4841.1Sleo const u_int32_t *a; 4851.1Sleo{ 4861.1Sleo for (; c; a++, c--) 4871.1Sleo __write_4(h, o, *a); 4881.1Sleo} 4891.1Sleo 4901.1Sleostatic void 4911.1Sleobeb_bus_space_write_multi_8(t, h, o, a, c) 4921.1Sleo bus_space_tag_t t; 4931.1Sleo bus_space_handle_t h; 4941.1Sleo bus_size_t o, c; 4951.1Sleo const u_int64_t *a; 4961.1Sleo{ 4971.1Sleo for (; c; a++, c--) 4981.1Sleo __write_8(h, o, *a); 4991.1Sleo} 5001.1Sleo 5011.1Sleo/* 5021.11Stsutsui * void bus_space_read_region_N(bus_space_tag_t tag, 5031.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 5041.11Stsutsui * u_intN_t *addr, bus_size_t count); 5051.1Sleo * 5061.1Sleo * Read `count' 1, 2, 4, or 8 byte quantities from bus space 5071.1Sleo * described by tag/handle and starting at `offset' and copy into 5081.1Sleo * buffer provided. 5091.1Sleo */ 5101.1Sleostatic void 5111.1Sleobeb_bus_space_read_region_1(t, h, o, a, c) 5121.1Sleo bus_space_tag_t t; 5131.1Sleo bus_space_handle_t h; 5141.1Sleo bus_size_t o, c; 5151.1Sleo u_int8_t *a; 5161.1Sleo{ 5171.1Sleo for (; c; a++, o++, c--) 5181.1Sleo *a = __read_1(h, o); 5191.1Sleo} 5201.1Sleo 5211.1Sleostatic void 5221.1Sleobeb_bus_space_read_region_2(t, h, o, a, c) 5231.1Sleo bus_space_tag_t t; 5241.1Sleo bus_space_handle_t h; 5251.1Sleo bus_size_t o, c; 5261.1Sleo u_int16_t *a; 5271.1Sleo{ 5281.1Sleo for (; c; a++, o += 2, c--) 5291.1Sleo *a = __read_2(h, o); 5301.1Sleo} 5311.1Sleo 5321.1Sleostatic void 5331.1Sleobeb_bus_space_read_region_4(t, h, o, a, c) 5341.1Sleo bus_space_tag_t t; 5351.1Sleo bus_space_handle_t h; 5361.1Sleo bus_size_t o, c; 5371.1Sleo u_int32_t *a; 5381.1Sleo{ 5391.1Sleo for (; c; a++, o += 4, c--) 5401.1Sleo *a = __read_4(h, o); 5411.1Sleo} 5421.1Sleo 5431.1Sleostatic void 5441.1Sleobeb_bus_space_read_region_8(t, h, o, a, c) 5451.1Sleo bus_space_tag_t t; 5461.1Sleo bus_space_handle_t h; 5471.1Sleo bus_size_t o, c; 5481.1Sleo u_int64_t *a; 5491.1Sleo{ 5501.1Sleo for (; c; a++, o += 8, c--) 5511.1Sleo *a = __read_8(h, o); 5521.1Sleo} 5531.1Sleo 5541.1Sleo/* 5551.11Stsutsui * void bus_space_write_region_N(bus_space_tag_t tag, 5561.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 5571.11Stsutsui * u_intN_t *addr, bus_size_t count); 5581.1Sleo * 5591.1Sleo * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided 5601.1Sleo * into the bus space described by tag/handle and starting at `offset'. 5611.1Sleo */ 5621.1Sleostatic void 5631.1Sleobeb_bus_space_write_region_1(t, h, o, a, c) 5641.1Sleo bus_space_tag_t t; 5651.1Sleo bus_space_handle_t h; 5661.1Sleo bus_size_t o, c; 5671.1Sleo const u_int8_t *a; 5681.1Sleo{ 5691.1Sleo for (; c; a++, o++, c--) 5701.1Sleo __write_1(h, o, *a); 5711.1Sleo} 5721.1Sleo 5731.1Sleostatic void 5741.1Sleobeb_bus_space_write_region_2(t, h, o, a, c) 5751.1Sleo bus_space_tag_t t; 5761.1Sleo bus_space_handle_t h; 5771.1Sleo bus_size_t o, c; 5781.1Sleo const u_int16_t *a; 5791.1Sleo{ 5801.1Sleo for (; c; a++, o += 2, c--) 5811.1Sleo __write_2(h, o, *a); 5821.1Sleo} 5831.1Sleo 5841.1Sleostatic void 5851.1Sleobeb_bus_space_write_region_4(t, h, o, a, c) 5861.1Sleo bus_space_tag_t t; 5871.1Sleo bus_space_handle_t h; 5881.1Sleo bus_size_t o, c; 5891.1Sleo const u_int32_t *a; 5901.1Sleo{ 5911.1Sleo for (; c; a++, o += 4, c--) 5921.1Sleo __write_4(h, o, *a); 5931.1Sleo} 5941.1Sleo 5951.1Sleostatic void 5961.1Sleobeb_bus_space_write_region_8(t, h, o, a, c) 5971.1Sleo bus_space_tag_t t; 5981.1Sleo bus_space_handle_t h; 5991.1Sleo bus_size_t o, c; 6001.1Sleo const u_int64_t *a; 6011.1Sleo{ 6021.1Sleo for (; c; a++, o += 8, c--) 6031.1Sleo __write_8(h, o, *a); 6041.1Sleo} 6051.1Sleo 6061.1Sleo/* 6071.11Stsutsui * void bus_space_set_multi_N(bus_space_tag_t tag, 6081.1Sleo * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 6091.11Stsutsui * bus_size_t count); 6101.1Sleo * 6111.1Sleo * Write the 1, 2, 4, or 8 byte value `val' to bus space described 6121.1Sleo * by tag/handle/offset `count' times. 6131.1Sleo */ 6141.1Sleo 6151.1Sleostatic void 6161.1Sleobeb_bus_space_set_multi_1(t, h, o, v, c) 6171.1Sleo bus_space_tag_t t; 6181.1Sleo bus_space_handle_t h; 6191.1Sleo bus_size_t o, c; 6201.1Sleo u_int8_t v; 6211.1Sleo{ 6221.1Sleo for (; c; c--) 6231.1Sleo __write_1(h, o, v); 6241.1Sleo} 6251.1Sleo 6261.1Sleostatic void 6271.1Sleobeb_bus_space_set_multi_2(t, h, o, v, c) 6281.1Sleo bus_space_tag_t t; 6291.1Sleo bus_space_handle_t h; 6301.1Sleo bus_size_t o, c; 6311.1Sleo u_int16_t v; 6321.1Sleo{ 6331.1Sleo for (; c; c--) 6341.1Sleo __write_2(h, o, v); 6351.1Sleo} 6361.1Sleo 6371.1Sleostatic void 6381.1Sleobeb_bus_space_set_multi_4(t, h, o, v, c) 6391.1Sleo bus_space_tag_t t; 6401.1Sleo bus_space_handle_t h; 6411.1Sleo bus_size_t o, c; 6421.1Sleo u_int32_t v; 6431.1Sleo{ 6441.1Sleo for (; c; c--) 6451.1Sleo __write_4(h, o, v); 6461.1Sleo} 6471.1Sleo 6481.1Sleostatic void 6491.1Sleobeb_bus_space_set_multi_8(t, h, o, v, c) 6501.1Sleo bus_space_tag_t t; 6511.1Sleo bus_space_handle_t h; 6521.1Sleo bus_size_t o, c; 6531.1Sleo u_int64_t v; 6541.1Sleo{ 6551.1Sleo for (; c; c--) 6561.1Sleo __write_8(h, o, v); 6571.1Sleo} 6581.1Sleo 6591.1Sleo/* 6601.11Stsutsui * void bus_space_set_region_N(bus_space_tag_t tag, 6611.1Sleo * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 6621.11Stsutsui * bus_size_t count); 6631.1Sleo * 6641.1Sleo * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 6651.1Sleo * by tag/handle starting at `offset'. 6661.1Sleo */ 6671.1Sleostatic void 6681.1Sleobeb_bus_space_set_region_1(t, h, o, v, c) 6691.1Sleo bus_space_tag_t t; 6701.1Sleo bus_space_handle_t h; 6711.1Sleo bus_size_t o, c; 6721.1Sleo u_int8_t v; 6731.1Sleo{ 6741.1Sleo for (; c; o++, c--) 6751.1Sleo __write_1(h, o, v); 6761.1Sleo} 6771.1Sleo 6781.1Sleostatic void 6791.1Sleobeb_bus_space_set_region_2(t, h, o, v, c) 6801.1Sleo bus_space_tag_t t; 6811.1Sleo bus_space_handle_t h; 6821.1Sleo bus_size_t o, c; 6831.1Sleo u_int16_t v; 6841.1Sleo{ 6851.1Sleo for (; c; o += 2, c--) 6861.1Sleo __write_2(h, o, v); 6871.1Sleo} 6881.1Sleo 6891.1Sleostatic void 6901.1Sleobeb_bus_space_set_region_4(t, h, o, v, c) 6911.1Sleo bus_space_tag_t t; 6921.1Sleo bus_space_handle_t h; 6931.1Sleo bus_size_t o, c; 6941.1Sleo u_int32_t v; 6951.1Sleo{ 6961.1Sleo for (; c; o += 4, c--) 6971.1Sleo __write_4(h, o, v); 6981.1Sleo} 6991.1Sleo 7001.1Sleostatic void 7011.1Sleobeb_bus_space_set_region_8(t, h, o, v, c) 7021.1Sleo bus_space_tag_t t; 7031.1Sleo bus_space_handle_t h; 7041.1Sleo bus_size_t o, c; 7051.1Sleo u_int64_t v; 7061.1Sleo{ 7071.1Sleo for (; c; o += 8, c--) 7081.1Sleo __write_8(h, o, v); 7091.1Sleo} 710