11.18Stsutsui/* $NetBSD: be_bus.c,v 1.18 2023/01/06 10:28:27 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.18Stsutsui__KERNEL_RCSID(0, "$NetBSD: be_bus.c,v 1.18 2023/01/06 10:28:27 tsutsui Exp $"); 341.5Slukem 351.1Sleo#include <sys/types.h> 361.1Sleo#include <sys/param.h> 371.1Sleo#include <sys/systm.h> 381.17Sthorpej#include <sys/kmem.h> 391.1Sleo#include <machine/cpu.h> 401.15Sdyoung#include <sys/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.17Sthorpej * is used during console config (when kmem_alloc() can't be used). 1821.4Sleo */ 1831.4Sleo if (storage != NULL) 1841.4Sleo beb_t = storage; 1851.4Sleo else { 1861.17Sthorpej beb_t = kmem_alloc(sizeof(*beb_t), KM_SLEEP); 1871.4Sleo } 1881.13Scegger memset(beb_t, 0, sizeof(*beb_t)); 1891.18Stsutsui 1901.1Sleo beb_t->abs_p_1 = beb_bus_space_peek_1; 1911.1Sleo beb_t->abs_p_2 = beb_bus_space_peek_2; 1921.1Sleo beb_t->abs_p_4 = beb_bus_space_peek_4; 1931.1Sleo beb_t->abs_p_8 = beb_bus_space_peek_8; 1941.1Sleo beb_t->abs_r_1 = beb_bus_space_read_1; 1951.1Sleo beb_t->abs_r_2 = beb_bus_space_read_2; 1961.1Sleo beb_t->abs_r_4 = beb_bus_space_read_4; 1971.1Sleo beb_t->abs_r_8 = beb_bus_space_read_8; 1981.1Sleo beb_t->abs_rs_1 = beb_bus_space_read_1; 1991.1Sleo beb_t->abs_rs_2 = beb_bus_space_read_2; 2001.1Sleo beb_t->abs_rs_4 = beb_bus_space_read_4; 2011.1Sleo beb_t->abs_rs_8 = beb_bus_space_read_8; 2021.1Sleo beb_t->abs_rm_1 = beb_bus_space_read_multi_1; 2031.1Sleo beb_t->abs_rm_2 = beb_bus_space_read_multi_2; 2041.1Sleo beb_t->abs_rm_4 = beb_bus_space_read_multi_4; 2051.1Sleo beb_t->abs_rm_8 = beb_bus_space_read_multi_8; 2061.1Sleo beb_t->abs_rms_1 = beb_bus_space_read_multi_1; 2071.1Sleo beb_t->abs_rms_2 = beb_bus_space_read_multi_2; 2081.1Sleo beb_t->abs_rms_4 = beb_bus_space_read_multi_4; 2091.1Sleo beb_t->abs_rms_8 = beb_bus_space_read_multi_8; 2101.1Sleo beb_t->abs_rr_1 = beb_bus_space_read_region_1; 2111.1Sleo beb_t->abs_rr_2 = beb_bus_space_read_region_2; 2121.1Sleo beb_t->abs_rr_4 = beb_bus_space_read_region_4; 2131.1Sleo beb_t->abs_rr_8 = beb_bus_space_read_region_8; 2141.3Sleo beb_t->abs_rrs_1 = beb_bus_space_read_region_1; 2151.3Sleo beb_t->abs_rrs_2 = beb_bus_space_read_region_2; 2161.3Sleo beb_t->abs_rrs_4 = beb_bus_space_read_region_4; 2171.3Sleo beb_t->abs_rrs_8 = beb_bus_space_read_region_8; 2181.1Sleo beb_t->abs_w_1 = beb_bus_space_write_1; 2191.1Sleo beb_t->abs_w_2 = beb_bus_space_write_2; 2201.1Sleo beb_t->abs_w_4 = beb_bus_space_write_4; 2211.1Sleo beb_t->abs_w_8 = beb_bus_space_write_8; 2221.1Sleo beb_t->abs_ws_1 = beb_bus_space_write_1; 2231.1Sleo beb_t->abs_ws_2 = beb_bus_space_write_2; 2241.1Sleo beb_t->abs_ws_4 = beb_bus_space_write_4; 2251.1Sleo beb_t->abs_ws_8 = beb_bus_space_write_8; 2261.1Sleo beb_t->abs_wm_1 = beb_bus_space_write_multi_1; 2271.1Sleo beb_t->abs_wm_2 = beb_bus_space_write_multi_2; 2281.1Sleo beb_t->abs_wm_4 = beb_bus_space_write_multi_4; 2291.1Sleo beb_t->abs_wm_8 = beb_bus_space_write_multi_8; 2301.1Sleo beb_t->abs_wms_1 = beb_bus_space_write_multi_1; 2311.1Sleo beb_t->abs_wms_2 = beb_bus_space_write_multi_2; 2321.1Sleo beb_t->abs_wms_4 = beb_bus_space_write_multi_4; 2331.1Sleo beb_t->abs_wms_8 = beb_bus_space_write_multi_8; 2341.1Sleo beb_t->abs_wr_1 = beb_bus_space_write_region_1; 2351.1Sleo beb_t->abs_wr_2 = beb_bus_space_write_region_2; 2361.1Sleo beb_t->abs_wr_4 = beb_bus_space_write_region_4; 2371.1Sleo beb_t->abs_wr_8 = beb_bus_space_write_region_8; 2381.3Sleo beb_t->abs_wrs_1 = beb_bus_space_write_region_1; 2391.3Sleo beb_t->abs_wrs_2 = beb_bus_space_write_region_2; 2401.3Sleo beb_t->abs_wrs_4 = beb_bus_space_write_region_4; 2411.3Sleo beb_t->abs_wrs_8 = beb_bus_space_write_region_8; 2421.1Sleo beb_t->abs_sm_1 = beb_bus_space_set_multi_1; 2431.1Sleo beb_t->abs_sm_2 = beb_bus_space_set_multi_2; 2441.1Sleo beb_t->abs_sm_4 = beb_bus_space_set_multi_4; 2451.1Sleo beb_t->abs_sm_8 = beb_bus_space_set_multi_8; 2461.1Sleo beb_t->abs_sr_1 = beb_bus_space_set_region_1; 2471.1Sleo beb_t->abs_sr_2 = beb_bus_space_set_region_2; 2481.1Sleo beb_t->abs_sr_4 = beb_bus_space_set_region_4; 2491.1Sleo beb_t->abs_sr_8 = beb_bus_space_set_region_8; 2501.1Sleo 2511.12Stsutsui return beb_t; 2521.1Sleo} 2531.1Sleo 2541.1Sleo 2551.1Sleo/* 2561.1Sleo * The various access functions 2571.1Sleo */ 2581.1Sleo 2591.1Sleo/* 2601.11Stsutsui * int bus_space_peek_N(bus_space_tag_t tag, 2611.11Stsutsui * bus_space_handle_t sh, bus_size_t offset); 2621.1Sleo * 2631.1Sleo * Check if the address is suitable for reading N-byte quantities. 2641.1Sleo */ 2651.1Sleostatic int 2661.12Stsutsuibeb_bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 2671.1Sleo{ 2681.12Stsutsui 2691.12Stsutsui return !badbaddr((void *)(h + o), 1); 2701.1Sleo} 2711.1Sleo 2721.18Stsutsuistatic int 2731.12Stsutsuibeb_bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 2741.1Sleo{ 2751.12Stsutsui 2761.12Stsutsui return !badbaddr((void *)(h + o), 2); 2771.1Sleo} 2781.1Sleo 2791.18Stsutsuistatic int 2801.12Stsutsuibeb_bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 2811.1Sleo{ 2821.12Stsutsui 2831.12Stsutsui return !badbaddr((void *)(h + o), 4); 2841.1Sleo} 2851.1Sleo 2861.18Stsutsuistatic int 2871.12Stsutsuibeb_bus_space_peek_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 2881.1Sleo{ 2891.12Stsutsui 2901.12Stsutsui return !badbaddr((void *)(h + o), 8); 2911.1Sleo} 2921.1Sleo 2931.1Sleo/* 2941.12Stsutsui * uintX_t bus_space_read_N(bus_space_tag_t tag, 2951.11Stsutsui * bus_space_handle_t bsh, bus_size_t offset); 2961.1Sleo * 2971.1Sleo * Return an 1, 2, 4, or 8 byte value read from the bus_space described 2981.1Sleo * by tag/handle at `offset'. The value is converted to host-endian. 2991.1Sleo */ 3001.12Stsutsuistatic uint8_t 3011.12Stsutsuibeb_bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 3021.1Sleo{ 3031.12Stsutsui 3041.12Stsutsui return __read_1(h, o); 3051.1Sleo} 3061.1Sleo 3071.12Stsutsuistatic uint16_t 3081.12Stsutsuibeb_bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 3091.1Sleo{ 3101.12Stsutsui 3111.12Stsutsui return __read_2(h, o); 3121.1Sleo} 3131.1Sleo 3141.12Stsutsuistatic uint32_t 3151.12Stsutsuibeb_bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 3161.1Sleo{ 3171.12Stsutsui 3181.12Stsutsui return __read_4(h, o); 3191.1Sleo} 3201.1Sleo 3211.12Stsutsuistatic uint64_t 3221.12Stsutsuibeb_bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 3231.1Sleo{ 3241.12Stsutsui 3251.12Stsutsui return __read_8(h, o); 3261.1Sleo} 3271.1Sleo 3281.1Sleo/* 3291.12Stsutsui * uintX_t bus_space_write_N(bus_space_tag_t tag, 3301.12Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintX_t val); 3311.1Sleo * 3321.1Sleo * Write an 1, 2, 4, or 8 byte value to the bus_space described by tag/handle 3331.1Sleo * at `offset'. The value `val' is converted from host to bus endianness 3341.1Sleo * before being written. 3351.1Sleo */ 3361.1Sleostatic void 3371.12Stsutsuibeb_bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 3381.12Stsutsui uint8_t v) 3391.1Sleo{ 3401.12Stsutsui 3411.12Stsutsui __write_1(h, o, v); 3421.1Sleo} 3431.1Sleo 3441.1Sleostatic void 3451.12Stsutsuibeb_bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 3461.12Stsutsui uint16_t v) 3471.1Sleo{ 3481.12Stsutsui 3491.12Stsutsui __write_2(h, o, v); 3501.1Sleo} 3511.1Sleo 3521.1Sleostatic void 3531.12Stsutsuibeb_bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 3541.12Stsutsui uint32_t v) 3551.1Sleo{ 3561.12Stsutsui 3571.12Stsutsui __write_4(h, o, v); 3581.1Sleo} 3591.1Sleo 3601.1Sleostatic void 3611.12Stsutsuibeb_bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 3621.12Stsutsui uint64_t v) 3631.1Sleo{ 3641.12Stsutsui 3651.12Stsutsui __write_8(h, o, v); 3661.1Sleo} 3671.1Sleo 3681.1Sleo/* 3691.11Stsutsui * void bus_space_read_multi_N(bus_space_tag_t tag, 3701.12Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintX_t *address, 3711.18Stsutsui * bus_size_t count); 3721.1Sleo * 3731.1Sleo * Read 'count' 1, 2, 4, or 8 byte values from the bus_space described by 3741.1Sleo * tag/handle at `offset' and store them in the address range starting at 3751.6Swiz * 'address'. The values are converted to CPU endian order before being 3761.1Sleo * being stored. 3771.1Sleo */ 3781.1Sleostatic void 3791.12Stsutsuibeb_bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, 3801.12Stsutsui bus_size_t o, uint8_t *a, bus_size_t c) 3811.1Sleo{ 3821.12Stsutsui 3831.1Sleo for (; c; a++, c--) 3841.1Sleo *a = __read_1(h, o); 3851.1Sleo} 3861.12Stsutsui 3871.1Sleostatic void 3881.12Stsutsuibeb_bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, 3891.12Stsutsui bus_size_t o, uint16_t *a, bus_size_t c) 3901.1Sleo{ 3911.12Stsutsui 3921.1Sleo for (; c; a++, c--) 3931.1Sleo *a = __read_2(h, o); 3941.1Sleo} 3951.1Sleo 3961.1Sleostatic void 3971.12Stsutsuibeb_bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, 3981.12Stsutsui bus_size_t o, uint32_t *a, bus_size_t c) 3991.1Sleo{ 4001.12Stsutsui 4011.1Sleo for (; c; a++, c--) 4021.1Sleo *a = __read_4(h, o); 4031.1Sleo} 4041.1Sleo 4051.1Sleostatic void 4061.12Stsutsuibeb_bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, 4071.12Stsutsui bus_size_t o, uint64_t *a, bus_size_t c) 4081.1Sleo{ 4091.12Stsutsui 4101.1Sleo for (; c; a++, c--) 4111.1Sleo *a = __read_8(h, o); 4121.1Sleo} 4131.1Sleo 4141.1Sleo/* 4151.11Stsutsui * void bus_space_write_multi_N(bus_space_tag_t tag, 4161.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 4171.12Stsutsui * const uintX_t *address, bus_size_t count); 4181.1Sleo * 4191.1Sleo * Write 'count' 1, 2, 4, or 8 byte values from the address range starting 4201.1Sleo * at 'address' to the bus_space described by tag/handle at `offset'. 4211.1Sleo * The values are converted to bus endian order before being written to 4221.1Sleo * the bus. 4231.1Sleo */ 4241.1Sleostatic void 4251.12Stsutsuibeb_bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, 4261.12Stsutsui bus_size_t o, const uint8_t *a, bus_size_t c) 4271.1Sleo{ 4281.12Stsutsui 4291.1Sleo for (; c; a++, c--) 4301.1Sleo __write_1(h, o, *a); 4311.1Sleo} 4321.1Sleo 4331.1Sleostatic void 4341.12Stsutsuibeb_bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, 4351.12Stsutsui bus_size_t o, const uint16_t *a, bus_size_t c) 4361.1Sleo{ 4371.12Stsutsui 4381.1Sleo for (; c; a++, c--) 4391.1Sleo __write_2(h, o, *a); 4401.1Sleo} 4411.1Sleo 4421.1Sleostatic void 4431.12Stsutsuibeb_bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, 4441.12Stsutsui bus_size_t o, const uint32_t *a, bus_size_t c) 4451.1Sleo{ 4461.12Stsutsui 4471.1Sleo for (; c; a++, c--) 4481.1Sleo __write_4(h, o, *a); 4491.1Sleo} 4501.1Sleo 4511.1Sleostatic void 4521.12Stsutsuibeb_bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, 4531.12Stsutsui bus_size_t o, const uint64_t *a, bus_size_t c) 4541.1Sleo{ 4551.12Stsutsui 4561.1Sleo for (; c; a++, c--) 4571.1Sleo __write_8(h, o, *a); 4581.1Sleo} 4591.1Sleo 4601.1Sleo/* 4611.11Stsutsui * void bus_space_read_region_N(bus_space_tag_t tag, 4621.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 4631.12Stsutsui * uintN_t *addr, bus_size_t count); 4641.1Sleo * 4651.1Sleo * Read `count' 1, 2, 4, or 8 byte quantities from bus space 4661.1Sleo * described by tag/handle and starting at `offset' and copy into 4671.1Sleo * buffer provided. 4681.1Sleo */ 4691.1Sleostatic void 4701.12Stsutsuibeb_bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, 4711.12Stsutsui bus_size_t o, uint8_t *a, bus_size_t c) 4721.1Sleo{ 4731.12Stsutsui 4741.1Sleo for (; c; a++, o++, c--) 4751.1Sleo *a = __read_1(h, o); 4761.1Sleo} 4771.1Sleo 4781.1Sleostatic void 4791.12Stsutsuibeb_bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, 4801.12Stsutsui bus_size_t o, uint16_t *a, bus_size_t c) 4811.1Sleo{ 4821.12Stsutsui 4831.1Sleo for (; c; a++, o += 2, c--) 4841.1Sleo *a = __read_2(h, o); 4851.1Sleo} 4861.1Sleo 4871.1Sleostatic void 4881.12Stsutsuibeb_bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, 4891.12Stsutsui bus_size_t o, uint32_t *a, bus_size_t c) 4901.1Sleo{ 4911.12Stsutsui 4921.1Sleo for (; c; a++, o += 4, c--) 4931.1Sleo *a = __read_4(h, o); 4941.1Sleo} 4951.1Sleo 4961.1Sleostatic void 4971.12Stsutsuibeb_bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, 4981.12Stsutsui bus_size_t o, uint64_t *a, bus_size_t c) 4991.1Sleo{ 5001.12Stsutsui 5011.1Sleo for (; c; a++, o += 8, c--) 5021.1Sleo *a = __read_8(h, o); 5031.1Sleo} 5041.1Sleo 5051.1Sleo/* 5061.11Stsutsui * void bus_space_write_region_N(bus_space_tag_t tag, 5071.1Sleo * bus_space_handle_t bsh, bus_size_t offset, 5081.12Stsutsui * uintN_t *addr, bus_size_t count); 5091.1Sleo * 5101.1Sleo * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided 5111.1Sleo * into the bus space described by tag/handle and starting at `offset'. 5121.1Sleo */ 5131.1Sleostatic void 5141.12Stsutsuibeb_bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, 5151.12Stsutsui bus_size_t o, const uint8_t *a, bus_size_t c) 5161.1Sleo{ 5171.12Stsutsui 5181.1Sleo for (; c; a++, o++, c--) 5191.1Sleo __write_1(h, o, *a); 5201.1Sleo} 5211.1Sleo 5221.1Sleostatic void 5231.12Stsutsuibeb_bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, 5241.12Stsutsui bus_size_t o, const uint16_t *a, bus_size_t c) 5251.1Sleo{ 5261.12Stsutsui 5271.1Sleo for (; c; a++, o += 2, c--) 5281.1Sleo __write_2(h, o, *a); 5291.1Sleo} 5301.1Sleo 5311.1Sleostatic void 5321.12Stsutsuibeb_bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, 5331.12Stsutsui bus_size_t o, const uint32_t *a, bus_size_t c) 5341.1Sleo{ 5351.12Stsutsui 5361.1Sleo for (; c; a++, o += 4, c--) 5371.1Sleo __write_4(h, o, *a); 5381.1Sleo} 5391.1Sleo 5401.1Sleostatic void 5411.12Stsutsuibeb_bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, 5421.12Stsutsui bus_size_t o, const uint64_t *a, bus_size_t c) 5431.1Sleo{ 5441.12Stsutsui 5451.1Sleo for (; c; a++, o += 8, c--) 5461.1Sleo __write_8(h, o, *a); 5471.1Sleo} 5481.1Sleo 5491.1Sleo/* 5501.11Stsutsui * void bus_space_set_multi_N(bus_space_tag_t tag, 5511.12Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 5521.11Stsutsui * bus_size_t count); 5531.1Sleo * 5541.1Sleo * Write the 1, 2, 4, or 8 byte value `val' to bus space described 5551.1Sleo * by tag/handle/offset `count' times. 5561.1Sleo */ 5571.1Sleo 5581.1Sleostatic void 5591.12Stsutsuibeb_bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, 5601.12Stsutsui bus_size_t o, uint8_t v, bus_size_t c) 5611.1Sleo{ 5621.12Stsutsui 5631.1Sleo for (; c; c--) 5641.1Sleo __write_1(h, o, v); 5651.1Sleo} 5661.1Sleo 5671.1Sleostatic void 5681.12Stsutsuibeb_bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, 5691.12Stsutsui bus_size_t o, uint16_t v, bus_size_t c) 5701.1Sleo{ 5711.12Stsutsui 5721.1Sleo for (; c; c--) 5731.1Sleo __write_2(h, o, v); 5741.1Sleo} 5751.1Sleo 5761.1Sleostatic void 5771.12Stsutsuibeb_bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, 5781.12Stsutsui bus_size_t o, uint32_t v, bus_size_t c) 5791.1Sleo{ 5801.12Stsutsui 5811.1Sleo for (; c; c--) 5821.1Sleo __write_4(h, o, v); 5831.1Sleo} 5841.1Sleo 5851.1Sleostatic void 5861.12Stsutsuibeb_bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, 5871.12Stsutsui bus_size_t o, uint64_t v, bus_size_t c) 5881.1Sleo{ 5891.12Stsutsui 5901.1Sleo for (; c; c--) 5911.1Sleo __write_8(h, o, v); 5921.1Sleo} 5931.1Sleo 5941.1Sleo/* 5951.11Stsutsui * void bus_space_set_region_N(bus_space_tag_t tag, 5961.12Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 5971.11Stsutsui * bus_size_t count); 5981.1Sleo * 5991.1Sleo * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 6001.1Sleo * by tag/handle starting at `offset'. 6011.1Sleo */ 6021.1Sleostatic void 6031.12Stsutsuibeb_bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, 6041.12Stsutsui bus_size_t o, uint8_t v, bus_size_t c) 6051.1Sleo{ 6061.12Stsutsui 6071.1Sleo for (; c; o++, c--) 6081.1Sleo __write_1(h, o, v); 6091.1Sleo} 6101.1Sleo 6111.1Sleostatic void 6121.12Stsutsuibeb_bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, 6131.12Stsutsui bus_size_t o, uint16_t v, bus_size_t c) 6141.1Sleo{ 6151.12Stsutsui 6161.1Sleo for (; c; o += 2, c--) 6171.1Sleo __write_2(h, o, v); 6181.1Sleo} 6191.1Sleo 6201.1Sleostatic void 6211.12Stsutsuibeb_bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, 6221.12Stsutsui bus_size_t o, uint32_t v, bus_size_t c) 6231.1Sleo{ 6241.12Stsutsui 6251.1Sleo for (; c; o += 4, c--) 6261.1Sleo __write_4(h, o, v); 6271.1Sleo} 6281.1Sleo 6291.1Sleostatic void 6301.12Stsutsuibeb_bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, 6311.12Stsutsui bus_size_t o, uint64_t v, bus_size_t c) 6321.1Sleo{ 6331.12Stsutsui 6341.1Sleo for (; c; o += 8, c--) 6351.1Sleo __write_8(h, o, v); 6361.1Sleo} 637