bus.h revision 1.4
11.4Smatt/* $NetBSD: bus.h,v 1.4 2000/11/27 08:53:54 matt Exp $ */ 21.1Snonaka/* $OpenBSD: bus.h,v 1.1 1997/10/13 10:53:42 pefo Exp $ */ 31.1Snonaka 41.1Snonaka/*- 51.1Snonaka * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. 61.1Snonaka * All rights reserved. 71.1Snonaka * 81.1Snonaka * This code is derived from software contributed to The NetBSD Foundation 91.1Snonaka * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 101.1Snonaka * NASA Ames Research Center. 111.1Snonaka * 121.1Snonaka * Redistribution and use in source and binary forms, with or without 131.1Snonaka * modification, are permitted provided that the following conditions 141.1Snonaka * are met: 151.1Snonaka * 1. Redistributions of source code must retain the above copyright 161.1Snonaka * notice, this list of conditions and the following disclaimer. 171.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright 181.1Snonaka * notice, this list of conditions and the following disclaimer in the 191.1Snonaka * documentation and/or other materials provided with the distribution. 201.1Snonaka * 3. All advertising materials mentioning features or use of this software 211.1Snonaka * must display the following acknowledgement: 221.1Snonaka * This product includes software developed by the NetBSD 231.1Snonaka * Foundation, Inc. and its contributors. 241.1Snonaka * 4. Neither the name of The NetBSD Foundation nor the names of its 251.1Snonaka * contributors may be used to endorse or promote products derived 261.1Snonaka * from this software without specific prior written permission. 271.1Snonaka * 281.1Snonaka * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 291.1Snonaka * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 301.1Snonaka * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 311.1Snonaka * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 321.1Snonaka * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 331.1Snonaka * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 341.1Snonaka * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 351.1Snonaka * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 361.1Snonaka * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 371.1Snonaka * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 381.1Snonaka * POSSIBILITY OF SUCH DAMAGE. 391.1Snonaka */ 401.1Snonaka 411.1Snonaka/* 421.1Snonaka * Copyright (c) 1996 Charles M. Hannum. All rights reserved. 431.1Snonaka * Copyright (c) 1996 Jason R. Thorpe. All rights reserved. 441.1Snonaka * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 451.1Snonaka * 461.1Snonaka * Redistribution and use in source and binary forms, with or without 471.1Snonaka * modification, are permitted provided that the following conditions 481.1Snonaka * are met: 491.1Snonaka * 1. Redistributions of source code must retain the above copyright 501.1Snonaka * notice, this list of conditions and the following disclaimer. 511.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright 521.1Snonaka * notice, this list of conditions and the following disclaimer in the 531.1Snonaka * documentation and/or other materials provided with the distribution. 541.1Snonaka * 3. All advertising materials mentioning features or use of this software 551.1Snonaka * must display the following acknowledgement: 561.1Snonaka * This product includes software developed by Christopher G. Demetriou 571.1Snonaka * for the NetBSD Project. 581.1Snonaka * 4. The name of the author may not be used to endorse or promote products 591.1Snonaka * derived from this software without specific prior written permission 601.1Snonaka * 611.1Snonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 621.1Snonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 631.1Snonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 641.1Snonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 651.1Snonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 661.1Snonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 671.1Snonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 681.1Snonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 691.1Snonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 701.1Snonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 711.1Snonaka */ 721.1Snonaka 731.1Snonaka/* 741.1Snonaka * Copyright (c) 1997 Per Fogelstrom. All rights reserved. 751.1Snonaka * Copyright (c) 1996 Niklas Hallqvist. All rights reserved. 761.1Snonaka * 771.1Snonaka * Redistribution and use in source and binary forms, with or without 781.1Snonaka * modification, are permitted provided that the following conditions 791.1Snonaka * are met: 801.1Snonaka * 1. Redistributions of source code must retain the above copyright 811.1Snonaka * notice, this list of conditions and the following disclaimer. 821.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright 831.1Snonaka * notice, this list of conditions and the following disclaimer in the 841.1Snonaka * documentation and/or other materials provided with the distribution. 851.1Snonaka * 3. All advertising materials mentioning features or use of this software 861.1Snonaka * must display the following acknowledgement: 871.1Snonaka * This product includes software developed by Christopher G. Demetriou 881.1Snonaka * for the NetBSD Project. 891.1Snonaka * 4. The name of the author may not be used to endorse or promote products 901.1Snonaka * derived from this software without specific prior written permission 911.1Snonaka * 921.1Snonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 931.1Snonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 941.1Snonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 951.1Snonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 961.1Snonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 971.1Snonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 981.1Snonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 991.1Snonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1001.1Snonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 1011.1Snonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1021.1Snonaka */ 1031.1Snonaka 1041.1Snonaka#ifndef _PREP_BUS_H_ 1051.1Snonaka#define _PREP_BUS_H_ 1061.1Snonaka 1071.1Snonaka#include <machine/pio.h> 1081.1Snonaka 1091.1Snonaka/* 1101.1Snonaka * Values for the Be bus space tag, not to be used directly by MI code. 1111.1Snonaka */ 1121.1Snonaka#define PREP_BUS_SPACE_IO 0x80000000 /* i/o space */ 1131.1Snonaka#define PREP_BUS_SPACE_MEM 0xC0000000 /* mem space */ 1141.1Snonaka 1151.1Snonaka/* 1161.1Snonaka * Address conversion as seen from a PCI master. 1171.1Snonaka */ 1181.1Snonaka#define MPC105_DIRECT_MAPPED_SPACE 0x80000000 1191.1Snonaka#define PHYS_TO_PCI_MEM(x) ((x) | MPC105_DIRECT_MAPPED_SPACE) 1201.1Snonaka#define PCI_MEM_TO_PHYS(x) ((x) & ~MPC105_DIRECT_MAPPED_SPACE) 1211.1Snonaka 1221.1Snonaka/* 1231.1Snonaka * Bus access types. 1241.1Snonaka */ 1251.1Snonakatypedef u_int32_t bus_addr_t; 1261.1Snonakatypedef u_int32_t bus_size_t; 1271.1Snonakatypedef u_int32_t bus_space_handle_t; 1281.4Smatttypedef const struct prep_bus_space { 1291.4Smatt u_int32_t pbs_type; 1301.4Smatt bus_addr_t pbs_base; 1311.4Smatt bus_addr_t pbs_limit; 1321.4Smatt} *bus_space_tag_t; 1331.4Smatt 1341.4Smattextern const struct prep_bus_space prep_io_space_tag; 1351.4Smattextern const struct prep_bus_space prep_isa_io_space_tag; 1361.4Smattextern const struct prep_bus_space prep_mem_space_tag; 1371.4Smattextern const struct prep_bus_space prep_isa_mem_space_tag; 1381.1Snonaka 1391.1Snonaka#define BUS_SPACE_MAP_CACHEABLE 0x01 1401.1Snonaka#define BUS_SPACE_MAP_LINEAR 0x02 1411.1Snonaka#define BUS_SPACE_MAP_PREFETCHABLE 0x04 1421.1Snonaka 1431.1Snonaka#ifdef __STDC__ 1441.1Snonaka#define CAT(a,b) a##b 1451.1Snonaka#define CAT3(a,b,c) a##b##c 1461.1Snonaka#else 1471.1Snonaka#define CAT(a,b) a/**/b 1481.1Snonaka#define CAT3(a,b,c) a/**/b/**/c 1491.1Snonaka#endif 1501.1Snonaka 1511.1Snonaka/* 1521.1Snonaka * Access methods for bus resources 1531.1Snonaka */ 1541.1Snonaka 1551.1Snonaka#define __BUS_SPACE_HAS_STREAM_METHODS 1561.1Snonaka 1571.1Snonaka/* 1581.1Snonaka * int bus_space_map __P((bus_space_tag_t t, bus_addr_t addr, 1591.1Snonaka * bus_size_t size, int flags, bus_space_handle_t *bshp)); 1601.1Snonaka * 1611.1Snonaka * Map a region of bus space. 1621.1Snonaka */ 1631.1Snonaka 1641.2Snonakaint prep_memio_map __P((bus_space_tag_t t, bus_addr_t addr, 1651.2Snonaka bus_size_t size, int flags, bus_space_handle_t *bshp)); 1661.2Snonaka 1671.2Snonaka#define bus_space_map(t, a, s, f, hp) \ 1681.2Snonaka prep_memio_map((t), (a), (s), (f), (hp)) 1691.1Snonaka 1701.1Snonaka/* 1711.1Snonaka * int bus_space_unmap __P((bus_space_tag_t t, 1721.1Snonaka * bus_space_handle_t bsh, bus_size_t size)); 1731.1Snonaka * 1741.1Snonaka * Unmap a region of bus space. 1751.1Snonaka */ 1761.1Snonaka 1771.2Snonakavoid prep_memio_unmap __P((bus_space_tag_t t, bus_space_handle_t bsh, 1781.2Snonaka bus_size_t size)); 1791.2Snonaka 1801.2Snonaka#define bus_space_unmap(t, h, s) \ 1811.2Snonaka prep_memio_unmap((t), (h), (s)) 1821.1Snonaka 1831.1Snonaka/* 1841.1Snonaka * int bus_space_subregion __P((bus_space_tag_t t, 1851.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, bus_size_t size, 1861.1Snonaka * bus_space_handle_t *nbshp)); 1871.1Snonaka * 1881.1Snonaka * Get a new handle for a subregion of an already-mapped area of bus space. 1891.1Snonaka */ 1901.1Snonaka 1911.2Snonaka#define bus_space_subregion(t, h, o, s, hp) \ 1921.2Snonaka ((*(hp) = (h) + (o)), 0) 1931.1Snonaka 1941.1Snonaka/* 1951.1Snonaka * int bus_space_alloc __P((bus_space_tag_t t, bus_addr_t rstart, 1961.1Snonaka * bus_addr_t rend, bus_size_t size, bus_size_t align, 1971.2Snonaka * bus_size_t boundary, int flags, bus_addr_t *bpap, 1981.1Snonaka * bus_space_handle_t *bshp)); 1991.1Snonaka * 2001.1Snonaka * Allocate a region of bus space. 2011.1Snonaka */ 2021.1Snonaka 2031.2Snonakaint prep_memio_alloc __P((bus_space_tag_t t, bus_addr_t rstart, 2041.2Snonaka bus_addr_t rend, bus_size_t size, bus_size_t align, 2051.2Snonaka bus_size_t boundary, int flags, bus_addr_t *bpap, 2061.2Snonaka bus_space_handle_t *bshp)); 2071.2Snonaka 2081.2Snonaka#define bus_space_alloc(t, rs, re, s, a, b, f, ap, hp) \ 2091.2Snonaka prep_memio_alloc((t), (rs), (re), (s), (a), (b), (f), (ap), (hp)) 2101.1Snonaka 2111.1Snonaka/* 2121.1Snonaka * int bus_space_free __P((bus_space_tag_t t, 2131.1Snonaka * bus_space_handle_t bsh, bus_size_t size)); 2141.1Snonaka * 2151.1Snonaka * Free a region of bus space. 2161.1Snonaka */ 2171.1Snonaka 2181.2Snonakavoid prep_memio_free __P((bus_space_tag_t t, bus_space_handle_t bsh, 2191.2Snonaka bus_size_t size)); 2201.2Snonaka 2211.2Snonaka#define bus_space_free(t, h, s) \ 2221.2Snonaka prep_memio_free((t), (h), (s)) 2231.1Snonaka 2241.1Snonaka/* 2251.1Snonaka * u_intN_t bus_space_read_N __P((bus_space_tag_t tag, 2261.1Snonaka * bus_space_handle_t bsh, bus_size_t offset)); 2271.1Snonaka * 2281.1Snonaka * Read a 1, 2, 4, or 8 byte quantity from bus space 2291.1Snonaka * described by tag/handle/offset. 2301.1Snonaka */ 2311.1Snonaka 2321.1Snonaka#define bus_space_read(n,m) \ 2331.1Snonakastatic __inline CAT3(u_int,m,_t) \ 2341.1SnonakaCAT(bus_space_read_,n)(bus_space_tag_t tag, bus_space_handle_t bsh, \ 2351.1Snonaka bus_size_t offset) \ 2361.1Snonaka{ \ 2371.1Snonaka return CAT3(in,m,rb)((volatile CAT3(u_int,m,_t) *)(bsh + (offset))); \ 2381.1Snonaka} 2391.1Snonaka 2401.1Snonakabus_space_read(1,8) 2411.1Snonakabus_space_read(2,16) 2421.1Snonakabus_space_read(4,32) 2431.1Snonaka#define bus_space_read_8 !!! bus_space_read_8 unimplemented !!! 2441.1Snonaka 2451.1Snonaka/* 2461.1Snonaka * u_intN_t bus_space_read_stream_N __P((bus_space_tag_t tag, 2471.1Snonaka * bus_space_handle_t bsh, bus_size_t offset)); 2481.1Snonaka * 2491.1Snonaka * Read a 2, 4, or 8 byte stream quantity from bus space 2501.1Snonaka * described by tag/handle/offset. 2511.1Snonaka */ 2521.1Snonaka 2531.1Snonaka#define bus_space_read_stream(n,m) \ 2541.1Snonakastatic __inline CAT3(u_int,m,_t) \ 2551.1SnonakaCAT(bus_space_read_stream_,n)(bus_space_tag_t tag, bus_space_handle_t bsh, \ 2561.1Snonaka bus_size_t offset) \ 2571.1Snonaka{ \ 2581.1Snonaka return CAT(in,m)((volatile CAT3(u_int,m,_t) *)(bsh + (offset))); \ 2591.1Snonaka} 2601.1Snonaka 2611.1Snonakabus_space_read_stream(2,16) 2621.1Snonakabus_space_read_stream(4,32) 2631.1Snonaka#define bus_space_read_stream_8 !!! bus_space_read_stream_8 unimplemented !!! 2641.1Snonaka 2651.1Snonaka/* 2661.1Snonaka * void bus_space_read_multi_N __P((bus_space_tag_t tag, 2671.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 2681.1Snonaka * u_intN_t *addr, size_t count)); 2691.1Snonaka * 2701.1Snonaka * Read `count' 1, 2, 4, or 8 byte quantities from bus space 2711.1Snonaka * described by tag/handle/offset and copy into buffer provided. 2721.1Snonaka */ 2731.1Snonaka 2741.1Snonaka#define bus_space_read_multi(n,m) \ 2751.1Snonakastatic __inline void \ 2761.1SnonakaCAT(bus_space_read_multi_,n)(bus_space_tag_t tag, bus_space_handle_t bsh, \ 2771.1Snonaka bus_size_t offset, CAT3(u_int,m,_t) *addr, size_t count) \ 2781.1Snonaka{ \ 2791.1Snonaka CAT3(ins,m,rb)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)), \ 2801.1Snonaka (CAT3(u_int,m,_t) *)addr, (size_t)count); \ 2811.1Snonaka} 2821.1Snonaka 2831.1Snonakabus_space_read_multi(1,8) 2841.1Snonakabus_space_read_multi(2,16) 2851.1Snonakabus_space_read_multi(4,32) 2861.1Snonaka#define bus_space_read_multi_8 !!! bus_space_read_multi_8 not implemented !!! 2871.1Snonaka 2881.1Snonaka/* 2891.1Snonaka * void bus_space_read_multi_stream_N __P((bus_space_tag_t tag, 2901.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 2911.1Snonaka * u_intN_t *addr, size_t count)); 2921.1Snonaka * 2931.1Snonaka * Read `count' 2, 4, or 8 byte stream quantities from bus space 2941.1Snonaka * described by tag/handle/offset and copy into buffer provided. 2951.1Snonaka */ 2961.1Snonaka 2971.1Snonaka#define bus_space_read_multi_stream(n,m) \ 2981.1Snonakastatic __inline void \ 2991.1SnonakaCAT(bus_space_read_multi_stream_,n)(bus_space_tag_t tag, \ 3001.1Snonaka bus_space_handle_t bsh, \ 3011.1Snonaka bus_size_t offset, CAT3(u_int,m,_t) *addr, size_t count) \ 3021.1Snonaka{ \ 3031.1Snonaka CAT(ins,m)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)), \ 3041.1Snonaka (CAT3(u_int,m,_t) *)addr, (size_t)count); \ 3051.1Snonaka} 3061.1Snonaka 3071.1Snonakabus_space_read_multi_stream(2,16) 3081.1Snonakabus_space_read_multi_stream(4,32) 3091.1Snonaka#define bus_space_read_multi_stream_8 \ 3101.1Snonaka !!! bus_space_read_multi_stream_8 not implemented !!! 3111.1Snonaka 3121.1Snonaka/* 3131.1Snonaka * void bus_space_write_N __P((bus_space_tag_t tag, 3141.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 3151.1Snonaka * u_intN_t value)); 3161.1Snonaka * 3171.1Snonaka * Write the 1, 2, 4, or 8 byte value `value' to bus space 3181.1Snonaka * described by tag/handle/offset. 3191.1Snonaka */ 3201.1Snonaka 3211.1Snonaka#define bus_space_write(n,m) \ 3221.1Snonakastatic __inline void \ 3231.1SnonakaCAT(bus_space_write_,n)(bus_space_tag_t tag, bus_space_handle_t bsh, \ 3241.1Snonaka bus_size_t offset, CAT3(u_int,m,_t) x) \ 3251.1Snonaka{ \ 3261.1Snonaka CAT3(out,m,rb)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)), x); \ 3271.1Snonaka} 3281.1Snonaka 3291.1Snonakabus_space_write(1,8) 3301.1Snonakabus_space_write(2,16) 3311.1Snonakabus_space_write(4,32) 3321.1Snonaka#define bus_space_write_8 !!! bus_space_write_8 unimplemented !!! 3331.1Snonaka 3341.1Snonaka/* 3351.1Snonaka * void bus_space_write_stream_N __P((bus_space_tag_t tag, 3361.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 3371.1Snonaka * u_intN_t value)); 3381.1Snonaka * 3391.1Snonaka * Write the 2, 4, or 8 byte stream value `value' to bus space 3401.1Snonaka * described by tag/handle/offset. 3411.1Snonaka */ 3421.1Snonaka 3431.1Snonaka#define bus_space_write_stream(n,m) \ 3441.1Snonakastatic __inline void \ 3451.1SnonakaCAT(bus_space_write_stream_,n)(bus_space_tag_t tag, bus_space_handle_t bsh, \ 3461.1Snonaka bus_size_t offset, CAT3(u_int,m,_t) x) \ 3471.1Snonaka{ \ 3481.1Snonaka CAT(out,m)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)), x); \ 3491.1Snonaka} 3501.1Snonaka 3511.1Snonakabus_space_write_stream(2,16) 3521.1Snonakabus_space_write_stream(4,32) 3531.1Snonaka#define bus_space_write_stream_8 !!! bus_space_write_stream_8 unimplemented !!! 3541.1Snonaka 3551.1Snonaka/* 3561.1Snonaka * void bus_space_write_multi_N __P((bus_space_tag_t tag, 3571.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 3581.1Snonaka * const u_intN_t *addr, size_t count)); 3591.1Snonaka * 3601.1Snonaka * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 3611.1Snonaka * provided to bus space described by tag/handle/offset. 3621.1Snonaka */ 3631.1Snonaka 3641.1Snonaka#define bus_space_write_multi(n,m) \ 3651.1Snonakastatic __inline void \ 3661.1SnonakaCAT(bus_space_write_multi_,n)(bus_space_tag_t tag, bus_space_handle_t bsh, \ 3671.1Snonaka bus_size_t offset, const CAT3(u_int,m,_t) *addr, size_t count) \ 3681.1Snonaka{ \ 3691.1Snonaka CAT3(outs,m,rb)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)), \ 3701.1Snonaka (CAT3(u_int,m,_t) *)addr, (size_t)count); \ 3711.1Snonaka} 3721.1Snonaka 3731.1Snonakabus_space_write_multi(1,8) 3741.1Snonakabus_space_write_multi(2,16) 3751.1Snonakabus_space_write_multi(4,32) 3761.1Snonaka#define bus_space_write_multi_8 !!! bus_space_write_multi_8 not implemented !!! 3771.1Snonaka 3781.1Snonaka/* 3791.1Snonaka * void bus_space_write_multi_stream_N __P((bus_space_tag_t tag, 3801.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 3811.1Snonaka * const u_intN_t *addr, size_t count)); 3821.1Snonaka * 3831.1Snonaka * Write `count' 2, 4, or 8 byte stream quantities from the buffer 3841.1Snonaka * provided to bus space described by tag/handle/offset. 3851.1Snonaka */ 3861.1Snonaka 3871.1Snonaka#define bus_space_write_multi_stream(n,m) \ 3881.1Snonakastatic __inline void \ 3891.1SnonakaCAT(bus_space_write_multi_stream_,n)(bus_space_tag_t tag, \ 3901.1Snonaka bus_space_handle_t bsh, \ 3911.1Snonaka bus_size_t offset, const CAT3(u_int,m,_t) *addr, size_t count) \ 3921.1Snonaka{ \ 3931.1Snonaka CAT(outs,m)((volatile CAT3(u_int,m,_t) *)(bsh + (offset)), \ 3941.1Snonaka (CAT3(u_int,m,_t) *)addr, (size_t)count); \ 3951.1Snonaka} 3961.1Snonaka 3971.1Snonakabus_space_write_multi_stream(2,16) 3981.1Snonakabus_space_write_multi_stream(4,32) 3991.1Snonaka#define bus_space_write_multi_stream_8 \ 4001.1Snonaka !!! bus_space_write_multi_stream_8 not implemented !!! 4011.1Snonaka 4021.1Snonaka/* 4031.1Snonaka * void bus_space_read_region_N __P((bus_space_tag_t tag, 4041.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 4051.1Snonaka * u_intN_t *addr, size_t count)); 4061.1Snonaka * 4071.1Snonaka * Read `count' 1, 2, 4, or 8 byte quantities from bus space 4081.1Snonaka * described by tag/handle and starting at `offset' and copy into 4091.1Snonaka * buffer provided. 4101.1Snonaka */ 4111.1Snonakastatic __inline void bus_space_read_region_1 __P((bus_space_tag_t, 4121.1Snonaka bus_space_handle_t, bus_size_t, u_int8_t *, size_t)); 4131.1Snonakastatic __inline void bus_space_read_region_2 __P((bus_space_tag_t, 4141.1Snonaka bus_space_handle_t, bus_size_t, u_int16_t *, size_t)); 4151.1Snonakastatic __inline void bus_space_read_region_4 __P((bus_space_tag_t, 4161.1Snonaka bus_space_handle_t, bus_size_t, u_int32_t *, size_t)); 4171.1Snonaka 4181.1Snonakastatic __inline void 4191.1Snonakabus_space_read_region_1(tag, bsh, offset, addr, count) 4201.1Snonaka bus_space_tag_t tag; 4211.1Snonaka bus_space_handle_t bsh; 4221.1Snonaka bus_size_t offset; 4231.1Snonaka u_int8_t *addr; 4241.1Snonaka size_t count; 4251.1Snonaka{ 4261.1Snonaka volatile u_int8_t *s; 4271.1Snonaka 4281.1Snonaka s = (volatile u_int8_t *)(bsh + offset); 4291.1Snonaka while (count--) 4301.1Snonaka *addr++ = *s++; 4311.1Snonaka __asm__ volatile("eieio; sync"); 4321.1Snonaka} 4331.1Snonaka 4341.1Snonakastatic __inline void 4351.1Snonakabus_space_read_region_2(tag, bsh, offset, addr, count) 4361.1Snonaka bus_space_tag_t tag; 4371.1Snonaka bus_space_handle_t bsh; 4381.1Snonaka bus_size_t offset; 4391.1Snonaka u_int16_t *addr; 4401.1Snonaka size_t count; 4411.1Snonaka{ 4421.1Snonaka volatile u_int16_t *s; 4431.1Snonaka 4441.1Snonaka s = (volatile u_int16_t *)(bsh + offset); 4451.1Snonaka while (count--) 4461.1Snonaka __asm__ volatile("lhbrx %0, 0, %1" : 4471.1Snonaka "=r"(*addr++) : "r"(s++)); 4481.1Snonaka __asm__ volatile("eieio; sync"); 4491.1Snonaka} 4501.1Snonaka 4511.1Snonakastatic __inline void 4521.1Snonakabus_space_read_region_4(tag, bsh, offset, addr, count) 4531.1Snonaka bus_space_tag_t tag; 4541.1Snonaka bus_space_handle_t bsh; 4551.1Snonaka bus_size_t offset; 4561.1Snonaka u_int32_t *addr; 4571.1Snonaka size_t count; 4581.1Snonaka{ 4591.1Snonaka volatile u_int32_t *s; 4601.1Snonaka 4611.1Snonaka s = (volatile u_int32_t *)(bsh + offset); 4621.1Snonaka while (count--) 4631.1Snonaka __asm__ volatile("lwbrx %0, 0, %1" : 4641.1Snonaka "=r"(*addr++) : "r"(s++)); 4651.1Snonaka __asm__ volatile("eieio; sync"); 4661.1Snonaka} 4671.1Snonaka 4681.1Snonaka#define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!! 4691.1Snonaka 4701.1Snonaka/* 4711.1Snonaka * void bus_space_read_region_stream_N __P((bus_space_tag_t tag, 4721.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 4731.1Snonaka * u_intN_t *addr, size_t count)); 4741.1Snonaka * 4751.1Snonaka * Read `count' 2, 4, or 8 byte stream quantities from bus space 4761.1Snonaka * described by tag/handle and starting at `offset' and copy into 4771.1Snonaka * buffer provided. 4781.1Snonaka */ 4791.1Snonakastatic __inline void bus_space_read_region_stream_2 __P((bus_space_tag_t, 4801.1Snonaka bus_space_handle_t, bus_size_t, u_int16_t *, size_t)); 4811.1Snonakastatic __inline void bus_space_read_region_stream_4 __P((bus_space_tag_t, 4821.1Snonaka bus_space_handle_t, bus_size_t, u_int32_t *, size_t)); 4831.1Snonaka 4841.1Snonakastatic __inline void 4851.1Snonakabus_space_read_region_stream_2(tag, bsh, offset, addr, count) 4861.1Snonaka bus_space_tag_t tag; 4871.1Snonaka bus_space_handle_t bsh; 4881.1Snonaka bus_size_t offset; 4891.1Snonaka u_int16_t *addr; 4901.1Snonaka size_t count; 4911.1Snonaka{ 4921.1Snonaka volatile u_int16_t *s; 4931.1Snonaka 4941.1Snonaka s = (volatile u_int16_t *)(bsh + offset); 4951.1Snonaka while (count--) 4961.1Snonaka *addr++ = *s++; 4971.1Snonaka __asm__ volatile("eieio; sync"); 4981.1Snonaka} 4991.1Snonaka 5001.1Snonakastatic __inline void 5011.1Snonakabus_space_read_region_stream_4(tag, bsh, offset, addr, count) 5021.1Snonaka bus_space_tag_t tag; 5031.1Snonaka bus_space_handle_t bsh; 5041.1Snonaka bus_size_t offset; 5051.1Snonaka u_int32_t *addr; 5061.1Snonaka size_t count; 5071.1Snonaka{ 5081.1Snonaka volatile u_int32_t *s; 5091.1Snonaka 5101.1Snonaka s = (volatile u_int32_t *)(bsh + offset); 5111.1Snonaka while (count--) 5121.1Snonaka *addr++ = *s++; 5131.1Snonaka __asm__ volatile("eieio; sync"); 5141.1Snonaka} 5151.1Snonaka 5161.1Snonaka#define bus_space_read_region_stream_8 \ 5171.1Snonaka !!! bus_space_read_region_stream_8 unimplemented !!! 5181.1Snonaka 5191.1Snonaka/* 5201.1Snonaka * void bus_space_write_region_N __P((bus_space_tag_t tag, 5211.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 5221.1Snonaka * const u_intN_t *addr, size_t count)); 5231.1Snonaka * 5241.1Snonaka * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 5251.1Snonaka * to bus space described by tag/handle starting at `offset'. 5261.1Snonaka */ 5271.1Snonakastatic __inline void bus_space_write_region_1 __P((bus_space_tag_t, 5281.1Snonaka bus_space_handle_t, bus_size_t, const u_int8_t *, size_t)); 5291.1Snonakastatic __inline void bus_space_write_region_2 __P((bus_space_tag_t, 5301.1Snonaka bus_space_handle_t, bus_size_t, const u_int16_t *, size_t)); 5311.1Snonakastatic __inline void bus_space_write_region_4 __P((bus_space_tag_t, 5321.1Snonaka bus_space_handle_t, bus_size_t, const u_int32_t *, size_t)); 5331.1Snonaka 5341.1Snonakastatic __inline void 5351.1Snonakabus_space_write_region_1(tag, bsh, offset, addr, count) 5361.1Snonaka bus_space_tag_t tag; 5371.1Snonaka bus_space_handle_t bsh; 5381.1Snonaka bus_size_t offset; 5391.1Snonaka const u_int8_t *addr; 5401.1Snonaka size_t count; 5411.1Snonaka{ 5421.1Snonaka volatile u_int8_t *d; 5431.1Snonaka 5441.1Snonaka d = (volatile u_int8_t *)(bsh + offset); 5451.1Snonaka while (count--) 5461.1Snonaka *d++ = *addr++; 5471.1Snonaka __asm__ volatile("eieio; sync"); 5481.1Snonaka} 5491.1Snonaka 5501.1Snonakastatic __inline void 5511.1Snonakabus_space_write_region_2(tag, bsh, offset, addr, count) 5521.1Snonaka bus_space_tag_t tag; 5531.1Snonaka bus_space_handle_t bsh; 5541.1Snonaka bus_size_t offset; 5551.1Snonaka const u_int16_t *addr; 5561.1Snonaka size_t count; 5571.1Snonaka{ 5581.1Snonaka volatile u_int16_t *d; 5591.1Snonaka 5601.1Snonaka d = (volatile u_int16_t *)(bsh + offset); 5611.1Snonaka while (count--) 5621.1Snonaka __asm__ volatile("sthbrx %0, 0, %1" :: 5631.1Snonaka "r"(*addr++), "r"(d++)); 5641.1Snonaka __asm__ volatile("eieio; sync"); 5651.1Snonaka} 5661.1Snonaka 5671.1Snonakastatic __inline void 5681.1Snonakabus_space_write_region_4(tag, bsh, offset, addr, count) 5691.1Snonaka bus_space_tag_t tag; 5701.1Snonaka bus_space_handle_t bsh; 5711.1Snonaka bus_size_t offset; 5721.1Snonaka const u_int32_t *addr; 5731.1Snonaka size_t count; 5741.1Snonaka{ 5751.1Snonaka volatile u_int32_t *d; 5761.1Snonaka 5771.1Snonaka d = (volatile u_int32_t *)(bsh + offset); 5781.1Snonaka while (count--) 5791.1Snonaka __asm__ volatile("stwbrx %0, 0, %1" :: 5801.1Snonaka "r"(*addr++), "r"(d++)); 5811.1Snonaka __asm__ volatile("eieio; sync"); 5821.1Snonaka} 5831.1Snonaka 5841.1Snonaka#define bus_space_write_region_8 !!! bus_space_write_region_8 unimplemented !!! 5851.1Snonaka 5861.1Snonaka/* 5871.1Snonaka * void bus_space_write_region_stream_N __P((bus_space_tag_t tag, 5881.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 5891.1Snonaka * const u_intN_t *addr, size_t count)); 5901.1Snonaka * 5911.1Snonaka * Write `count' 2, 4, or 8 byte stream quantities from the buffer provided 5921.1Snonaka * to bus space described by tag/handle starting at `offset'. 5931.1Snonaka */ 5941.1Snonakastatic __inline void bus_space_write_region_stream_2 __P((bus_space_tag_t, 5951.1Snonaka bus_space_handle_t, bus_size_t, const u_int16_t *, size_t)); 5961.1Snonakastatic __inline void bus_space_write_region_stream_4 __P((bus_space_tag_t, 5971.1Snonaka bus_space_handle_t, bus_size_t, const u_int32_t *, size_t)); 5981.1Snonaka 5991.1Snonakastatic __inline void 6001.1Snonakabus_space_write_region_stream_2(tag, bsh, offset, addr, count) 6011.1Snonaka bus_space_tag_t tag; 6021.1Snonaka bus_space_handle_t bsh; 6031.1Snonaka bus_size_t offset; 6041.1Snonaka const u_int16_t *addr; 6051.1Snonaka size_t count; 6061.1Snonaka{ 6071.1Snonaka volatile u_int16_t *d; 6081.1Snonaka 6091.1Snonaka d = (volatile u_int16_t *)(bsh + offset); 6101.1Snonaka while (count--) 6111.1Snonaka *d++ = *addr++; 6121.1Snonaka __asm__ volatile("eieio; sync"); 6131.1Snonaka} 6141.1Snonaka 6151.1Snonakastatic __inline void 6161.1Snonakabus_space_write_region_stream_4(tag, bsh, offset, addr, count) 6171.1Snonaka bus_space_tag_t tag; 6181.1Snonaka bus_space_handle_t bsh; 6191.1Snonaka bus_size_t offset; 6201.1Snonaka const u_int32_t *addr; 6211.1Snonaka size_t count; 6221.1Snonaka{ 6231.1Snonaka volatile u_int32_t *d; 6241.1Snonaka 6251.1Snonaka d = (volatile u_int32_t *)(bsh + offset); 6261.1Snonaka while (count--) 6271.1Snonaka *d++ = *addr++; 6281.1Snonaka __asm__ volatile("eieio; sync"); 6291.1Snonaka} 6301.1Snonaka 6311.1Snonaka#define bus_space_write_region_stream_8 \ 6321.1Snonaka !!! bus_space_write_region_stream_8 unimplemented !!! 6331.1Snonaka 6341.1Snonaka/* 6351.1Snonaka * void bus_space_set_multi_N __P((bus_space_tag_t tag, 6361.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 6371.1Snonaka * size_t count)); 6381.1Snonaka * 6391.1Snonaka * Write the 1, 2, 4, or 8 byte value `val' to bus space described 6401.1Snonaka * by tag/handle/offset `count' times. 6411.1Snonaka */ 6421.1Snonakastatic __inline void bus_space_set_multi_1 __P((bus_space_tag_t, 6431.1Snonaka bus_space_handle_t, bus_size_t, u_int8_t, size_t)); 6441.1Snonakastatic __inline void bus_space_set_multi_2 __P((bus_space_tag_t, 6451.1Snonaka bus_space_handle_t, bus_size_t, u_int16_t, size_t)); 6461.1Snonakastatic __inline void bus_space_set_multi_4 __P((bus_space_tag_t, 6471.1Snonaka bus_space_handle_t, bus_size_t, u_int32_t, size_t)); 6481.1Snonaka 6491.1Snonakastatic __inline void 6501.1Snonakabus_space_set_multi_1(tag, bsh, offset, val, count) 6511.1Snonaka bus_space_tag_t tag; 6521.1Snonaka bus_space_handle_t bsh; 6531.1Snonaka bus_size_t offset; 6541.1Snonaka u_int8_t val; 6551.1Snonaka size_t count; 6561.1Snonaka{ 6571.1Snonaka volatile u_int8_t *d; 6581.1Snonaka 6591.1Snonaka d = (volatile u_int8_t *)(bsh + offset); 6601.1Snonaka while (count--) 6611.1Snonaka *d = val; 6621.1Snonaka __asm__ volatile("eieio; sync"); 6631.1Snonaka} 6641.1Snonaka 6651.1Snonakastatic __inline void 6661.1Snonakabus_space_set_multi_2(tag, bsh, offset, val, count) 6671.1Snonaka bus_space_tag_t tag; 6681.1Snonaka bus_space_handle_t bsh; 6691.1Snonaka bus_size_t offset; 6701.1Snonaka u_int16_t val; 6711.1Snonaka size_t count; 6721.1Snonaka{ 6731.1Snonaka volatile u_int16_t *d; 6741.1Snonaka 6751.1Snonaka d = (volatile u_int16_t *)(bsh + offset); 6761.1Snonaka while (count--) 6771.1Snonaka __asm__ volatile("sthbrx %0, 0, %1" :: 6781.1Snonaka "r"(val), "r"(d)); 6791.1Snonaka __asm__ volatile("eieio; sync"); 6801.1Snonaka} 6811.1Snonaka 6821.1Snonakastatic __inline void 6831.1Snonakabus_space_set_multi_4(tag, bsh, offset, val, count) 6841.1Snonaka bus_space_tag_t tag; 6851.1Snonaka bus_space_handle_t bsh; 6861.1Snonaka bus_size_t offset; 6871.1Snonaka u_int32_t val; 6881.1Snonaka size_t count; 6891.1Snonaka{ 6901.1Snonaka volatile u_int32_t *d; 6911.1Snonaka 6921.1Snonaka d = (volatile u_int32_t *)(bsh + offset); 6931.1Snonaka while (count--) 6941.1Snonaka __asm__ volatile("stwbrx %0, 0, %1" :: 6951.1Snonaka "r"(val), "r"(d)); 6961.1Snonaka __asm__ volatile("eieio; sync"); 6971.1Snonaka} 6981.1Snonaka 6991.1Snonaka#define bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!! 7001.1Snonaka 7011.1Snonaka/* 7021.1Snonaka * void bus_space_set_multi_stream_N __P((bus_space_tag_t tag, 7031.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 7041.1Snonaka * size_t count)); 7051.1Snonaka * 7061.1Snonaka * Write the 2, 4, or 8 byte stream value `val' to bus space described 7071.1Snonaka * by tag/handle/offset `count' times. 7081.1Snonaka */ 7091.1Snonakastatic __inline void bus_space_set_multi_stream_2 __P((bus_space_tag_t, 7101.1Snonaka bus_space_handle_t, bus_size_t, u_int16_t, size_t)); 7111.1Snonakastatic __inline void bus_space_set_multi_stream_4 __P((bus_space_tag_t, 7121.1Snonaka bus_space_handle_t, bus_size_t, u_int32_t, size_t)); 7131.1Snonaka 7141.1Snonakastatic __inline void 7151.1Snonakabus_space_set_multi_stream_2(tag, bsh, offset, val, count) 7161.1Snonaka bus_space_tag_t tag; 7171.1Snonaka bus_space_handle_t bsh; 7181.1Snonaka bus_size_t offset; 7191.1Snonaka u_int16_t val; 7201.1Snonaka size_t count; 7211.1Snonaka{ 7221.1Snonaka volatile u_int16_t *d; 7231.1Snonaka 7241.1Snonaka d = (volatile u_int16_t *)(bsh + offset); 7251.1Snonaka while (count--) 7261.1Snonaka *d = val; 7271.1Snonaka __asm__ volatile("eieio; sync"); 7281.1Snonaka} 7291.1Snonaka 7301.1Snonakastatic __inline void 7311.1Snonakabus_space_set_multi_stream_4(tag, bsh, offset, val, count) 7321.1Snonaka bus_space_tag_t tag; 7331.1Snonaka bus_space_handle_t bsh; 7341.1Snonaka bus_size_t offset; 7351.1Snonaka u_int32_t val; 7361.1Snonaka size_t count; 7371.1Snonaka{ 7381.1Snonaka volatile u_int32_t *d; 7391.1Snonaka 7401.1Snonaka d = (volatile u_int32_t *)(bsh + offset); 7411.1Snonaka while (count--) 7421.1Snonaka *d = val; 7431.1Snonaka __asm__ volatile("eieio; sync"); 7441.1Snonaka} 7451.1Snonaka 7461.1Snonaka#define bus_space_set_multi_stream_8 \ 7471.1Snonaka !!! bus_space_set_multi_stream_8 unimplemented !!! 7481.1Snonaka 7491.1Snonaka/* 7501.1Snonaka * void bus_space_set_region_N __P((bus_space_tag_t tag, 7511.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 7521.1Snonaka * size_t count)); 7531.1Snonaka * 7541.1Snonaka * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 7551.1Snonaka * by tag/handle starting at `offset'. 7561.1Snonaka */ 7571.1Snonakastatic __inline void bus_space_set_region_1 __P((bus_space_tag_t, 7581.1Snonaka bus_space_handle_t, bus_size_t, u_int8_t, size_t)); 7591.1Snonakastatic __inline void bus_space_set_region_2 __P((bus_space_tag_t, 7601.1Snonaka bus_space_handle_t, bus_size_t, u_int16_t, size_t)); 7611.1Snonakastatic __inline void bus_space_set_region_4 __P((bus_space_tag_t, 7621.1Snonaka bus_space_handle_t, bus_size_t, u_int32_t, size_t)); 7631.1Snonaka 7641.1Snonakastatic __inline void 7651.1Snonakabus_space_set_region_1(tag, bsh, offset, val, count) 7661.1Snonaka bus_space_tag_t tag; 7671.1Snonaka bus_space_handle_t bsh; 7681.1Snonaka bus_size_t offset; 7691.1Snonaka u_int8_t val; 7701.1Snonaka size_t count; 7711.1Snonaka{ 7721.1Snonaka volatile u_int8_t *d; 7731.1Snonaka 7741.1Snonaka d = (volatile u_int8_t *)(bsh + offset); 7751.1Snonaka while (count--) 7761.1Snonaka *d++ = val; 7771.1Snonaka __asm__ volatile("eieio; sync"); 7781.1Snonaka} 7791.1Snonaka 7801.1Snonakastatic __inline void 7811.1Snonakabus_space_set_region_2(tag, bsh, offset, val, count) 7821.1Snonaka bus_space_tag_t tag; 7831.1Snonaka bus_space_handle_t bsh; 7841.1Snonaka bus_size_t offset; 7851.1Snonaka u_int16_t val; 7861.1Snonaka size_t count; 7871.1Snonaka{ 7881.1Snonaka volatile u_int16_t *d; 7891.1Snonaka 7901.1Snonaka d = (volatile u_int16_t *)(bsh + offset); 7911.1Snonaka while (count--) 7921.1Snonaka __asm__ volatile("sthbrx %0, 0, %1" :: 7931.1Snonaka "r"(val), "r"(d++)); 7941.1Snonaka __asm__ volatile("eieio; sync"); 7951.1Snonaka} 7961.1Snonaka 7971.1Snonakastatic __inline void 7981.1Snonakabus_space_set_region_4(tag, bsh, offset, val, count) 7991.1Snonaka bus_space_tag_t tag; 8001.1Snonaka bus_space_handle_t bsh; 8011.1Snonaka bus_size_t offset; 8021.1Snonaka u_int32_t val; 8031.1Snonaka size_t count; 8041.1Snonaka{ 8051.1Snonaka volatile u_int32_t *d; 8061.1Snonaka 8071.1Snonaka d = (volatile u_int32_t *)(bsh + offset); 8081.1Snonaka while (count--) 8091.1Snonaka __asm__ volatile("stwbrx %0, 0, %1" :: 8101.1Snonaka "r"(val), "r"(d++)); 8111.1Snonaka __asm__ volatile("eieio; sync"); 8121.1Snonaka} 8131.1Snonaka 8141.1Snonaka#define bus_space_set_region_8 !!! bus_space_set_region_8 unimplemented !!! 8151.1Snonaka 8161.1Snonaka/* 8171.1Snonaka * void bus_space_set_region_stream_N __P((bus_space_tag_t tag, 8181.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 8191.1Snonaka * size_t count)); 8201.1Snonaka * 8211.1Snonaka * Write `count' 2, 4, or 8 byte stream value `val' to bus space described 8221.1Snonaka * by tag/handle starting at `offset'. 8231.1Snonaka */ 8241.1Snonakastatic __inline void bus_space_set_region_stream_2 __P((bus_space_tag_t, 8251.1Snonaka bus_space_handle_t, bus_size_t, u_int16_t, size_t)); 8261.1Snonakastatic __inline void bus_space_set_region_stream_4 __P((bus_space_tag_t, 8271.1Snonaka bus_space_handle_t, bus_size_t, u_int32_t, size_t)); 8281.1Snonaka 8291.1Snonaka 8301.1Snonakastatic __inline void 8311.1Snonakabus_space_set_region_stream_2(tag, bsh, offset, val, count) 8321.1Snonaka bus_space_tag_t tag; 8331.1Snonaka bus_space_handle_t bsh; 8341.1Snonaka bus_size_t offset; 8351.1Snonaka u_int16_t val; 8361.1Snonaka size_t count; 8371.1Snonaka{ 8381.1Snonaka volatile u_int16_t *d; 8391.1Snonaka 8401.1Snonaka d = (volatile u_int16_t *)(bsh + offset); 8411.1Snonaka while (count--) 8421.1Snonaka *d++ = val; 8431.1Snonaka __asm__ volatile("eieio; sync"); 8441.1Snonaka} 8451.1Snonaka 8461.1Snonakastatic __inline void 8471.1Snonakabus_space_set_region_stream_4(tag, bsh, offset, val, count) 8481.1Snonaka bus_space_tag_t tag; 8491.1Snonaka bus_space_handle_t bsh; 8501.1Snonaka bus_size_t offset; 8511.1Snonaka u_int32_t val; 8521.1Snonaka size_t count; 8531.1Snonaka{ 8541.1Snonaka volatile u_int32_t *d; 8551.1Snonaka 8561.1Snonaka d = (volatile u_int32_t *)(bsh + offset); 8571.1Snonaka while (count--) 8581.1Snonaka *d++ = val; 8591.1Snonaka __asm__ volatile("eieio; sync"); 8601.1Snonaka} 8611.1Snonaka 8621.1Snonaka#define bus_space_set_region_stream_8 \ 8631.1Snonaka !!! bus_space_set_region_stream_8 unimplemented !!! 8641.1Snonaka 8651.1Snonaka/* 8661.1Snonaka * void bus_space_copy_region_N __P((bus_space_tag_t tag, 8671.1Snonaka * bus_space_handle_t bsh1, bus_size_t off1, 8681.1Snonaka * bus_space_handle_t bsh2, bus_size_t off2, 8691.1Snonaka * size_t count)); 8701.1Snonaka * 8711.1Snonaka * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 8721.1Snonaka * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 8731.1Snonaka */ 8741.1Snonaka 8751.1Snonakastatic __inline void bus_space_copy_region_1 __P((bus_space_tag_t, 8761.1Snonaka bus_space_handle_t, bus_size_t, bus_space_handle_t, 8771.1Snonaka bus_size_t, size_t)); 8781.1Snonakastatic __inline void bus_space_copy_region_2 __P((bus_space_tag_t, 8791.1Snonaka bus_space_handle_t, bus_size_t, bus_space_handle_t, 8801.1Snonaka bus_size_t, size_t)); 8811.1Snonakastatic __inline void bus_space_copy_region_4 __P((bus_space_tag_t, 8821.1Snonaka bus_space_handle_t, bus_size_t, bus_space_handle_t, 8831.1Snonaka bus_size_t, size_t)); 8841.1Snonaka 8851.1Snonakastatic __inline void 8861.1Snonakabus_space_copy_region_1(t, h1, o1, h2, o2, c) 8871.1Snonaka bus_space_tag_t t; 8881.1Snonaka bus_space_handle_t h1; 8891.1Snonaka bus_size_t o1; 8901.1Snonaka bus_space_handle_t h2; 8911.1Snonaka bus_size_t o2; 8921.1Snonaka size_t c; 8931.1Snonaka{ 8941.1Snonaka bus_addr_t addr1 = h1 + o1; 8951.1Snonaka bus_addr_t addr2 = h2 + o2; 8961.1Snonaka 8971.1Snonaka if (addr1 >= addr2) { 8981.1Snonaka /* src after dest: copy forward */ 8991.1Snonaka for (; c != 0; c--, addr1++, addr2++) 9001.1Snonaka *(volatile u_int8_t *)(addr2) = 9011.1Snonaka *(volatile u_int8_t *)(addr1); 9021.1Snonaka } else { 9031.1Snonaka /* dest after src: copy backwards */ 9041.1Snonaka for (addr1 += (c - 1), addr2 += (c - 1); 9051.1Snonaka c != 0; c--, addr1--, addr2--) 9061.1Snonaka *(volatile u_int8_t *)(addr2) = 9071.1Snonaka *(volatile u_int8_t *)(addr1); 9081.1Snonaka } 9091.1Snonaka} 9101.1Snonaka 9111.1Snonakastatic __inline void 9121.1Snonakabus_space_copy_region_2(t, h1, o1, h2, o2, c) 9131.1Snonaka bus_space_tag_t t; 9141.1Snonaka bus_space_handle_t h1; 9151.1Snonaka bus_size_t o1; 9161.1Snonaka bus_space_handle_t h2; 9171.1Snonaka bus_size_t o2; 9181.1Snonaka size_t c; 9191.1Snonaka{ 9201.1Snonaka bus_addr_t addr1 = h1 + o1; 9211.1Snonaka bus_addr_t addr2 = h2 + o2; 9221.1Snonaka 9231.1Snonaka if (addr1 >= addr2) { 9241.1Snonaka /* src after dest: copy forward */ 9251.1Snonaka for (; c != 0; c--, addr1 += 2, addr2 += 2) 9261.1Snonaka *(volatile u_int16_t *)(addr2) = 9271.1Snonaka *(volatile u_int16_t *)(addr1); 9281.1Snonaka } else { 9291.1Snonaka /* dest after src: copy backwards */ 9301.1Snonaka for (addr1 += 2 * (c - 1), addr2 += 2 * (c - 1); 9311.1Snonaka c != 0; c--, addr1 -= 2, addr2 -= 2) 9321.1Snonaka *(volatile u_int16_t *)(addr2) = 9331.1Snonaka *(volatile u_int16_t *)(addr1); 9341.1Snonaka } 9351.1Snonaka} 9361.1Snonaka 9371.1Snonakastatic __inline void 9381.1Snonakabus_space_copy_region_4(t, h1, o1, h2, o2, c) 9391.1Snonaka bus_space_tag_t t; 9401.1Snonaka bus_space_handle_t h1; 9411.1Snonaka bus_size_t o1; 9421.1Snonaka bus_space_handle_t h2; 9431.1Snonaka bus_size_t o2; 9441.1Snonaka size_t c; 9451.1Snonaka{ 9461.1Snonaka bus_addr_t addr1 = h1 + o1; 9471.1Snonaka bus_addr_t addr2 = h2 + o2; 9481.1Snonaka 9491.1Snonaka if (addr1 >= addr2) { 9501.1Snonaka /* src after dest: copy forward */ 9511.1Snonaka for (; c != 0; c--, addr1 += 4, addr2 += 4) 9521.1Snonaka *(volatile u_int32_t *)(addr2) = 9531.1Snonaka *(volatile u_int32_t *)(addr1); 9541.1Snonaka } else { 9551.1Snonaka /* dest after src: copy backwards */ 9561.1Snonaka for (addr1 += 4 * (c - 1), addr2 += 4 * (c - 1); 9571.1Snonaka c != 0; c--, addr1 -= 4, addr2 -= 4) 9581.1Snonaka *(volatile u_int32_t *)(addr2) = 9591.1Snonaka *(volatile u_int32_t *)(addr1); 9601.1Snonaka } 9611.1Snonaka} 9621.1Snonaka 9631.1Snonaka#define bus_space_copy_region_8 !!! bus_space_copy_region_8 unimplemented !!! 9641.1Snonaka 9651.1Snonaka/* 9661.1Snonaka * Bus read/write barrier methods. 9671.1Snonaka * 9681.1Snonaka * void bus_space_barrier __P((bus_space_tag_t tag, 9691.1Snonaka * bus_space_handle_t bsh, bus_size_t offset, 9701.1Snonaka * bus_size_t len, int flags)); 9711.1Snonaka * 9721.1Snonaka */ 9731.1Snonaka#define bus_space_barrier(t, h, o, l, f) \ 9741.1Snonaka ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f))) 9751.1Snonaka#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 9761.1Snonaka#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 9771.1Snonaka 9781.1Snonaka#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) 9791.1Snonaka 9801.1Snonaka/* 9811.1Snonaka * Bus DMA methods. 9821.1Snonaka */ 9831.1Snonaka 9841.1Snonaka/* 9851.1Snonaka * Flags used in various bus DMA methods. 9861.1Snonaka */ 9871.1Snonaka#define BUS_DMA_WAITOK 0x00 /* safe to sleep (pseudo-flag) */ 9881.1Snonaka#define BUS_DMA_NOWAIT 0x01 /* not safe to sleep */ 9891.1Snonaka#define BUS_DMA_ALLOCNOW 0x02 /* perform resource allocation now */ 9901.1Snonaka#define BUS_DMA_COHERENT 0x04 /* hint: map memory DMA coherent */ 9911.1Snonaka#define BUS_DMA_BUS1 0x10 /* placeholders for bus functions... */ 9921.1Snonaka#define BUS_DMA_BUS2 0x20 9931.1Snonaka#define BUS_DMA_BUS3 0x40 9941.1Snonaka#define BUS_DMA_BUS4 0x80 9951.1Snonaka 9961.1Snonaka/* Forwards needed by prototypes below. */ 9971.1Snonakastruct mbuf; 9981.1Snonakastruct uio; 9991.1Snonaka 10001.1Snonaka/* 10011.1Snonaka * Operations performed by bus_dmamap_sync(). 10021.1Snonaka */ 10031.1Snonaka#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */ 10041.1Snonaka#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */ 10051.1Snonaka#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */ 10061.1Snonaka#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */ 10071.1Snonaka 10081.1Snonakatypedef struct prep_bus_dma_tag *bus_dma_tag_t; 10091.1Snonakatypedef struct prep_bus_dmamap *bus_dmamap_t; 10101.1Snonaka 10111.1Snonaka/* 10121.1Snonaka * bus_dma_segment_t 10131.1Snonaka * 10141.1Snonaka * Describes a single contiguous DMA transaction. Values 10151.1Snonaka * are suitable for programming into DMA registers. 10161.1Snonaka */ 10171.1Snonakastruct prep_bus_dma_segment { 10181.1Snonaka bus_addr_t ds_addr; /* DMA address */ 10191.1Snonaka bus_size_t ds_len; /* length of transfer */ 10201.1Snonaka}; 10211.1Snonakatypedef struct prep_bus_dma_segment bus_dma_segment_t; 10221.1Snonaka 10231.1Snonaka/* 10241.1Snonaka * bus_dma_tag_t 10251.1Snonaka * 10261.1Snonaka * A machine-dependent opaque type describing the implementation of 10271.1Snonaka * DMA for a given bus. 10281.1Snonaka */ 10291.1Snonaka 10301.1Snonakastruct prep_bus_dma_tag { 10311.1Snonaka /* 10321.1Snonaka * The `bounce threshold' is checked while we are loading 10331.1Snonaka * the DMA map. If the physical address of the segment 10341.1Snonaka * exceeds the threshold, an error will be returned. The 10351.1Snonaka * caller can then take whatever action is necessary to 10361.1Snonaka * bounce the transfer. If this value is 0, it will be 10371.1Snonaka * ignored. 10381.1Snonaka */ 10391.1Snonaka bus_addr_t _bounce_thresh; 10401.1Snonaka 10411.1Snonaka /* 10421.1Snonaka * DMA mapping methods. 10431.1Snonaka */ 10441.1Snonaka int (*_dmamap_create) __P((bus_dma_tag_t, bus_size_t, int, 10451.1Snonaka bus_size_t, bus_size_t, int, bus_dmamap_t *)); 10461.1Snonaka void (*_dmamap_destroy) __P((bus_dma_tag_t, bus_dmamap_t)); 10471.1Snonaka int (*_dmamap_load) __P((bus_dma_tag_t, bus_dmamap_t, void *, 10481.1Snonaka bus_size_t, struct proc *, int)); 10491.1Snonaka int (*_dmamap_load_mbuf) __P((bus_dma_tag_t, bus_dmamap_t, 10501.1Snonaka struct mbuf *, int)); 10511.1Snonaka int (*_dmamap_load_uio) __P((bus_dma_tag_t, bus_dmamap_t, 10521.1Snonaka struct uio *, int)); 10531.1Snonaka int (*_dmamap_load_raw) __P((bus_dma_tag_t, bus_dmamap_t, 10541.1Snonaka bus_dma_segment_t *, int, bus_size_t, int)); 10551.1Snonaka void (*_dmamap_unload) __P((bus_dma_tag_t, bus_dmamap_t)); 10561.1Snonaka void (*_dmamap_sync) __P((bus_dma_tag_t, bus_dmamap_t, 10571.1Snonaka bus_addr_t, bus_size_t, int)); 10581.1Snonaka 10591.1Snonaka /* 10601.1Snonaka * DMA memory utility functions. 10611.1Snonaka */ 10621.1Snonaka int (*_dmamem_alloc) __P((bus_dma_tag_t, bus_size_t, bus_size_t, 10631.1Snonaka bus_size_t, bus_dma_segment_t *, int, int *, int)); 10641.1Snonaka void (*_dmamem_free) __P((bus_dma_tag_t, 10651.1Snonaka bus_dma_segment_t *, int)); 10661.1Snonaka int (*_dmamem_map) __P((bus_dma_tag_t, bus_dma_segment_t *, 10671.1Snonaka int, size_t, caddr_t *, int)); 10681.1Snonaka void (*_dmamem_unmap) __P((bus_dma_tag_t, caddr_t, size_t)); 10691.3Ssimonb paddr_t (*_dmamem_mmap) __P((bus_dma_tag_t, bus_dma_segment_t *, 10701.3Ssimonb int, off_t, int, int)); 10711.1Snonaka}; 10721.1Snonaka 10731.1Snonaka#define bus_dmamap_create(t, s, n, m, b, f, p) \ 10741.1Snonaka (*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p)) 10751.1Snonaka#define bus_dmamap_destroy(t, p) \ 10761.1Snonaka (*(t)->_dmamap_destroy)((t), (p)) 10771.1Snonaka#define bus_dmamap_load(t, m, b, s, p, f) \ 10781.1Snonaka (*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f)) 10791.1Snonaka#define bus_dmamap_load_mbuf(t, m, b, f) \ 10801.1Snonaka (*(t)->_dmamap_load_mbuf)((t), (m), (b), (f)) 10811.1Snonaka#define bus_dmamap_load_uio(t, m, u, f) \ 10821.1Snonaka (*(t)->_dmamap_load_uio)((t), (m), (u), (f)) 10831.1Snonaka#define bus_dmamap_load_raw(t, m, sg, n, s, f) \ 10841.1Snonaka (*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f)) 10851.1Snonaka#define bus_dmamap_unload(t, p) \ 10861.1Snonaka (*(t)->_dmamap_unload)((t), (p)) 10871.1Snonaka#define bus_dmamap_sync(t, p, o, l, ops) \ 10881.1Snonaka (void)((t)->_dmamap_sync ? \ 10891.1Snonaka (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) : (void)0) 10901.1Snonaka 10911.1Snonaka#define bus_dmamem_alloc(t, s, a, b, sg, n, r, f) \ 10921.1Snonaka (*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f)) 10931.1Snonaka#define bus_dmamem_free(t, sg, n) \ 10941.1Snonaka (*(t)->_dmamem_free)((t), (sg), (n)) 10951.1Snonaka#define bus_dmamem_map(t, sg, n, s, k, f) \ 10961.1Snonaka (*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f)) 10971.1Snonaka#define bus_dmamem_unmap(t, k, s) \ 10981.1Snonaka (*(t)->_dmamem_unmap)((t), (k), (s)) 10991.1Snonaka#define bus_dmamem_mmap(t, sg, n, o, p, f) \ 11001.1Snonaka (*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f)) 11011.1Snonaka 11021.1Snonaka/* 11031.1Snonaka * bus_dmamap_t 11041.1Snonaka * 11051.1Snonaka * Describes a DMA mapping. 11061.1Snonaka */ 11071.1Snonakastruct prep_bus_dmamap { 11081.1Snonaka /* 11091.1Snonaka * PRIVATE MEMBERS: not for use my machine-independent code. 11101.1Snonaka */ 11111.1Snonaka bus_size_t _dm_size; /* largest DMA transfer mappable */ 11121.1Snonaka int _dm_segcnt; /* number of segs this map can map */ 11131.1Snonaka bus_size_t _dm_maxsegsz; /* largest possible segment */ 11141.1Snonaka bus_size_t _dm_boundary; /* don't cross this */ 11151.1Snonaka bus_addr_t _dm_bounce_thresh; /* bounce threshold; see tag */ 11161.1Snonaka int _dm_flags; /* misc. flags */ 11171.1Snonaka 11181.1Snonaka void *_dm_cookie; /* cookie for bus-specific functions */ 11191.1Snonaka 11201.1Snonaka /* 11211.1Snonaka * PUBLIC MEMBERS: these are used by machine-independent code. 11221.1Snonaka */ 11231.1Snonaka bus_size_t dm_mapsize; /* size of the mapping */ 11241.1Snonaka int dm_nsegs; /* # valid segments in mapping */ 11251.1Snonaka bus_dma_segment_t dm_segs[1]; /* segments; variable length */ 11261.1Snonaka}; 11271.1Snonaka 11281.1Snonaka#ifdef _PREP_BUS_DMA_PRIVATE 11291.1Snonakaint _bus_dmamap_create __P((bus_dma_tag_t, bus_size_t, int, bus_size_t, 11301.1Snonaka bus_size_t, int, bus_dmamap_t *)); 11311.1Snonakavoid _bus_dmamap_destroy __P((bus_dma_tag_t, bus_dmamap_t)); 11321.1Snonakaint _bus_dmamap_load __P((bus_dma_tag_t, bus_dmamap_t, void *, 11331.1Snonaka bus_size_t, struct proc *, int)); 11341.1Snonakaint _bus_dmamap_load_mbuf __P((bus_dma_tag_t, bus_dmamap_t, 11351.1Snonaka struct mbuf *, int)); 11361.1Snonakaint _bus_dmamap_load_uio __P((bus_dma_tag_t, bus_dmamap_t, 11371.1Snonaka struct uio *, int)); 11381.1Snonakaint _bus_dmamap_load_raw __P((bus_dma_tag_t, bus_dmamap_t, 11391.1Snonaka bus_dma_segment_t *, int, bus_size_t, int)); 11401.1Snonakavoid _bus_dmamap_unload __P((bus_dma_tag_t, bus_dmamap_t)); 11411.1Snonakavoid _bus_dmamap_sync __P((bus_dma_tag_t, bus_dmamap_t, bus_addr_t, 11421.1Snonaka bus_size_t, int)); 11431.1Snonaka 11441.1Snonakaint _bus_dmamem_alloc __P((bus_dma_tag_t tag, bus_size_t size, 11451.1Snonaka bus_size_t alignment, bus_size_t boundary, 11461.1Snonaka bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags)); 11471.1Snonakavoid _bus_dmamem_free __P((bus_dma_tag_t tag, bus_dma_segment_t *segs, 11481.1Snonaka int nsegs)); 11491.1Snonakaint _bus_dmamem_map __P((bus_dma_tag_t tag, bus_dma_segment_t *segs, 11501.1Snonaka int nsegs, size_t size, caddr_t *kvap, int flags)); 11511.1Snonakavoid _bus_dmamem_unmap __P((bus_dma_tag_t tag, caddr_t kva, 11521.1Snonaka size_t size)); 11531.3Ssimonbpaddr_t _bus_dmamem_mmap __P((bus_dma_tag_t tag, bus_dma_segment_t *segs, 11541.3Ssimonb int nsegs, off_t off, int prot, int flags)); 11551.1Snonaka 11561.1Snonakaint _bus_dmamem_alloc_range __P((bus_dma_tag_t tag, bus_size_t size, 11571.1Snonaka bus_size_t alignment, bus_size_t boundary, 11581.1Snonaka bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags, 11591.1Snonaka paddr_t low, paddr_t high)); 11601.1Snonaka#endif /* _PREP_BUS_DMA_PRIVATE */ 11611.1Snonaka#endif /* _PREP_BUS_H_ */ 1162