be_bus.c revision 1.12
11.12Stsutsui/* $NetBSD: be_bus.c,v 1.12 2009/03/08 05:25:30 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.12Stsutsui__KERNEL_RCSID(0, "$NetBSD: be_bus.c,v 1.12 2009/03/08 05:25:30 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.12Stsutsuistatic uint8_t beb_bus_space_read_1(bus_space_tag_t, 591.11Stsutsui bus_space_handle_t, bus_size_t); 601.12Stsutsuistatic uint16_t beb_bus_space_read_2(bus_space_tag_t, 611.11Stsutsui bus_space_handle_t, bus_size_t); 621.12Stsutsuistatic uint32_t beb_bus_space_read_4(bus_space_tag_t, 631.11Stsutsui bus_space_handle_t, bus_size_t); 641.12Stsutsuistatic uint64_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.12Stsutsui bus_space_handle_t, bus_size_t, uint8_t); 701.11Stsutsuistatic void beb_bus_space_write_2(bus_space_tag_t, 711.12Stsutsui bus_space_handle_t, bus_size_t, uint16_t); 721.11Stsutsuistatic void beb_bus_space_write_4(bus_space_tag_t, 731.12Stsutsui bus_space_handle_t, bus_size_t, uint32_t); 741.11Stsutsuistatic void beb_bus_space_write_8(bus_space_tag_t, 751.12Stsutsui bus_space_handle_t, bus_size_t, uint64_t); 761.1Sleo 771.1Sleo /* read multiple */ 781.11Stsutsuistatic void beb_bus_space_read_multi_1(bus_space_tag_t, 791.12Stsutsui bus_space_handle_t, bus_size_t, uint8_t *, 801.11Stsutsui bus_size_t); 811.11Stsutsuistatic void beb_bus_space_read_multi_2(bus_space_tag_t, 821.12Stsutsui bus_space_handle_t, bus_size_t, uint16_t *, 831.11Stsutsui bus_size_t); 841.11Stsutsuistatic void beb_bus_space_read_multi_4(bus_space_tag_t, 851.12Stsutsui bus_space_handle_t, bus_size_t, uint32_t *, 861.11Stsutsui bus_size_t); 871.11Stsutsuistatic void beb_bus_space_read_multi_8(bus_space_tag_t, 881.12Stsutsui bus_space_handle_t, bus_size_t, uint64_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.12Stsutsui const uint8_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.12Stsutsui const uint16_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.12Stsutsui const uint32_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.12Stsutsui const uint64_t *, bus_size_t); 1041.1Sleo 1051.1Sleo /* read region */ 1061.11Stsutsuistatic void beb_bus_space_read_region_1(bus_space_tag_t, 1071.12Stsutsui bus_space_handle_t, bus_size_t, uint8_t *, 1081.11Stsutsui bus_size_t); 1091.11Stsutsuistatic void beb_bus_space_read_region_2(bus_space_tag_t, 1101.12Stsutsui bus_space_handle_t, bus_size_t, uint16_t *, 1111.11Stsutsui bus_size_t); 1121.11Stsutsuistatic void beb_bus_space_read_region_4(bus_space_tag_t, 1131.12Stsutsui bus_space_handle_t, bus_size_t, uint32_t *, 1141.11Stsutsui bus_size_t); 1151.11Stsutsuistatic void beb_bus_space_read_region_8(bus_space_tag_t, 1161.12Stsutsui bus_space_handle_t, bus_size_t, uint64_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.12Stsutsui const uint8_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.12Stsutsui const uint16_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.12Stsutsui const uint32_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.12Stsutsui const uint64_t *, bus_size_t); 1321.1Sleo 1331.1Sleo /* set multi */ 1341.11Stsutsuistatic void beb_bus_space_set_multi_1(bus_space_tag_t, 1351.12Stsutsui bus_space_handle_t, bus_size_t, uint8_t, 1361.11Stsutsui bus_size_t); 1371.11Stsutsuistatic void beb_bus_space_set_multi_2(bus_space_tag_t, 1381.12Stsutsui bus_space_handle_t, bus_size_t, uint16_t, 1391.11Stsutsui bus_size_t); 1401.11Stsutsuistatic void beb_bus_space_set_multi_4(bus_space_tag_t, 1411.12Stsutsui bus_space_handle_t, bus_size_t, uint32_t, 1421.11Stsutsui bus_size_t); 1431.11Stsutsuistatic void beb_bus_space_set_multi_8(bus_space_tag_t, 1441.12Stsutsui bus_space_handle_t, bus_size_t, uint64_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.12Stsutsui bus_space_handle_t, bus_size_t, uint8_t, 1501.11Stsutsui bus_size_t); 1511.11Stsutsuistatic void beb_bus_space_set_region_2(bus_space_tag_t, 1521.12Stsutsui bus_space_handle_t, bus_size_t, uint16_t, 1531.11Stsutsui bus_size_t); 1541.11Stsutsuistatic void beb_bus_space_set_region_4(bus_space_tag_t, 1551.12Stsutsui bus_space_handle_t, bus_size_t, uint32_t, 1561.11Stsutsui bus_size_t); 1571.11Stsutsuistatic void beb_bus_space_set_region_8(bus_space_tag_t, 1581.12Stsutsui bus_space_handle_t, bus_size_t, uint64_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.12Stsutsui#define __read_1(h, o) *((volatile uint8_t *)((h) + (o))) 1651.12Stsutsui#define __read_2(h, o) *((volatile uint16_t *)((h) + (o))) 1661.12Stsutsui#define __read_4(h, o) *((volatile uint32_t *)((h) + (o))) 1671.12Stsutsui#define __read_8(h, o) *((volatile uint64_t *)((h) + (o))) 1681.12Stsutsui 1691.12Stsutsui#define __write_1(h, o, v) *((volatile uint8_t *)((h) + (o))) = (v) 1701.12Stsutsui#define __write_2(h, o, v) *((volatile uint16_t *)((h) + (o))) = (v) 1711.12Stsutsui#define __write_4(h, o, v) *((volatile uint32_t *)((h) + (o))) = (v) 1721.12Stsutsui#define __write_8(h, o, v) *((volatile uint64_t *)((h) + (o))) = (v) 1731.1Sleo 1741.1Sleobus_space_tag_t 1751.12Stsutsuibeb_alloc_bus_space_tag(bus_space_tag_t storage) 1761.1Sleo{ 1771.1Sleo bus_space_tag_t beb_t; 1781.1Sleo 1791.4Sleo /* 1801.4Sleo * Allow the caller to specify storage space for the tag. This 1811.4Sleo * is used during console config (when malloc() can't be used). 1821.4Sleo */ 1831.4Sleo if (storage != NULL) 1841.4Sleo beb_t = storage; 1851.4Sleo else { 1861.4Sleo if ((beb_t = malloc(sizeof(*beb_t), M_TEMP, M_NOWAIT)) == NULL) 1871.1Sleo return(NULL); 1881.4Sleo } 1891.1Sleo bzero(beb_t, sizeof(*beb_t)); 1901.1Sleo 1911.1Sleo beb_t->abs_p_1 = beb_bus_space_peek_1; 1921.1Sleo beb_t->abs_p_2 = beb_bus_space_peek_2; 1931.1Sleo beb_t->abs_p_4 = beb_bus_space_peek_4; 1941.1Sleo beb_t->abs_p_8 = beb_bus_space_peek_8; 1951.1Sleo beb_t->abs_r_1 = beb_bus_space_read_1; 1961.1Sleo beb_t->abs_r_2 = beb_bus_space_read_2; 1971.1Sleo beb_t->abs_r_4 = beb_bus_space_read_4; 1981.1Sleo beb_t->abs_r_8 = beb_bus_space_read_8; 1991.1Sleo beb_t->abs_rs_1 = beb_bus_space_read_1; 2001.1Sleo beb_t->abs_rs_2 = beb_bus_space_read_2; 2011.1Sleo beb_t->abs_rs_4 = beb_bus_space_read_4; 2021.1Sleo beb_t->abs_rs_8 = beb_bus_space_read_8; 2031.1Sleo beb_t->abs_rm_1 = beb_bus_space_read_multi_1; 2041.1Sleo beb_t->abs_rm_2 = beb_bus_space_read_multi_2; 2051.1Sleo beb_t->abs_rm_4 = beb_bus_space_read_multi_4; 2061.1Sleo beb_t->abs_rm_8 = beb_bus_space_read_multi_8; 2071.1Sleo beb_t->abs_rms_1 = beb_bus_space_read_multi_1; 2081.1Sleo beb_t->abs_rms_2 = beb_bus_space_read_multi_2; 2091.1Sleo beb_t->abs_rms_4 = beb_bus_space_read_multi_4; 2101.1Sleo beb_t->abs_rms_8 = beb_bus_space_read_multi_8; 2111.1Sleo beb_t->abs_rr_1 = beb_bus_space_read_region_1; 2121.1Sleo beb_t->abs_rr_2 = beb_bus_space_read_region_2; 2131.1Sleo beb_t->abs_rr_4 = beb_bus_space_read_region_4; 2141.1Sleo beb_t->abs_rr_8 = beb_bus_space_read_region_8; 2151.3Sleo beb_t->abs_rrs_1 = beb_bus_space_read_region_1; 2161.3Sleo beb_t->abs_rrs_2 = beb_bus_space_read_region_2; 2171.3Sleo beb_t->abs_rrs_4 = beb_bus_space_read_region_4; 2181.3Sleo beb_t->abs_rrs_8 = beb_bus_space_read_region_8; 2191.1Sleo beb_t->abs_w_1 = beb_bus_space_write_1; 2201.1Sleo beb_t->abs_w_2 = beb_bus_space_write_2; 2211.1Sleo beb_t->abs_w_4 = beb_bus_space_write_4; 2221.1Sleo beb_t->abs_w_8 = beb_bus_space_write_8; 2231.1Sleo beb_t->abs_ws_1 = beb_bus_space_write_1; 2241.1Sleo beb_t->abs_ws_2 = beb_bus_space_write_2; 2251.1Sleo beb_t->abs_ws_4 = beb_bus_space_write_4; 2261.1Sleo beb_t->abs_ws_8 = beb_bus_space_write_8; 2271.1Sleo beb_t->abs_wm_1 = beb_bus_space_write_multi_1; 2281.1Sleo beb_t->abs_wm_2 = beb_bus_space_write_multi_2; 2291.1Sleo beb_t->abs_wm_4 = beb_bus_space_write_multi_4; 2301.1Sleo beb_t->abs_wm_8 = beb_bus_space_write_multi_8; 2311.1Sleo beb_t->abs_wms_1 = beb_bus_space_write_multi_1; 2321.1Sleo beb_t->abs_wms_2 = beb_bus_space_write_multi_2; 2331.1Sleo beb_t->abs_wms_4 = beb_bus_space_write_multi_4; 2341.1Sleo beb_t->abs_wms_8 = beb_bus_space_write_multi_8; 2351.1Sleo beb_t->abs_wr_1 = beb_bus_space_write_region_1; 2361.1Sleo beb_t->abs_wr_2 = beb_bus_space_write_region_2; 2371.1Sleo beb_t->abs_wr_4 = beb_bus_space_write_region_4; 2381.1Sleo beb_t->abs_wr_8 = beb_bus_space_write_region_8; 2391.3Sleo beb_t->abs_wrs_1 = beb_bus_space_write_region_1; 2401.3Sleo beb_t->abs_wrs_2 = beb_bus_space_write_region_2; 2411.3Sleo beb_t->abs_wrs_4 = beb_bus_space_write_region_4; 2421.3Sleo beb_t->abs_wrs_8 = beb_bus_space_write_region_8; 2431.1Sleo beb_t->abs_sm_1 = beb_bus_space_set_multi_1; 2441.1Sleo beb_t->abs_sm_2 = beb_bus_space_set_multi_2; 2451.1Sleo beb_t->abs_sm_4 = beb_bus_space_set_multi_4; 2461.1Sleo beb_t->abs_sm_8 = beb_bus_space_set_multi_8; 2471.1Sleo beb_t->abs_sr_1 = beb_bus_space_set_region_1; 2481.1Sleo beb_t->abs_sr_2 = beb_bus_space_set_region_2; 2491.1Sleo beb_t->abs_sr_4 = beb_bus_space_set_region_4; 2501.1Sleo beb_t->abs_sr_8 = beb_bus_space_set_region_8; 2511.1Sleo 2521.12Stsutsui return beb_t; 2531.1Sleo} 2541.1Sleo 2551.1Sleo 2561.1Sleo/* 2571.1Sleo * The various access functions 2581.1Sleo */ 2591.1Sleo 2601.1Sleo/* 2611.11Stsutsui * int bus_space_peek_N(bus_space_tag_t tag, 2621.11Stsutsui * bus_space_handle_t sh, bus_size_t offset); 2631.1Sleo * 2641.1Sleo * Check if the address is suitable for reading N-byte quantities. 2651.1Sleo */ 2661.1Sleostatic int 2671.12Stsutsuibeb_bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 2681.1Sleo{ 2691.12Stsutsui 2701.12Stsutsui return !badbaddr((void *)(h + o), 1); 2711.1Sleo} 2721.1Sleo 2731.1Sleostatic int 2741.12Stsutsuibeb_bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 2751.1Sleo{ 2761.12Stsutsui 2771.12Stsutsui return !badbaddr((void *)(h + o), 2); 2781.1Sleo} 2791.1Sleo 2801.1Sleostatic int 2811.12Stsutsuibeb_bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 2821.1Sleo{ 2831.12Stsutsui 2841.12Stsutsui return !badbaddr((void *)(h + o), 4); 2851.1Sleo} 2861.1Sleo 2871.1Sleostatic int 2881.12Stsutsuibeb_bus_space_peek_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 2891.1Sleo{ 2901.12Stsutsui 2911.12Stsutsui return !badbaddr((void *)(h + o), 8); 2921.1Sleo} 2931.1Sleo 2941.1Sleo/* 2951.12Stsutsui * uintX_t bus_space_read_N(bus_space_tag_t tag, 2961.11Stsutsui * bus_space_handle_t bsh, bus_size_t offset); 2971.1Sleo * 2981.1Sleo * Return an 1, 2, 4, or 8 byte value read from the bus_space described 2991.1Sleo * by tag/handle at `offset'. The value is converted to host-endian. 3001.1Sleo */ 3011.12Stsutsuistatic uint8_t 3021.12Stsutsuibeb_bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 3031.1Sleo{ 3041.12Stsutsui 3051.12Stsutsui return __read_1(h, o); 3061.1Sleo} 3071.1Sleo 3081.12Stsutsuistatic uint16_t 3091.12Stsutsuibeb_bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 3101.1Sleo{ 3111.12Stsutsui 3121.12Stsutsui return __read_2(h, o); 3131.1Sleo} 3141.1Sleo 3151.12Stsutsuistatic uint32_t 3161.12Stsutsuibeb_bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 3171.1Sleo{ 3181.12Stsutsui 3191.12Stsutsui return __read_4(h, o); 3201.1Sleo} 3211.1Sleo 3221.12Stsutsuistatic uint64_t 3231.12Stsutsuibeb_bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 3241.1Sleo{ 3251.12Stsutsui 3261.12Stsutsui return __read_8(h, o); 3271.1Sleo} 3281.1Sleo 3291.1Sleo/* 3301.12Stsutsui * uintX_t bus_space_write_N(bus_space_tag_t tag, 3311.12Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintX_t val); 3321.1Sleo * 3331.1Sleo * Write an 1, 2, 4, or 8 byte value to the bus_space described by tag/handle 3341.1Sleo * at `offset'. The value `val' is converted from host to bus endianness 3351.1Sleo * before being written. 3361.1Sleo */ 3371.1Sleostatic void 3381.12Stsutsuibeb_bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 3391.12Stsutsui uint8_t v) 3401.1Sleo{ 3411.12Stsutsui 3421.12Stsutsui __write_1(h, o, v); 3431.1Sleo} 3441.1Sleo 3451.1Sleostatic void 3461.12Stsutsuibeb_bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 3471.12Stsutsui uint16_t v) 3481.1Sleo{ 3491.12Stsutsui 3501.12Stsutsui __write_2(h, o, v); 3511.1Sleo} 3521.1Sleo 3531.1Sleostatic void 3541.12Stsutsuibeb_bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 3551.12Stsutsui uint32_t v) 3561.1Sleo{ 3571.12Stsutsui 3581.12Stsutsui __write_4(h, o, v); 3591.1Sleo} 3601.1Sleo 3611.1Sleostatic void 3621.12Stsutsuibeb_bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 3631.12Stsutsui uint64_t v) 3641.1Sleo{ 3651.12Stsutsui 3661.12Stsutsui __write_8(h, o, v); 3671.1Sleo} 3681.1Sleo 3691.1Sleo/* 3701.11Stsutsui * void bus_space_read_multi_N(bus_space_tag_t tag, 3711.12Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintX_t *address, 3721.11Stsutsui * bus_size_t count); 3731.1Sleo * 3741.1Sleo * Read 'count' 1, 2, 4, or 8 byte values from the bus_space described by 3751.1Sleo * tag/handle at `offset' and store them in the address range starting at 3761.6Swiz * 'address'. The values are converted to CPU endian order before being 3771.1Sleo * being stored. 3781.1Sleo */ 3791.1Sleostatic void 3801.12Stsutsuibeb_bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, 3811.12Stsutsui bus_size_t o, uint8_t *a, bus_size_t c) 3821.1Sleo{ 3831.12Stsutsui 3841.1Sleo for (; c; a++, c--) 3851.1Sleo *a = __read_1(h, o); 3861.1Sleo} 3871.12Stsutsui 3881.1Sleostatic void 3891.12Stsutsuibeb_bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, 3901.12Stsutsui bus_size_t o, uint16_t *a, bus_size_t c) 3911.1Sleo{ 3921.12Stsutsui 3931.1Sleo for (; c; a++, c--) 3941.1Sleo *a = __read_2(h, o); 3951.1Sleo} 3961.1Sleo 3971.1Sleostatic void 3981.12Stsutsuibeb_bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, 3991.12Stsutsui bus_size_t o, uint32_t *a, bus_size_t c) 4001.1Sleo{ 4011.12Stsutsui 4021.1Sleo for (; c; a++, c--) 4031.1Sleo *a = __read_4(h, o); 4041.1Sleo} 4051.1Sleo 4061.1Sleostatic void 4071.12Stsutsuibeb_bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, 4081.12Stsutsui bus_size_t o, uint64_t *a, bus_size_t c) 4091.1Sleo{ 4101.12Stsutsui 4111.1Sleo for (; c; a++, c--) 4121.1Sleo *a = __read_8(h, o); 4131.1Sleo} 4141.1Sleo 4151.1Sleo/* 4161.11Stsutsui * void bus_space_write_multi_N(bus_space_tag_t tag, 4171.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 4181.12Stsutsui * const uintX_t *address, bus_size_t count); 4191.1Sleo * 4201.1Sleo * Write 'count' 1, 2, 4, or 8 byte values from the address range starting 4211.1Sleo * at 'address' to the bus_space described by tag/handle at `offset'. 4221.1Sleo * The values are converted to bus endian order before being written to 4231.1Sleo * the bus. 4241.1Sleo */ 4251.1Sleostatic void 4261.12Stsutsuibeb_bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, 4271.12Stsutsui bus_size_t o, const uint8_t *a, bus_size_t c) 4281.1Sleo{ 4291.12Stsutsui 4301.1Sleo for (; c; a++, c--) 4311.1Sleo __write_1(h, o, *a); 4321.1Sleo} 4331.1Sleo 4341.1Sleostatic void 4351.12Stsutsuibeb_bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, 4361.12Stsutsui bus_size_t o, const uint16_t *a, bus_size_t c) 4371.1Sleo{ 4381.12Stsutsui 4391.1Sleo for (; c; a++, c--) 4401.1Sleo __write_2(h, o, *a); 4411.1Sleo} 4421.1Sleo 4431.1Sleostatic void 4441.12Stsutsuibeb_bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, 4451.12Stsutsui bus_size_t o, const uint32_t *a, bus_size_t c) 4461.1Sleo{ 4471.12Stsutsui 4481.1Sleo for (; c; a++, c--) 4491.1Sleo __write_4(h, o, *a); 4501.1Sleo} 4511.1Sleo 4521.1Sleostatic void 4531.12Stsutsuibeb_bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, 4541.12Stsutsui bus_size_t o, const uint64_t *a, bus_size_t c) 4551.1Sleo{ 4561.12Stsutsui 4571.1Sleo for (; c; a++, c--) 4581.1Sleo __write_8(h, o, *a); 4591.1Sleo} 4601.1Sleo 4611.1Sleo/* 4621.11Stsutsui * void bus_space_read_region_N(bus_space_tag_t tag, 4631.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 4641.12Stsutsui * uintN_t *addr, bus_size_t count); 4651.1Sleo * 4661.1Sleo * Read `count' 1, 2, 4, or 8 byte quantities from bus space 4671.1Sleo * described by tag/handle and starting at `offset' and copy into 4681.1Sleo * buffer provided. 4691.1Sleo */ 4701.1Sleostatic void 4711.12Stsutsuibeb_bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, 4721.12Stsutsui bus_size_t o, uint8_t *a, bus_size_t c) 4731.1Sleo{ 4741.12Stsutsui 4751.1Sleo for (; c; a++, o++, c--) 4761.1Sleo *a = __read_1(h, o); 4771.1Sleo} 4781.1Sleo 4791.1Sleostatic void 4801.12Stsutsuibeb_bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, 4811.12Stsutsui bus_size_t o, uint16_t *a, bus_size_t c) 4821.1Sleo{ 4831.12Stsutsui 4841.1Sleo for (; c; a++, o += 2, c--) 4851.1Sleo *a = __read_2(h, o); 4861.1Sleo} 4871.1Sleo 4881.1Sleostatic void 4891.12Stsutsuibeb_bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, 4901.12Stsutsui bus_size_t o, uint32_t *a, bus_size_t c) 4911.1Sleo{ 4921.12Stsutsui 4931.1Sleo for (; c; a++, o += 4, c--) 4941.1Sleo *a = __read_4(h, o); 4951.1Sleo} 4961.1Sleo 4971.1Sleostatic void 4981.12Stsutsuibeb_bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, 4991.12Stsutsui bus_size_t o, uint64_t *a, bus_size_t c) 5001.1Sleo{ 5011.12Stsutsui 5021.1Sleo for (; c; a++, o += 8, c--) 5031.1Sleo *a = __read_8(h, o); 5041.1Sleo} 5051.1Sleo 5061.1Sleo/* 5071.11Stsutsui * void bus_space_write_region_N(bus_space_tag_t tag, 5081.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 5091.12Stsutsui * uintN_t *addr, bus_size_t count); 5101.1Sleo * 5111.1Sleo * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided 5121.1Sleo * into the bus space described by tag/handle and starting at `offset'. 5131.1Sleo */ 5141.1Sleostatic void 5151.12Stsutsuibeb_bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, 5161.12Stsutsui bus_size_t o, const uint8_t *a, bus_size_t c) 5171.1Sleo{ 5181.12Stsutsui 5191.1Sleo for (; c; a++, o++, c--) 5201.1Sleo __write_1(h, o, *a); 5211.1Sleo} 5221.1Sleo 5231.1Sleostatic void 5241.12Stsutsuibeb_bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, 5251.12Stsutsui bus_size_t o, const uint16_t *a, bus_size_t c) 5261.1Sleo{ 5271.12Stsutsui 5281.1Sleo for (; c; a++, o += 2, c--) 5291.1Sleo __write_2(h, o, *a); 5301.1Sleo} 5311.1Sleo 5321.1Sleostatic void 5331.12Stsutsuibeb_bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, 5341.12Stsutsui bus_size_t o, const uint32_t *a, bus_size_t c) 5351.1Sleo{ 5361.12Stsutsui 5371.1Sleo for (; c; a++, o += 4, c--) 5381.1Sleo __write_4(h, o, *a); 5391.1Sleo} 5401.1Sleo 5411.1Sleostatic void 5421.12Stsutsuibeb_bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, 5431.12Stsutsui bus_size_t o, const uint64_t *a, bus_size_t c) 5441.1Sleo{ 5451.12Stsutsui 5461.1Sleo for (; c; a++, o += 8, c--) 5471.1Sleo __write_8(h, o, *a); 5481.1Sleo} 5491.1Sleo 5501.1Sleo/* 5511.11Stsutsui * void bus_space_set_multi_N(bus_space_tag_t tag, 5521.12Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 5531.11Stsutsui * bus_size_t count); 5541.1Sleo * 5551.1Sleo * Write the 1, 2, 4, or 8 byte value `val' to bus space described 5561.1Sleo * by tag/handle/offset `count' times. 5571.1Sleo */ 5581.1Sleo 5591.1Sleostatic void 5601.12Stsutsuibeb_bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, 5611.12Stsutsui bus_size_t o, uint8_t v, bus_size_t c) 5621.1Sleo{ 5631.12Stsutsui 5641.1Sleo for (; c; c--) 5651.1Sleo __write_1(h, o, v); 5661.1Sleo} 5671.1Sleo 5681.1Sleostatic void 5691.12Stsutsuibeb_bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, 5701.12Stsutsui bus_size_t o, uint16_t v, bus_size_t c) 5711.1Sleo{ 5721.12Stsutsui 5731.1Sleo for (; c; c--) 5741.1Sleo __write_2(h, o, v); 5751.1Sleo} 5761.1Sleo 5771.1Sleostatic void 5781.12Stsutsuibeb_bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, 5791.12Stsutsui bus_size_t o, uint32_t v, bus_size_t c) 5801.1Sleo{ 5811.12Stsutsui 5821.1Sleo for (; c; c--) 5831.1Sleo __write_4(h, o, v); 5841.1Sleo} 5851.1Sleo 5861.1Sleostatic void 5871.12Stsutsuibeb_bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, 5881.12Stsutsui bus_size_t o, uint64_t v, bus_size_t c) 5891.1Sleo{ 5901.12Stsutsui 5911.1Sleo for (; c; c--) 5921.1Sleo __write_8(h, o, v); 5931.1Sleo} 5941.1Sleo 5951.1Sleo/* 5961.11Stsutsui * void bus_space_set_region_N(bus_space_tag_t tag, 5971.12Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 5981.11Stsutsui * bus_size_t count); 5991.1Sleo * 6001.1Sleo * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 6011.1Sleo * by tag/handle starting at `offset'. 6021.1Sleo */ 6031.1Sleostatic void 6041.12Stsutsuibeb_bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, 6051.12Stsutsui bus_size_t o, uint8_t v, bus_size_t c) 6061.1Sleo{ 6071.12Stsutsui 6081.1Sleo for (; c; o++, c--) 6091.1Sleo __write_1(h, o, v); 6101.1Sleo} 6111.1Sleo 6121.1Sleostatic void 6131.12Stsutsuibeb_bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, 6141.12Stsutsui bus_size_t o, uint16_t v, bus_size_t c) 6151.1Sleo{ 6161.12Stsutsui 6171.1Sleo for (; c; o += 2, c--) 6181.1Sleo __write_2(h, o, v); 6191.1Sleo} 6201.1Sleo 6211.1Sleostatic void 6221.12Stsutsuibeb_bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, 6231.12Stsutsui bus_size_t o, uint32_t v, bus_size_t c) 6241.1Sleo{ 6251.12Stsutsui 6261.1Sleo for (; c; o += 4, c--) 6271.1Sleo __write_4(h, o, v); 6281.1Sleo} 6291.1Sleo 6301.1Sleostatic void 6311.12Stsutsuibeb_bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, 6321.12Stsutsui bus_size_t o, uint64_t v, bus_size_t c) 6331.1Sleo{ 6341.12Stsutsui 6351.1Sleo for (; c; o += 8, c--) 6361.1Sleo __write_8(h, o, v); 6371.1Sleo} 638