Home | History | Annotate | Line # | Download | only in include
bus.h revision 1.27.2.1
      1  1.27.2.1       tls /*	$NetBSD: bus.h,v 1.27.2.1 2014/08/20 00:02:43 tls Exp $	*/
      2       1.1        is 
      3       1.1        is /*
      4       1.1        is  * Copyright (c) 1996 Leo Weppelman.  All rights reserved.
      5       1.1        is  *
      6       1.1        is  * Redistribution and use in source and binary forms, with or without
      7       1.1        is  * modification, are permitted provided that the following conditions
      8       1.1        is  * are met:
      9       1.1        is  * 1. Redistributions of source code must retain the above copyright
     10       1.1        is  *    notice, this list of conditions and the following disclaimer.
     11       1.1        is  * 2. Redistributions in binary form must reproduce the above copyright
     12       1.1        is  *    notice, this list of conditions and the following disclaimer in the
     13       1.1        is  *    documentation and/or other materials provided with the distribution.
     14       1.1        is  *
     15       1.1        is  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16       1.1        is  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17       1.1        is  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18       1.1        is  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19       1.1        is  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     20       1.1        is  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     21       1.1        is  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     22       1.1        is  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23       1.1        is  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     24       1.1        is  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25       1.1        is  */
     26       1.1        is 
     27       1.1        is #ifndef _AMIGA_BUS_H_
     28       1.1        is #define _AMIGA_BUS_H_
     29       1.1        is 
     30       1.4        is #include <sys/types.h>
     31       1.5        is 
     32      1.12        is /* for public use: */
     33      1.12        is 
     34       1.1        is /*
     35       1.1        is  * Memory addresses (in bus space)
     36       1.1        is  */
     37       1.5        is 
     38       1.4        is typedef u_int32_t bus_addr_t;
     39       1.4        is typedef u_int32_t bus_size_t;
     40       1.1        is 
     41       1.1        is /*
     42       1.1        is  * Access methods for bus resources and address space.
     43       1.1        is  */
     44       1.4        is typedef struct bus_space_tag *bus_space_tag_t;
     45       1.4        is typedef u_long	bus_space_handle_t;
     46       1.4        is 
     47      1.12        is /* unpublic, but needed by method implementors */
     48      1.12        is 
     49       1.5        is /*
     50       1.5        is  * Lazyness macros for function declarations.
     51       1.5        is  */
     52       1.5        is 
     53       1.4        is #define bsr(what, typ) \
     54      1.12        is 	typ (what)(bus_space_handle_t, bus_addr_t)
     55       1.4        is 
     56       1.4        is #define bsw(what, typ) \
     57      1.12        is 	void (what)(bus_space_handle_t, bus_addr_t, unsigned)
     58       1.4        is 
     59       1.4        is #define bsrm(what, typ) \
     60      1.12        is 	void (what)(bus_space_handle_t, bus_size_t, typ *, bus_size_t)
     61       1.4        is 
     62       1.4        is #define bswm(what, typ) \
     63      1.12        is 	void (what)(bus_space_handle_t, bus_size_t, const typ *, bus_size_t)
     64       1.4        is 
     65       1.5        is #define bssr(what, typ) \
     66      1.12        is 	void (what)(bus_space_handle_t, bus_size_t, unsigned, bus_size_t)
     67       1.5        is 
     68       1.5        is #define bscr(what, typ) \
     69      1.12        is 	void (what)(bus_space_handle_t, bus_size_t, \
     70      1.12        is 		    bus_space_handle_t, bus_size_t, bus_size_t)
     71       1.5        is 
     72       1.5        is /*
     73       1.5        is  * Implementation specific structures.
     74       1.5        is  * XXX Don't use outside of bus_space definitions!
     75       1.5        is  * XXX maybe this should be encapsuled in a non-global .h file?
     76       1.5        is  */
     77       1.5        is 
     78       1.5        is struct bus_space_tag {
     79       1.5        is 	bus_addr_t	base;
     80       1.9        is 	const struct amiga_bus_space_methods *absm;
     81       1.5        is };
     82       1.5        is 
     83       1.4        is struct amiga_bus_space_methods {
     84       1.5        is 
     85      1.12        is 	/* map, unmap, etc */
     86      1.12        is 
     87      1.12        is 	int (*bsm)(bus_space_tag_t,
     88      1.12        is 		bus_addr_t, bus_size_t, int, bus_space_handle_t *);
     89      1.12        is 
     90      1.12        is 	int (*bsms)(bus_space_handle_t,
     91      1.12        is 		bus_size_t, bus_size_t, bus_space_handle_t *);
     92      1.12        is 
     93      1.12        is 	void (*bsu)(bus_space_handle_t, bus_size_t);
     94      1.12        is 
     95      1.12        is 	/* placeholders for currently not implemented alloc and free */
     96      1.12        is 
     97      1.12        is 	void *bsa;
     98      1.12        is 	void *bsf;
     99      1.12        is 
    100      1.12        is 	/* 8 bit methods */
    101      1.12        is 
    102      1.12        is 	bsr(*bsr1, u_int8_t);
    103      1.12        is 	bsw(*bsw1, u_int8_t);
    104      1.12        is 	bsrm(*bsrm1, u_int8_t);
    105      1.12        is 	bswm(*bswm1, u_int8_t);
    106      1.12        is 	bsrm(*bsrr1, u_int8_t);
    107      1.12        is 	bswm(*bswr1, u_int8_t);
    108      1.12        is 	bssr(*bssr1, u_int8_t);
    109      1.12        is 	bscr(*bscr1, u_int8_t);
    110      1.12        is 
    111       1.4        is 	/* 16bit methods */
    112       1.5        is 
    113       1.4        is 	bsr(*bsr2, u_int16_t);
    114       1.4        is 	bsw(*bsw2, u_int16_t);
    115      1.12        is 	bsr(*bsrs2, u_int16_t);
    116      1.12        is 	bsw(*bsws2, u_int16_t);
    117       1.4        is 	bsrm(*bsrm2, u_int16_t);
    118       1.4        is 	bswm(*bswm2, u_int16_t);
    119      1.12        is 	bsrm(*bsrms2, u_int16_t);
    120      1.12        is 	bswm(*bswms2, u_int16_t);
    121       1.4        is 	bsrm(*bsrr2, u_int16_t);
    122       1.4        is 	bswm(*bswr2, u_int16_t);
    123       1.7        is 	bsrm(*bsrrs2, u_int16_t);
    124       1.7        is 	bswm(*bswrs2, u_int16_t);
    125       1.5        is 	bssr(*bssr2, u_int16_t);
    126       1.5        is 	bscr(*bscr2, u_int16_t);
    127       1.4        is 
    128      1.24   rkujawa 	/* 32bit methods */
    129      1.24   rkujawa 
    130      1.24   rkujawa 	bsr(*bsr4, u_int32_t);
    131      1.24   rkujawa 	bsw(*bsw4, u_int32_t);
    132      1.24   rkujawa 	bsr(*bsrs4, u_int32_t);
    133      1.24   rkujawa 	bsw(*bsws4, u_int32_t);
    134      1.24   rkujawa 	bsrm(*bsrm4, u_int32_t);
    135      1.24   rkujawa 	bswm(*bswm4, u_int32_t);
    136      1.24   rkujawa 	bsrm(*bsrms4, u_int32_t);
    137      1.24   rkujawa 	bswm(*bswms4, u_int32_t);
    138      1.24   rkujawa 	bsrm(*bsrr4, u_int32_t);
    139      1.24   rkujawa 	bswm(*bswr4, u_int32_t);
    140      1.24   rkujawa 	bsrm(*bsrrs4, u_int32_t);
    141      1.24   rkujawa 	bswm(*bswrs4, u_int32_t);
    142      1.24   rkujawa 	bssr(*bssr4, u_int32_t);
    143      1.24   rkujawa 	bscr(*bscr4, u_int32_t);
    144      1.24   rkujawa 
    145       1.4        is };
    146       1.9        is 
    147       1.5        is /*
    148       1.5        is  * Macro definition of map, unmap, etc.
    149       1.5        is  */
    150       1.1        is 
    151      1.12        is #define bus_space_map(t, o, s, f, hp) \
    152      1.12        is 	((t)->absm->bsm)((t), (o), (s), (f), (hp))
    153       1.2        is 
    154      1.12        is #define bus_space_subregion(t, h, o, s, hp) \
    155      1.12        is 	((t)->absm->bsms)((h), (o), (s), (hp))
    156       1.1        is 
    157      1.12        is #define bus_space_unmap(t, h, s) \
    158      1.12        is 	((t)->absm->bsu)((h), (s))
    159       1.1        is 
    160       1.5        is /*
    161      1.12        is  * Macro definition of _2 functions as indirect method array calls
    162       1.5        is  */
    163       1.5        is 
    164      1.12        is /* 0: Helper macros */
    165      1.12        is 
    166      1.12        is #define dbsdr(n, t, h, o)	((t)->absm->n)((h), (o))
    167      1.12        is #define dbsdw(n, t, h, o, v)	((t)->absm->n)((h), (o), (v))
    168      1.12        is #define dbsm(n, t, h, o, p, c)	((t)->absm->n)((h), (o), (p), (c))
    169      1.12        is #define dbss(n, t, h, o, v, c)	((t)->absm->n)((h), (o), (v), (c))
    170      1.12        is #define dbsc(n, t, h, o, v, c)	((t)->absm->n)((h), (o), (v), (c))
    171       1.1        is 
    172      1.12        is /* 1: byte-wide "functions" */
    173       1.1        is 
    174      1.12        is #define bus_space_read_1(t, h, o)		  dbsdr(bsr1, t, h, o)
    175      1.12        is #define bus_space_write_1(t, h, o, v)		  dbsdw(bsw1, t, h, o, v)
    176      1.12        is 
    177      1.12        is #define bus_space_read_multi_1(t, h, o, p, c)	  dbsm(bsrm1, t, h, o, p, c)
    178      1.12        is #define bus_space_write_multi_1(t, h, o, p, c)	  dbsm(bswm1, t, h, o, p, c)
    179      1.12        is 
    180      1.12        is #define bus_space_read_region_1(t, h, o, p, c)	  dbsm(bsrr1, t, h, o, p, c)
    181      1.12        is #define bus_space_write_region_1(t, h, o, p, c)	  dbsm(bswr1, t, h, o, p, c)
    182      1.12        is 
    183      1.12        is #define bus_space_set_region_1(t, h, o, v, c)	  dbss(bssr1, t, h, o, v, c)
    184      1.12        is #define bus_space_copy_region_1(t, h, o, g, q, c) dbss(bscr1, t, h, o, g, q, c)
    185       1.5        is 
    186       1.5        is 
    187      1.12        is /* 2: word-wide "functions" */
    188       1.5        is 
    189      1.12        is #define bus_space_read_2(t, h, o)		  dbsdr(bsr2, t, h, o)
    190      1.12        is #define bus_space_write_2(t, h, o, v)		  dbsdw(bsw2, t, h, o, v)
    191      1.12        is #define bus_space_read_stream_2(t, h, o)	  dbsdr(bsrs2, t, h, o)
    192      1.12        is #define bus_space_write_stream_2(t, h, o, v)	  dbsdw(bsws2, t, h, o, v)
    193       1.5        is 
    194      1.12        is #define bus_space_read_multi_2(t, h, o, p, c)	  dbsm(bsrm2, t, h, o, p, c)
    195      1.12        is #define bus_space_write_multi_2(t, h, o, p, c)	  dbsm(bswm2, t, h, o, p, c)
    196       1.5        is 
    197      1.12        is #define bus_space_read_multi_stream_2(t, h, o, p, c) \
    198      1.12        is 						  dbsm(bsrms2, t, h, o, p, c)
    199       1.5        is 
    200      1.12        is #define bus_space_write_multi_stream_2(t, h, o, p, c) \
    201      1.12        is 						  dbsm(bswms2, t, h, o, p, c)
    202       1.5        is 
    203      1.12        is #define bus_space_read_region_2(t, h, o, p, c)	  dbsm(bsrr2, t, h, o, p, c)
    204      1.12        is #define bus_space_write_region_2(t, h, o, p, c)	  dbsm(bswr2, t, h, o, p, c)
    205       1.5        is 
    206       1.7        is #define bus_space_read_region_stream_2(t, h, o, p, c) \
    207      1.12        is 						  dbsm(bsrrs2, t, h, o, p, c)
    208       1.5        is 
    209       1.7        is #define bus_space_write_region_stream_2(t, h, o, p, c) \
    210      1.12        is 						  dbsm(bswrs2, t, h, o, p, c)
    211       1.5        is 
    212      1.12        is #define bus_space_set_region_2(t, h, o, v, c)	  dbss(bssr2, t, h, o, v, c)
    213      1.12        is #define bus_space_copy_region_2(t, h, o, g, q, c) dbss(bscr2, t, h, o, g, q, c)
    214      1.10  drochner 
    215      1.24   rkujawa /* 4: long-wide "functions" */
    216      1.18  jdolecek 
    217      1.24   rkujawa #define bus_space_read_4(t, h, o)                 dbsdr(bsr4, t, h, o)
    218      1.24   rkujawa #define bus_space_write_4(t, h, o, v)             dbsdw(bsw4, t, h, o, v)
    219      1.24   rkujawa #define bus_space_read_stream_4(t, h, o)          dbsdr(bsrs4, t, h, o)
    220      1.24   rkujawa #define bus_space_write_stream_4(t, h, o, v)      dbsdw(bsws4, t, h, o, v)
    221      1.18  jdolecek 
    222      1.24   rkujawa #define bus_space_read_multi_4(t, h, o, p, c)     dbsm(bsrm4, t, h, o, p, c)
    223      1.24   rkujawa #define bus_space_write_multi_4(t, h, o, p, c)    dbsm(bswm4, t, h, o, p, c)
    224      1.13   aymeric 
    225      1.13   aymeric #define bus_space_read_multi_stream_4(t, h, o, p, c) \
    226      1.24   rkujawa                                                   dbsm(bsrms4, t, h, o, p, c)
    227      1.13   aymeric 
    228      1.13   aymeric #define bus_space_write_multi_stream_4(t, h, o, p, c) \
    229      1.24   rkujawa                                                   dbsm(bswms4, t, h, o, p, c)
    230      1.24   rkujawa 
    231      1.24   rkujawa #define bus_space_read_region_4(t, h, o, p, c)    dbsm(bsrr4, t, h, o, p, c)
    232      1.24   rkujawa #define bus_space_write_region_4(t, h, o, p, c)   dbsm(bswr4, t, h, o, p, c)
    233      1.13   aymeric 
    234      1.19   aymeric #define bus_space_read_region_stream_4(t, h, o, p, c) \
    235      1.24   rkujawa                                                   dbsm(bsrrs4, t, h, o, p, c)
    236      1.19   aymeric 
    237      1.19   aymeric #define bus_space_write_region_stream_4(t, h, o, p, c) \
    238      1.24   rkujawa                                                   dbsm(bswrs4, t, h, o, p, c)
    239      1.24   rkujawa 
    240      1.24   rkujawa #define bus_space_set_region_4(t, h, o, v, c)     dbss(bssr4, t, h, o, v, c)
    241      1.24   rkujawa #define bus_space_copy_region_4(t, h, o, g, q, c) dbss(bscr4, t, h, o, g, q, c)
    242      1.19   aymeric 
    243      1.11        is /*
    244      1.11        is  * Bus read/write barrier methods.
    245      1.11        is  *
    246      1.21       dsl  *      void bus_space_barrier(bus_space_tag_t tag,
    247      1.11        is  *          bus_space_handle_t bsh, bus_size_t offset,
    248      1.21       dsl  *          bus_size_t len, int flags);
    249      1.11        is  *
    250      1.11        is  * Note: the 680x0 does not currently require barriers, but we must
    251      1.11        is  * provide the flags to MI code.
    252      1.11        is  */
    253      1.24   rkujawa void bus_space_barrier(bus_space_tag_t space, bus_space_handle_t handle,
    254      1.24   rkujawa 			bus_size_t offset, bus_size_t length, int flags);
    255      1.24   rkujawa 
    256      1.11        is #define BUS_SPACE_BARRIER_READ  0x01            /* force read barrier */
    257      1.11        is #define BUS_SPACE_BARRIER_WRITE 0x02            /* force write barrier */
    258      1.11        is 
    259      1.10  drochner #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
    260      1.12        is 
    261      1.12        is #define __BUS_SPACE_HAS_STREAM_METHODS
    262      1.12        is 
    263      1.24   rkujawa paddr_t bus_space_mmap(bus_space_tag_t t, bus_addr_t addr, off_t off, int prot,
    264      1.24   rkujawa 			int flags);
    265      1.24   rkujawa 
    266      1.24   rkujawa #define BUS_SPACE_MAP_CACHEABLE		0x01
    267      1.24   rkujawa #define BUS_SPACE_MAP_LINEAR		0x02
    268      1.24   rkujawa #define BUS_SPACE_MAP_PREFETCHABLE	0x04
    269      1.24   rkujawa 
    270      1.23       phx /* Instruction for enforcing reorder protection. Nothing for 68k. */
    271      1.23       phx #define amiga_bus_reorder_protect()
    272      1.23       phx 
    273      1.24   rkujawa void * bus_space_vaddr(bus_space_tag_t space, bus_space_handle_t handle);
    274      1.24   rkujawa 
    275      1.17   aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_1;
    276      1.24   rkujawa extern const struct amiga_bus_space_methods amiga_bus_stride_1swap;
    277      1.24   rkujawa extern const struct amiga_bus_space_methods amiga_bus_stride_1swap_abs;
    278      1.17   aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_2;
    279      1.17   aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_4;
    280      1.17   aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_4swap;
    281      1.17   aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_16;
    282  1.27.2.1       tls extern const struct amiga_bus_space_methods amiga_bus_stride_0x1000;
    283  1.27.2.1       tls extern const struct amiga_bus_space_methods amiga_bus_stride_0x4000;
    284      1.27   rkujawa extern const struct amiga_bus_space_methods empb_bus_swap;
    285      1.12        is 
    286      1.26   tsutsui /*
    287      1.26   tsutsui  * XXX
    288      1.26   tsutsui  * amiga doesn't have actual bus_dma(9) implementation for PCI devices yet.
    289      1.26   tsutsui  */
    290      1.26   tsutsui #include <m68k/bus_dma.h>
    291      1.26   tsutsui 
    292       1.1        is #endif /* _AMIGA_BUS_H_ */
    293      1.24   rkujawa 
    294