bus.h revision 120375
180708Sjake/*- 286228Stmm * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc. 380708Sjake * All rights reserved. 480708Sjake * 586228Stmm * This code is derived from software contributed to The NetBSD Foundation 686228Stmm * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 786228Stmm * NASA Ames Research Center. 886228Stmm * 980708Sjake * Redistribution and use in source and binary forms, with or without 1080708Sjake * modification, are permitted provided that the following conditions 1180708Sjake * are met: 1280708Sjake * 1. Redistributions of source code must retain the above copyright 1380708Sjake * notice, this list of conditions and the following disclaimer. 1480708Sjake * 2. Redistributions in binary form must reproduce the above copyright 1580708Sjake * notice, this list of conditions and the following disclaimer in the 1680708Sjake * documentation and/or other materials provided with the distribution. 1786228Stmm * 3. All advertising materials mentioning features or use of this software 1886228Stmm * must display the following acknowledgement: 1986228Stmm * This product includes software developed by the NetBSD 2086228Stmm * Foundation, Inc. and its contributors. 2186228Stmm * 4. Neither the name of The NetBSD Foundation nor the names of its 2286228Stmm * contributors may be used to endorse or promote products derived 2386228Stmm * from this software without specific prior written permission. 2480708Sjake * 2586228Stmm * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2686228Stmm * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2786228Stmm * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2886228Stmm * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2986228Stmm * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 3086228Stmm * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 3186228Stmm * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 3286228Stmm * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 3386228Stmm * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3486228Stmm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3586228Stmm * POSSIBILITY OF SUCH DAMAGE. 3686228Stmm */ 3786228Stmm/* 3886228Stmm * Copyright (c) 1997-1999 Eduardo E. Horvath. All rights reserved. 3986228Stmm * Copyright (c) 1996 Charles M. Hannum. All rights reserved. 4086228Stmm * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 4180708Sjake * 4286228Stmm * Redistribution and use in source and binary forms, with or without 4386228Stmm * modification, are permitted provided that the following conditions 4486228Stmm * are met: 4586228Stmm * 1. Redistributions of source code must retain the above copyright 4686228Stmm * notice, this list of conditions and the following disclaimer. 4786228Stmm * 2. Redistributions in binary form must reproduce the above copyright 4886228Stmm * notice, this list of conditions and the following disclaimer in the 4986228Stmm * documentation and/or other materials provided with the distribution. 5086228Stmm * 3. All advertising materials mentioning features or use of this software 5186228Stmm * must display the following acknowledgement: 5286228Stmm * This product includes software developed by Christopher G. Demetriou 5386228Stmm * for the NetBSD Project. 5486228Stmm * 4. The name of the author may not be used to endorse or promote products 5586228Stmm * derived from this software without specific prior written permission 5686228Stmm * 5786228Stmm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 5886228Stmm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 5986228Stmm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 6086228Stmm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 6186228Stmm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 6286228Stmm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 6386228Stmm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 6486228Stmm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 6586228Stmm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 6686228Stmm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 6786228Stmm * 6886228Stmm * from: NetBSD: bus.h,v 1.28 2001/07/19 15:32:19 thorpej Exp 6986228Stmm * and 7086228Stmm * from: FreeBSD: src/sys/alpha/include/bus.h,v 1.9 2001/01/09 7186228Stmm * 7280708Sjake * $FreeBSD: head/sys/sparc64/include/bus.h 120375 2003-09-23 08:22:34Z nyan $ 7380708Sjake */ 7480708Sjake 7580708Sjake#ifndef _MACHINE_BUS_H_ 7680708Sjake#define _MACHINE_BUS_H_ 7780708Sjake 7890615Stmm#ifdef BUS_SPACE_DEBUG 7990615Stmm#include <sys/ktr.h> 8090615Stmm#endif 8190615Stmm 8286228Stmm#include <machine/cpufunc.h> 8390615Stmm#include <machine/upa.h> 8480708Sjake 8586228Stmm/* 8686228Stmm * UPA and SBUS spaces are non-cached and big endian 8786228Stmm * (except for RAM and PROM) 8886228Stmm * 8986228Stmm * PCI spaces are non-cached and little endian 9086228Stmm */ 9186228Stmm#define UPA_BUS_SPACE 0 9286228Stmm#define SBUS_BUS_SPACE 1 9386228Stmm#define PCI_CONFIG_BUS_SPACE 2 9486228Stmm#define PCI_IO_BUS_SPACE 3 9586228Stmm#define PCI_MEMORY_BUS_SPACE 4 9686228Stmm#define LAST_BUS_SPACE 5 9786228Stmm 9886228Stmmextern int bus_type_asi[]; 9986228Stmmextern int bus_stream_asi[]; 10086228Stmm 10186228Stmm#define __BUS_SPACE_HAS_STREAM_METHODS 1 10286228Stmm 10386228Stmm/* 10486228Stmm * Bus address and size types 10586228Stmm */ 10686228Stmmtypedef u_long bus_space_handle_t; 10786228Stmmtypedef int bus_type_t; 10886228Stmmtypedef u_long bus_addr_t; 10986228Stmmtypedef u_long bus_size_t; 11086228Stmm 11186228Stmm#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF 11286228Stmm#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF 113111524Smux#define BUS_SPACE_MAXSIZE 0xFFFFFFFFFFFFFFFF 11486228Stmm#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF 11586228Stmm#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF 11686228Stmm#define BUS_SPACE_MAXADDR 0xFFFFFFFF 11786228Stmm 11886228Stmm#define BUS_SPACE_UNRESTRICTED (~0UL) 11986228Stmm 12086228Stmm/* 12186228Stmm * Access methods for bus resources and address space. 12286228Stmm */ 12386228Stmmtypedef struct bus_space_tag *bus_space_tag_t; 12486228Stmm 12586228Stmmstruct bus_space_tag { 126108815Stmm void *bst_cookie; 127108815Stmm bus_space_tag_t bst_parent; 128108815Stmm int bst_type; 12986228Stmm 130108815Stmm void (*bst_bus_barrier)(bus_space_tag_t, bus_space_handle_t, 13193052Stmm bus_size_t, bus_size_t, int); 13286228Stmm}; 13386228Stmm 13486228Stmm/* 13586228Stmm * Bus space function prototypes. 13686228Stmm */ 13793052Stmmstatic void bus_space_barrier(bus_space_tag_t, bus_space_handle_t, bus_size_t, 13893052Stmm bus_size_t, int); 139108917Sjakestatic int bus_space_subregion(bus_space_tag_t, bus_space_handle_t, 140108917Sjake bus_size_t, bus_size_t, bus_space_handle_t *); 141120375Snyan 142111347Sobrien/* 143120375Snyan * Map a region of device bus space into CPU virtual address space. 144120375Snyan */ 145120375Snyan 146120375Snyanstatic __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr, 147120375Snyan bus_size_t size, int flags, 148120375Snyan bus_space_handle_t *bshp); 149120375Snyan 150120375Snyanstatic __inline int 151120375Snyanbus_space_map(bus_space_tag_t t __unused, bus_addr_t addr, 152120375Snyan bus_size_t size __unused, int flags __unused, 153120375Snyan bus_space_handle_t *bshp) 154120375Snyan{ 155120375Snyan 156120375Snyan *bshp = addr; 157120375Snyan return (0); 158120375Snyan} 159120375Snyan 160120375Snyan/* 161111347Sobrien * Unmap a region of device bus space. 162111347Sobrien */ 163111347Sobrienstatic __inline void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, 164111347Sobrien bus_size_t size); 16586228Stmm 166111347Sobrienstatic __inline void 167111347Sobrienbus_space_unmap(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused, 168111347Sobrien bus_size_t size __unused) 169111347Sobrien{ 170111347Sobrien} 171111347Sobrien 17286228Stmm/* This macro finds the first "upstream" implementation of method `f' */ 17393052Stmm#define _BS_CALL(t,f) \ 17493052Stmm while (t->f == NULL) \ 175108815Stmm t = t->bst_parent; \ 17686228Stmm return (*(t)->f) 17786228Stmm 17893052Stmmstatic __inline void 17993052Stmmbus_space_barrier(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 18093052Stmm bus_size_t s, int f) 18186228Stmm{ 182108815Stmm _BS_CALL(t, bst_bus_barrier)(t, h, o, s, f); 18386228Stmm} 18486228Stmm 185108917Sjakestatic __inline int 186108917Sjakebus_space_subregion(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 187108917Sjake bus_size_t s, bus_space_handle_t *hp) 188108917Sjake{ 189108917Sjake *hp = h + o; 190108917Sjake return (0); 191108917Sjake} 192108917Sjake 19386228Stmm/* flags for bus space map functions */ 19486228Stmm#define BUS_SPACE_MAP_CACHEABLE 0x0001 19586228Stmm#define BUS_SPACE_MAP_LINEAR 0x0002 19686228Stmm#define BUS_SPACE_MAP_READONLY 0x0004 19786228Stmm#define BUS_SPACE_MAP_PREFETCHABLE 0x0008 19886228Stmm/* placeholders for bus functions... */ 19986228Stmm#define BUS_SPACE_MAP_BUS1 0x0100 20086228Stmm#define BUS_SPACE_MAP_BUS2 0x0200 20186228Stmm#define BUS_SPACE_MAP_BUS3 0x0400 20286228Stmm#define BUS_SPACE_MAP_BUS4 0x0800 20386228Stmm 20486228Stmm/* flags for bus_space_barrier() */ 20586228Stmm#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 20686228Stmm#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 20786228Stmm 20890615Stmm#ifdef BUS_SPACE_DEBUG 20990615Stmm#define KTR_BUS KTR_CT2 21090615Stmm#define BUS_HANDLE_MIN UPA_MEMSTART 21190615Stmm#define __BUS_DEBUG_ACCESS(h, o, desc, sz) do { \ 21290615Stmm CTR4(KTR_BUS, "bus space: %s %d: handle %#lx, offset %#lx", \ 21390615Stmm (desc), (sz), (h), (o)); \ 21490615Stmm if ((h) + (o) < BUS_HANDLE_MIN) \ 21590615Stmm panic("bus space access at %#lx out of range", \ 21690615Stmm (h) + (o)); \ 21790615Stmm} while (0) 21890615Stmm#else 21990615Stmm#define __BUS_DEBUG_ACCESS(h, o, desc, sz) 22090615Stmm#endif 22190615Stmm 222104304Sjakestatic __inline uint8_t 223104304Sjakebus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 224104304Sjake{ 22586228Stmm 226104304Sjake __BUS_DEBUG_ACCESS(h, o, "read", 1); 227108815Stmm return (lduba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type])); 228104304Sjake} 22986228Stmm 230104304Sjakestatic __inline uint16_t 231104304Sjakebus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 232104304Sjake{ 23386228Stmm 234104304Sjake __BUS_DEBUG_ACCESS(h, o, "read", 2); 235108815Stmm return (lduha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type])); 236104304Sjake} 23786228Stmm 238104304Sjakestatic __inline uint32_t 239104304Sjakebus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 240104304Sjake{ 24186228Stmm 242104304Sjake __BUS_DEBUG_ACCESS(h, o, "read", 4); 243108815Stmm return (lduwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type])); 244104304Sjake} 24586228Stmm 246104304Sjakestatic __inline uint64_t 247104304Sjakebus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 248104304Sjake{ 24986228Stmm 250104304Sjake __BUS_DEBUG_ACCESS(h, o, "read", 8); 251108815Stmm return (ldxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type])); 252104304Sjake} 25386228Stmm 254104304Sjakestatic __inline void 255104304Sjakebus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 256104304Sjake uint8_t *a, size_t c) 257104304Sjake{ 25886228Stmm 259104304Sjake while (c-- > 0) 260104304Sjake *a++ = bus_space_read_1(t, h, o); 261104304Sjake} 26286228Stmm 263104304Sjakestatic __inline void 264104304Sjakebus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 265104304Sjake uint16_t *a, size_t c) 266104304Sjake{ 26786228Stmm 268104304Sjake while (c-- > 0) 269104304Sjake *a++ = bus_space_read_2(t, h, o); 270104304Sjake} 27186228Stmm 272104304Sjakestatic __inline void 273104304Sjakebus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 274104304Sjake uint32_t *a, size_t c) 275104304Sjake{ 27686228Stmm 277104304Sjake while (c-- > 0) 278104304Sjake *a++ = bus_space_read_4(t, h, o); 279104304Sjake} 28086228Stmm 281104304Sjakestatic __inline void 282104304Sjakebus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 283104304Sjake uint64_t *a, size_t c) 284104304Sjake{ 28586228Stmm 286104304Sjake while (c-- > 0) 287104304Sjake *a++ = bus_space_read_8(t, h, o); 288104304Sjake} 28986228Stmm 290104304Sjakestatic __inline void 291104304Sjakebus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 292104304Sjake uint8_t v) 293104304Sjake{ 29486228Stmm 295104304Sjake __BUS_DEBUG_ACCESS(h, o, "write", 1); 296108815Stmm stba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v); 297104304Sjake} 29886228Stmm 299104304Sjakestatic __inline void 300104304Sjakebus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 301104304Sjake uint16_t v) 302104304Sjake{ 30386228Stmm 304104304Sjake __BUS_DEBUG_ACCESS(h, o, "write", 2); 305108815Stmm stha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v); 306104304Sjake} 30786228Stmm 30893052Stmmstatic __inline void 309104304Sjakebus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 310104304Sjake uint32_t v) 311104304Sjake{ 312104304Sjake 313104304Sjake __BUS_DEBUG_ACCESS(h, o, "write", 4); 314108815Stmm stwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v); 315104304Sjake} 316104304Sjake 317104304Sjakestatic __inline void 318104304Sjakebus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 319104304Sjake uint64_t v) 320104304Sjake{ 321104304Sjake 322104304Sjake __BUS_DEBUG_ACCESS(h, o, "write", 8); 323108815Stmm stxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v); 324104304Sjake} 325104304Sjake 326104304Sjakestatic __inline void 327104304Sjakebus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 328104304Sjake uint8_t *a, size_t c) 329104304Sjake{ 330104304Sjake 331104304Sjake while (c-- > 0) 332104304Sjake bus_space_write_1(t, h, o, *a++); 333104304Sjake} 334104304Sjake 335104304Sjakestatic __inline void 336104304Sjakebus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 337104304Sjake uint16_t *a, size_t c) 338104304Sjake{ 339104304Sjake 340104304Sjake while (c-- > 0) 341104304Sjake bus_space_write_2(t, h, o, *a++); 342104304Sjake} 343104304Sjake 344104304Sjakestatic __inline void 345104304Sjakebus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 346104304Sjake uint32_t *a, size_t c) 347104304Sjake{ 348104304Sjake 349104304Sjake while (c-- > 0) 350104304Sjake bus_space_write_4(t, h, o, *a++); 351104304Sjake} 352104304Sjake 353104304Sjakestatic __inline void 354104304Sjakebus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 355104304Sjake uint64_t *a, size_t c) 356104304Sjake{ 357104304Sjake 358104304Sjake while (c-- > 0) 359104304Sjake bus_space_write_8(t, h, o, *a++); 360104304Sjake} 361104304Sjake 362104304Sjakestatic __inline void 363104304Sjakebus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 364104304Sjake uint8_t v, size_t c) 365104304Sjake{ 366104304Sjake 367104304Sjake while (c-- > 0) 368104304Sjake bus_space_write_1(t, h, o, v); 369104304Sjake} 370104304Sjake 371104304Sjakestatic __inline void 372104304Sjakebus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 373104304Sjake uint16_t v, size_t c) 374104304Sjake{ 375104304Sjake 376104304Sjake while (c-- > 0) 377104304Sjake bus_space_write_2(t, h, o, v); 378104304Sjake} 379104304Sjake 380104304Sjakestatic __inline void 381104304Sjakebus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 382104304Sjake uint32_t v, size_t c) 383104304Sjake{ 384104304Sjake 385104304Sjake while (c-- > 0) 386104304Sjake bus_space_write_4(t, h, o, v); 387104304Sjake} 388104304Sjake 389104304Sjakestatic __inline void 390104304Sjakebus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 391104304Sjake uint64_t v, size_t c) 392104304Sjake{ 393104304Sjake 394104304Sjake while (c-- > 0) 395104304Sjake bus_space_write_8(t, h, o, v); 396104304Sjake} 397104304Sjake 398104304Sjakestatic __inline void 39993052Stmmbus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 40093052Stmm u_int8_t *a, bus_size_t c) 40186228Stmm{ 40286228Stmm for (; c; a++, c--, o++) 40386228Stmm *a = bus_space_read_1(t, h, o); 40486228Stmm} 40586228Stmm 40693052Stmmstatic __inline void 40793052Stmmbus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 40893052Stmm u_int16_t *a, bus_size_t c) 40986228Stmm{ 41086228Stmm for (; c; a++, c--, o+=2) 41186228Stmm *a = bus_space_read_2(t, h, o); 41286228Stmm} 41386228Stmm 41493052Stmmstatic __inline void 41593052Stmmbus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 41693052Stmm u_int32_t *a, bus_size_t c) 41786228Stmm{ 41886228Stmm for (; c; a++, c--, o+=4) 41986228Stmm *a = bus_space_read_4(t, h, o); 42086228Stmm} 42186228Stmm 42293052Stmmstatic __inline void 42393052Stmmbus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 42493052Stmm u_int64_t *a, bus_size_t c) 42586228Stmm{ 42686228Stmm for (; c; a++, c--, o+=8) 42786228Stmm *a = bus_space_read_8(t, h, o); 42886228Stmm} 42986228Stmm 43093052Stmmstatic __inline void 43193052Stmmbus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 43293052Stmm const u_int8_t *a, bus_size_t c) 43386228Stmm{ 43486228Stmm for (; c; a++, c--, o++) 43586228Stmm bus_space_write_1(t, h, o, *a); 43686228Stmm} 43786228Stmm 43893052Stmmstatic __inline void 43993052Stmmbus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 44093052Stmm const u_int16_t *a, bus_size_t c) 44186228Stmm{ 44286228Stmm for (; c; a++, c--, o+=2) 44386228Stmm bus_space_write_2(t, h, o, *a); 44486228Stmm} 44586228Stmm 44693052Stmmstatic __inline void 44793052Stmmbus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 44893052Stmm const u_int32_t *a, bus_size_t c) 44986228Stmm{ 45086228Stmm for (; c; a++, c--, o+=4) 45186228Stmm bus_space_write_4(t, h, o, *a); 45286228Stmm} 45386228Stmm 45493052Stmmstatic __inline void 45593052Stmmbus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 45693052Stmm const u_int64_t *a, bus_size_t c) 45786228Stmm{ 45886228Stmm for (; c; a++, c--, o+=8) 45986228Stmm bus_space_write_8(t, h, o, *a); 46086228Stmm} 46186228Stmm 46293052Stmmstatic __inline void 46393052Stmmbus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 46493052Stmm const u_int8_t v, bus_size_t c) 46586228Stmm{ 46686228Stmm for (; c; c--, o++) 46786228Stmm bus_space_write_1(t, h, o, v); 46886228Stmm} 46986228Stmm 47093052Stmmstatic __inline void 47193052Stmmbus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 47293052Stmm const u_int16_t v, bus_size_t c) 47386228Stmm{ 47486228Stmm for (; c; c--, o+=2) 47586228Stmm bus_space_write_2(t, h, o, v); 47686228Stmm} 47786228Stmm 47893052Stmmstatic __inline void 47993052Stmmbus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 48093052Stmm const u_int32_t v, bus_size_t c) 48186228Stmm{ 48286228Stmm for (; c; c--, o+=4) 48386228Stmm bus_space_write_4(t, h, o, v); 48486228Stmm} 48586228Stmm 48693052Stmmstatic __inline void 48793052Stmmbus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 48893052Stmm const u_int64_t v, bus_size_t c) 48986228Stmm{ 49086228Stmm for (; c; c--, o+=8) 49186228Stmm bus_space_write_8(t, h, o, v); 49286228Stmm} 49386228Stmm 49493052Stmmstatic __inline void 49593052Stmmbus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, 49693052Stmm bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 49786228Stmm{ 49886228Stmm for (; c; c--, o1++, o2++) 49986228Stmm bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2)); 50086228Stmm} 50186228Stmm 50293052Stmmstatic __inline void 50393052Stmmbus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, 50493052Stmm bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 50586228Stmm{ 50686228Stmm for (; c; c--, o1+=2, o2+=2) 50786228Stmm bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2)); 50886228Stmm} 50986228Stmm 51093052Stmmstatic __inline void 51193052Stmmbus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, 51293052Stmm bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 51386228Stmm{ 51486228Stmm for (; c; c--, o1+=4, o2+=4) 51586228Stmm bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2)); 51686228Stmm} 51786228Stmm 51893052Stmmstatic __inline void 51993052Stmmbus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1, 52093052Stmm bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 52186228Stmm{ 52286228Stmm for (; c; c--, o1+=8, o2+=8) 52386228Stmm bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2)); 52486228Stmm} 52586228Stmm 526104304Sjakestatic __inline uint8_t 527104304Sjakebus_space_read_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 528104304Sjake{ 52986228Stmm 530104304Sjake __BUS_DEBUG_ACCESS(h, o, "read stream", 1); 531108815Stmm return (lduba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type])); 532104304Sjake} 53386228Stmm 534104304Sjakestatic __inline uint16_t 535104304Sjakebus_space_read_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 536104304Sjake{ 53786228Stmm 538104304Sjake __BUS_DEBUG_ACCESS(h, o, "read stream", 2); 539108815Stmm return (lduha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type])); 540104304Sjake} 54186228Stmm 542104304Sjakestatic __inline uint32_t 543104304Sjakebus_space_read_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 544104304Sjake{ 54586228Stmm 546104304Sjake __BUS_DEBUG_ACCESS(h, o, "read stream", 4); 547108815Stmm return (lduwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type])); 548104304Sjake} 54986228Stmm 550104304Sjakestatic __inline uint64_t 551104304Sjakebus_space_read_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) 552104304Sjake{ 55386228Stmm 554104304Sjake __BUS_DEBUG_ACCESS(h, o, "read stream", 8); 555108815Stmm return (ldxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type])); 556104304Sjake} 55786228Stmm 558104304Sjakestatic __inline void 559104304Sjakebus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, 560104304Sjake bus_size_t o, uint8_t *a, size_t c) 561104304Sjake{ 56286228Stmm 563104304Sjake while (c-- > 0) 564104304Sjake *a++ = bus_space_read_stream_1(t, h, o); 565104304Sjake} 56686228Stmm 567104304Sjakestatic __inline void 568104304Sjakebus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, 569104304Sjake bus_size_t o, uint16_t *a, size_t c) 570104304Sjake{ 57186228Stmm 572104304Sjake while (c-- > 0) 573104304Sjake *a++ = bus_space_read_stream_2(t, h, o); 574104304Sjake} 57586228Stmm 576104304Sjakestatic __inline void 577104304Sjakebus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, 578104304Sjake bus_size_t o, uint32_t *a, size_t c) 579104304Sjake{ 58086228Stmm 581104304Sjake while (c-- > 0) 582104304Sjake *a++ = bus_space_read_stream_4(t, h, o); 583104304Sjake} 58486228Stmm 585104304Sjakestatic __inline void 586104304Sjakebus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, 587104304Sjake bus_size_t o, uint64_t *a, size_t c) 588104304Sjake{ 58986228Stmm 590104304Sjake while (c-- > 0) 591104304Sjake *a++ = bus_space_read_stream_8(t, h, o); 592104304Sjake} 59386228Stmm 594104304Sjakestatic __inline void 595104304Sjakebus_space_write_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 596104304Sjake uint8_t v) 597104304Sjake{ 59886228Stmm 599104304Sjake __BUS_DEBUG_ACCESS(h, o, "write stream", 1); 600108815Stmm stba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v); 601104304Sjake} 60286228Stmm 603104304Sjakestatic __inline void 604104304Sjakebus_space_write_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 605104304Sjake uint16_t v) 606104304Sjake{ 60786228Stmm 608104304Sjake __BUS_DEBUG_ACCESS(h, o, "write stream", 2); 609108815Stmm stha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v); 610104304Sjake} 61186228Stmm 61293052Stmmstatic __inline void 613104304Sjakebus_space_write_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 614104304Sjake uint32_t v) 615104304Sjake{ 616104304Sjake 617104304Sjake __BUS_DEBUG_ACCESS(h, o, "write stream", 4); 618108815Stmm stwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v); 619104304Sjake} 620104304Sjake 621104304Sjakestatic __inline void 622104304Sjakebus_space_write_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 623104304Sjake uint64_t v) 624104304Sjake{ 625104304Sjake 626104304Sjake __BUS_DEBUG_ACCESS(h, o, "write stream", 8); 627108815Stmm stxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v); 628104304Sjake} 629104304Sjake 630104304Sjakestatic __inline void 631104304Sjakebus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, 632111383Sobrien bus_size_t o, const uint8_t *a, size_t c) 633104304Sjake{ 634104304Sjake 635104304Sjake while (c-- > 0) 636104304Sjake bus_space_write_stream_1(t, h, o, *a++); 637104304Sjake} 638104304Sjake 639104304Sjakestatic __inline void 640104304Sjakebus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, 641111353Sobrien bus_size_t o, const uint16_t *a, size_t c) 642104304Sjake{ 643104304Sjake 644104304Sjake while (c-- > 0) 645104304Sjake bus_space_write_stream_2(t, h, o, *a++); 646104304Sjake} 647104304Sjake 648104304Sjakestatic __inline void 649104304Sjakebus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, 650111383Sobrien bus_size_t o, const uint32_t *a, size_t c) 651104304Sjake{ 652104304Sjake 653104304Sjake while (c-- > 0) 654104304Sjake bus_space_write_stream_4(t, h, o, *a++); 655104304Sjake} 656104304Sjake 657104304Sjakestatic __inline void 658104304Sjakebus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, 659111383Sobrien bus_size_t o, const uint64_t *a, size_t c) 660104304Sjake{ 661104304Sjake 662104304Sjake while (c-- > 0) 663104304Sjake bus_space_write_stream_8(t, h, o, *a++); 664104304Sjake} 665104304Sjake 666104304Sjakestatic __inline void 667104304Sjakebus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h, 668104304Sjake bus_size_t o, uint8_t v, size_t c) 669104304Sjake{ 670104304Sjake 671104304Sjake while (c-- > 0) 672104304Sjake bus_space_write_stream_1(t, h, o, v); 673104304Sjake} 674104304Sjake 675104304Sjakestatic __inline void 676104304Sjakebus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h, 677104304Sjake bus_size_t o, uint16_t v, size_t c) 678104304Sjake{ 679104304Sjake 680104304Sjake while (c-- > 0) 681104304Sjake bus_space_write_stream_2(t, h, o, v); 682104304Sjake} 683104304Sjake 684104304Sjakestatic __inline void 685104304Sjakebus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h, 686104304Sjake bus_size_t o, uint32_t v, size_t c) 687104304Sjake{ 688104304Sjake 689104304Sjake while (c-- > 0) 690104304Sjake bus_space_write_stream_4(t, h, o, v); 691104304Sjake} 692104304Sjake 693104304Sjakestatic __inline void 694104304Sjakebus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, 695104304Sjake bus_size_t o, uint64_t v, size_t c) 696104304Sjake{ 697104304Sjake 698104304Sjake while (c-- > 0) 699104304Sjake bus_space_write_stream_8(t, h, o, v); 700104304Sjake} 701104304Sjake 702104304Sjakestatic __inline void 70393052Stmmbus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, 70493052Stmm bus_size_t o, u_int8_t *a, bus_size_t c) 70586228Stmm{ 70686228Stmm for (; c; a++, c--, o++) 70786228Stmm *a = bus_space_read_stream_1(t, h, o); 70886228Stmm} 70986228Stmm 71093052Stmmstatic __inline void 71193052Stmmbus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, 71293052Stmm bus_size_t o, u_int16_t *a, bus_size_t c) 71386228Stmm{ 71486228Stmm for (; c; a++, c--, o+=2) 71586228Stmm *a = bus_space_read_stream_2(t, h, o); 71686228Stmm} 71786228Stmm 71893052Stmmstatic __inline void 71993052Stmmbus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, 72093052Stmm bus_size_t o, u_int32_t *a, bus_size_t c) 72186228Stmm{ 72286228Stmm for (; c; a++, c--, o+=4) 72386228Stmm *a = bus_space_read_stream_4(t, h, o); 72486228Stmm} 72586228Stmm 72693052Stmmstatic __inline void 72793052Stmmbus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, 72893052Stmm bus_size_t o, u_int64_t *a, bus_size_t c) 72986228Stmm{ 73086228Stmm for (; c; a++, c--, o+=8) 73186228Stmm *a = bus_space_read_stream_8(t, h, o); 73286228Stmm} 73386228Stmm 73493052Stmmstatic __inline void 73593052Stmmbus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, 73693052Stmm bus_size_t o, const u_int8_t *a, bus_size_t c) 73786228Stmm{ 73886228Stmm for (; c; a++, c--, o++) 73986228Stmm bus_space_write_stream_1(t, h, o, *a); 74086228Stmm} 74186228Stmm 74293052Stmmstatic __inline void 74393052Stmmbus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, 74493052Stmm bus_size_t o, const u_int16_t *a, bus_size_t c) 74586228Stmm{ 74686228Stmm for (; c; a++, c--, o+=2) 74786228Stmm bus_space_write_stream_2(t, h, o, *a); 74886228Stmm} 74986228Stmm 75093052Stmmstatic __inline void 75193052Stmmbus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, 75293052Stmm bus_size_t o, const u_int32_t *a, bus_size_t c) 75386228Stmm{ 75486228Stmm for (; c; a++, c--, o+=4) 75586228Stmm bus_space_write_stream_4(t, h, o, *a); 75686228Stmm} 75786228Stmm 75893052Stmmstatic __inline void 75993052Stmmbus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, 76093052Stmm bus_size_t o, const u_int64_t *a, bus_size_t c) 76186228Stmm{ 76286228Stmm for (; c; a++, c--, o+=8) 76386228Stmm bus_space_write_stream_8(t, h, o, *a); 76486228Stmm} 76586228Stmm 76693052Stmmstatic __inline void 76793052Stmmbus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, 76893052Stmm bus_size_t o, const u_int8_t v, bus_size_t c) 76986228Stmm{ 77086228Stmm for (; c; c--, o++) 77186228Stmm bus_space_write_stream_1(t, h, o, v); 77286228Stmm} 77386228Stmm 77493052Stmmstatic __inline void 77593052Stmmbus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, 77693052Stmm bus_size_t o, const u_int16_t v, bus_size_t c) 77786228Stmm{ 77886228Stmm for (; c; c--, o+=2) 77986228Stmm bus_space_write_stream_2(t, h, o, v); 78086228Stmm} 78186228Stmm 78293052Stmmstatic __inline void 78393052Stmmbus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, 78493052Stmm bus_size_t o, const u_int32_t v, bus_size_t c) 78586228Stmm{ 78686228Stmm for (; c; c--, o+=4) 78786228Stmm bus_space_write_stream_4(t, h, o, v); 78886228Stmm} 78986228Stmm 79093052Stmmstatic __inline void 79193052Stmmbus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, 79293052Stmm bus_size_t o, const u_int64_t v, bus_size_t c) 79386228Stmm{ 79486228Stmm for (; c; c--, o+=8) 79586228Stmm bus_space_write_stream_8(t, h, o, v); 79686228Stmm} 79786228Stmm 79893052Stmmstatic __inline void 79993052Stmmbus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1, 80093052Stmm bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 80186228Stmm{ 80286228Stmm for (; c; c--, o1++, o2++) 80386228Stmm bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2, 80486228Stmm o2)); 80586228Stmm} 80686228Stmm 80793052Stmmstatic __inline void 80893052Stmmbus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1, 80993052Stmm bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 81086228Stmm{ 81186228Stmm for (; c; c--, o1+=2, o2+=2) 81286228Stmm bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2, 81386228Stmm o2)); 81486228Stmm} 81586228Stmm 81693052Stmmstatic __inline void 81793052Stmmbus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1, 81893052Stmm bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 81986228Stmm{ 82086228Stmm for (; c; c--, o1+=4, o2+=4) 82186228Stmm bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2, 82286228Stmm o2)); 82386228Stmm} 82486228Stmm 82593052Stmmstatic __inline void 82693052Stmmbus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1, 82793052Stmm bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 82886228Stmm{ 82986228Stmm for (; c; c--, o1+=8, o2+=8) 83086228Stmm bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2)); 83186228Stmm} 83286228Stmm 833116659Sjmgstatic __inline int 834116659Sjmgbus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 835116659Sjmg u_int8_t *a) 836116659Sjmg{ 837116659Sjmg 838116659Sjmg __BUS_DEBUG_ACCESS(h, o, "peek", 1); 839116659Sjmg return (fasword8(bus_type_asi[t->bst_type], (caddr_t)(h + o), a)); 840116659Sjmg} 841116659Sjmg 842116659Sjmgstatic __inline int 843116659Sjmgbus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 844116659Sjmg u_int16_t *a) 845116659Sjmg{ 846116659Sjmg 847116659Sjmg __BUS_DEBUG_ACCESS(h, o, "peek", 2); 848116659Sjmg return (fasword16(bus_type_asi[t->bst_type], (caddr_t)(h + o), a)); 849116659Sjmg} 850116659Sjmg 851116659Sjmgstatic __inline int 852116659Sjmgbus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 853116659Sjmg u_int32_t *a) 854116659Sjmg{ 855116659Sjmg 856116659Sjmg __BUS_DEBUG_ACCESS(h, o, "peek", 4); 857116659Sjmg return (fasword32(bus_type_asi[t->bst_type], (caddr_t)(h + o), a)); 858116659Sjmg} 859116659Sjmg 86086228Stmm/* Back-compat functions for old ISA drivers */ 86186228Stmmextern bus_space_tag_t isa_io_bt; 86286228Stmmextern bus_space_handle_t isa_io_hdl; 86386228Stmmextern bus_space_tag_t isa_mem_bt; 86486228Stmmextern bus_space_handle_t isa_mem_hdl; 86586228Stmm 86686228Stmm#define inb(o) bus_space_read_1(isa_io_bt, isa_io_hdl, o) 86786228Stmm#define inw(o) bus_space_read_2(isa_io_bt, isa_io_hdl, o) 86886228Stmm#define inl(o) bus_space_read_4(isa_io_bt, isa_io_hdl, o) 86990615Stmm#define outb(o, v) bus_space_write_1(isa_io_bt, isa_io_hdl, o, v) 87086228Stmm#define outw(o, v) bus_space_write_2(isa_io_bt, isa_io_hdl, o, v) 87186228Stmm#define outl(o, v) bus_space_write_4(isa_io_bt, isa_io_hdl, o, v) 87286228Stmm 87386228Stmm#define readb(o) bus_space_read_1(isa_mem_bt, isa_mem_hdl, o) 87486228Stmm#define readw(o) bus_space_read_2(isa_mem_bt, isa_mem_hdl, o) 87586228Stmm#define readl(o) bus_space_read_4(isa_mem_bt, isa_mem_hdl, o) 87686228Stmm#define writeb(o, v) bus_space_write_1(isa_mem_bt, isa_mem_hdl, o, v) 87786228Stmm#define writew(o, v) bus_space_write_2(isa_mem_bt, isa_mem_hdl, o, v) 87886228Stmm#define writel(o, v) bus_space_write_4(isa_mem_bt, isa_mem_hdl, o, v) 87986228Stmm 88086228Stmm#define insb(o, a, c) \ 88186228Stmm bus_space_read_multi_1(isa_io_bt, isa_io_hdl, o, (void*)a, c) 88286228Stmm#define insw(o, a, c) \ 88386228Stmm bus_space_read_multi_2(isa_io_bt, isa_io_hdl, o, (void*)a, c) 88486228Stmm#define insl(o, a, c) \ 88586228Stmm bus_space_read_multi_4(isa_io_bt, isa_io_hdl, o, (void*)a, c) 88686228Stmm#define outsb(o, a, c) \ 88786228Stmm bus_space_write_multi_1(isa_io_bt, isa_io_hdl, o, (void*)a, c) 88886228Stmm#define outsw(o, a, c) \ 88986228Stmm bus_space_write_multi_2(isa_io_bt, isa_io_hdl, o, (void*)a, c) 89086228Stmm#define outsl(o, a, c) \ 89186228Stmm bus_space_write_multi_4(isa_io_bt, isa_io_hdl, o, (void*)a, c) 89286228Stmm 89386228Stmm#define memcpy_fromio(d, s, c) \ 89486228Stmm bus_space_read_region_1(isa_mem_bt, isa_mem_hdl, s, d, c) 89586228Stmm#define memcpy_toio(d, s, c) \ 89686228Stmm bus_space_write_region_1(isa_mem_bt, isa_mem_hdl, d, s, c) 89786228Stmm#define memcpy_io(d, s, c) \ 89886228Stmm bus_space_copy_region_1(isa_mem_bt, isa_mem_hdl, s, isa_mem_hdl, d, c) 89986228Stmm#define memset_io(d, v, c) \ 90086228Stmm bus_space_set_region_1(isa_mem_bt, isa_mem_hdl, d, v, c) 90186228Stmm#define memsetw_io(d, v, c) \ 90286228Stmm bus_space_set_region_2(isa_mem_bt, isa_mem_hdl, d, v, c) 90386228Stmm 90486228Stmmstatic __inline void 90586228Stmmmemsetw(void *d, int val, size_t size) 90686228Stmm{ 90786228Stmm u_int16_t *sp = d; 90886228Stmm 90986228Stmm while (size--) 91086228Stmm *sp++ = val; 91186228Stmm} 91286228Stmm 91386228Stmm/* DMA support */ 91486228Stmm 91586228Stmm/* 91686228Stmm * Flags used in various bus DMA methods. 91786228Stmm */ 91886228Stmm#define BUS_DMA_WAITOK 0x000 /* safe to sleep (pseudo-flag) */ 91986228Stmm#define BUS_DMA_NOWAIT 0x001 /* not safe to sleep */ 92086228Stmm#define BUS_DMA_ALLOCNOW 0x002 /* perform resource allocation now */ 921115416Shmp#define BUS_DMA_COHERENT 0x004 /* hint: map memory in a coherent way */ 922118081Smux#define BUS_DMA_ZERO 0x008 /* allocate zero'ed memory */ 92390615Stmm#define BUS_DMA_BUS1 0x010 92486228Stmm#define BUS_DMA_BUS2 0x020 92586228Stmm#define BUS_DMA_BUS3 0x040 92686228Stmm#define BUS_DMA_BUS4 0x080 92786228Stmm 928117390Stmm/* The following two flags are non-standard. */ 929117390Stmm#define BUS_DMA_NOWRITE 0x100 930117390Stmm#define BUS_DMA_NOCACHE 0x200 93186228Stmm 93286228Stmm/* Forwards needed by prototypes below. */ 93386228Stmmstruct mbuf; 93486228Stmmstruct uio; 93586228Stmm 936115343Sscottltypedef int bus_dmasync_op_t; 937113347Smux#define BUS_DMASYNC_PREREAD 1 938113347Smux#define BUS_DMASYNC_POSTREAD 2 939113347Smux#define BUS_DMASYNC_PREWRITE 4 940113347Smux#define BUS_DMASYNC_POSTWRITE 8 94186228Stmm 94286228Stmm/* 94386228Stmm * A function that returns 1 if the address cannot be accessed by 94486228Stmm * a device and 0 if it can be. 94586228Stmm */ 94686228Stmmtypedef int bus_dma_filter_t(void *, bus_addr_t); 94786228Stmm 94886228Stmmtypedef struct bus_dma_tag *bus_dma_tag_t; 94986228Stmmtypedef struct bus_dmamap *bus_dmamap_t; 95086228Stmm 95186228Stmmstruct bus_dma_segment { 95286228Stmm bus_addr_t ds_addr; /* DVMA address */ 95386228Stmm bus_size_t ds_len; /* length of transfer */ 95486228Stmm}; 95586228Stmmtypedef struct bus_dma_segment bus_dma_segment_t; 95686228Stmm 95786228Stmm/* 95886228Stmm * A function that processes a successfully loaded dma map or an error 95986228Stmm * from a delayed load map. 96086228Stmm */ 96186228Stmmtypedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int); 96286228Stmm 96386228Stmm/* 964104486Ssam * Like bus_dmamap_callback but includes map size in bytes. This is 965104486Ssam * defined as a separate interface to maintain compatiiblity for users 966104486Ssam * of bus_dmamap_callback_t--at some point these interfaces should be merged. 967104486Ssam */ 968104486Ssamtypedef void bus_dmamap_callback2_t(void *, bus_dma_segment_t *, int, bus_size_t, int); 969104486Ssam 970104486Ssam/* 971117126Sscottl * A function that performs driver-specific syncronization on behalf of 972117126Sscottl * busdma. 973117126Sscottl */ 974117126Sscottltypedef enum { 975117126Sscottl BUS_DMA_LOCK = 0x01, 976117126Sscottl BUS_DMA_UNLOCK = 0x02, 977117126Sscottl} bus_dma_lock_op_t; 978117126Sscottl 979117126Sscottltypedef void bus_dma_lock_t(void *, bus_dma_lock_op_t); 980117126Sscottl 981117126Sscottl/* 982116541Stmm * Method table for a bus_dma_tag. 983116541Stmm */ 984116541Stmmstruct bus_dma_methods { 985116541Stmm int (*dm_dmamap_create)(bus_dma_tag_t, int, bus_dmamap_t *); 986116541Stmm int (*dm_dmamap_destroy)(bus_dma_tag_t, bus_dmamap_t); 987116541Stmm int (*dm_dmamap_load)(bus_dma_tag_t, bus_dmamap_t, void *, 988116541Stmm bus_size_t, bus_dmamap_callback_t *, void *, int); 989116541Stmm int (*dm_dmamap_load_mbuf)(bus_dma_tag_t, bus_dmamap_t, 990116541Stmm struct mbuf *, bus_dmamap_callback2_t *, void *, int); 991116541Stmm int (*dm_dmamap_load_uio)(bus_dma_tag_t, bus_dmamap_t, struct uio *, 992116541Stmm bus_dmamap_callback2_t *, void *, int); 993116541Stmm void (*dm_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t); 994116541Stmm void (*dm_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t, 995116541Stmm bus_dmasync_op_t); 996116541Stmm int (*dm_dmamem_alloc)(bus_dma_tag_t, void **, int, bus_dmamap_t *); 997116541Stmm void (*dm_dmamem_free)(bus_dma_tag_t, void *, bus_dmamap_t); 998116541Stmm}; 999116541Stmm 1000116541Stmm/* 1001116541Stmm * bus_dma_tag_t 100286228Stmm * 1003116541Stmm * A machine-dependent opaque type describing the implementation of 1004116541Stmm * DMA for a given bus. 100586228Stmm */ 100686228Stmmstruct bus_dma_tag { 1007108815Stmm void *dt_cookie; /* cookie used in the guts */ 1008108815Stmm bus_dma_tag_t dt_parent; 1009108815Stmm bus_size_t dt_alignment; 1010108815Stmm bus_size_t dt_boundary; 1011108815Stmm bus_addr_t dt_lowaddr; 1012108815Stmm bus_addr_t dt_highaddr; 1013108815Stmm bus_dma_filter_t *dt_filter; 1014108815Stmm void *dt_filterarg; 1015108815Stmm bus_size_t dt_maxsize; 1016108815Stmm int dt_nsegments; 1017108815Stmm bus_size_t dt_maxsegsz; 1018108815Stmm int dt_flags; 1019108815Stmm int dt_ref_count; 1020108815Stmm int dt_map_count; 1021117126Sscottl bus_dma_lock_t *dt_lockfunc; 1022117126Sscottl void * *dt_lockfuncarg; 102386228Stmm 1024116541Stmm struct bus_dma_methods *dt_mt; 102586228Stmm}; 102686228Stmm 102786228Stmmint bus_dma_tag_create(bus_dma_tag_t, bus_size_t, bus_size_t, bus_addr_t, 102893052Stmm bus_addr_t, bus_dma_filter_t *, void *, bus_size_t, int, bus_size_t, 1029117126Sscottl int, bus_dma_lock_t *, void *, bus_dma_tag_t *); 103086228Stmm 103186228Stmmint bus_dma_tag_destroy(bus_dma_tag_t); 103286228Stmm 103386228Stmm#define bus_dmamap_create(t, f, p) \ 1034116541Stmm ((t)->dt_mt->dm_dmamap_create((t), (f), (p))) 103586228Stmm#define bus_dmamap_destroy(t, p) \ 1036116541Stmm ((t)->dt_mt->dm_dmamap_destroy((t), (p))) 103786228Stmm#define bus_dmamap_load(t, m, p, s, cb, cba, f) \ 1038116541Stmm ((t)->dt_mt->dm_dmamap_load((t), (m), (p), (s), (cb), (cba), (f))) 1039116541Stmm#define bus_dmamap_load_mbuf(t, m, mb, cb, cba, f) \ 1040116541Stmm ((t)->dt_mt->dm_dmamap_load_mbuf((t), (m), (mb), (cb), (cba), (f))) 1041116541Stmm#define bus_dmamap_load_uio(t, m, ui, cb, cba, f) \ 1042116541Stmm ((t)->dt_mt->dm_dmamap_load_uio((t), (m), (ui), (cb), (cba), (f))) 104386228Stmm#define bus_dmamap_unload(t, p) \ 1044116541Stmm ((t)->dt_mt->dm_dmamap_unload((t), (p))) 104586228Stmm#define bus_dmamap_sync(t, m, op) \ 1046116541Stmm ((t)->dt_mt->dm_dmamap_sync((t), (m), (op))) 104786228Stmm#define bus_dmamem_alloc(t, v, f, m) \ 1048116541Stmm ((t)->dt_mt->dm_dmamem_alloc((t), (v), (f), (m))) 104986228Stmm#define bus_dmamem_free(t, v, m) \ 1050116541Stmm ((t)->dt_mt->dm_dmamem_free((t), (v), (m))) 105186228Stmm 1052117126Sscottl/* 1053117126Sscottl * Generic helper function for manipulating mutexes. 1054117126Sscottl */ 1055117126Sscottlvoid busdma_lock_mutex(void *arg, bus_dma_lock_op_t op); 105680708Sjake#endif /* !_MACHINE_BUS_H_ */ 1057