Home | History | Annotate | Line # | Download | only in include
bus.h revision 1.17
      1 /*	$NetBSD: bus.h,v 1.17 2002/04/25 09:20:32 aymeric Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1996 Leo Weppelman.  All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. All advertising materials mentioning features or use of this software
     15  *    must display the following acknowledgement:
     16  *      This product includes software developed by Leo Weppelman for the
     17  *	NetBSD Project.
     18  * 4. The name of the author may not be used to endorse or promote products
     19  *    derived from this software without specific prior written permission
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 #ifndef _AMIGA_BUS_H_
     34 #define _AMIGA_BUS_H_
     35 
     36 #include <sys/types.h>
     37 
     38 /* for public use: */
     39 
     40 /*
     41  * Memory addresses (in bus space)
     42  */
     43 
     44 typedef u_int32_t bus_addr_t;
     45 typedef u_int32_t bus_size_t;
     46 
     47 /*
     48  * Access methods for bus resources and address space.
     49  */
     50 typedef struct bus_space_tag *bus_space_tag_t;
     51 typedef u_long	bus_space_handle_t;
     52 
     53 /* unpublic, but needed by method implementors */
     54 
     55 /*
     56  * Lazyness macros for function declarations.
     57  */
     58 
     59 #define bsr(what, typ) \
     60 	typ (what)(bus_space_handle_t, bus_addr_t)
     61 
     62 #define bsw(what, typ) \
     63 	void (what)(bus_space_handle_t, bus_addr_t, unsigned)
     64 
     65 #define bsrm(what, typ) \
     66 	void (what)(bus_space_handle_t, bus_size_t, typ *, bus_size_t)
     67 
     68 #define bswm(what, typ) \
     69 	void (what)(bus_space_handle_t, bus_size_t, const typ *, bus_size_t)
     70 
     71 #define bssr(what, typ) \
     72 	void (what)(bus_space_handle_t, bus_size_t, unsigned, bus_size_t)
     73 
     74 #define bscr(what, typ) \
     75 	void (what)(bus_space_handle_t, bus_size_t, \
     76 		    bus_space_handle_t, bus_size_t, bus_size_t)
     77 
     78 /*
     79  * Implementation specific structures.
     80  * XXX Don't use outside of bus_space definitions!
     81  * XXX maybe this should be encapsuled in a non-global .h file?
     82  */
     83 
     84 struct bus_space_tag {
     85 	bus_addr_t	base;
     86 	const struct amiga_bus_space_methods *absm;
     87 };
     88 
     89 struct amiga_bus_space_methods {
     90 
     91 	/* map, unmap, etc */
     92 
     93 	int (*bsm)(bus_space_tag_t,
     94 		bus_addr_t, bus_size_t, int, bus_space_handle_t *);
     95 
     96 	int (*bsms)(bus_space_handle_t,
     97 		bus_size_t, bus_size_t, bus_space_handle_t *);
     98 
     99 	void (*bsu)(bus_space_handle_t, bus_size_t);
    100 
    101 	/* placeholders for currently not implemented alloc and free */
    102 
    103 	void *bsa;
    104 	void *bsf;
    105 
    106 	/* 8 bit methods */
    107 
    108 	bsr(*bsr1, u_int8_t);
    109 	bsw(*bsw1, u_int8_t);
    110 	bsrm(*bsrm1, u_int8_t);
    111 	bswm(*bswm1, u_int8_t);
    112 	bsrm(*bsrr1, u_int8_t);
    113 	bswm(*bswr1, u_int8_t);
    114 	bssr(*bssr1, u_int8_t);
    115 	bscr(*bscr1, u_int8_t);
    116 
    117 	/* 16bit methods */
    118 
    119 	bsr(*bsr2, u_int16_t);
    120 	bsw(*bsw2, u_int16_t);
    121 	bsr(*bsrs2, u_int16_t);
    122 	bsw(*bsws2, u_int16_t);
    123 	bsrm(*bsrm2, u_int16_t);
    124 	bswm(*bswm2, u_int16_t);
    125 	bsrm(*bsrms2, u_int16_t);
    126 	bswm(*bswms2, u_int16_t);
    127 	bsrm(*bsrr2, u_int16_t);
    128 	bswm(*bswr2, u_int16_t);
    129 	bsrm(*bsrrs2, u_int16_t);
    130 	bswm(*bswrs2, u_int16_t);
    131 	bssr(*bssr2, u_int16_t);
    132 	bscr(*bscr2, u_int16_t);
    133 
    134 	/* add 32bit methods here */
    135 };
    136 
    137 /*
    138  * Macro definition of map, unmap, etc.
    139  */
    140 
    141 #define bus_space_map(t, o, s, f, hp) \
    142 	((t)->absm->bsm)((t), (o), (s), (f), (hp))
    143 
    144 #define bus_space_subregion(t, h, o, s, hp) \
    145 	((t)->absm->bsms)((h), (o), (s), (hp))
    146 
    147 #define bus_space_unmap(t, h, s) \
    148 	((t)->absm->bsu)((h), (s))
    149 
    150 /*
    151  * Macro definition of _2 functions as indirect method array calls
    152  */
    153 
    154 /* 0: Helper macros */
    155 
    156 #define dbsdr(n, t, h, o)	((t)->absm->n)((h), (o))
    157 #define dbsdw(n, t, h, o, v)	((t)->absm->n)((h), (o), (v))
    158 #define dbsm(n, t, h, o, p, c)	((t)->absm->n)((h), (o), (p), (c))
    159 #define dbss(n, t, h, o, v, c)	((t)->absm->n)((h), (o), (v), (c))
    160 #define dbsc(n, t, h, o, v, c)	((t)->absm->n)((h), (o), (v), (c))
    161 
    162 /* 1: byte-wide "functions" */
    163 
    164 #define bus_space_read_1(t, h, o)		  dbsdr(bsr1, t, h, o)
    165 #define bus_space_write_1(t, h, o, v)		  dbsdw(bsw1, t, h, o, v)
    166 
    167 #define bus_space_read_multi_1(t, h, o, p, c)	  dbsm(bsrm1, t, h, o, p, c)
    168 #define bus_space_write_multi_1(t, h, o, p, c)	  dbsm(bswm1, t, h, o, p, c)
    169 
    170 #define bus_space_read_region_1(t, h, o, p, c)	  dbsm(bsrr1, t, h, o, p, c)
    171 #define bus_space_write_region_1(t, h, o, p, c)	  dbsm(bswr1, t, h, o, p, c)
    172 
    173 #define bus_space_set_region_1(t, h, o, v, c)	  dbss(bssr1, t, h, o, v, c)
    174 #define bus_space_copy_region_1(t, h, o, g, q, c) dbss(bscr1, t, h, o, g, q, c)
    175 
    176 
    177 /* 2: word-wide "functions" */
    178 
    179 #define bus_space_read_2(t, h, o)		  dbsdr(bsr2, t, h, o)
    180 #define bus_space_write_2(t, h, o, v)		  dbsdw(bsw2, t, h, o, v)
    181 #define bus_space_read_stream_2(t, h, o)	  dbsdr(bsrs2, t, h, o)
    182 #define bus_space_write_stream_2(t, h, o, v)	  dbsdw(bsws2, t, h, o, v)
    183 
    184 #define bus_space_read_multi_2(t, h, o, p, c)	  dbsm(bsrm2, t, h, o, p, c)
    185 #define bus_space_write_multi_2(t, h, o, p, c)	  dbsm(bswm2, t, h, o, p, c)
    186 
    187 #define bus_space_read_multi_stream_2(t, h, o, p, c) \
    188 						  dbsm(bsrms2, t, h, o, p, c)
    189 
    190 #define bus_space_write_multi_stream_2(t, h, o, p, c) \
    191 						  dbsm(bswms2, t, h, o, p, c)
    192 
    193 #define bus_space_read_region_2(t, h, o, p, c)	  dbsm(bsrr2, t, h, o, p, c)
    194 #define bus_space_write_region_2(t, h, o, p, c)	  dbsm(bswr2, t, h, o, p, c)
    195 
    196 #define bus_space_read_region_stream_2(t, h, o, p, c) \
    197 						  dbsm(bsrrs2, t, h, o, p, c)
    198 
    199 #define bus_space_write_region_stream_2(t, h, o, p, c) \
    200 						  dbsm(bswrs2, t, h, o, p, c)
    201 
    202 #define bus_space_set_region_2(t, h, o, v, c)	  dbss(bssr2, t, h, o, v, c)
    203 #define bus_space_copy_region_2(t, h, o, g, q, c) dbss(bscr2, t, h, o, g, q, c)
    204 
    205 /* 4: Fake 32-bit macros */
    206 
    207 #define bus_space_read_4(t, h, o) \
    208 	(panic("bus_space_read_4 not implemented"), 0)
    209 
    210 #define bus_space_write_4(t, h, o, v) \
    211 	panic("bus_space_write_4 not implemented")
    212 
    213 #define bus_space_read_multi_4(t, h, o, p, c) \
    214 	panic("bus_space_read_multi_4 not implemented")
    215 
    216 #define bus_space_write_multi_4(t, h, o, p, c) \
    217 	panic("bus_space_write_multi_4 not implemented")
    218 
    219 #define bus_space_read_multi_stream_4(t, h, o, p, c) \
    220 	panic("bus_space_read_multi_stream_4 not implemented")
    221 
    222 #define bus_space_write_multi_stream_4(t, h, o, p, c) \
    223 	panic("bus_space_write_multi_stream_4 not implemented")
    224 
    225 /*
    226  * Bus read/write barrier methods.
    227  *
    228  *      void bus_space_barrier __P((bus_space_tag_t tag,
    229  *          bus_space_handle_t bsh, bus_size_t offset,
    230  *          bus_size_t len, int flags));
    231  *
    232  * Note: the 680x0 does not currently require barriers, but we must
    233  * provide the flags to MI code.
    234  */
    235 #define bus_space_barrier(t, h, o, l, f)        \
    236         ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
    237 #define BUS_SPACE_BARRIER_READ  0x01            /* force read barrier */
    238 #define BUS_SPACE_BARRIER_WRITE 0x02            /* force write barrier */
    239 
    240 #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
    241 
    242 #define __BUS_SPACE_HAS_STREAM_METHODS
    243 
    244 extern const struct amiga_bus_space_methods amiga_bus_stride_1;
    245 extern const struct amiga_bus_space_methods amiga_bus_stride_2;
    246 extern const struct amiga_bus_space_methods amiga_bus_stride_4;
    247 extern const struct amiga_bus_space_methods amiga_bus_stride_4swap;
    248 extern const struct amiga_bus_space_methods amiga_bus_stride_16;
    249 
    250 #endif /* _AMIGA_BUS_H_ */
    251