Index: evbmips/conf/files.malta =================================================================== RCS file: /cvsroot/src/sys/arch/evbmips/conf/files.malta,v retrieving revision 1.9 diff -d -p -u -r1.9 files.malta --- evbmips/conf/files.malta 13 Mar 2004 17:31:33 -0000 1.9 +++ evbmips/conf/files.malta 25 Nov 2005 13:56:05 -0000 @@ -10,6 +10,7 @@ file arch/evbmips/malta/leds.c file arch/evbmips/malta/machdep.c file arch/mips/mips/bus_dma.c +file arch/mips/mips/bus_space.c file arch/evbmips/evbmips/clock.c file arch/evbmips/evbmips/disksubr.c file arch/evbmips/evbmips/interrupt.c Index: evbmips/conf/files.pb1000 =================================================================== RCS file: /cvsroot/src/sys/arch/evbmips/conf/files.pb1000,v retrieving revision 1.8 diff -d -p -u -r1.8 files.pb1000 --- evbmips/conf/files.pb1000 25 Oct 2003 22:34:57 -0000 1.8 +++ evbmips/conf/files.pb1000 25 Nov 2005 13:56:05 -0000 @@ -6,6 +6,7 @@ file arch/evbmips/alchemy/autoconf.c file arch/evbmips/alchemy/machdep.c file arch/mips/mips/bus_dma.c +file arch/mips/mips/bus_space.c file arch/evbmips/evbmips/clock.c file arch/evbmips/evbmips/disksubr.c file arch/evbmips/evbmips/interrupt.c Index: mips/include/bus_space.h =================================================================== RCS file: /cvsroot/src/sys/arch/mips/include/bus_space.h,v retrieving revision 1.2 diff -d -p -u -r1.2 bus_space.h --- mips/include/bus_space.h 18 Mar 2002 01:01:54 -0000 1.2 +++ mips/include/bus_space.h 25 Nov 2005 13:56:06 -0000 @@ -1,7 +1,7 @@ /* $NetBSD: bus_space.h,v 1.2 2002/03/18 01:01:54 simonb Exp $ */ /*- - * Copyright (c) 1997, 1998, 2000, 2001 The NetBSD Foundation, Inc. + * Copyright (c) 1997, 1998, 2000, 2001, 2005 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -78,30 +78,10 @@ #endif #ifdef BUS_SPACE_DEBUG -#include /* for printf() prototype */ -/* - * Macros for checking the aligned-ness of pointers passed to bus - * space ops. Strict alignment is required by the MIPS architecture, - * and a trap will occur if unaligned access is performed. These - * may aid in the debugging of a broken device driver by displaying - * useful information about the problem. - */ #define __BUS_SPACE_ALIGNED_ADDRESS(p, t) \ ((((u_long)(p)) & (sizeof(t)-1)) == 0) - -#define __BUS_SPACE_ADDRESS_SANITY(p, t, d) \ -({ \ - if (__BUS_SPACE_ALIGNED_ADDRESS((p), t) == 0) { \ - printf("%s 0x%lx not aligned to %lu bytes %s:%d\n", \ - d, (u_long)(p), (u_long)sizeof(t), \ - __FILE__, __LINE__); \ - } \ - (void) 0; \ -}) - #define BUS_SPACE_ALIGNED_POINTER(p, t) __BUS_SPACE_ALIGNED_ADDRESS(p, t) #else -#define __BUS_SPACE_ADDRESS_SANITY(p, t, d) (void) 0 #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) #endif /* BUS_SPACE_DEBUG */ #endif /* _KERNEL */ @@ -255,60 +235,18 @@ struct mips_bus_space_translation { #ifdef _KERNEL /* - * Utility macros; INTERNAL USE ONLY. - */ -#define __bs_c(a,b) __CONCAT(a,b) -#define __bs_opname(op,size) __bs_c(__bs_c(__bs_c(bs_,op),_),size) - -#define __bs_rs(sz, tn, t, h, o) \ - (__BUS_SPACE_ADDRESS_SANITY((h) + (o), tn, "bus addr"), \ - (*(t)->__bs_opname(r,sz))((t)->bs_cookie, h, o)) - -#define __bs_ws(sz, tn, t, h, o, v) \ -do { \ - __BUS_SPACE_ADDRESS_SANITY((h) + (o), tn, "bus addr"); \ - (*(t)->__bs_opname(w,sz))((t)->bs_cookie, h, o, v); \ -} while (0) - -#define __bs_nonsingle(type, sz, tn, t, h, o, a, c) \ -do { \ - __BUS_SPACE_ADDRESS_SANITY((a), tn, "buffer"); \ - __BUS_SPACE_ADDRESS_SANITY((h) + (o), tn, "bus addr"); \ - (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, a, c); \ -} while (0) - -#define __bs_set(type, sz, tn, t, h, o, v, c) \ -do { \ - __BUS_SPACE_ADDRESS_SANITY((h) + (o), tn, "bus addr"); \ - (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, v, c); \ -} while (0) - -#define __bs_copy(sz, tn, t, h1, o1, h2, o2, cnt) \ -do { \ - __BUS_SPACE_ADDRESS_SANITY((h1) + (o1), tn, "bus addr 1"); \ - __BUS_SPACE_ADDRESS_SANITY((h2) + (o2), tn, "bus addr 2"); \ - (*(t)->__bs_opname(c,sz))((t)->bs_cookie, h1, o1, h2, o2, cnt); \ -} while (0) - - -/* * Mapping and unmapping operations. */ -#define bus_space_map(t, a, s, f, hp) \ - (*(t)->bs_map)((t)->bs_cookie, (a), (s), (f), (hp), 1) -#define mips_bus_space_map_noacct(t, a, s, f, hp) \ - (*(t)->bs_map)((t)->bs_cookie, (a), (s), (f), (hp), 0) -#define bus_space_unmap(t, h, s) \ - (*(t)->bs_unmap)((t)->bs_cookie, (h), (s), 1) -#define mips_bus_space_unmap_noacct(t, h, s) \ - (*(t)->bs_unmap)((t)->bs_cookie, (h), (s), 0) -#define bus_space_subregion(t, h, o, s, hp) \ - (*(t)->bs_subregion)((t)->bs_cookie, (h), (o), (s), (hp)) +int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, int, + bus_space_handle_t *); +void bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); +int bus_space_subregion(bus_space_tag_t, bus_space_handle_t, bus_size_t, + bus_size_t, bus_space_handle_t *); -#define mips_bus_space_translate(t, a, s, f, bst) \ - (*(t)->bs_translate)((t)->bs_cookie, (a), (s), (f), (bst)) -#define mips_bus_space_get_window(t, w, bst) \ - (*(t)->bs_get_window)((t)->bs_cookie, (w), (bst)) +int mips_bus_space_translate(bus_space_tag_t, bus_addr_t, bus_size_t, int, + struct mips_bus_space_translation *); +int mips_bus_space_get_window(bus_space_tag_t, int, + struct mips_bus_space_translation *); #endif /* _KERNEL */ #define BUS_SPACE_MAP_CACHEABLE 0x01 @@ -319,29 +257,25 @@ do { \ /* * Allocation and deallocation operations. */ -#define bus_space_alloc(t, rs, re, s, a, b, f, ap, hp) \ - (*(t)->bs_alloc)((t)->bs_cookie, (rs), (re), (s), (a), (b), \ - (f), (ap), (hp)) -#define bus_space_free(t, h, s) \ - (*(t)->bs_free)((t)->bs_cookie, (h), (s)) +int bus_space_alloc(bus_space_tag_t, bus_addr_t, bus_addr_t, bus_size_t, + bus_size_t, bus_size_t, int, bus_addr_t *, bus_space_handle_t *); +void bus_space_free(bus_space_tag_t, bus_space_handle_t, bus_size_t); /* * Get kernel virtual address for ranges mapped BUS_SPACE_MAP_LINEAR. */ -#define bus_space_vaddr(t, h) \ - (*(t)->bs_vaddr)((t)->bs_cookie, (h)) +void *bus_space_vaddr(bus_space_tag_t, bus_space_handle_t); /* * Mmap bus space for a user application. */ -#define bus_space_mmap(t, a, o, p, f) \ - (*(t)->bs_mmap)((t)->bs_cookie, (a), (o), (p), (f)) +paddr_t bus_space_mmap(bus_space_tag_t, bus_addr_t, off_t, int, int); /* * Bus barrier operations. */ -#define bus_space_barrier(t, h, o, l, f) \ - (*(t)->bs_barrier)((t)->bs_cookie, (h), (o), (l), (f)) +void bus_space_barrier(bus_space_tag_t, bus_space_handle_t, bus_size_t, + bus_size_t, int); #define BUS_SPACE_BARRIER_READ 0x01 #define BUS_SPACE_BARRIER_WRITE 0x02 @@ -350,110 +284,114 @@ do { \ /* * Bus read (single) operations. */ -#define bus_space_read_1(t, h, o) __bs_rs(1,uint8_t,(t),(h),(o)) -#define bus_space_read_2(t, h, o) __bs_rs(2,uint16_t,(t),(h),(o)) -#define bus_space_read_4(t, h, o) __bs_rs(4,uint32_t,(t),(h),(o)) -#define bus_space_read_8(t, h, o) __bs_rs(8,uint64_t,(t),(h),(o)) +uint8_t bus_space_read_1(bus_space_tag_t, bus_space_handle_t, bus_size_t); +u_int16_t bus_space_read_2(bus_space_tag_t, bus_space_handle_t, bus_size_t); +u_int32_t bus_space_read_4(bus_space_tag_t, bus_space_handle_t, bus_size_t); +u_int64_t bus_space_read_8(bus_space_tag_t, bus_space_handle_t, bus_size_t); /* * Bus read multiple operations. */ -#define bus_space_read_multi_1(t, h, o, a, c) \ - __bs_nonsingle(rm,1,uint8_t,(t),(h),(o),(a),(c)) -#define bus_space_read_multi_2(t, h, o, a, c) \ - __bs_nonsingle(rm,2,uint16_t,(t),(h),(o),(a),(c)) -#define bus_space_read_multi_4(t, h, o, a, c) \ - __bs_nonsingle(rm,4,uint32_t,(t),(h),(o),(a),(c)) -#define bus_space_read_multi_8(t, h, o, a, c) \ - __bs_nonsingle(rm,8,uint64_t,(t),(h),(o),(a),(c)) +void bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); +void bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); +void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int32_t *, bus_size_t); +void bus_space_read_multi_8(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int64_t *, bus_size_t); /* * Bus read region operations. */ -#define bus_space_read_region_1(t, h, o, a, c) \ - __bs_nonsingle(rr,1,uint8_t,(t),(h),(o),(a),(c)) -#define bus_space_read_region_2(t, h, o, a, c) \ - __bs_nonsingle(rr,2,uint16_t,(t),(h),(o),(a),(c)) -#define bus_space_read_region_4(t, h, o, a, c) \ - __bs_nonsingle(rr,4,uint32_t,(t),(h),(o),(a),(c)) -#define bus_space_read_region_8(t, h, o, a, c) \ - __bs_nonsingle(rr,8,uint64_t,(t),(h),(o),(a),(c)) +void bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); +void bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); +void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int32_t *, bus_size_t); +void bus_space_read_region_8(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int64_t *, bus_size_t); /* * Bus write (single) operations. */ -#define bus_space_write_1(t, h, o, v) __bs_ws(1,uint8_t,(t),(h),(o),(v)) -#define bus_space_write_2(t, h, o, v) __bs_ws(2,uint16_t,(t),(h),(o),(v)) -#define bus_space_write_4(t, h, o, v) __bs_ws(4,uint32_t,(t),(h),(o),(v)) -#define bus_space_write_8(t, h, o, v) __bs_ws(8,uint64_t,(t),(h),(o),(v)) +void bus_space_write_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int8_t); +void bus_space_write_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int16_t); +void bus_space_write_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int32_t); +void bus_space_write_8(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int64_t); /* * Bus write multiple operations. */ -#define bus_space_write_multi_1(t, h, o, a, c) \ - __bs_nonsingle(wm,1,uint8_t,(t),(h),(o),(a),(c)) -#define bus_space_write_multi_2(t, h, o, a, c) \ - __bs_nonsingle(wm,2,uint16_t,(t),(h),(o),(a),(c)) -#define bus_space_write_multi_4(t, h, o, a, c) \ - __bs_nonsingle(wm,4,uint32_t,(t),(h),(o),(a),(c)) -#define bus_space_write_multi_8(t, h, o, a, c) \ - __bs_nonsingle(wm,8,uint64_t,(t),(h),(o),(a),(c)) +void bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, + const u_int8_t *, bus_size_t); +void bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, + const u_int16_t *, bus_size_t); +void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, + const u_int32_t *, bus_size_t); +void bus_space_write_multi_8(bus_space_tag_t, bus_space_handle_t, bus_size_t, + const u_int64_t *, bus_size_t); /* * Bus write region operations. */ -#define bus_space_write_region_1(t, h, o, a, c) \ - __bs_nonsingle(wr,1,uint8_t,(t),(h),(o),(a),(c)) -#define bus_space_write_region_2(t, h, o, a, c) \ - __bs_nonsingle(wr,2,uint16_t,(t),(h),(o),(a),(c)) -#define bus_space_write_region_4(t, h, o, a, c) \ - __bs_nonsingle(wr,4,uint32_t,(t),(h),(o),(a),(c)) -#define bus_space_write_region_8(t, h, o, a, c) \ - __bs_nonsingle(wr,8,uint64_t,(t),(h),(o),(a),(c)) +void bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); +void bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); +void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); +void bus_space_write_region_8(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int64_t *, bus_size_t); /* * Set multiple operations. */ -#define bus_space_set_multi_1(t, h, o, v, c) \ - __bs_set(sm,1,uint8_t,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_2(t, h, o, v, c) \ - __bs_set(sm,2,uint16_t,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_4(t, h, o, v, c) \ - __bs_set(sm,4,uint32_t,(t),(h),(o),(v),(c)) -#define bus_space_set_multi_8(t, h, o, v, c) \ - __bs_set(sm,8,uint64_t,(t),(h),(o),(v),(c)) +void bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int8_t, bus_size_t); +void bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int16_t, bus_size_t); +void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int32_t, bus_size_t); +void bus_space_set_multi_8(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int64_t, bus_size_t); /* * Set region operations. */ -#define bus_space_set_region_1(t, h, o, v, c) \ - __bs_set(sr,1,uint8_t,(t),(h),(o),(v),(c)) -#define bus_space_set_region_2(t, h, o, v, c) \ - __bs_set(sr,2,uint16_t,(t),(h),(o),(v),(c)) -#define bus_space_set_region_4(t, h, o, v, c) \ - __bs_set(sr,4,uint32_t,(t),(h),(o),(v),(c)) -#define bus_space_set_region_8(t, h, o, v, c) \ - __bs_set(sr,8,uint64_t,(t),(h),(o),(v),(c)) +void bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int8_t, bus_size_t); +void bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int16_t, bus_size_t); +void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int32_t, bus_size_t); +void bus_space_set_region_8(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int64_t, bus_size_t); /* * Copy region operations. */ -#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ - __bs_copy(1, uint8_t, (t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ - __bs_copy(2, uint16_t, (t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ - __bs_copy(4, uint32_t, (t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ - __bs_copy(8, uint64_t, (t), (h1), (o1), (h2), (o2), (c)) +void bus_space_copy_region_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, bus_size_t); +void bus_space_copy_region_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, bus_size_t); +void bus_space_copy_region_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, bus_size_t); +void bus_space_copy_region_8(bus_space_tag_t, bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, bus_size_t); /* * Bus stream operations--defined in terms of non-stream counterparts Index: mips/mips/bus_space.c =================================================================== RCS file: mips/mips/bus_space.c diff -N mips/mips/bus_space.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ mips/mips/bus_space.c 25 Nov 2005 13:56:07 -0000 @@ -0,0 +1,516 @@ +/* $NetBSD$ */ + +/*- + * Copyright (c) 1997, 1998, 2000, 2001, 2005 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include +__KERNEL_RCSID(0, "$NetBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#ifdef BUS_SPACE_DEBUG +/* + * Macros for checking the aligned-ness of pointers passed to bus + * space ops. Strict alignment is required by the MIPS architecture, + * and a trap will occur if unaligned access is performed. These + * may aid in the debugging of a broken device driver by displaying + * useful information about the problem. + */ +#define __BUS_SPACE_ADDRESS_SANITY(p, t, d) \ +({ \ + if (__BUS_SPACE_ALIGNED_ADDRESS((p), t) == 0) { \ + printf("%s 0x%lx not aligned to %lu bytes %s:%d\n", \ + d, (u_long)(p), (u_long)sizeof(t), \ + __FILE__, __LINE__); \ + } \ + (void) 0; \ +}) + +#else +#define __BUS_SPACE_ADDRESS_SANITY(p, t, d) (void) 0 +#endif /* BUS_SPACE_DEBUG */ + +/* + * Utility macros. + */ +#define __bs_c(a,b) __CONCAT(a,b) +#define __bs_opname(op,size) __bs_c(__bs_c(__bs_c(bs_,op),_),size) + +#define __bs_rs(sz, tn, t, h, o) \ + (__BUS_SPACE_ADDRESS_SANITY((h) + (o), tn, "bus addr"), \ + (*(t)->__bs_opname(r,sz))((t)->bs_cookie, h, o)) + +#define __bs_ws(sz, tn, t, h, o, v) \ +do { \ + __BUS_SPACE_ADDRESS_SANITY((h) + (o), tn, "bus addr"); \ + (*(t)->__bs_opname(w,sz))((t)->bs_cookie, h, o, v); \ +} while (0) + +#define __bs_nonsingle(type, sz, tn, t, h, o, a, c) \ +do { \ + __BUS_SPACE_ADDRESS_SANITY((a), tn, "buffer"); \ + __BUS_SPACE_ADDRESS_SANITY((h) + (o), tn, "bus addr"); \ + (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, a, c); \ +} while (0) + +#define __bs_set(type, sz, tn, t, h, o, v, c) \ +do { \ + __BUS_SPACE_ADDRESS_SANITY((h) + (o), tn, "bus addr"); \ + (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, v, c); \ +} while (0) + +#define __bs_copy(sz, tn, t, h1, o1, h2, o2, cnt) \ +do { \ + __BUS_SPACE_ADDRESS_SANITY((h1) + (o1), tn, "bus addr 1"); \ + __BUS_SPACE_ADDRESS_SANITY((h2) + (o2), tn, "bus addr 2"); \ + (*(t)->__bs_opname(c,sz))((t)->bs_cookie, h1, o1, h2, o2, cnt); \ +} while (0) + + +int +bus_space_map(bus_space_tag_t space, bus_addr_t address, bus_size_t size, + int flags, bus_space_handle_t *handlep) +{ + + return (*space->bs_map)(space->bs_cookie, address, size, flags, handlep, + 1); +} + +void +bus_space_unmap(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t size) +{ + + (*space->bs_unmap)(space->bs_cookie, handle, size, 1); +} + +int +bus_space_subregion(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, bus_size_t size, bus_space_handle_t *handlep) +{ + + return (*space->bs_subregion)(space->bs_cookie, handle, offset, size, + handlep); +} + +int +mips_bus_space_translate(bus_space_tag_t space, bus_addr_t addr, + bus_size_t size, int flags, struct mips_bus_space_translation *bst) +{ + + return (*space->bs_translate)(space->bs_cookie, addr, size, flags, bst); +} + +int +mips_bus_space_get_window(bus_space_tag_t space, int window, + struct mips_bus_space_translation *bst) +{ + + return (*space->bs_get_window)(space->bs_cookie, window, bst); +} + +int +bus_space_alloc(bus_space_tag_t space, bus_addr_t reg_start, bus_addr_t reg_end, + bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, + bus_addr_t *addrp, bus_space_handle_t *handlep) +{ + + return (*space->bs_alloc)(space->bs_cookie, reg_start, reg_end, size, + alignment, boundary, flags, addrp, handlep); +} + +void +bus_space_free(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t size) +{ + + (*space->bs_free)(space->bs_cookie, handle, size); +} + +void * +bus_space_vaddr(bus_space_tag_t space, bus_space_handle_t handle) +{ + + return (*space->bs_vaddr)(space->bs_cookie, handle); +} + +paddr_t +bus_space_mmap(bus_space_tag_t space, bus_addr_t addr, off_t off, int prot, + int flags) +{ + + return (*space->bs_mmap)(space->bs_cookie, addr, off, prot, flags); +} + +void +bus_space_barrier(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, bus_size_t length, int flags) +{ + + (*space->bs_barrier)(space->bs_cookie, handle, offset, length, flags); +} + +u_int8_t +bus_space_read_1(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset) +{ + + return __bs_rs(1,uint8_t,space,handle,offset); +} + +u_int16_t +bus_space_read_2(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset) +{ + + return __bs_rs(2,uint16_t,space,handle,offset); +} + +u_int32_t +bus_space_read_4(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset) +{ + + return __bs_rs(4,uint32_t,space,handle,offset); +} + +u_int64_t +bus_space_read_8(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset) +{ + + return __bs_rs(8,uint64_t,space,handle,offset); +} + +void +bus_space_read_multi_1(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int8_t *datap, bus_size_t count) +{ + + __bs_nonsingle(rm,1,uint8_t,space,handle,offset,datap,count); +} + +void +bus_space_read_multi_2(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int16_t *datap, bus_size_t count) +{ + + __bs_nonsingle(rm,2,uint16_t,space,handle,offset,datap,count); +} + +void +bus_space_read_multi_4(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int32_t *datap, bus_size_t count) +{ + + __bs_nonsingle(rm,4,uint32_t,space,handle,offset,datap,count); +} + +void +bus_space_read_multi_8(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int64_t *datap, bus_size_t count) +{ + + __bs_nonsingle(rm,8,uint64_t,space,handle,offset,datap,count); +} + +void +bus_space_read_region_1(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int8_t *datap, bus_size_t count) +{ + + __bs_nonsingle(rr,1,uint8_t,space,handle,offset,datap,count); +} + +void +bus_space_read_region_2(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int16_t *datap, bus_size_t count) +{ + + __bs_nonsingle(rr,2,uint16_t,space,handle,offset,datap,count); +} + +void +bus_space_read_region_4(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int32_t *datap, bus_size_t count) +{ + + __bs_nonsingle(rr,4,uint32_t,space,handle,offset,datap,count); +} + +void +bus_space_read_region_8(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int64_t *datap, bus_size_t count) +{ + + __bs_nonsingle(rr,8,uint64_t,space,handle,offset,datap,count); +} + +void +bus_space_write_1(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value) +{ + __bs_ws(1, uint8_t, space, handle, offset, value); +} + +void +bus_space_write_2(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value) +{ + __bs_ws(2, uint16_t, space, handle, offset, value); +} + +void +bus_space_write_4(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value) +{ + __bs_ws(4, uint32_t, space, handle, offset, value); +} + +void +bus_space_write_8(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int64_t value) +{ + __bs_ws(8, uint64_t, space, handle, offset, value); +} + +void +bus_space_write_multi_1(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, const u_int8_t *datap, bus_size_t count) +{ + + __bs_nonsingle(wm,1,uint8_t,space,handle,offset,datap,count); +} + +void +bus_space_write_multi_2(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, const u_int16_t *datap, bus_size_t count) +{ + + __bs_nonsingle(wm,2,uint16_t,space,handle,offset,datap,count); +} + +void +bus_space_write_multi_4(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, const u_int32_t *datap, bus_size_t count) +{ + + __bs_nonsingle(wm,4,uint32_t,space,handle,offset,datap,count); +} + +void +bus_space_write_multi_8(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, const u_int64_t *datap, bus_size_t count) +{ + + __bs_nonsingle(wm,8,uint64_t,space,handle,offset,datap,count); +} + +void +bus_space_write_region_1(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, const u_int8_t *datap, bus_size_t count) +{ + + __bs_nonsingle(wr,1,uint8_t,space,handle,offset,datap,count); +} + +void +bus_space_write_region_2(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, const u_int16_t *datap, bus_size_t count) +{ + + __bs_nonsingle(wr,2,uint16_t,space,handle,offset,datap,count); +} + +void +bus_space_write_region_4(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, const u_int32_t *datap, bus_size_t count) +{ + + __bs_nonsingle(wr,4,uint32_t,space,handle,offset,datap,count); +} + +void +bus_space_write_region_8(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, const u_int64_t *datap, bus_size_t count) +{ + + __bs_nonsingle(wr,8,uint64_t,space,handle,offset,datap,count); +} + +void +bus_space_set_multi_1(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value, bus_size_t count) +{ + + __bs_set(sm,1,uint8_t,space,handle,offset,value,count); +} + +void +bus_space_set_multi_2(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value, bus_size_t count) +{ + + __bs_set(sm,2,uint16_t,space,handle,offset,value,count); +} + +void +bus_space_set_multi_4(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value, bus_size_t count) +{ + + __bs_set(sm,4,uint32_t,space,handle,offset,value,count); +} + +void +bus_space_set_multi_8(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int64_t value, bus_size_t count) +{ + + __bs_set(sm,8,uint64_t,space,handle,offset,value,count); +} + +void +bus_space_set_region_1(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value, bus_size_t count) +{ + + __bs_set(sr,1,uint8_t,space,handle,offset,value,count); +} + +void +bus_space_set_region_2(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value, bus_size_t count) +{ + + __bs_set(sr,2,uint16_t,space,handle,offset,value,count); +} + +void +bus_space_set_region_4(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value, bus_size_t count) +{ + + __bs_set(sr,4,uint32_t,space,handle,offset,value,count); +} + +void +bus_space_set_region_8(bus_space_tag_t space, bus_space_handle_t handle, + bus_size_t offset, u_int64_t value, bus_size_t count) +{ + + __bs_set(sr,8,uint64_t,space,handle,offset,value,count); +} + +void +bus_space_copy_region_1(bus_space_tag_t space, bus_space_handle_t srchandle, + bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, + bus_size_t count) +{ + + __bs_copy(1, uint8_t, space, srchandle, srcoffset, dsthandle, dstoffset, + count); +} + +void +bus_space_copy_region_2(bus_space_tag_t space, bus_space_handle_t srchandle, + bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, + bus_size_t count) +{ + + __bs_copy(2, uint16_t, space, srchandle, srcoffset, dsthandle, + dstoffset, count); +} + +void +bus_space_copy_region_4(bus_space_tag_t space, bus_space_handle_t srchandle, + bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, + bus_size_t count) +{ + + __bs_copy(4, uint32_t, space, srchandle, srcoffset, dsthandle, + dstoffset, count); +} + +void +bus_space_copy_region_8(bus_space_tag_t space, bus_space_handle_t srchandle, + bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, + bus_size_t count) +{ + + __bs_copy(8, uint64_t, space, srchandle, srcoffset, dsthandle, + dstoffset, count); +}