bus.h revision 1.4 1 1.4 is /* $NetBSD: bus.h,v 1.4 1998/10/08 21:46:39 is 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 * 3. All advertising materials mentioning features or use of this software
15 1.1 is * must display the following acknowledgement:
16 1.1 is * This product includes software developed by Leo Weppelman for the
17 1.1 is * NetBSD Project.
18 1.1 is * 4. The name of the author may not be used to endorse or promote products
19 1.1 is * derived from this software without specific prior written permission
20 1.1 is *
21 1.1 is * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 1.1 is * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 1.1 is * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 1.1 is * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 1.1 is * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 1.1 is * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 1.1 is * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 1.1 is * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 1.1 is * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 1.1 is * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 1.1 is */
32 1.1 is
33 1.1 is #ifndef _AMIGA_BUS_H_
34 1.1 is #define _AMIGA_BUS_H_
35 1.1 is
36 1.4 is #include <sys/types.h>
37 1.1 is /*
38 1.1 is * Memory addresses (in bus space)
39 1.1 is */
40 1.4 is typedef u_int32_t bus_addr_t;
41 1.4 is typedef u_int32_t bus_size_t;
42 1.1 is
43 1.1 is /*
44 1.1 is * Access methods for bus resources and address space.
45 1.1 is */
46 1.4 is typedef struct bus_space_tag *bus_space_tag_t;
47 1.4 is typedef u_long bus_space_handle_t;
48 1.4 is
49 1.4 is #define bsr(what, typ) \
50 1.4 is typ (what)(bus_space_tag_t, bus_space_handle_t, bus_size_t)
51 1.4 is
52 1.4 is #define bsw(what, typ) \
53 1.4 is void (what)(bus_space_tag_t, bus_space_handle_t, bus_size_t, typ)
54 1.4 is
55 1.4 is #define bsrm(what, typ) \
56 1.4 is void (what)(bus_space_tag_t, bus_space_handle_t, bus_size_t, \
57 1.4 is typ *, bus_size_t)
58 1.4 is
59 1.4 is #define bswm(what, typ) \
60 1.4 is void (what)(bus_space_tag_t, bus_space_handle_t, bus_size_t, \
61 1.4 is typ *, bus_size_t)
62 1.4 is
63 1.4 is struct amiga_bus_space_methods {
64 1.4 is /* 16bit methods */
65 1.4 is bsr(*bsr2, u_int16_t);
66 1.4 is bsw(*bsw2, u_int16_t);
67 1.4 is bsrm(*bsrm2, u_int16_t);
68 1.4 is bswm(*bswm2, u_int16_t);
69 1.4 is bsrm(*bsrr2, u_int16_t);
70 1.4 is bswm(*bswr2, u_int16_t);
71 1.4 is bsrm(*bsrs2, u_int16_t);
72 1.4 is bswm(*bsws2, u_int16_t);
73 1.4 is };
74 1.4 is
75 1.4 is struct bus_space_tag {
76 1.1 is bus_addr_t base;
77 1.4 is u_int8_t stride;
78 1.4 is u_int8_t dum[3];
79 1.4 is struct amiga_bus_space_methods *absm;
80 1.4 is };
81 1.4 is
82 1.4 is #define bus_space_read_2(t, h, o) ((t)->bsr2)((t), (h), (o))
83 1.4 is #define bus_space_write_2(t, h, o, v) ((t)->bsw2)((t), (h), (o), (v))
84 1.4 is
85 1.4 is #define bus_space_read_multi_2(t, h, o, p, c) \
86 1.4 is ((t)->absm->bsrm2)((t), (h), (o), (p), (c))
87 1.4 is
88 1.4 is #define bus_space_write_multi_2(t, h, o, p, c) \
89 1.4 is ((t)->absm->bswm2)((t), (h), (o), (p), (c))
90 1.4 is
91 1.4 is #define bus_space_read_region_2(t, h, o, p, c) \
92 1.4 is ((t)->absm->bsrr2)((t), (h), (o), (p), (c))
93 1.4 is
94 1.4 is #define bus_space_write_region_2(t, h, o, p, c) \
95 1.4 is ((t)->absm->bswr2)((t), (h), (o), (p), (c))
96 1.4 is
97 1.4 is #define bus_space_read_stream_2(t, h, o, p, c) \
98 1.4 is ((t)->absm->bsrs2)((t), (h), (o), (p), (c))
99 1.1 is
100 1.4 is #define bus_space_write_stream_2(t, h, o, p, c) \
101 1.4 is ((t)->absm->bsws2)((t), (h), (o), (p), (c))
102 1.4 is
103 1.1 is
104 1.1 is void bus_space_read_multi_1 __P((bus_space_tag_t, bus_space_handle_t,
105 1.4 is bus_size_t, u_int8_t *, bus_size_t));
106 1.1 is void bus_space_write_multi_1 __P((bus_space_tag_t, bus_space_handle_t,
107 1.4 is bus_size_t, u_int8_t *, bus_size_t));
108 1.1 is
109 1.3 is void bus_space_read_region_1 __P((bus_space_tag_t, bus_space_handle_t,
110 1.4 is bus_size_t, u_int8_t *, bus_size_t));
111 1.3 is void bus_space_write_region_1 __P((bus_space_tag_t, bus_space_handle_t,
112 1.4 is bus_size_t, u_int8_t *, bus_size_t));
113 1.3 is
114 1.4 is void bus_space_read_stream_1 __P((bus_space_tag_t, bus_space_handle_t,
115 1.4 is bus_size_t, u_int8_t *, bus_size_t));
116 1.4 is void bus_space_write_stream_1 __P((bus_space_tag_t, bus_space_handle_t,
117 1.4 is bus_size_t, u_int8_t *, bus_size_t));
118 1.1 is
119 1.1 is #define bus_space_map(tag,off,size,cache,handle) \
120 1.1 is (*(handle) = (tag)->base + ((off)<<(tag)->stride), 0)
121 1.2 is
122 1.2 is #define bus_space_subregion(tag, handle, offset, size, nhandlep) \
123 1.2 is (*(nhandlep) = (handle) + ((offset)<<(tag)->stride), 0)
124 1.1 is
125 1.1 is #define bus_space_unmap(tag,handle,size) (void)0
126 1.1 is
127 1.1 is #define bus_space_read_1(t, h, o) \
128 1.1 is ((void) t, (*(volatile u_int8_t *)((h) + ((o)<<(t)->stride))))
129 1.1 is
130 1.1 is #define bus_space_write_1(t, h, o, v) \
131 1.1 is ((void) t, ((void)(*(volatile u_int8_t *)((h) + ((o)<<(t)->stride)) = (v))))
132 1.1 is
133 1.1 is extern __inline__ void
134 1.1 is bus_space_read_multi_1(t, h, o, a, c)
135 1.1 is bus_space_tag_t t;
136 1.1 is bus_space_handle_t h;
137 1.4 is bus_size_t o, c;
138 1.4 is u_int8_t *a;
139 1.1 is {
140 1.1 is for (; c; a++, c--)
141 1.4 is *a = bus_space_read_1(t, h, o);
142 1.1 is }
143 1.1 is
144 1.1 is extern __inline__ void
145 1.1 is bus_space_write_multi_1(t, h, o, a, c)
146 1.1 is bus_space_tag_t t;
147 1.1 is bus_space_handle_t h;
148 1.4 is bus_size_t o, c;
149 1.4 is u_int8_t *a;
150 1.1 is {
151 1.1 is for (; c; a++, c--)
152 1.4 is bus_space_write_1(t, h, o, *a);
153 1.1 is }
154 1.1 is
155 1.1 is extern __inline__ void
156 1.4 is bus_space_read_region_1(t, h, o, a, c)
157 1.1 is bus_space_tag_t t;
158 1.1 is bus_space_handle_t h;
159 1.4 is bus_size_t o, c;
160 1.4 is u_int8_t *a;
161 1.1 is {
162 1.4 is for (; c; a++, c--)
163 1.4 is *a = bus_space_read_1(t, h, o++);
164 1.1 is }
165 1.1 is
166 1.1 is extern __inline__ void
167 1.4 is bus_space_write_region_1(t, h, o, a, c)
168 1.1 is bus_space_tag_t t;
169 1.1 is bus_space_handle_t h;
170 1.4 is bus_size_t o, c;
171 1.4 is u_int8_t *a;
172 1.1 is {
173 1.4 is for (; c; a++, c--)
174 1.4 is bus_space_write_1(t, h, o++, *a);
175 1.1 is }
176 1.1 is
177 1.3 is extern __inline__ void
178 1.4 is bus_space_read_stream_1(t, h, o, a, c)
179 1.3 is bus_space_tag_t t;
180 1.3 is bus_space_handle_t h;
181 1.4 is bus_size_t o, c;
182 1.4 is u_int8_t *a;
183 1.3 is {
184 1.3 is for (; c; a++, c--)
185 1.4 is *a = bus_space_read_1(t, h, o++);
186 1.3 is }
187 1.3 is
188 1.3 is extern __inline__ void
189 1.4 is bus_space_write_stream_1(t, h, o, a, c)
190 1.3 is bus_space_tag_t t;
191 1.3 is bus_space_handle_t h;
192 1.4 is bus_size_t o, c;
193 1.4 is u_int8_t *a;
194 1.3 is {
195 1.3 is for (; c; a++, c--)
196 1.4 is bus_space_write_1(t, h, o++, *a);
197 1.3 is }
198 1.1 is #endif /* _AMIGA_BUS_H_ */
199