1/*	$NetBSD$	*/
2
3/*-
4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9 * NASA Ames Research Center.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33/*
34 * Copyright (c) 1996 Carnegie-Mellon University.
35 * All rights reserved.
36 *
37 * Author: Chris G. Demetriou
38 *
39 * Permission to use, copy, modify and distribute this software and
40 * its documentation is hereby granted, provided that both the copyright
41 * notice and this permission notice appear in all copies of the
42 * software, derivative works or modified versions, and any portions
43 * thereof, and that both notices appear in supporting documentation.
44 *
45 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
46 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
47 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
48 *
49 * Carnegie Mellon requests users of this software to return to
50 *
51 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
52 *  School of Computer Science
53 *  Carnegie Mellon University
54 *  Pittsburgh PA 15213-3890
55 *
56 * any improvements or extensions that they make and grant Carnegie the
57 * rights to redistribute these changes.
58 */
59
60#ifndef _ATARI_BUS_DEFS_H_
61#define _ATARI_BUS_DEFS_H_
62
63/*
64 * Memory addresses (in bus space)
65 */
66typedef u_long	bus_addr_t;
67typedef u_long	bus_size_t;
68
69/*
70 * I/O addresses (in bus space)
71 */
72typedef u_long bus_io_addr_t;
73typedef u_long bus_io_size_t;
74
75#define __BUS_SPACE_HAS_STREAM_METHODS
76
77/*
78 * Access methods for bus resources and address space.
79 */
80typedef struct atari_bus_space	*bus_space_tag_t;
81typedef u_long			bus_space_handle_t;
82
83#define	BUS_SPACE_MAP_CACHEABLE		0x01
84#define	BUS_SPACE_MAP_LINEAR		0x02
85#define	BUS_SPACE_MAP_PREFETCHABLE	0x04
86
87/*
88 * Structure containing functions and other feature-data that might differ
89 * between the various bus spaces on the atari. Currently 'known' bus
90 * spaces are: ISA, PCI, VME and 'mainbus'.
91 */
92struct atari_bus_space {
93	u_long	base;
94
95	/* XXX Next 2 lines can be turned into an opaque cookie */
96	int	stride;
97	int	wo_1, wo_2, wo_4, wo_8;
98
99	/* Autoconf detection stuff */
100	int		(*abs_p_1)(bus_space_tag_t, bus_space_handle_t,
101			    bus_size_t);
102	int		(*abs_p_2)(bus_space_tag_t, bus_space_handle_t,
103			    bus_size_t);
104	int		(*abs_p_4)(bus_space_tag_t, bus_space_handle_t,
105			    bus_size_t);
106	int		(*abs_p_8)(bus_space_tag_t, bus_space_handle_t,
107			    bus_size_t);
108
109	/* read (single) */
110	uint8_t		(*abs_r_1)(bus_space_tag_t, bus_space_handle_t,
111			    bus_size_t);
112	uint16_t	(*abs_r_2)(bus_space_tag_t, bus_space_handle_t,
113			    bus_size_t);
114	uint32_t	(*abs_r_4)(bus_space_tag_t, bus_space_handle_t,
115			    bus_size_t);
116	uint64_t	(*abs_r_8)(bus_space_tag_t, bus_space_handle_t,
117			    bus_size_t);
118
119	/* read (single) stream */
120	uint8_t		(*abs_rs_1)(bus_space_tag_t, bus_space_handle_t,
121			    bus_size_t);
122	uint16_t	(*abs_rs_2)(bus_space_tag_t, bus_space_handle_t,
123			    bus_size_t);
124	uint32_t	(*abs_rs_4)(bus_space_tag_t, bus_space_handle_t,
125			    bus_size_t);
126	uint64_t	(*abs_rs_8)(bus_space_tag_t, bus_space_handle_t,
127			    bus_size_t);
128
129	/* read multiple */
130	void		(*abs_rm_1)(bus_space_tag_t, bus_space_handle_t,
131			    bus_size_t, uint8_t *, bus_size_t);
132	void		(*abs_rm_2)(bus_space_tag_t, bus_space_handle_t,
133			    bus_size_t, uint16_t *, bus_size_t);
134	void		(*abs_rm_4)(bus_space_tag_t, bus_space_handle_t,
135			    bus_size_t, uint32_t *, bus_size_t);
136	void		(*abs_rm_8)(bus_space_tag_t, bus_space_handle_t,
137			    bus_size_t, uint64_t *, bus_size_t);
138
139	/* read multiple stream */
140	void		(*abs_rms_1)(bus_space_tag_t, bus_space_handle_t,
141			    bus_size_t, uint8_t *, bus_size_t);
142	void		(*abs_rms_2)(bus_space_tag_t, bus_space_handle_t,
143			    bus_size_t, uint16_t *, bus_size_t);
144	void		(*abs_rms_4)(bus_space_tag_t, bus_space_handle_t,
145			    bus_size_t, uint32_t *, bus_size_t);
146	void		(*abs_rms_8)(bus_space_tag_t, bus_space_handle_t,
147			    bus_size_t, uint64_t *, bus_size_t);
148
149	/* read region */
150	void		(*abs_rr_1)(bus_space_tag_t, bus_space_handle_t,
151			    bus_size_t, uint8_t *, bus_size_t);
152	void		(*abs_rr_2)(bus_space_tag_t, bus_space_handle_t,
153			    bus_size_t, uint16_t *, bus_size_t);
154	void		(*abs_rr_4)(bus_space_tag_t, bus_space_handle_t,
155			    bus_size_t, uint32_t *, bus_size_t);
156	void		(*abs_rr_8)(bus_space_tag_t, bus_space_handle_t,
157			    bus_size_t, uint64_t *, bus_size_t);
158
159	/* read region stream */
160	void		(*abs_rrs_1)(bus_space_tag_t, bus_space_handle_t,
161			    bus_size_t, uint8_t *, bus_size_t);
162	void		(*abs_rrs_2)(bus_space_tag_t, bus_space_handle_t,
163			    bus_size_t, uint16_t *, bus_size_t);
164	void		(*abs_rrs_4)(bus_space_tag_t, bus_space_handle_t,
165			    bus_size_t, uint32_t *, bus_size_t);
166	void		(*abs_rrs_8)(bus_space_tag_t, bus_space_handle_t,
167			    bus_size_t, uint64_t *, bus_size_t);
168
169	/* write (single) */
170	void		(*abs_w_1)(bus_space_tag_t, bus_space_handle_t,
171			    bus_size_t, uint8_t);
172	void		(*abs_w_2)(bus_space_tag_t, bus_space_handle_t,
173			    bus_size_t, uint16_t);
174	void		(*abs_w_4)(bus_space_tag_t, bus_space_handle_t,
175			    bus_size_t, uint32_t);
176	void		(*abs_w_8)(bus_space_tag_t, bus_space_handle_t,
177			    bus_size_t, uint64_t);
178
179	/* write (single) stream */
180	void		(*abs_ws_1)(bus_space_tag_t, bus_space_handle_t,
181			    bus_size_t, uint8_t);
182	void		(*abs_ws_2)(bus_space_tag_t, bus_space_handle_t,
183			    bus_size_t, uint16_t);
184	void		(*abs_ws_4)(bus_space_tag_t, bus_space_handle_t,
185			    bus_size_t, uint32_t);
186	void		(*abs_ws_8)(bus_space_tag_t, bus_space_handle_t,
187			    bus_size_t, uint64_t);
188
189	/* write multiple */
190	void		(*abs_wm_1)(bus_space_tag_t, bus_space_handle_t,
191			    bus_size_t, const uint8_t *, bus_size_t);
192	void		(*abs_wm_2)(bus_space_tag_t, bus_space_handle_t,
193			    bus_size_t, const uint16_t *, bus_size_t);
194	void		(*abs_wm_4)(bus_space_tag_t, bus_space_handle_t,
195			    bus_size_t, const uint32_t *, bus_size_t);
196	void		(*abs_wm_8)(bus_space_tag_t, bus_space_handle_t,
197			    bus_size_t, const uint64_t *, bus_size_t);
198
199	/* write multiple stream */
200	void		(*abs_wms_1)(bus_space_tag_t, bus_space_handle_t,
201			    bus_size_t, const uint8_t *, bus_size_t);
202	void		(*abs_wms_2)(bus_space_tag_t, bus_space_handle_t,
203			    bus_size_t, const uint16_t *, bus_size_t);
204	void		(*abs_wms_4)(bus_space_tag_t, bus_space_handle_t,
205			    bus_size_t, const uint32_t *, bus_size_t);
206	void		(*abs_wms_8)(bus_space_tag_t, bus_space_handle_t,
207			    bus_size_t, const uint64_t *, bus_size_t);
208
209	/* write region */
210	void		(*abs_wr_1)(bus_space_tag_t, bus_space_handle_t,
211			    bus_size_t, const uint8_t *, bus_size_t);
212	void		(*abs_wr_2)(bus_space_tag_t, bus_space_handle_t,
213			    bus_size_t, const uint16_t *, bus_size_t);
214	void		(*abs_wr_4)(bus_space_tag_t, bus_space_handle_t,
215			    bus_size_t, const uint32_t *, bus_size_t);
216	void		(*abs_wr_8)(bus_space_tag_t, bus_space_handle_t,
217			    bus_size_t, const uint64_t *, bus_size_t);
218
219	/* write region stream */
220	void		(*abs_wrs_1)(bus_space_tag_t, bus_space_handle_t,
221			    bus_size_t, const uint8_t *, bus_size_t);
222	void		(*abs_wrs_2)(bus_space_tag_t, bus_space_handle_t,
223			    bus_size_t, const uint16_t *, bus_size_t);
224	void		(*abs_wrs_4)(bus_space_tag_t, bus_space_handle_t,
225			    bus_size_t, const uint32_t *, bus_size_t);
226	void		(*abs_wrs_8)(bus_space_tag_t, bus_space_handle_t,
227			    bus_size_t, const uint64_t *, bus_size_t);
228
229	/* set multiple */
230	void		(*abs_sm_1)(bus_space_tag_t, bus_space_handle_t,
231			    bus_size_t, uint8_t, bus_size_t);
232	void		(*abs_sm_2)(bus_space_tag_t, bus_space_handle_t,
233			    bus_size_t, uint16_t, bus_size_t);
234	void		(*abs_sm_4)(bus_space_tag_t, bus_space_handle_t,
235			    bus_size_t, uint32_t, bus_size_t);
236	void		(*abs_sm_8)(bus_space_tag_t, bus_space_handle_t,
237			    bus_size_t, uint64_t, bus_size_t);
238
239	/* set region */
240	void		(*abs_sr_1)(bus_space_tag_t, bus_space_handle_t,
241			    bus_size_t, uint8_t, bus_size_t);
242	void		(*abs_sr_2)(bus_space_tag_t, bus_space_handle_t,
243			    bus_size_t, uint16_t, bus_size_t);
244	void		(*abs_sr_4)(bus_space_tag_t, bus_space_handle_t,
245			    bus_size_t, uint32_t, bus_size_t);
246	void		(*abs_sr_8)(bus_space_tag_t, bus_space_handle_t,
247			    bus_size_t, uint64_t, bus_size_t);
248
249#if 0 /* See comment on __abs_copy below */
250	/* copy */
251	void		(*abs_c_1)(bus_space_tag_t, bus_space_handle_t,
252			    bus_size_t, bus_space_handle_t, bus_size_t,
253			    bus_size_t);
254	void		(*abs_c_2)(bus_space_tag_t, bus_space_handle_t,
255			    bus_size_t, bus_space_handle_t, bus_size_t,
256			    bus_size_t);
257	void		(*abs_c_4)(bus_space_tag_t, bus_space_handle_t,
258			    bus_size_t, bus_space_handle_t, bus_size_t,
259			    bus_size_t);
260	void		(*abs_c_8)(bus_space_tag_t, bus_space_handle_t,
261			    bus_size_t, bus_space_handle_t, bus_size_t,
262			    bus_size_t);
263#endif
264};
265
266#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
267
268#define	BUS_SPACE_BARRIER_READ	0x01	/* force read barrier */
269#define	BUS_SPACE_BARRIER_WRITE	0x02	/* force write barrier */
270
271/*
272 * Flags used in various bus DMA methods.
273 */
274#define	BUS_DMA_WAITOK		0x000	/* safe to sleep (pseudo-flag)       */
275#define	BUS_DMA_NOWAIT		0x001	/* not safe to sleep		     */
276#define	BUS_DMA_ALLOCNOW	0x002	/* perform resource allocation now   */
277#define	BUS_DMA_COHERENT	0x004	/* hint: map memory DMA coherent     */
278#define	BUS_DMA_STREAMING	0x008	/* hint: sequential, unidirectional */
279#define	BUS_DMA_BUS1		0x010	/* placeholders for bus functions... */
280#define	BUS_DMA_BUS2		0x020
281#define	BUS_DMA_BUS3		0x040
282#define	BUS_DMA_BUS4		0x080
283#define	BUS_DMA_READ		0x100	/* mapping is device -> memory only */
284#define	BUS_DMA_WRITE		0x200	/* mapping is memory -> device only */
285#define	BUS_DMA_NOCACHE		0x400	/* hint: map non-cached memory */
286
287/* Forwards needed by prototypes below. */
288struct mbuf;
289struct uio;
290
291/*
292 * Operations performed by bus_dmamap_sync().
293 */
294#define	BUS_DMASYNC_PREREAD	0x01	/* pre-read synchronization */
295#define	BUS_DMASYNC_POSTREAD	0x02	/* post-read synchronization */
296#define	BUS_DMASYNC_PREWRITE	0x04	/* pre-write synchronization */
297#define	BUS_DMASYNC_POSTWRITE	0x08	/* post-write synchronization */
298
299typedef struct atari_bus_dma_tag	*bus_dma_tag_t;
300typedef struct atari_bus_dmamap		*bus_dmamap_t;
301
302#define BUS_DMA_TAG_VALID(t)    ((t) != (bus_dma_tag_t)0)
303
304/*
305 *	bus_dma_segment_t
306 *
307 *	Describes a single contiguous DMA transaction.  Values
308 *	are suitable for programming into DMA registers.
309 */
310struct atari_bus_dma_segment {
311	bus_addr_t	ds_addr;	/* DMA address */
312	bus_size_t	ds_len;		/* length of transfer */
313};
314typedef struct atari_bus_dma_segment	bus_dma_segment_t;
315
316/*
317 *	bus_dma_tag_t
318 *
319 *	A machine-dependent opaque type describing the implementation of
320 *	DMA for a given bus.
321 */
322struct atari_bus_dma_tag {
323	/*
324	 * The `bounce threshold' is checked while we are loading
325	 * the DMA map.  If the physical address of the segment
326	 * exceeds the threshold, an error will be returned.  The
327	 * caller can then take whatever action is necessary to
328	 * bounce the transfer.  If this value is 0, it will be
329	 * ignored.
330	 */
331	bus_addr_t	_bounce_thresh;
332
333	/*
334	 * The next value can be used to compensate for a constant
335	 * displacement between the address space view of the CPU
336	 * and the devices on the bus.
337	 */
338	int32_t		_displacement;
339
340	/*
341	 * DMA mapping methods.
342	 */
343	int	(*_dmamap_create)(bus_dma_tag_t, bus_size_t, int,
344		    bus_size_t, bus_size_t, int, bus_dmamap_t *);
345	void	(*_dmamap_destroy)(bus_dma_tag_t, bus_dmamap_t);
346	int	(*_dmamap_load)(bus_dma_tag_t, bus_dmamap_t, void *,
347		    bus_size_t, struct proc *, int);
348	int	(*_dmamap_load_mbuf)(bus_dma_tag_t, bus_dmamap_t,
349		    struct mbuf *, int);
350	int	(*_dmamap_load_uio)(bus_dma_tag_t, bus_dmamap_t,
351		    struct uio *, int);
352	int	(*_dmamap_load_raw)(bus_dma_tag_t, bus_dmamap_t,
353		    bus_dma_segment_t *, int, bus_size_t, int);
354	void	(*_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t);
355	void	(*_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t,
356		    bus_addr_t, bus_size_t, int);
357};
358
359/*
360 *	bus_dmamap_t
361 *
362 *	Describes a DMA mapping.
363 */
364struct atari_bus_dmamap {
365	/*
366	 * PRIVATE MEMBERS: not for use my machine-independent code.
367	 */
368	bus_size_t	_dm_size;	   /* largest DMA transfer mappable */
369	int		_dm_segcnt;	   /* number of segs this map can map */
370	bus_size_t	_dm_maxmaxsegsz;   /* fixed largest possible segment */
371	bus_size_t	_dm_boundary;	   /* don't cross this */
372	bus_addr_t	_dm_bounce_thresh; /* bounce threshold; see tag */
373	int		_dm_flags;	   /* misc. flags */
374
375	void		*_dm_cookie;	   /* cookie for bus-specific funcs */
376
377	/*
378	 * PUBLIC MEMBERS: these are used by machine-independent code.
379	 */
380	bus_size_t	dm_maxsegsz;	   /* largest possible segment */
381	bus_size_t	dm_mapsize;	/* size of the mapping */
382	int		dm_nsegs;	/* # valid segments in mapping */
383	bus_dma_segment_t dm_segs[1];	/* segments; variable length */
384};
385
386#endif /* _ATARI_BUS_DEFS_H_ */
387