xref: /openbsd-src/sys/arch/macppc/dev/dbdma.h (revision 36fd90dcf1acf2ddb4ef5dbabe5313b3a8d46ee2)
1*36fd90dcSjsg /*	$OpenBSD: dbdma.h,v 1.5 2021/03/11 11:16:58 jsg Exp $	*/
2d9a5f17fSdrahn /*	$NetBSD: dbdma.h,v 1.2 1998/08/21 16:13:28 tsubai Exp $	*/
3d9a5f17fSdrahn 
4d9a5f17fSdrahn /*
5d9a5f17fSdrahn  * Copyright 1991-1998 by Open Software Foundation, Inc.
6d9a5f17fSdrahn  *              All Rights Reserved
7d9a5f17fSdrahn  *
8d9a5f17fSdrahn  * Permission to use, copy, modify, and distribute this software and
9d9a5f17fSdrahn  * its documentation for any purpose and without fee is hereby granted,
10d9a5f17fSdrahn  * provided that the above copyright notice appears in all copies and
11d9a5f17fSdrahn  * that both the copyright notice and this permission notice appear in
12d9a5f17fSdrahn  * supporting documentation.
13d9a5f17fSdrahn  *
14d9a5f17fSdrahn  * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
15d9a5f17fSdrahn  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
16d9a5f17fSdrahn  * FOR A PARTICULAR PURPOSE.
17d9a5f17fSdrahn  *
18d9a5f17fSdrahn  * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
19d9a5f17fSdrahn  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
20d9a5f17fSdrahn  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
21d9a5f17fSdrahn  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
22d9a5f17fSdrahn  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23d9a5f17fSdrahn  *
24d9a5f17fSdrahn  */
25d9a5f17fSdrahn 
2649f72352Sdrahn #include <machine/bus.h>
2749f72352Sdrahn #include <machine/pio.h>
28d9a5f17fSdrahn 
29d9a5f17fSdrahn #ifndef _POWERMAC_DBDMA_H_
30d9a5f17fSdrahn #define _POWERMAC_DBDMA_H_
31d9a5f17fSdrahn 
32d9a5f17fSdrahn #define	DBDMA_CMD_OUT_MORE	0
33d9a5f17fSdrahn #define	DBDMA_CMD_OUT_LAST	1
34d9a5f17fSdrahn #define	DBDMA_CMD_IN_MORE	2
35d9a5f17fSdrahn #define	DBDMA_CMD_IN_LAST	3
36d9a5f17fSdrahn #define	DBDMA_CMD_STORE_QUAD	4
37d9a5f17fSdrahn #define	DBDMA_CMD_LOAD_QUAD	5
38d9a5f17fSdrahn #define	DBDMA_CMD_NOP		6
39d9a5f17fSdrahn #define	DBDMA_CMD_STOP		7
40d9a5f17fSdrahn 
41d9a5f17fSdrahn /* Keys */
42d9a5f17fSdrahn 
43d9a5f17fSdrahn #define	DBDMA_KEY_STREAM0	0
44d9a5f17fSdrahn #define	DBDMA_KEY_STREAM1	1
45d9a5f17fSdrahn #define	DBDMA_KEY_STREAM2	2
46d9a5f17fSdrahn #define	DBDMA_KEY_STREAM3	3
47d9a5f17fSdrahn 
48d9a5f17fSdrahn /* value 4 is reserved */
49d9a5f17fSdrahn #define	DBDMA_KEY_REGS		5
50d9a5f17fSdrahn #define	DBDMA_KEY_SYSTEM	6
51d9a5f17fSdrahn #define	DBDMA_KEY_DEVICE	7
52d9a5f17fSdrahn 
53d9a5f17fSdrahn #define	DBDMA_INT_NEVER		0
54d9a5f17fSdrahn #define	DBDMA_INT_IF_TRUE	1
55d9a5f17fSdrahn #define	DBDMA_INT_IF_FALSE	2
56d9a5f17fSdrahn #define	DBDMA_INT_ALWAYS	3
57d9a5f17fSdrahn 
58d9a5f17fSdrahn #define	DBDMA_BRANCH_NEVER	0
59d9a5f17fSdrahn #define	DBDMA_BRANCH_IF_TRUE	1
60d9a5f17fSdrahn #define	DBDMA_BRANCH_IF_FALSE	2
61d9a5f17fSdrahn #define	DBDMA_BRANCH_ALWAYS	3
62d9a5f17fSdrahn 
63d9a5f17fSdrahn #define	DBDMA_WAIT_NEVER	0
64d9a5f17fSdrahn #define	DBDMA_WAIT_IF_TRUE	1
65d9a5f17fSdrahn #define DBDMA_WAIT_IF_FALSE	2
66d9a5f17fSdrahn #define	DBDMA_WAIT_ALWAYS	3
67d9a5f17fSdrahn 
68d9a5f17fSdrahn 
69d9a5f17fSdrahn /* Channels */
70d9a5f17fSdrahn 
71d9a5f17fSdrahn #define	DBDMA_SCSI0		0x0
72d9a5f17fSdrahn #define	DBDMA_CURIO_SCSI	DBDMA_SCSI0
73d9a5f17fSdrahn #define	DBDMA_FLOPPY		0x1
74d9a5f17fSdrahn #define	DBDMA_ETHERNET_TX	0x2
75d9a5f17fSdrahn #define	DBDMA_ETHERNET_RV	0x3
76d9a5f17fSdrahn #define	DBDMA_SCC_XMIT_A	0x4
77d9a5f17fSdrahn #define	DBDMA_SCC_RECV_A	0x5
78d9a5f17fSdrahn #define	DBDMA_SCC_XMIT_B	0x6
79d9a5f17fSdrahn #define	DBDMA_SCC_RECV_B	0x7
80d9a5f17fSdrahn #define	DBDMA_AUDIO_OUT		0x8
81d9a5f17fSdrahn #define	DBDMA_AUDIO_IN		0x9
82d9a5f17fSdrahn #define	DBDMA_SCSI1		0xA
83d9a5f17fSdrahn 
84d9a5f17fSdrahn /* Control register values (in little endian) */
85d9a5f17fSdrahn 
86d9a5f17fSdrahn #define	DBDMA_STATUS_MASK	0x000000ff	/* Status Mask */
87d9a5f17fSdrahn #define	DBDMA_CNTRL_BRANCH	0x00000100
88d9a5f17fSdrahn 				/* 0x200 reserved */
89d9a5f17fSdrahn #define	DBDMA_CNTRL_ACTIVE	0x00000400
90d9a5f17fSdrahn #define	DBDMA_CNTRL_DEAD	0x00000800
91d9a5f17fSdrahn #define	DBDMA_CNTRL_WAKE	0x00001000
92d9a5f17fSdrahn #define	DBDMA_CNTRL_FLUSH	0x00002000
93d9a5f17fSdrahn #define	DBDMA_CNTRL_PAUSE	0x00004000
94d9a5f17fSdrahn #define	DBDMA_CNTRL_RUN		0x00008000
95d9a5f17fSdrahn 
96d9a5f17fSdrahn #define	DBDMA_SET_CNTRL(x)	( ((x) | (x) << 16) )
97d9a5f17fSdrahn #define	DBDMA_CLEAR_CNTRL(x)	( (x) << 16)
98d9a5f17fSdrahn 
99e6d856e8Smickey #define	DBDMA_COUNT_MAX		0x8000
100d9a5f17fSdrahn 
101d9a5f17fSdrahn #define	DBDMA_REGMAP(channel) \
102d9a5f17fSdrahn 		(dbdma_regmap_t *)((v_u_char *) POWERMAC_IO(PCI_DMA_BASE_PHYS) \
103d9a5f17fSdrahn 				+ (channel << 8))
104d9a5f17fSdrahn 
105d9a5f17fSdrahn /* This struct is layout in little endian format */
106d9a5f17fSdrahn 
107d9a5f17fSdrahn struct dbdma_command {
108d9a5f17fSdrahn 	u_int16_t	d_count;
109d9a5f17fSdrahn 	u_int16_t	d_command;
110d9a5f17fSdrahn 	u_int32_t	d_address;
111d9a5f17fSdrahn 	u_int32_t	d_cmddep;
112d9a5f17fSdrahn 	u_int16_t	d_resid;
113d9a5f17fSdrahn 	u_int16_t	d_status;
114d9a5f17fSdrahn };
115d9a5f17fSdrahn 
116d9a5f17fSdrahn typedef struct dbdma_command dbdma_command_t;
117d9a5f17fSdrahn 
118d9a5f17fSdrahn #define	DBDMA_BUILD_CMD(d, cmd, key, interrupt, wait, branch) {		\
119d9a5f17fSdrahn 		dbdma_st16(&(d)->d_command,				\
120d9a5f17fSdrahn 				((cmd) << 12) | ((key) << 8) |		\
121d9a5f17fSdrahn 				((interrupt) << 4) |			\
122d9a5f17fSdrahn 				((branch) << 2) | (wait));		\
123d9a5f17fSdrahn 	}
124d9a5f17fSdrahn 
125d9a5f17fSdrahn #define	DBDMA_BUILD(d, cmd, key, count, address, interrupt, wait, branch) { \
126d9a5f17fSdrahn 		dbdma_st16(&(d)->d_count, count);			\
127d9a5f17fSdrahn 		dbdma_st32(&(d)->d_address, address);			\
128d9a5f17fSdrahn 		(d)->d_resid = 0;					\
129d9a5f17fSdrahn 		(d)->d_status = 0;					\
130d9a5f17fSdrahn 		(d)->d_cmddep = 0;					\
131d9a5f17fSdrahn 		dbdma_st16(&(d)->d_command,				\
132d9a5f17fSdrahn 				((cmd) << 12) | ((key) << 8) |		\
133d9a5f17fSdrahn 				((interrupt) << 4) |			\
134d9a5f17fSdrahn 				((branch) << 2) | (wait));		\
135d9a5f17fSdrahn 	}
136d9a5f17fSdrahn 
137d9a5f17fSdrahn #if 0
138d9a5f17fSdrahn static __inline__ void
139d9a5f17fSdrahn dbdma_st32(a, x)
140d9a5f17fSdrahn 	volatile u_int32_t *a;
141d9a5f17fSdrahn 	u_int32_t x;
142d9a5f17fSdrahn {
143d9a5f17fSdrahn 	__asm__ volatile
144d9a5f17fSdrahn 		("stwbrx %0,0,%1" : : "r" (x), "r" (a) : "memory");
145d9a5f17fSdrahn 	__asm__ volatile ("eieio");
146d9a5f17fSdrahn }
147d9a5f17fSdrahn 
148d9a5f17fSdrahn static __inline__ void
149d9a5f17fSdrahn dbdma_st16(a, x)
150d9a5f17fSdrahn 	volatile u_int16_t *a;
151d9a5f17fSdrahn 	u_int16_t x;
152d9a5f17fSdrahn {
153d9a5f17fSdrahn 	__asm__ volatile
154d9a5f17fSdrahn 		("sthbrx %0,0,%1" : : "r" (x), "r" (a) : "memory");
155d9a5f17fSdrahn 	__asm__ volatile ("eieio");
156d9a5f17fSdrahn }
157d9a5f17fSdrahn 
158d9a5f17fSdrahn static __inline__ u_int32_t
159d9a5f17fSdrahn dbdma_ld32(a)
160d9a5f17fSdrahn 	volatile u_int32_t *a;
161d9a5f17fSdrahn {
162d9a5f17fSdrahn 	u_int32_t swap;
163d9a5f17fSdrahn 
164d9a5f17fSdrahn 	__asm__ volatile ("eieio");
165d9a5f17fSdrahn 	__asm__ volatile
166d9a5f17fSdrahn 		("lwbrx %0,0,%1" :  "=r" (swap) : "r" (a));
167d9a5f17fSdrahn 
168d9a5f17fSdrahn 	return	swap;
169d9a5f17fSdrahn }
170d9a5f17fSdrahn 
171d9a5f17fSdrahn static __inline__ u_int16_t
172d9a5f17fSdrahn dbdma_ld16(a)
173d9a5f17fSdrahn 	volatile u_int16_t *a;
174d9a5f17fSdrahn {
175d9a5f17fSdrahn 	u_int16_t swap;
176d9a5f17fSdrahn 
177d9a5f17fSdrahn 	__asm__ volatile ("eieio");
178d9a5f17fSdrahn 	__asm__ volatile
179d9a5f17fSdrahn 		("lhbrx %0,0,%1" :  "=r" (swap) : "r" (a));
180d9a5f17fSdrahn 
181d9a5f17fSdrahn 	return	swap;
182d9a5f17fSdrahn }
183d9a5f17fSdrahn 
184d9a5f17fSdrahn #define	DBDMA_LD4_ENDIAN(a)	dbdma_ld32(a)
185d9a5f17fSdrahn #define	DBDMA_ST4_ENDIAN(a, x)	dbdma_st32(a, x)
186d9a5f17fSdrahn #else
187d9a5f17fSdrahn #define	DBDMA_LD4_ENDIAN(a)	in32rb(a)
188d9a5f17fSdrahn #define	DBDMA_ST4_ENDIAN(a, x)	out32rb(a, x)
189d9a5f17fSdrahn #define dbdma_st16(a,x)		out16rb((a),(x))
190d9a5f17fSdrahn #define dbdma_ld16(a)		in16rb(a)
191d9a5f17fSdrahn #define dbdma_st32(a,x)		out32rb((a),(x))
192d9a5f17fSdrahn #define dbdma_ld32(a)		in32rb(a)
193d9a5f17fSdrahn #endif
194d9a5f17fSdrahn 
195d9a5f17fSdrahn 
196d9a5f17fSdrahn /*
197d9a5f17fSdrahn  * DBDMA Channel layout
198d9a5f17fSdrahn  *
199d9a5f17fSdrahn  * NOTE - This structure is in little-endian format.
200d9a5f17fSdrahn  */
201d9a5f17fSdrahn 
202d9a5f17fSdrahn struct dbdma_regmap {
203d9a5f17fSdrahn 	u_int32_t	d_control;	/* Control Register */
204d9a5f17fSdrahn 	u_int32_t	d_status;	/* DBDMA Status Register */
205d9a5f17fSdrahn 	u_int32_t	d_cmdptrhi;	/* MSB of command pointer (not used yet) */
206d9a5f17fSdrahn 	u_int32_t	d_cmdptrlo;	/* LSB of command pointer */
207d9a5f17fSdrahn 	u_int32_t	d_intselect;	/* Interrupt Select */
208d9a5f17fSdrahn 	u_int32_t	d_branch;	/* Branch selection */
209d9a5f17fSdrahn 	u_int32_t	d_wait;		/* Wait selection */
210d9a5f17fSdrahn 	u_int32_t	d_transmode;	/* Transfer modes */
211d9a5f17fSdrahn 	u_int32_t	d_dataptrhi;	/* MSB of Data Pointer */
212d9a5f17fSdrahn 	u_int32_t	d_dataptrlo;	/* LSB of Data Pointer */
213d9a5f17fSdrahn 	u_int32_t	d_reserved;	/* Reserved for the moment */
214d9a5f17fSdrahn 	u_int32_t	d_branchptrhi;	/* MSB of Branch Pointer */
215d9a5f17fSdrahn 	u_int32_t	d_branchptrlo;	/* LSB of Branch Pointer */
216*36fd90dcSjsg 	/* The remaining fields are undefined and unimplemented */
217d9a5f17fSdrahn };
218d9a5f17fSdrahn 
219d9a5f17fSdrahn typedef volatile struct dbdma_regmap dbdma_regmap_t;
220d9a5f17fSdrahn 
221d9a5f17fSdrahn /* DBDMA routines */
222e6d856e8Smickey typedef
223e6d856e8Smickey struct dbdma_desc {
224fe1b9aebSmiod 	bus_dma_tag_t d_dmat;
225e6d856e8Smickey 	bus_dmamap_t d_map;
226e6d856e8Smickey 	dbdma_command_t *d_addr;
227e6d856e8Smickey #define	d_paddr	d_segs->ds_addr
228e6d856e8Smickey 	bus_dma_segment_t d_segs[1];
229fe1b9aebSmiod 	int d_nsegs;
230e6d856e8Smickey 	size_t d_size;
231e6d856e8Smickey } *dbdma_t;
232d9a5f17fSdrahn 
233e6d856e8Smickey dbdma_t	dbdma_alloc(bus_dma_tag_t, int); /* Allocate command structures */
234e6d856e8Smickey void	dbdma_free(dbdma_t);	/* Dispose command structures */
235e6d856e8Smickey void	dbdma_start(dbdma_regmap_t *channel, dbdma_t dt);
236d9a5f17fSdrahn void	dbdma_stop(dbdma_regmap_t *channel);
237d9a5f17fSdrahn void	dbdma_flush(dbdma_regmap_t *channel);
238d9a5f17fSdrahn void	dbdma_reset(dbdma_regmap_t *channel);
239d9a5f17fSdrahn void	dbdma_continue(dbdma_regmap_t *channel);
240d9a5f17fSdrahn void	dbdma_pause(dbdma_regmap_t *channel);
241d9a5f17fSdrahn 
242d9a5f17fSdrahn 
243d9a5f17fSdrahn #endif /* !defined(_POWERMAC_DBDMA_H_) */
244