1e1a1bba4SJustin T. Gibbs /* $NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $ */ 2e1a1bba4SJustin T. Gibbs 3e1a1bba4SJustin T. Gibbs /*- 4e1a1bba4SJustin T. Gibbs * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. 5e1a1bba4SJustin T. Gibbs * All rights reserved. 6e1a1bba4SJustin T. Gibbs * 7e1a1bba4SJustin T. Gibbs * This code is derived from software contributed to The NetBSD Foundation 8e1a1bba4SJustin T. Gibbs * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 9e1a1bba4SJustin T. Gibbs * NASA Ames Research Center. 10e1a1bba4SJustin T. Gibbs * 11e1a1bba4SJustin T. Gibbs * Redistribution and use in source and binary forms, with or without 12e1a1bba4SJustin T. Gibbs * modification, are permitted provided that the following conditions 13e1a1bba4SJustin T. Gibbs * are met: 14e1a1bba4SJustin T. Gibbs * 1. Redistributions of source code must retain the above copyright 15e1a1bba4SJustin T. Gibbs * notice, this list of conditions and the following disclaimer. 16e1a1bba4SJustin T. Gibbs * 2. Redistributions in binary form must reproduce the above copyright 17e1a1bba4SJustin T. Gibbs * notice, this list of conditions and the following disclaimer in the 18e1a1bba4SJustin T. Gibbs * documentation and/or other materials provided with the distribution. 19e1a1bba4SJustin T. Gibbs * 3. All advertising materials mentioning features or use of this software 20e1a1bba4SJustin T. Gibbs * must display the following acknowledgement: 21e1a1bba4SJustin T. Gibbs * This product includes software developed by the NetBSD 22e1a1bba4SJustin T. Gibbs * Foundation, Inc. and its contributors. 23e1a1bba4SJustin T. Gibbs * 4. Neither the name of The NetBSD Foundation nor the names of its 24e1a1bba4SJustin T. Gibbs * contributors may be used to endorse or promote products derived 25e1a1bba4SJustin T. Gibbs * from this software without specific prior written permission. 26e1a1bba4SJustin T. Gibbs * 27e1a1bba4SJustin T. Gibbs * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28e1a1bba4SJustin T. Gibbs * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29e1a1bba4SJustin T. Gibbs * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30e1a1bba4SJustin T. Gibbs * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31e1a1bba4SJustin T. Gibbs * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32e1a1bba4SJustin T. Gibbs * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33e1a1bba4SJustin T. Gibbs * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34e1a1bba4SJustin T. Gibbs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35e1a1bba4SJustin T. Gibbs * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36e1a1bba4SJustin T. Gibbs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37e1a1bba4SJustin T. Gibbs * POSSIBILITY OF SUCH DAMAGE. 38e1a1bba4SJustin T. Gibbs */ 39e1a1bba4SJustin T. Gibbs 40e1a1bba4SJustin T. Gibbs /* 41e1a1bba4SJustin T. Gibbs * Copyright (c) 1996 Charles M. Hannum. All rights reserved. 42e1a1bba4SJustin T. Gibbs * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 43e1a1bba4SJustin T. Gibbs * 44e1a1bba4SJustin T. Gibbs * Redistribution and use in source and binary forms, with or without 45e1a1bba4SJustin T. Gibbs * modification, are permitted provided that the following conditions 46e1a1bba4SJustin T. Gibbs * are met: 47e1a1bba4SJustin T. Gibbs * 1. Redistributions of source code must retain the above copyright 48e1a1bba4SJustin T. Gibbs * notice, this list of conditions and the following disclaimer. 49e1a1bba4SJustin T. Gibbs * 2. Redistributions in binary form must reproduce the above copyright 50e1a1bba4SJustin T. Gibbs * notice, this list of conditions and the following disclaimer in the 51e1a1bba4SJustin T. Gibbs * documentation and/or other materials provided with the distribution. 52e1a1bba4SJustin T. Gibbs * 3. All advertising materials mentioning features or use of this software 53e1a1bba4SJustin T. Gibbs * must display the following acknowledgement: 54e1a1bba4SJustin T. Gibbs * This product includes software developed by Christopher G. Demetriou 55e1a1bba4SJustin T. Gibbs * for the NetBSD Project. 56e1a1bba4SJustin T. Gibbs * 4. The name of the author may not be used to endorse or promote products 57e1a1bba4SJustin T. Gibbs * derived from this software without specific prior written permission 58e1a1bba4SJustin T. Gibbs * 59e1a1bba4SJustin T. Gibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 60e1a1bba4SJustin T. Gibbs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 61e1a1bba4SJustin T. Gibbs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 62e1a1bba4SJustin T. Gibbs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 63e1a1bba4SJustin T. Gibbs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 64e1a1bba4SJustin T. Gibbs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 65e1a1bba4SJustin T. Gibbs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 66e1a1bba4SJustin T. Gibbs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 67e1a1bba4SJustin T. Gibbs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 68e1a1bba4SJustin T. Gibbs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 69e1a1bba4SJustin T. Gibbs */ 70e1a1bba4SJustin T. Gibbs /* $Id$ */ 71e1a1bba4SJustin T. Gibbs 72e1a1bba4SJustin T. Gibbs #ifndef _I386_BUS_H_ 73e1a1bba4SJustin T. Gibbs #define _I386_BUS_H_ 74e1a1bba4SJustin T. Gibbs 75e1a1bba4SJustin T. Gibbs #include <machine/cpufunc.h> 76e1a1bba4SJustin T. Gibbs 77e1a1bba4SJustin T. Gibbs /* 78e1a1bba4SJustin T. Gibbs * Values for the i386 bus space tag, not to be used directly by MI code. 79e1a1bba4SJustin T. Gibbs */ 80e1a1bba4SJustin T. Gibbs #define I386_BUS_SPACE_IO 0 /* space is i/o space */ 81e1a1bba4SJustin T. Gibbs #define I386_BUS_SPACE_MEM 1 /* space is mem space */ 82e1a1bba4SJustin T. Gibbs 83e1a1bba4SJustin T. Gibbs /* 84e1a1bba4SJustin T. Gibbs * Bus address and size types 85e1a1bba4SJustin T. Gibbs */ 86e1a1bba4SJustin T. Gibbs typedef u_long bus_addr_t; 87e1a1bba4SJustin T. Gibbs typedef u_long bus_size_t; 88e1a1bba4SJustin T. Gibbs 89e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF 90e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF 91e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXSIZE (64 * 1024) /* Maximum supported size */ 92e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF 93e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF 94e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXADDR 0xFFFFFFFF 95e1a1bba4SJustin T. Gibbs 96e1a1bba4SJustin T. Gibbs /* 97e1a1bba4SJustin T. Gibbs * Access methods for bus resources and address space. 98e1a1bba4SJustin T. Gibbs */ 99e1a1bba4SJustin T. Gibbs typedef int bus_space_tag_t; 100e1a1bba4SJustin T. Gibbs typedef u_long bus_space_handle_t; 101e1a1bba4SJustin T. Gibbs 102e1a1bba4SJustin T. Gibbs /* 103e1a1bba4SJustin T. Gibbs * Map a region of device bus space into CPU virtual address space. 104e1a1bba4SJustin T. Gibbs */ 105e1a1bba4SJustin T. Gibbs 106e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAP_CACHEABLE 0x01 107e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAP_LINEAR 0x02 108e1a1bba4SJustin T. Gibbs 109e1a1bba4SJustin T. Gibbs int bus_space_map(bus_space_tag_t t, bus_addr_t addr, bus_size_t size, 110e1a1bba4SJustin T. Gibbs int flags, bus_space_handle_t *bshp); 111e1a1bba4SJustin T. Gibbs 112e1a1bba4SJustin T. Gibbs /* 113e1a1bba4SJustin T. Gibbs * Unmap a region of device bus space. 114e1a1bba4SJustin T. Gibbs */ 115e1a1bba4SJustin T. Gibbs 116e1a1bba4SJustin T. Gibbs void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, 117e1a1bba4SJustin T. Gibbs bus_size_t size); 118e1a1bba4SJustin T. Gibbs 119e1a1bba4SJustin T. Gibbs /* 120e1a1bba4SJustin T. Gibbs * Get a new handle for a subregion of an already-mapped area of bus space. 121e1a1bba4SJustin T. Gibbs */ 122e1a1bba4SJustin T. Gibbs 123e1a1bba4SJustin T. Gibbs int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, 124e1a1bba4SJustin T. Gibbs bus_size_t offset, bus_size_t size, 125e1a1bba4SJustin T. Gibbs bus_space_handle_t *nbshp); 126e1a1bba4SJustin T. Gibbs 127e1a1bba4SJustin T. Gibbs /* 128e1a1bba4SJustin T. Gibbs * Allocate a region of memory that is accessible to devices in bus space. 129e1a1bba4SJustin T. Gibbs */ 130e1a1bba4SJustin T. Gibbs 131e1a1bba4SJustin T. Gibbs int bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, 132e1a1bba4SJustin T. Gibbs bus_addr_t rend, bus_size_t size, bus_size_t align, 133e1a1bba4SJustin T. Gibbs bus_size_t boundary, int flags, bus_addr_t *addrp, 134e1a1bba4SJustin T. Gibbs bus_space_handle_t *bshp); 135e1a1bba4SJustin T. Gibbs 136e1a1bba4SJustin T. Gibbs /* 137e1a1bba4SJustin T. Gibbs * Free a region of bus space accessible memory. 138e1a1bba4SJustin T. Gibbs */ 139e1a1bba4SJustin T. Gibbs 140e1a1bba4SJustin T. Gibbs void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, 141e1a1bba4SJustin T. Gibbs bus_size_t size); 142e1a1bba4SJustin T. Gibbs 143e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_) 144e1a1bba4SJustin T. Gibbs 145e1a1bba4SJustin T. Gibbs /* 146e1a1bba4SJustin T. Gibbs * Read a 1, 2, 4, or 8 byte quantity from bus space 147e1a1bba4SJustin T. Gibbs * described by tag/handle/offset. 148e1a1bba4SJustin T. Gibbs */ 149e1a1bba4SJustin T. Gibbs static __inline u_int8_t bus_space_read_1(bus_space_tag_t tag, 150e1a1bba4SJustin T. Gibbs bus_space_handle_t handle, 151e1a1bba4SJustin T. Gibbs bus_size_t offset); 152e1a1bba4SJustin T. Gibbs 153e1a1bba4SJustin T. Gibbs static __inline u_int16_t bus_space_read_2(bus_space_tag_t tag, 154e1a1bba4SJustin T. Gibbs bus_space_handle_t handle, 155e1a1bba4SJustin T. Gibbs bus_size_t offset); 156e1a1bba4SJustin T. Gibbs 157e1a1bba4SJustin T. Gibbs static __inline u_int32_t bus_space_read_4(bus_space_tag_t tag, 158e1a1bba4SJustin T. Gibbs bus_space_handle_t handle, 159e1a1bba4SJustin T. Gibbs bus_size_t offset); 160e1a1bba4SJustin T. Gibbs 161e1a1bba4SJustin T. Gibbs static __inline u_int8_t 162e1a1bba4SJustin T. Gibbs bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle, 163e1a1bba4SJustin T. Gibbs bus_size_t offset) 164e1a1bba4SJustin T. Gibbs { 165e1a1bba4SJustin T. Gibbs #if defined (_I386_BUS_PIO_H_) 166e1a1bba4SJustin T. Gibbs #if defined (_I386_BUS_MEMIO_H_) 167e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 168e1a1bba4SJustin T. Gibbs #endif 169e1a1bba4SJustin T. Gibbs return (inb(handle + offset)); 170e1a1bba4SJustin T. Gibbs #endif 171e1a1bba4SJustin T. Gibbs #if defined (_I386_BUS_MEMIO_H_) 172e1a1bba4SJustin T. Gibbs return (*(volatile u_int8_t *)(handle + offset)); 173e1a1bba4SJustin T. Gibbs #endif 174e1a1bba4SJustin T. Gibbs } 175e1a1bba4SJustin T. Gibbs 176e1a1bba4SJustin T. Gibbs static __inline u_int16_t 177e1a1bba4SJustin T. Gibbs bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle, 178e1a1bba4SJustin T. Gibbs bus_size_t offset) 179e1a1bba4SJustin T. Gibbs { 180e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 181e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 182e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 183e1a1bba4SJustin T. Gibbs #endif 184e1a1bba4SJustin T. Gibbs return (inw(handle + offset)); 185e1a1bba4SJustin T. Gibbs #endif 186e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 187e1a1bba4SJustin T. Gibbs return (*(volatile u_int16_t *)(handle + offset)); 188e1a1bba4SJustin T. Gibbs #endif 189e1a1bba4SJustin T. Gibbs } 190e1a1bba4SJustin T. Gibbs 191e1a1bba4SJustin T. Gibbs static __inline u_int32_t 192e1a1bba4SJustin T. Gibbs bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle, 193e1a1bba4SJustin T. Gibbs bus_size_t offset) 194e1a1bba4SJustin T. Gibbs { 195e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 196e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 197e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 198e1a1bba4SJustin T. Gibbs #endif 199e1a1bba4SJustin T. Gibbs return (inl(handle + offset)); 200e1a1bba4SJustin T. Gibbs #endif 201e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 202e1a1bba4SJustin T. Gibbs return (*(volatile u_int32_t *)(handle + offset)); 203e1a1bba4SJustin T. Gibbs #endif 204e1a1bba4SJustin T. Gibbs } 205e1a1bba4SJustin T. Gibbs 206e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_read_8 */ 207e1a1bba4SJustin T. Gibbs #define bus_space_read_8(t, h, o) !!! bus_space_read_8 unimplemented !!! 208e1a1bba4SJustin T. Gibbs #endif 209e1a1bba4SJustin T. Gibbs 210e1a1bba4SJustin T. Gibbs /* 211e1a1bba4SJustin T. Gibbs * Read `count' 1, 2, 4, or 8 byte quantities from bus space 212e1a1bba4SJustin T. Gibbs * described by tag/handle/offset and copy into buffer provided. 213e1a1bba4SJustin T. Gibbs */ 214e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_multi_1(bus_space_tag_t tag, 215e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 216e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t *addr, 217e1a1bba4SJustin T. Gibbs size_t count); 218e1a1bba4SJustin T. Gibbs 219e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_multi_2(bus_space_tag_t tag, 220e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 221e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t *addr, 222e1a1bba4SJustin T. Gibbs size_t count); 223e1a1bba4SJustin T. Gibbs 224e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_multi_4(bus_space_tag_t tag, 225e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 226e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t *addr, 227e1a1bba4SJustin T. Gibbs size_t count); 228e1a1bba4SJustin T. Gibbs 229e1a1bba4SJustin T. Gibbs static __inline void 230e1a1bba4SJustin T. Gibbs bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, 231e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t *addr, size_t count) 232e1a1bba4SJustin T. Gibbs { 233e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 234e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 235e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 236e1a1bba4SJustin T. Gibbs #endif 237e1a1bba4SJustin T. Gibbs insb(bsh + offset, addr, count); 238e1a1bba4SJustin T. Gibbs #endif 239e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 240e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 241e1a1bba4SJustin T. Gibbs else 242e1a1bba4SJustin T. Gibbs #endif 243e1a1bba4SJustin T. Gibbs { 244e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 245e1a1bba4SJustin T. Gibbs __asm __volatile(" 246e1a1bba4SJustin T. Gibbs cld ; 247e1a1bba4SJustin T. Gibbs 1: movb (%1),%%al ; 248e1a1bba4SJustin T. Gibbs stosb ; 249e1a1bba4SJustin T. Gibbs loop 1b" : 250e1a1bba4SJustin T. Gibbs "=&a" (__x) : 251e1a1bba4SJustin T. Gibbs "r" (bsh + offset), "D" (addr), "c" (count) : 252e1a1bba4SJustin T. Gibbs "%edi", "%ecx", "memory"); 253e1a1bba4SJustin T. Gibbs } 254e1a1bba4SJustin T. Gibbs #endif 255e1a1bba4SJustin T. Gibbs } 256e1a1bba4SJustin T. Gibbs 257e1a1bba4SJustin T. Gibbs static __inline void 258e1a1bba4SJustin T. Gibbs bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, 259e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t *addr, size_t count) 260e1a1bba4SJustin T. Gibbs { 261e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 262e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 263e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 264e1a1bba4SJustin T. Gibbs #endif 265e1a1bba4SJustin T. Gibbs insw(bsh + offset, addr, count); 266e1a1bba4SJustin T. Gibbs #endif 267e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 268e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 269e1a1bba4SJustin T. Gibbs else 270e1a1bba4SJustin T. Gibbs #endif 271e1a1bba4SJustin T. Gibbs { 272e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 273e1a1bba4SJustin T. Gibbs __asm __volatile(" 274e1a1bba4SJustin T. Gibbs cld ; 275e1a1bba4SJustin T. Gibbs 1: movw (%1),%%ax ; 276e1a1bba4SJustin T. Gibbs stosw ; 277e1a1bba4SJustin T. Gibbs loop 1b" : 278e1a1bba4SJustin T. Gibbs "=&a" (__x) : 279e1a1bba4SJustin T. Gibbs "r" (bsh + offset), "D" (addr), "c" (count) : 280e1a1bba4SJustin T. Gibbs "%edi", "%ecx", "memory"); 281e1a1bba4SJustin T. Gibbs } 282e1a1bba4SJustin T. Gibbs #endif 283e1a1bba4SJustin T. Gibbs } 284e1a1bba4SJustin T. Gibbs 285e1a1bba4SJustin T. Gibbs static __inline void 286e1a1bba4SJustin T. Gibbs bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, 287e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t *addr, size_t count) 288e1a1bba4SJustin T. Gibbs { 289e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 290e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 291e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 292e1a1bba4SJustin T. Gibbs #endif 293e1a1bba4SJustin T. Gibbs insl(bsh + offset, addr, count); 294e1a1bba4SJustin T. Gibbs #endif 295e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 296e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 297e1a1bba4SJustin T. Gibbs else 298e1a1bba4SJustin T. Gibbs #endif 299e1a1bba4SJustin T. Gibbs { 300e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 301e1a1bba4SJustin T. Gibbs __asm __volatile(" 302e1a1bba4SJustin T. Gibbs cld ; 303e1a1bba4SJustin T. Gibbs 1: movl (%1),%%eax ; 304e1a1bba4SJustin T. Gibbs stosl ; 305e1a1bba4SJustin T. Gibbs loop 1b" : 306e1a1bba4SJustin T. Gibbs "=&a" (__x) : 307e1a1bba4SJustin T. Gibbs "r" (bsh + offset), "D" (addr), "c" (count) : 308e1a1bba4SJustin T. Gibbs "%edi", "%ecx", "memory"); 309e1a1bba4SJustin T. Gibbs } 310e1a1bba4SJustin T. Gibbs #endif 311e1a1bba4SJustin T. Gibbs } 312e1a1bba4SJustin T. Gibbs 313e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_read_multi_8 */ 314e1a1bba4SJustin T. Gibbs #define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!! 315e1a1bba4SJustin T. Gibbs #endif 316e1a1bba4SJustin T. Gibbs 317e1a1bba4SJustin T. Gibbs /* 318e1a1bba4SJustin T. Gibbs * Read `count' 1, 2, 4, or 8 byte quantities from bus space 319e1a1bba4SJustin T. Gibbs * described by tag/handle and starting at `offset' and copy into 320e1a1bba4SJustin T. Gibbs * buffer provided. 321e1a1bba4SJustin T. Gibbs */ 322e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_region_1(bus_space_tag_t tag, 323e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 324e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t *addr, 325e1a1bba4SJustin T. Gibbs size_t count); 326e1a1bba4SJustin T. Gibbs 327e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_region_2(bus_space_tag_t tag, 328e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 329e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t *addr, 330e1a1bba4SJustin T. Gibbs size_t count); 331e1a1bba4SJustin T. Gibbs 332e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_region_4(bus_space_tag_t tag, 333e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 334e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t *addr, 335e1a1bba4SJustin T. Gibbs size_t count); 336e1a1bba4SJustin T. Gibbs 337e1a1bba4SJustin T. Gibbs 338e1a1bba4SJustin T. Gibbs static __inline void 339e1a1bba4SJustin T. Gibbs bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 340e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t *addr, size_t count) 341e1a1bba4SJustin T. Gibbs { 342e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 343e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 344e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 345e1a1bba4SJustin T. Gibbs #endif 346e1a1bba4SJustin T. Gibbs { 347e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 348e1a1bba4SJustin T. Gibbs __asm __volatile(" 349e1a1bba4SJustin T. Gibbs cld ; 350e1a1bba4SJustin T. Gibbs 1: inb %w1,%%al ; 351e1a1bba4SJustin T. Gibbs stosb ; 352e1a1bba4SJustin T. Gibbs incl %1 ; 353e1a1bba4SJustin T. Gibbs loop 1b" : 354e1a1bba4SJustin T. Gibbs "=&a" (__x) : 355e1a1bba4SJustin T. Gibbs "d" (bsh + offset), "D" (addr), "c" (count) : 356e1a1bba4SJustin T. Gibbs "%edx", "%edi", "%ecx", "memory"); 357e1a1bba4SJustin T. Gibbs } 358e1a1bba4SJustin T. Gibbs #endif 359e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 360e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 361e1a1bba4SJustin T. Gibbs else 362e1a1bba4SJustin T. Gibbs #endif 363e1a1bba4SJustin T. Gibbs { 364e1a1bba4SJustin T. Gibbs __asm __volatile(" 365e1a1bba4SJustin T. Gibbs cld ; 366e1a1bba4SJustin T. Gibbs repne ; 367e1a1bba4SJustin T. Gibbs movsb" : 368e1a1bba4SJustin T. Gibbs : 369e1a1bba4SJustin T. Gibbs "S" (bsh + offset), "D" (addr), "c" (count) : 370e1a1bba4SJustin T. Gibbs "%esi", "%edi", "%ecx", "memory"); 371e1a1bba4SJustin T. Gibbs } 372e1a1bba4SJustin T. Gibbs #endif 373e1a1bba4SJustin T. Gibbs } 374e1a1bba4SJustin T. Gibbs 375e1a1bba4SJustin T. Gibbs static __inline void 376e1a1bba4SJustin T. Gibbs bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 377e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t *addr, size_t count) 378e1a1bba4SJustin T. Gibbs { 379e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 380e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 381e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 382e1a1bba4SJustin T. Gibbs #endif 383e1a1bba4SJustin T. Gibbs { 384e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 385e1a1bba4SJustin T. Gibbs __asm __volatile(" 386e1a1bba4SJustin T. Gibbs cld ; 387e1a1bba4SJustin T. Gibbs 1: inw %w1,%%ax ; 388e1a1bba4SJustin T. Gibbs stosw ; 389e1a1bba4SJustin T. Gibbs addl $2,%1 ; 390e1a1bba4SJustin T. Gibbs loop 1b" : 391e1a1bba4SJustin T. Gibbs "=&a" (__x) : 392e1a1bba4SJustin T. Gibbs "d" (bsh + offset), "D" (addr), "c" (count) : 393e1a1bba4SJustin T. Gibbs "%edx", "%edi", "%ecx", "memory"); 394e1a1bba4SJustin T. Gibbs } 395e1a1bba4SJustin T. Gibbs #endif 396e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 397e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 398e1a1bba4SJustin T. Gibbs else 399e1a1bba4SJustin T. Gibbs #endif 400e1a1bba4SJustin T. Gibbs { 401e1a1bba4SJustin T. Gibbs __asm __volatile(" 402e1a1bba4SJustin T. Gibbs cld ; 403e1a1bba4SJustin T. Gibbs repne ; 404e1a1bba4SJustin T. Gibbs movsw" : 405e1a1bba4SJustin T. Gibbs : 406e1a1bba4SJustin T. Gibbs "S" (bsh + offset), "D" (addr), "c" (count) : 407e1a1bba4SJustin T. Gibbs "%esi", "%edi", "%ecx", "memory"); 408e1a1bba4SJustin T. Gibbs } 409e1a1bba4SJustin T. Gibbs #endif 410e1a1bba4SJustin T. Gibbs } 411e1a1bba4SJustin T. Gibbs 412e1a1bba4SJustin T. Gibbs static __inline void 413e1a1bba4SJustin T. Gibbs bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 414e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t *addr, size_t count) 415e1a1bba4SJustin T. Gibbs { 416e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 417e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 418e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 419e1a1bba4SJustin T. Gibbs #endif 420e1a1bba4SJustin T. Gibbs { 421e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 422e1a1bba4SJustin T. Gibbs __asm __volatile(" 423e1a1bba4SJustin T. Gibbs cld ; 424e1a1bba4SJustin T. Gibbs 1: inl %w1,%%eax ; 425e1a1bba4SJustin T. Gibbs stosl ; 426e1a1bba4SJustin T. Gibbs addl $4,%1 ; 427e1a1bba4SJustin T. Gibbs loop 1b" : 428e1a1bba4SJustin T. Gibbs "=&a" (__x) : 429e1a1bba4SJustin T. Gibbs "d" (bsh + offset), "D" (addr), "c" (count) : 430e1a1bba4SJustin T. Gibbs "%edx", "%edi", "%ecx", "memory"); 431e1a1bba4SJustin T. Gibbs } 432e1a1bba4SJustin T. Gibbs #endif 433e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 434e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 435e1a1bba4SJustin T. Gibbs else 436e1a1bba4SJustin T. Gibbs #endif 437e1a1bba4SJustin T. Gibbs { 438e1a1bba4SJustin T. Gibbs __asm __volatile(" 439e1a1bba4SJustin T. Gibbs cld ; 440e1a1bba4SJustin T. Gibbs repne ; 441e1a1bba4SJustin T. Gibbs movsl" : 442e1a1bba4SJustin T. Gibbs : 443e1a1bba4SJustin T. Gibbs "S" (bsh + offset), "D" (addr), "c" (count) : 444e1a1bba4SJustin T. Gibbs "%esi", "%edi", "%ecx", "memory"); 445e1a1bba4SJustin T. Gibbs } 446e1a1bba4SJustin T. Gibbs #endif 447e1a1bba4SJustin T. Gibbs } 448e1a1bba4SJustin T. Gibbs 449e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_read_region_8 */ 450e1a1bba4SJustin T. Gibbs #define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!! 451e1a1bba4SJustin T. Gibbs #endif 452e1a1bba4SJustin T. Gibbs 453e1a1bba4SJustin T. Gibbs /* 454e1a1bba4SJustin T. Gibbs * Write the 1, 2, 4, or 8 byte value `value' to bus space 455e1a1bba4SJustin T. Gibbs * described by tag/handle/offset. 456e1a1bba4SJustin T. Gibbs */ 457e1a1bba4SJustin T. Gibbs 458e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_1(bus_space_tag_t tag, 459e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 460e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t value); 461e1a1bba4SJustin T. Gibbs 462e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_2(bus_space_tag_t tag, 463e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 464e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t value); 465e1a1bba4SJustin T. Gibbs 466e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_4(bus_space_tag_t tag, 467e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 468e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t value); 469e1a1bba4SJustin T. Gibbs 470e1a1bba4SJustin T. Gibbs static __inline void 471e1a1bba4SJustin T. Gibbs bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh, 472e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t value) 473e1a1bba4SJustin T. Gibbs { 474e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 475e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 476e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 477e1a1bba4SJustin T. Gibbs #endif 478e1a1bba4SJustin T. Gibbs outb(bsh + offset, value); 479e1a1bba4SJustin T. Gibbs #endif 480e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 481e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 482e1a1bba4SJustin T. Gibbs else 483e1a1bba4SJustin T. Gibbs #endif 484e1a1bba4SJustin T. Gibbs *(volatile u_int8_t *)(bsh + offset) = value; 485e1a1bba4SJustin T. Gibbs #endif 486e1a1bba4SJustin T. Gibbs } 487e1a1bba4SJustin T. Gibbs 488e1a1bba4SJustin T. Gibbs static __inline void 489e1a1bba4SJustin T. Gibbs bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh, 490e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t value) 491e1a1bba4SJustin T. Gibbs { 492e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 493e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 494e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 495e1a1bba4SJustin T. Gibbs #endif 496e1a1bba4SJustin T. Gibbs outw(bsh + offset, value); 497e1a1bba4SJustin T. Gibbs #endif 498e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 499e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 500e1a1bba4SJustin T. Gibbs else 501e1a1bba4SJustin T. Gibbs #endif 502e1a1bba4SJustin T. Gibbs *(volatile u_int16_t *)(bsh + offset) = value; 503e1a1bba4SJustin T. Gibbs #endif 504e1a1bba4SJustin T. Gibbs } 505e1a1bba4SJustin T. Gibbs 506e1a1bba4SJustin T. Gibbs static __inline void 507e1a1bba4SJustin T. Gibbs bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh, 508e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t value) 509e1a1bba4SJustin T. Gibbs { 510e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 511e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 512e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 513e1a1bba4SJustin T. Gibbs #endif 514e1a1bba4SJustin T. Gibbs outl(bsh + offset, value); 515e1a1bba4SJustin T. Gibbs #endif 516e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 517e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 518e1a1bba4SJustin T. Gibbs else 519e1a1bba4SJustin T. Gibbs #endif 520e1a1bba4SJustin T. Gibbs *(volatile u_int32_t *)(bsh + offset) = value; 521e1a1bba4SJustin T. Gibbs #endif 522e1a1bba4SJustin T. Gibbs } 523e1a1bba4SJustin T. Gibbs 524e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_write_8 */ 525e1a1bba4SJustin T. Gibbs #define bus_space_write_8 !!! bus_space_write_8 not implemented !!! 526e1a1bba4SJustin T. Gibbs #endif 527e1a1bba4SJustin T. Gibbs 528e1a1bba4SJustin T. Gibbs /* 529e1a1bba4SJustin T. Gibbs * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 530e1a1bba4SJustin T. Gibbs * provided to bus space described by tag/handle/offset. 531e1a1bba4SJustin T. Gibbs */ 532e1a1bba4SJustin T. Gibbs 533e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_multi_1(bus_space_tag_t tag, 534e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 535e1a1bba4SJustin T. Gibbs bus_size_t offset, 536e1a1bba4SJustin T. Gibbs const u_int8_t *addr, 537e1a1bba4SJustin T. Gibbs size_t count); 538e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_multi_2(bus_space_tag_t tag, 539e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 540e1a1bba4SJustin T. Gibbs bus_size_t offset, 541e1a1bba4SJustin T. Gibbs const u_int16_t *addr, 542e1a1bba4SJustin T. Gibbs size_t count); 543e1a1bba4SJustin T. Gibbs 544e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_multi_4(bus_space_tag_t tag, 545e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 546e1a1bba4SJustin T. Gibbs bus_size_t offset, 547e1a1bba4SJustin T. Gibbs const u_int32_t *addr, 548e1a1bba4SJustin T. Gibbs size_t count); 549e1a1bba4SJustin T. Gibbs 550e1a1bba4SJustin T. Gibbs static __inline void 551e1a1bba4SJustin T. Gibbs bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, 552e1a1bba4SJustin T. Gibbs bus_size_t offset, const u_int8_t *addr, size_t count) 553e1a1bba4SJustin T. Gibbs { 554e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 555e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 556e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 557e1a1bba4SJustin T. Gibbs #endif 558e1a1bba4SJustin T. Gibbs outsb(bsh + offset, addr, count); 559e1a1bba4SJustin T. Gibbs #endif 560e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 561e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 562e1a1bba4SJustin T. Gibbs else 563e1a1bba4SJustin T. Gibbs #endif 564e1a1bba4SJustin T. Gibbs { 565e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 566e1a1bba4SJustin T. Gibbs __asm __volatile(" 567e1a1bba4SJustin T. Gibbs cld ; 568e1a1bba4SJustin T. Gibbs 1: lodsb ; 569e1a1bba4SJustin T. Gibbs movb %%al,(%1) ; 570e1a1bba4SJustin T. Gibbs loop 1b" : 571e1a1bba4SJustin T. Gibbs "=&a" (__x) : 572e1a1bba4SJustin T. Gibbs "r" (bsh + offset), "S" (addr), "c" (count) : 573e1a1bba4SJustin T. Gibbs "%esi", "%ecx"); 574e1a1bba4SJustin T. Gibbs } 575e1a1bba4SJustin T. Gibbs #endif 576e1a1bba4SJustin T. Gibbs } 577e1a1bba4SJustin T. Gibbs 578e1a1bba4SJustin T. Gibbs static __inline void 579e1a1bba4SJustin T. Gibbs bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, 580e1a1bba4SJustin T. Gibbs bus_size_t offset, const u_int16_t *addr, size_t count) 581e1a1bba4SJustin T. Gibbs { 582e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 583e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 584e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 585e1a1bba4SJustin T. Gibbs #endif 586e1a1bba4SJustin T. Gibbs outsw(bsh + offset, addr, count); 587e1a1bba4SJustin T. Gibbs #endif 588e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 589e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 590e1a1bba4SJustin T. Gibbs else 591e1a1bba4SJustin T. Gibbs #endif 592e1a1bba4SJustin T. Gibbs { 593e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 594e1a1bba4SJustin T. Gibbs __asm __volatile(" 595e1a1bba4SJustin T. Gibbs cld ; 596e1a1bba4SJustin T. Gibbs 1: lodsw ; 597e1a1bba4SJustin T. Gibbs movw %%ax,(%1) ; 598e1a1bba4SJustin T. Gibbs loop 1b" : 599e1a1bba4SJustin T. Gibbs "=&a" (__x) : 600e1a1bba4SJustin T. Gibbs "r" (bsh + offset), "S" (addr), "c" (count) : 601e1a1bba4SJustin T. Gibbs "%esi", "%ecx"); 602e1a1bba4SJustin T. Gibbs } 603e1a1bba4SJustin T. Gibbs #endif 604e1a1bba4SJustin T. Gibbs } 605e1a1bba4SJustin T. Gibbs 606e1a1bba4SJustin T. Gibbs static __inline void 607e1a1bba4SJustin T. Gibbs bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, 608e1a1bba4SJustin T. Gibbs bus_size_t offset, const u_int32_t *addr, size_t count) 609e1a1bba4SJustin T. Gibbs { 610e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 611e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 612e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 613e1a1bba4SJustin T. Gibbs #endif 614e1a1bba4SJustin T. Gibbs outsl(bsh + offset, addr, count); 615e1a1bba4SJustin T. Gibbs #endif 616e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 617e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 618e1a1bba4SJustin T. Gibbs else 619e1a1bba4SJustin T. Gibbs #endif 620e1a1bba4SJustin T. Gibbs { 621e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 622e1a1bba4SJustin T. Gibbs __asm __volatile(" 623e1a1bba4SJustin T. Gibbs cld ; 624e1a1bba4SJustin T. Gibbs 1: lodsl ; 625e1a1bba4SJustin T. Gibbs movl %%eax,(%1) ; 626e1a1bba4SJustin T. Gibbs loop 1b" : 627e1a1bba4SJustin T. Gibbs "=&a" (__x) : 628e1a1bba4SJustin T. Gibbs "r" (bsh + offset), "S" (addr), "c" (count) : 629e1a1bba4SJustin T. Gibbs "%esi", "%ecx"); 630e1a1bba4SJustin T. Gibbs } 631e1a1bba4SJustin T. Gibbs #endif 632e1a1bba4SJustin T. Gibbs } 633e1a1bba4SJustin T. Gibbs 634e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_write_multi_8 */ 635e1a1bba4SJustin T. Gibbs #define bus_space_write_multi_8(t, h, o, a, c) \ 636e1a1bba4SJustin T. Gibbs !!! bus_space_write_multi_8 unimplemented !!! 637e1a1bba4SJustin T. Gibbs #endif 638e1a1bba4SJustin T. Gibbs 639e1a1bba4SJustin T. Gibbs /* 640e1a1bba4SJustin T. Gibbs * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 641e1a1bba4SJustin T. Gibbs * to bus space described by tag/handle starting at `offset'. 642e1a1bba4SJustin T. Gibbs */ 643e1a1bba4SJustin T. Gibbs 644e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_region_1(bus_space_tag_t tag, 645e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 646e1a1bba4SJustin T. Gibbs bus_size_t offset, 647e1a1bba4SJustin T. Gibbs const u_int8_t *addr, 648e1a1bba4SJustin T. Gibbs size_t count); 649e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_region_2(bus_space_tag_t tag, 650e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 651e1a1bba4SJustin T. Gibbs bus_size_t offset, 652e1a1bba4SJustin T. Gibbs const u_int16_t *addr, 653e1a1bba4SJustin T. Gibbs size_t count); 654e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_region_4(bus_space_tag_t tag, 655e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 656e1a1bba4SJustin T. Gibbs bus_size_t offset, 657e1a1bba4SJustin T. Gibbs const u_int32_t *addr, 658e1a1bba4SJustin T. Gibbs size_t count); 659e1a1bba4SJustin T. Gibbs 660e1a1bba4SJustin T. Gibbs static __inline void 661e1a1bba4SJustin T. Gibbs bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 662e1a1bba4SJustin T. Gibbs bus_size_t offset, const u_int8_t *addr, size_t count) 663e1a1bba4SJustin T. Gibbs { 664e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 665e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 666e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 667e1a1bba4SJustin T. Gibbs #endif 668e1a1bba4SJustin T. Gibbs { 669e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 670e1a1bba4SJustin T. Gibbs __asm __volatile(" 671e1a1bba4SJustin T. Gibbs cld ; 672e1a1bba4SJustin T. Gibbs 1: lodsb ; 673e1a1bba4SJustin T. Gibbs outb %%al,%w1 ; 674e1a1bba4SJustin T. Gibbs incl %1 ; 675e1a1bba4SJustin T. Gibbs loop 1b" : 676e1a1bba4SJustin T. Gibbs "=&a" (__x) : 677e1a1bba4SJustin T. Gibbs "d" (bsh + offset), "S" (addr), "c" (count) : 678e1a1bba4SJustin T. Gibbs "%edx", "%esi", "%ecx", "memory"); 679e1a1bba4SJustin T. Gibbs } 680e1a1bba4SJustin T. Gibbs #endif 681e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 682e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 683e1a1bba4SJustin T. Gibbs else 684e1a1bba4SJustin T. Gibbs #endif 685e1a1bba4SJustin T. Gibbs { 686e1a1bba4SJustin T. Gibbs __asm __volatile(" 687e1a1bba4SJustin T. Gibbs cld ; 688e1a1bba4SJustin T. Gibbs repne ; 689e1a1bba4SJustin T. Gibbs movsb" : 690e1a1bba4SJustin T. Gibbs : 691e1a1bba4SJustin T. Gibbs "D" (bsh + offset), "S" (addr), "c" (count) : 692e1a1bba4SJustin T. Gibbs "%edi", "%esi", "%ecx", "memory"); 693e1a1bba4SJustin T. Gibbs } 694e1a1bba4SJustin T. Gibbs #endif 695e1a1bba4SJustin T. Gibbs } 696e1a1bba4SJustin T. Gibbs 697e1a1bba4SJustin T. Gibbs static __inline void 698e1a1bba4SJustin T. Gibbs bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 699e1a1bba4SJustin T. Gibbs bus_size_t offset, const u_int16_t *addr, size_t count) 700e1a1bba4SJustin T. Gibbs { 701e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 702e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 703e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 704e1a1bba4SJustin T. Gibbs #endif 705e1a1bba4SJustin T. Gibbs { 706e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 707e1a1bba4SJustin T. Gibbs __asm __volatile(" 708e1a1bba4SJustin T. Gibbs cld ; 709e1a1bba4SJustin T. Gibbs 1: lodsw ; 710e1a1bba4SJustin T. Gibbs outw %%ax,%w1 ; 711e1a1bba4SJustin T. Gibbs addl $2,%1 ; 712e1a1bba4SJustin T. Gibbs loop 1b" : 713e1a1bba4SJustin T. Gibbs "=&a" (__x) : 714e1a1bba4SJustin T. Gibbs "d" (bsh + offset), "S" (addr), "c" (count) : 715e1a1bba4SJustin T. Gibbs "%edx", "%esi", "%ecx", "memory"); 716e1a1bba4SJustin T. Gibbs } 717e1a1bba4SJustin T. Gibbs #endif 718e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 719e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 720e1a1bba4SJustin T. Gibbs else 721e1a1bba4SJustin T. Gibbs #endif 722e1a1bba4SJustin T. Gibbs { 723e1a1bba4SJustin T. Gibbs __asm __volatile(" 724e1a1bba4SJustin T. Gibbs cld ; 725e1a1bba4SJustin T. Gibbs repne ; 726e1a1bba4SJustin T. Gibbs movsw" : 727e1a1bba4SJustin T. Gibbs : 728e1a1bba4SJustin T. Gibbs "D" (bsh + offset), "S" (addr), "c" (count) : 729e1a1bba4SJustin T. Gibbs "%edi", "%esi", "%ecx", "memory"); 730e1a1bba4SJustin T. Gibbs } 731e1a1bba4SJustin T. Gibbs #endif 732e1a1bba4SJustin T. Gibbs } 733e1a1bba4SJustin T. Gibbs 734e1a1bba4SJustin T. Gibbs static __inline void 735e1a1bba4SJustin T. Gibbs bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 736e1a1bba4SJustin T. Gibbs bus_size_t offset, const u_int32_t *addr, size_t count) 737e1a1bba4SJustin T. Gibbs { 738e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 739e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 740e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 741e1a1bba4SJustin T. Gibbs #endif 742e1a1bba4SJustin T. Gibbs { 743e1a1bba4SJustin T. Gibbs int __x __asm__("%eax"); 744e1a1bba4SJustin T. Gibbs __asm __volatile(" 745e1a1bba4SJustin T. Gibbs cld ; 746e1a1bba4SJustin T. Gibbs 1: lodsl ; 747e1a1bba4SJustin T. Gibbs outl %%eax,%w1 ; 748e1a1bba4SJustin T. Gibbs addl $4,%1 ; 749e1a1bba4SJustin T. Gibbs loop 1b" : 750e1a1bba4SJustin T. Gibbs "=&a" (__x) : 751e1a1bba4SJustin T. Gibbs "d" (bsh + offset), "S" (addr), "c" (count) : 752e1a1bba4SJustin T. Gibbs "%edx", "%esi", "%ecx", "memory"); 753e1a1bba4SJustin T. Gibbs } 754e1a1bba4SJustin T. Gibbs #endif 755e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 756e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 757e1a1bba4SJustin T. Gibbs else 758e1a1bba4SJustin T. Gibbs #endif 759e1a1bba4SJustin T. Gibbs { 760e1a1bba4SJustin T. Gibbs __asm __volatile(" 761e1a1bba4SJustin T. Gibbs cld ; 762e1a1bba4SJustin T. Gibbs repne ; 763e1a1bba4SJustin T. Gibbs movsl" : 764e1a1bba4SJustin T. Gibbs : 765e1a1bba4SJustin T. Gibbs "D" (bsh + offset), "S" (addr), "c" (count) : 766e1a1bba4SJustin T. Gibbs "%edi", "%esi", "%ecx", "memory"); 767e1a1bba4SJustin T. Gibbs } 768e1a1bba4SJustin T. Gibbs #endif 769e1a1bba4SJustin T. Gibbs } 770e1a1bba4SJustin T. Gibbs 771e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_write_region_8 */ 772e1a1bba4SJustin T. Gibbs #define bus_space_write_region_8 \ 773e1a1bba4SJustin T. Gibbs !!! bus_space_write_region_8 unimplemented !!! 774e1a1bba4SJustin T. Gibbs #endif 775e1a1bba4SJustin T. Gibbs 776e1a1bba4SJustin T. Gibbs /* 777e1a1bba4SJustin T. Gibbs * Write the 1, 2, 4, or 8 byte value `val' to bus space described 778e1a1bba4SJustin T. Gibbs * by tag/handle/offset `count' times. 779e1a1bba4SJustin T. Gibbs */ 780e1a1bba4SJustin T. Gibbs 781e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_multi_1(bus_space_tag_t tag, 782e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 783e1a1bba4SJustin T. Gibbs bus_size_t offset, 784e1a1bba4SJustin T. Gibbs u_int8_t value, size_t count); 785e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_multi_2(bus_space_tag_t tag, 786e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 787e1a1bba4SJustin T. Gibbs bus_size_t offset, 788e1a1bba4SJustin T. Gibbs u_int16_t value, size_t count); 789e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_multi_4(bus_space_tag_t tag, 790e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 791e1a1bba4SJustin T. Gibbs bus_size_t offset, 792e1a1bba4SJustin T. Gibbs u_int32_t value, size_t count); 793e1a1bba4SJustin T. Gibbs 794e1a1bba4SJustin T. Gibbs static __inline void 795e1a1bba4SJustin T. Gibbs bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, 796e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t value, size_t count) 797e1a1bba4SJustin T. Gibbs { 798e1a1bba4SJustin T. Gibbs bus_addr_t addr = bsh + offset; 799e1a1bba4SJustin T. Gibbs 800e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 801e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 802e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 803e1a1bba4SJustin T. Gibbs #endif 804e1a1bba4SJustin T. Gibbs while (count--) 805e1a1bba4SJustin T. Gibbs outb(addr, value); 806e1a1bba4SJustin T. Gibbs #endif 807e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 808e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 809e1a1bba4SJustin T. Gibbs else 810e1a1bba4SJustin T. Gibbs #endif 811e1a1bba4SJustin T. Gibbs while (count--) 812e1a1bba4SJustin T. Gibbs *(volatile u_int8_t *)(addr) = value; 813e1a1bba4SJustin T. Gibbs #endif 814e1a1bba4SJustin T. Gibbs } 815e1a1bba4SJustin T. Gibbs 816e1a1bba4SJustin T. Gibbs static __inline void 817e1a1bba4SJustin T. Gibbs bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, 818e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t value, size_t count) 819e1a1bba4SJustin T. Gibbs { 820e1a1bba4SJustin T. Gibbs bus_addr_t addr = bsh + offset; 821e1a1bba4SJustin T. Gibbs 822e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 823e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 824e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 825e1a1bba4SJustin T. Gibbs #endif 826e1a1bba4SJustin T. Gibbs while (count--) 827e1a1bba4SJustin T. Gibbs outw(addr, value); 828e1a1bba4SJustin T. Gibbs #endif 829e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 830e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 831e1a1bba4SJustin T. Gibbs else 832e1a1bba4SJustin T. Gibbs #endif 833e1a1bba4SJustin T. Gibbs while (count--) 834e1a1bba4SJustin T. Gibbs *(volatile u_int16_t *)(addr) = value; 835e1a1bba4SJustin T. Gibbs #endif 836e1a1bba4SJustin T. Gibbs } 837e1a1bba4SJustin T. Gibbs 838e1a1bba4SJustin T. Gibbs static __inline void 839e1a1bba4SJustin T. Gibbs bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, 840e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t value, size_t count) 841e1a1bba4SJustin T. Gibbs { 842e1a1bba4SJustin T. Gibbs bus_addr_t addr = bsh + offset; 843e1a1bba4SJustin T. Gibbs 844e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 845e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 846e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 847e1a1bba4SJustin T. Gibbs #endif 848e1a1bba4SJustin T. Gibbs while (count--) 849e1a1bba4SJustin T. Gibbs outl(addr, value); 850e1a1bba4SJustin T. Gibbs #endif 851e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 852e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 853e1a1bba4SJustin T. Gibbs else 854e1a1bba4SJustin T. Gibbs #endif 855e1a1bba4SJustin T. Gibbs while (count--) 856e1a1bba4SJustin T. Gibbs *(volatile u_int32_t *)(addr) = value; 857e1a1bba4SJustin T. Gibbs #endif 858e1a1bba4SJustin T. Gibbs } 859e1a1bba4SJustin T. Gibbs 860e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_set_multi_8 */ 861e1a1bba4SJustin T. Gibbs #define bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!! 862e1a1bba4SJustin T. Gibbs #endif 863e1a1bba4SJustin T. Gibbs 864e1a1bba4SJustin T. Gibbs /* 865e1a1bba4SJustin T. Gibbs * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 866e1a1bba4SJustin T. Gibbs * by tag/handle starting at `offset'. 867e1a1bba4SJustin T. Gibbs */ 868e1a1bba4SJustin T. Gibbs 869e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_region_1(bus_space_tag_t tag, 870e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 871e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t value, 872e1a1bba4SJustin T. Gibbs size_t count); 873e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_region_2(bus_space_tag_t tag, 874e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 875e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t value, 876e1a1bba4SJustin T. Gibbs size_t count); 877e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_region_4(bus_space_tag_t tag, 878e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh, 879e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t value, 880e1a1bba4SJustin T. Gibbs size_t count); 881e1a1bba4SJustin T. Gibbs 882e1a1bba4SJustin T. Gibbs static __inline void 883e1a1bba4SJustin T. Gibbs bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 884e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int8_t value, size_t count) 885e1a1bba4SJustin T. Gibbs { 886e1a1bba4SJustin T. Gibbs bus_addr_t addr = bsh + offset; 887e1a1bba4SJustin T. Gibbs 888e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 889e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 890e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 891e1a1bba4SJustin T. Gibbs #endif 892e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr++) 893e1a1bba4SJustin T. Gibbs outb(addr, value); 894e1a1bba4SJustin T. Gibbs #endif 895e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 896e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 897e1a1bba4SJustin T. Gibbs else 898e1a1bba4SJustin T. Gibbs #endif 899e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr++) 900e1a1bba4SJustin T. Gibbs *(volatile u_int8_t *)(addr) = value; 901e1a1bba4SJustin T. Gibbs #endif 902e1a1bba4SJustin T. Gibbs } 903e1a1bba4SJustin T. Gibbs 904e1a1bba4SJustin T. Gibbs static __inline void 905e1a1bba4SJustin T. Gibbs bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 906e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int16_t value, size_t count) 907e1a1bba4SJustin T. Gibbs { 908e1a1bba4SJustin T. Gibbs bus_addr_t addr = bsh + offset; 909e1a1bba4SJustin T. Gibbs 910e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 911e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 912e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 913e1a1bba4SJustin T. Gibbs #endif 914e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr += 2) 915e1a1bba4SJustin T. Gibbs outw(addr, value); 916e1a1bba4SJustin T. Gibbs #endif 917e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 918e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 919e1a1bba4SJustin T. Gibbs else 920e1a1bba4SJustin T. Gibbs #endif 921e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr += 2) 922e1a1bba4SJustin T. Gibbs *(volatile u_int16_t *)(addr) = value; 923e1a1bba4SJustin T. Gibbs #endif 924e1a1bba4SJustin T. Gibbs } 925e1a1bba4SJustin T. Gibbs 926e1a1bba4SJustin T. Gibbs static __inline void 927e1a1bba4SJustin T. Gibbs bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 928e1a1bba4SJustin T. Gibbs bus_size_t offset, u_int32_t value, size_t count) 929e1a1bba4SJustin T. Gibbs { 930e1a1bba4SJustin T. Gibbs bus_addr_t addr = bsh + offset; 931e1a1bba4SJustin T. Gibbs 932e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 933e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 934e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 935e1a1bba4SJustin T. Gibbs #endif 936e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr += 4) 937e1a1bba4SJustin T. Gibbs outl(addr, value); 938e1a1bba4SJustin T. Gibbs #endif 939e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 940e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 941e1a1bba4SJustin T. Gibbs else 942e1a1bba4SJustin T. Gibbs #endif 943e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr += 4) 944e1a1bba4SJustin T. Gibbs *(volatile u_int32_t *)(addr) = value; 945e1a1bba4SJustin T. Gibbs #endif 946e1a1bba4SJustin T. Gibbs } 947e1a1bba4SJustin T. Gibbs 948e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_set_region_8 */ 949e1a1bba4SJustin T. Gibbs #define bus_space_set_region_8 !!! bus_space_set_region_8 unimplemented !!! 950e1a1bba4SJustin T. Gibbs #endif 951e1a1bba4SJustin T. Gibbs 952e1a1bba4SJustin T. Gibbs /* 953e1a1bba4SJustin T. Gibbs * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 954e1a1bba4SJustin T. Gibbs * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 955e1a1bba4SJustin T. Gibbs */ 956e1a1bba4SJustin T. Gibbs 957e1a1bba4SJustin T. Gibbs static __inline void bus_space_copy_region_1(bus_space_tag_t tag, 958e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh1, 959e1a1bba4SJustin T. Gibbs bus_size_t off1, 960e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh2, 961e1a1bba4SJustin T. Gibbs bus_size_t off2, size_t count); 962e1a1bba4SJustin T. Gibbs 963e1a1bba4SJustin T. Gibbs static __inline void bus_space_copy_region_2(bus_space_tag_t tag, 964e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh1, 965e1a1bba4SJustin T. Gibbs bus_size_t off1, 966e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh2, 967e1a1bba4SJustin T. Gibbs bus_size_t off2, size_t count); 968e1a1bba4SJustin T. Gibbs 969e1a1bba4SJustin T. Gibbs static __inline void bus_space_copy_region_4(bus_space_tag_t tag, 970e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh1, 971e1a1bba4SJustin T. Gibbs bus_size_t off1, 972e1a1bba4SJustin T. Gibbs bus_space_handle_t bsh2, 973e1a1bba4SJustin T. Gibbs bus_size_t off2, size_t count); 974e1a1bba4SJustin T. Gibbs 975e1a1bba4SJustin T. Gibbs static __inline void 976e1a1bba4SJustin T. Gibbs bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1, 977e1a1bba4SJustin T. Gibbs bus_size_t off1, bus_space_handle_t bsh2, 978e1a1bba4SJustin T. Gibbs bus_size_t off2, size_t count) 979e1a1bba4SJustin T. Gibbs { 980e1a1bba4SJustin T. Gibbs bus_addr_t addr1 = bsh1 + off1; 981e1a1bba4SJustin T. Gibbs bus_addr_t addr2 = bsh2 + off2; 982e1a1bba4SJustin T. Gibbs 983e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 984e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 985e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 986e1a1bba4SJustin T. Gibbs #endif 987e1a1bba4SJustin T. Gibbs { 988e1a1bba4SJustin T. Gibbs if (addr1 >= addr2) { 989e1a1bba4SJustin T. Gibbs /* src after dest: copy forward */ 990e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr1++, addr2++) 991e1a1bba4SJustin T. Gibbs outb(addr2, inb(addr1)); 992e1a1bba4SJustin T. Gibbs } else { 993e1a1bba4SJustin T. Gibbs /* dest after src: copy backwards */ 994e1a1bba4SJustin T. Gibbs for (addr1 += (count - 1), addr2 += (count - 1); 995e1a1bba4SJustin T. Gibbs count != 0; count--, addr1--, addr2--) 996e1a1bba4SJustin T. Gibbs outb(addr2, inb(addr1)); 997e1a1bba4SJustin T. Gibbs } 998e1a1bba4SJustin T. Gibbs } 999e1a1bba4SJustin T. Gibbs #endif 1000e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 1001e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 1002e1a1bba4SJustin T. Gibbs else 1003e1a1bba4SJustin T. Gibbs #endif 1004e1a1bba4SJustin T. Gibbs { 1005e1a1bba4SJustin T. Gibbs if (addr1 >= addr2) { 1006e1a1bba4SJustin T. Gibbs /* src after dest: copy forward */ 1007e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr1++, addr2++) 1008e1a1bba4SJustin T. Gibbs *(volatile u_int8_t *)(addr2) = 1009e1a1bba4SJustin T. Gibbs *(volatile u_int8_t *)(addr1); 1010e1a1bba4SJustin T. Gibbs } else { 1011e1a1bba4SJustin T. Gibbs /* dest after src: copy backwards */ 1012e1a1bba4SJustin T. Gibbs for (addr1 += (count - 1), addr2 += (count - 1); 1013e1a1bba4SJustin T. Gibbs count != 0; count--, addr1--, addr2--) 1014e1a1bba4SJustin T. Gibbs *(volatile u_int8_t *)(addr2) = 1015e1a1bba4SJustin T. Gibbs *(volatile u_int8_t *)(addr1); 1016e1a1bba4SJustin T. Gibbs } 1017e1a1bba4SJustin T. Gibbs } 1018e1a1bba4SJustin T. Gibbs #endif 1019e1a1bba4SJustin T. Gibbs } 1020e1a1bba4SJustin T. Gibbs 1021e1a1bba4SJustin T. Gibbs static __inline void 1022e1a1bba4SJustin T. Gibbs bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1, 1023e1a1bba4SJustin T. Gibbs bus_size_t off1, bus_space_handle_t bsh2, 1024e1a1bba4SJustin T. Gibbs bus_size_t off2, size_t count) 1025e1a1bba4SJustin T. Gibbs { 1026e1a1bba4SJustin T. Gibbs bus_addr_t addr1 = bsh1 + off1; 1027e1a1bba4SJustin T. Gibbs bus_addr_t addr2 = bsh2 + off2; 1028e1a1bba4SJustin T. Gibbs 1029e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 1030e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 1031e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 1032e1a1bba4SJustin T. Gibbs #endif 1033e1a1bba4SJustin T. Gibbs { 1034e1a1bba4SJustin T. Gibbs if (addr1 >= addr2) { 1035e1a1bba4SJustin T. Gibbs /* src after dest: copy forward */ 1036e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr1 += 2, addr2 += 2) 1037e1a1bba4SJustin T. Gibbs outw(addr2, inw(addr1)); 1038e1a1bba4SJustin T. Gibbs } else { 1039e1a1bba4SJustin T. Gibbs /* dest after src: copy backwards */ 1040e1a1bba4SJustin T. Gibbs for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1); 1041e1a1bba4SJustin T. Gibbs count != 0; count--, addr1 -= 2, addr2 -= 2) 1042e1a1bba4SJustin T. Gibbs outw(addr2, inw(addr1)); 1043e1a1bba4SJustin T. Gibbs } 1044e1a1bba4SJustin T. Gibbs } 1045e1a1bba4SJustin T. Gibbs #endif 1046e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 1047e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 1048e1a1bba4SJustin T. Gibbs else 1049e1a1bba4SJustin T. Gibbs #endif 1050e1a1bba4SJustin T. Gibbs { 1051e1a1bba4SJustin T. Gibbs if (addr1 >= addr2) { 1052e1a1bba4SJustin T. Gibbs /* src after dest: copy forward */ 1053e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr1 += 2, addr2 += 2) 1054e1a1bba4SJustin T. Gibbs *(volatile u_int16_t *)(addr2) = 1055e1a1bba4SJustin T. Gibbs *(volatile u_int16_t *)(addr1); 1056e1a1bba4SJustin T. Gibbs } else { 1057e1a1bba4SJustin T. Gibbs /* dest after src: copy backwards */ 1058e1a1bba4SJustin T. Gibbs for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1); 1059e1a1bba4SJustin T. Gibbs count != 0; count--, addr1 -= 2, addr2 -= 2) 1060e1a1bba4SJustin T. Gibbs *(volatile u_int16_t *)(addr2) = 1061e1a1bba4SJustin T. Gibbs *(volatile u_int16_t *)(addr1); 1062e1a1bba4SJustin T. Gibbs } 1063e1a1bba4SJustin T. Gibbs } 1064e1a1bba4SJustin T. Gibbs #endif 1065e1a1bba4SJustin T. Gibbs } 1066e1a1bba4SJustin T. Gibbs 1067e1a1bba4SJustin T. Gibbs static __inline void 1068e1a1bba4SJustin T. Gibbs bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1, 1069e1a1bba4SJustin T. Gibbs bus_size_t off1, bus_space_handle_t bsh2, 1070e1a1bba4SJustin T. Gibbs bus_size_t off2, size_t count) 1071e1a1bba4SJustin T. Gibbs { 1072e1a1bba4SJustin T. Gibbs bus_addr_t addr1 = bsh1 + off1; 1073e1a1bba4SJustin T. Gibbs bus_addr_t addr2 = bsh2 + off2; 1074e1a1bba4SJustin T. Gibbs 1075e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 1076e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 1077e1a1bba4SJustin T. Gibbs if (tag == I386_BUS_SPACE_IO) 1078e1a1bba4SJustin T. Gibbs #endif 1079e1a1bba4SJustin T. Gibbs { 1080e1a1bba4SJustin T. Gibbs if (addr1 >= addr2) { 1081e1a1bba4SJustin T. Gibbs /* src after dest: copy forward */ 1082e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr1 += 4, addr2 += 4) 1083e1a1bba4SJustin T. Gibbs outl(addr2, inl(addr1)); 1084e1a1bba4SJustin T. Gibbs } else { 1085e1a1bba4SJustin T. Gibbs /* dest after src: copy backwards */ 1086e1a1bba4SJustin T. Gibbs for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1); 1087e1a1bba4SJustin T. Gibbs count != 0; count--, addr1 -= 4, addr2 -= 4) 1088e1a1bba4SJustin T. Gibbs outl(addr2, inl(addr1)); 1089e1a1bba4SJustin T. Gibbs } 1090e1a1bba4SJustin T. Gibbs } 1091e1a1bba4SJustin T. Gibbs #endif 1092e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_) 1093e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) 1094e1a1bba4SJustin T. Gibbs else 1095e1a1bba4SJustin T. Gibbs #endif 1096e1a1bba4SJustin T. Gibbs { 1097e1a1bba4SJustin T. Gibbs if (addr1 >= addr2) { 1098e1a1bba4SJustin T. Gibbs /* src after dest: copy forward */ 1099e1a1bba4SJustin T. Gibbs for (; count != 0; count--, addr1 += 4, addr2 += 4) 1100e1a1bba4SJustin T. Gibbs *(volatile u_int32_t *)(addr2) = 1101e1a1bba4SJustin T. Gibbs *(volatile u_int32_t *)(addr1); 1102e1a1bba4SJustin T. Gibbs } else { 1103e1a1bba4SJustin T. Gibbs /* dest after src: copy backwards */ 1104e1a1bba4SJustin T. Gibbs for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1); 1105e1a1bba4SJustin T. Gibbs count != 0; count--, addr1 -= 4, addr2 -= 4) 1106e1a1bba4SJustin T. Gibbs *(volatile u_int32_t *)(addr2) = 1107e1a1bba4SJustin T. Gibbs *(volatile u_int32_t *)(addr1); 1108e1a1bba4SJustin T. Gibbs } 1109e1a1bba4SJustin T. Gibbs } 1110e1a1bba4SJustin T. Gibbs #endif 1111e1a1bba4SJustin T. Gibbs } 1112e1a1bba4SJustin T. Gibbs 1113e1a1bba4SJustin T. Gibbs #endif /* defined(_I386_BUS_PIO_H_) || defined(_I386_MEM_IO_H_) */ 1114e1a1bba4SJustin T. Gibbs 1115e1a1bba4SJustin T. Gibbs #if 0 /* Cause a link error for bus_space_copy_8 */ 1116e1a1bba4SJustin T. Gibbs #define bus_space_copy_region_8 !!! bus_space_copy_region_8 unimplemented !!! 1117e1a1bba4SJustin T. Gibbs #endif 1118e1a1bba4SJustin T. Gibbs 1119e1a1bba4SJustin T. Gibbs /* 1120e1a1bba4SJustin T. Gibbs * Bus read/write barrier methods. 1121e1a1bba4SJustin T. Gibbs * 1122e1a1bba4SJustin T. Gibbs * void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, 1123e1a1bba4SJustin T. Gibbs * bus_size_t offset, bus_size_t len, int flags); 1124e1a1bba4SJustin T. Gibbs * 1125e1a1bba4SJustin T. Gibbs * Note: the i386 does not currently require barriers, but we must 1126e1a1bba4SJustin T. Gibbs * provide the flags to MI code. 1127e1a1bba4SJustin T. Gibbs */ 1128e1a1bba4SJustin T. Gibbs #define bus_space_barrier(t, h, o, l, f) \ 1129e1a1bba4SJustin T. Gibbs ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f))) 1130e1a1bba4SJustin T. Gibbs #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 1131e1a1bba4SJustin T. Gibbs #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 1132e1a1bba4SJustin T. Gibbs 1133e1a1bba4SJustin T. Gibbs /* 1134e1a1bba4SJustin T. Gibbs * Flags used in various bus DMA methods. 1135e1a1bba4SJustin T. Gibbs */ 1136e1a1bba4SJustin T. Gibbs #define BUS_DMA_WAITOK 0x00 /* safe to sleep (pseudo-flag) */ 1137e1a1bba4SJustin T. Gibbs #define BUS_DMA_NOWAIT 0x01 /* not safe to sleep */ 1138e1a1bba4SJustin T. Gibbs #define BUS_DMA_ALLOCNOW 0x02 /* perform resource allocation now */ 1139e1a1bba4SJustin T. Gibbs #define BUS_DMAMEM_NOSYNC 0x04 /* map memory to not require sync */ 1140e1a1bba4SJustin T. Gibbs #define BUS_DMA_BUS1 0x10 /* placeholders for bus functions... */ 1141e1a1bba4SJustin T. Gibbs #define BUS_DMA_BUS2 0x20 1142e1a1bba4SJustin T. Gibbs #define BUS_DMA_BUS3 0x40 1143e1a1bba4SJustin T. Gibbs #define BUS_DMA_BUS4 0x80 1144e1a1bba4SJustin T. Gibbs 1145e1a1bba4SJustin T. Gibbs /* Forwards needed by prototypes below. */ 1146e1a1bba4SJustin T. Gibbs struct mbuf; 1147e1a1bba4SJustin T. Gibbs struct uio; 1148e1a1bba4SJustin T. Gibbs 1149e1a1bba4SJustin T. Gibbs /* 1150e1a1bba4SJustin T. Gibbs * bus_dmasync_op_t 1151e1a1bba4SJustin T. Gibbs * 1152e1a1bba4SJustin T. Gibbs * Operations performed by bus_dmamap_sync(). 1153e1a1bba4SJustin T. Gibbs */ 1154e1a1bba4SJustin T. Gibbs typedef enum { 1155e1a1bba4SJustin T. Gibbs BUS_DMASYNC_PREREAD, 1156e1a1bba4SJustin T. Gibbs BUS_DMASYNC_POSTREAD, 1157e1a1bba4SJustin T. Gibbs BUS_DMASYNC_PREWRITE, 1158e1a1bba4SJustin T. Gibbs BUS_DMASYNC_POSTWRITE, 1159e1a1bba4SJustin T. Gibbs } bus_dmasync_op_t; 1160e1a1bba4SJustin T. Gibbs 1161e1a1bba4SJustin T. Gibbs /* 1162e1a1bba4SJustin T. Gibbs * bus_dma_tag_t 1163e1a1bba4SJustin T. Gibbs * 1164e1a1bba4SJustin T. Gibbs * A machine-dependent opaque type describing the characteristics 1165e1a1bba4SJustin T. Gibbs * of how to perform DMA mappings. This structure encapsultes 1166e1a1bba4SJustin T. Gibbs * information concerning address and alignment restrictions, number 1167e1a1bba4SJustin T. Gibbs * of S/G segments, amount of data per S/G segment, etc. 1168e1a1bba4SJustin T. Gibbs */ 1169e1a1bba4SJustin T. Gibbs typedef struct bus_dma_tag *bus_dma_tag_t; 1170e1a1bba4SJustin T. Gibbs 1171e1a1bba4SJustin T. Gibbs /* 1172e1a1bba4SJustin T. Gibbs * bus_dmamap_t 1173e1a1bba4SJustin T. Gibbs * 1174e1a1bba4SJustin T. Gibbs * DMA mapping instance information. 1175e1a1bba4SJustin T. Gibbs */ 1176e1a1bba4SJustin T. Gibbs typedef struct bus_dmamap *bus_dmamap_t; 1177e1a1bba4SJustin T. Gibbs 1178e1a1bba4SJustin T. Gibbs /* 1179e1a1bba4SJustin T. Gibbs * bus_dma_segment_t 1180e1a1bba4SJustin T. Gibbs * 1181e1a1bba4SJustin T. Gibbs * Describes a single contiguous DMA transaction. Values 1182e1a1bba4SJustin T. Gibbs * are suitable for programming into DMA registers. 1183e1a1bba4SJustin T. Gibbs */ 1184e1a1bba4SJustin T. Gibbs typedef struct bus_dma_segment { 1185e1a1bba4SJustin T. Gibbs bus_addr_t ds_addr; /* DMA address */ 1186e1a1bba4SJustin T. Gibbs bus_size_t ds_len; /* length of transfer */ 1187e1a1bba4SJustin T. Gibbs } bus_dma_segment_t; 1188e1a1bba4SJustin T. Gibbs 1189e1a1bba4SJustin T. Gibbs /* 1190e1a1bba4SJustin T. Gibbs * A function that returns 1 if the address cannot be accessed by 1191e1a1bba4SJustin T. Gibbs * a device and 0 if it can be. 1192e1a1bba4SJustin T. Gibbs */ 1193e1a1bba4SJustin T. Gibbs typedef int bus_dma_filter_t(void *, bus_addr_t); 1194e1a1bba4SJustin T. Gibbs 1195e1a1bba4SJustin T. Gibbs /* 1196e1a1bba4SJustin T. Gibbs * Allocate a device specific dma_tag encapsulating the constraints of 1197e1a1bba4SJustin T. Gibbs * the parent tag in addition to other restrictions specified: 1198e1a1bba4SJustin T. Gibbs * 1199e1a1bba4SJustin T. Gibbs * boundary: Boundary that segments cannot cross. 1200e1a1bba4SJustin T. Gibbs * lowaddr: Low restricted address that cannot appear in a mapping. 1201e1a1bba4SJustin T. Gibbs * highaddr: High restricted address that cannot appear in a mapping. 1202e1a1bba4SJustin T. Gibbs * filtfunc: An optional function to further test if an address 1203e1a1bba4SJustin T. Gibbs * within the range of lowaddr and highaddr cannot appear 1204e1a1bba4SJustin T. Gibbs * in a mapping. 1205e1a1bba4SJustin T. Gibbs * filtfuncarg: An argument that will be passed to filtfunc in addition 1206e1a1bba4SJustin T. Gibbs * to the address to test. 1207e1a1bba4SJustin T. Gibbs * flags: Bus DMA flags. 1208e1a1bba4SJustin T. Gibbs * dmat: A pointer to set to a valid dma tag should the return 1209e1a1bba4SJustin T. Gibbs * value of this function indicate success. 1210e1a1bba4SJustin T. Gibbs */ 1211e1a1bba4SJustin T. Gibbs int bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t boundary, 1212e1a1bba4SJustin T. Gibbs bus_addr_t lowaddr, bus_addr_t highaddr, 1213e1a1bba4SJustin T. Gibbs bus_dma_filter_t *filtfunc, void *filtfuncarg, 1214e1a1bba4SJustin T. Gibbs bus_size_t maxsize, int nsegments, bus_size_t maxsegsz, 1215e1a1bba4SJustin T. Gibbs int flags, bus_dma_tag_t *dmat); 1216e1a1bba4SJustin T. Gibbs 1217e1a1bba4SJustin T. Gibbs int bus_dma_tag_destroy(bus_dma_tag_t dmat); 1218e1a1bba4SJustin T. Gibbs 1219e1a1bba4SJustin T. Gibbs /* 1220e1a1bba4SJustin T. Gibbs * Allocate a handle for mapping from kva/uva/physical 1221e1a1bba4SJustin T. Gibbs * address space into bus device space. 1222e1a1bba4SJustin T. Gibbs * 1223e1a1bba4SJustin T. Gibbs * maxsize: Maximum mapping size supported by this handle. 1224e1a1bba4SJustin T. Gibbs * nsegments: Number of discontinuities allowed in the map. 1225e1a1bba4SJustin T. Gibbs * maxsegsz: Maximum size of a segment in the map. 1226e1a1bba4SJustin T. Gibbs */ 1227e1a1bba4SJustin T. Gibbs int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp); 1228e1a1bba4SJustin T. Gibbs 1229e1a1bba4SJustin T. Gibbs /* 1230e1a1bba4SJustin T. Gibbs * Destroy a handle for mapping from kva/uva/physical 1231e1a1bba4SJustin T. Gibbs * address space into bus device space. 1232e1a1bba4SJustin T. Gibbs */ 1233e1a1bba4SJustin T. Gibbs int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map); 1234e1a1bba4SJustin T. Gibbs 1235e1a1bba4SJustin T. Gibbs /* 1236e1a1bba4SJustin T. Gibbs * A function that processes a successfully loaded dma map or an error 1237e1a1bba4SJustin T. Gibbs * from a delayed load map. 1238e1a1bba4SJustin T. Gibbs */ 1239e1a1bba4SJustin T. Gibbs typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int); 1240e1a1bba4SJustin T. Gibbs 1241e1a1bba4SJustin T. Gibbs /* 1242e1a1bba4SJustin T. Gibbs * Map the buffer buf into bus space using the dmamap map. 1243e1a1bba4SJustin T. Gibbs */ 1244e1a1bba4SJustin T. Gibbs int bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, 1245e1a1bba4SJustin T. Gibbs bus_size_t buflen, bus_dmamap_callback_t *callback, 1246e1a1bba4SJustin T. Gibbs void *callback_arg, int flags); 1247e1a1bba4SJustin T. Gibbs 1248e1a1bba4SJustin T. Gibbs /* 1249e1a1bba4SJustin T. Gibbs * Perform a syncronization operation on the given map. 1250e1a1bba4SJustin T. Gibbs */ 1251e1a1bba4SJustin T. Gibbs void _bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_dmasync_op_t); 1252e1a1bba4SJustin T. Gibbs #define bus_dmamap_sync(dmat, dmamap, op) \ 1253e1a1bba4SJustin T. Gibbs if ((dmamap) != NULL) \ 1254e1a1bba4SJustin T. Gibbs _bus_dmamap_sync(dmat, dmamap, op) 1255e1a1bba4SJustin T. Gibbs 1256e1a1bba4SJustin T. Gibbs /* 1257e1a1bba4SJustin T. Gibbs * Release the mapping held by map. 1258e1a1bba4SJustin T. Gibbs */ 1259e1a1bba4SJustin T. Gibbs void _bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map); 1260e1a1bba4SJustin T. Gibbs #define bus_dmamap_unload(dmat, dmamap) \ 1261e1a1bba4SJustin T. Gibbs if ((dmamap) != NULL) \ 1262e1a1bba4SJustin T. Gibbs _bus_dmamap_unload(dmat, dmamap) 1263e1a1bba4SJustin T. Gibbs 1264e1a1bba4SJustin T. Gibbs #endif /* _I386_BUS_H_ */ 1265