xref: /netbsd-src/sys/arch/atari/dev/atari5380.c (revision d48f14661dda8638fee055ba15d35bdfb29b9fa8)
1 /*	$NetBSD: atari5380.c,v 1.41 2006/05/10 06:24:02 skrll Exp $	*/
2 
3 /*
4  * Copyright (c) 1995 Leo Weppelman.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by Leo Weppelman.
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 #include <sys/cdefs.h>
34 __KERNEL_RCSID(0, "$NetBSD: atari5380.c,v 1.41 2006/05/10 06:24:02 skrll Exp $");
35 
36 #include "opt_atariscsi.h"
37 
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/kernel.h>
41 #include <sys/device.h>
42 #include <sys/buf.h>
43 #include <dev/scsipi/scsi_all.h>
44 #include <dev/scsipi/scsipi_all.h>
45 #include <dev/scsipi/scsi_message.h>
46 #include <dev/scsipi/scsiconf.h>
47 
48 #include <uvm/uvm_extern.h>
49 
50 #include <m68k/asm_single.h>
51 #include <m68k/cpu.h>
52 #include <m68k/cacheops.h>
53 
54 #include <atari/atari/stalloc.h>
55 
56 /*
57  * Include the driver definitions
58  */
59 #include <atari/dev/ncr5380reg.h>
60 
61 #include <machine/stdarg.h>
62 #include <machine/iomap.h>
63 #include <machine/mfp.h>
64 
65 #include <atari/atari/intr.h>
66 
67 #if defined(FALCON_SCSI)
68 #include <machine/dma.h>
69 #endif
70 
71 /*
72  * Set the various driver options
73  */
74 #define	NREQ		18	/* Size of issue queue			*/
75 #define	AUTO_SENSE	1	/* Automatically issue a request-sense 	*/
76 
77 #define	DRNAME		ncrscsi	/* used in various prints		*/
78 #undef	DBG_SEL			/* Show the selection process		*/
79 #undef	DBG_REQ			/* Show enqueued/ready requests		*/
80 #undef	DBG_ERR_RET		/* Show requests with != 0 return code	*/
81 #undef	DBG_NOWRITE		/* Do not allow writes to the targets	*/
82 #undef	DBG_PIO			/* Show the polled-I/O process		*/
83 #undef	DBG_INF			/* Show information transfer process	*/
84 #define	DBG_NOSTATIC		/* No static functions, all in DDB trace*/
85 #define	DBG_PID		15	/* Keep track of driver			*/
86 #define	REAL_DMA		/* Use DMA if sensible			*/
87 #if defined(FALCON_SCSI)
88 #define	REAL_DMA_POLL	1	/* 1: Poll for end of DMA-transfer	*/
89 #else
90 #define	REAL_DMA_POLL	0	/* 1: Poll for end of DMA-transfer	*/
91 #endif
92 #undef	USE_PDMA		/* Use special pdma-transfer function	*/
93 #define MIN_PHYS	65536	/*BARF!!!!*/
94 
95 /*
96  * Include more driver definitions
97  */
98 #include <atari/dev/ncr5380var.h>
99 
100 /*
101  * The atari specific driver options
102  */
103 #undef	NO_TTRAM_DMA		/* Do not use DMA to TT-ram. This	*/
104 				/*    fails on older atari's		*/
105 #define	ENABLE_NCR5380(sc)	cur_softc = sc;
106 
107 static u_char	*alloc_bounceb __P((u_long));
108 static void	free_bounceb __P((u_char *));
109 static int	machine_match __P((struct device *, void *, void *,
110 							struct cfdriver *));
111        void	scsi_ctrl __P((int));
112        void	scsi_dma __P((int));
113 
114 /*
115  * Functions that do nothing on the atari
116  */
117 #define	pdma_ready()		0
118 
119 #if defined(TT_SCSI)
120 
121 void	ncr5380_drq_intr __P((int));
122 
123 /*
124  * Define all the things we need of the DMA-controller
125  */
126 #define	SCSI_DMA	((struct scsi_dma *)AD_SCSI_DMA)
127 #define	SCSI_5380	((struct scsi_5380 *)AD_NCR5380)
128 
129 struct scsi_dma {
130 	volatile u_char		s_dma_ptr[8];	/* use only the odd bytes */
131 	volatile u_char		s_dma_cnt[8];	/* use only the odd bytes */
132 	volatile u_char		s_dma_res[4];	/* data residue register  */
133 	volatile u_char		s_dma_gap;	/* not used		  */
134 	volatile u_char		s_dma_ctrl;	/* control register	  */
135 	volatile u_char		s_dma_gap2;	/* not used		  */
136 	volatile u_char		s_hdma_ctrl;	/* Hades control register */
137 };
138 
139 #define	set_scsi_dma(addr, val)	(void)(					\
140 	{								\
141 	u_char	*address = (u_char*)__UNVOLATILE(addr+1);		\
142 	u_long	nval	 = (u_long)val;					\
143 	__asm("movepl	%0, %1@(0)": :"d" (nval), "a" (address));	\
144 	})
145 
146 #define	get_scsi_dma(addr, res)	(					\
147 	{								\
148 	u_char	*address = (u_char*)__UNVOLATILE(addr+1);		\
149 	u_long	nval;							\
150 	__asm("movepl	%1@(0), %0": "=d" (nval) : "a" (address));	\
151 	res = (u_long)nval;						\
152 	})
153 
154 /*
155  * Defines for TT-DMA control register
156  */
157 #define	SD_BUSERR	0x80		/* 1 = transfer caused bus error*/
158 #define	SD_ZERO		0x40		/* 1 = byte counter is zero	*/
159 #define	SD_ENABLE	0x02		/* 1 = Enable DMA		*/
160 #define	SD_OUT		0x01		/* Direction: memory to SCSI	*/
161 #define	SD_IN		0x00		/* Direction: SCSI to memory	*/
162 
163 /*
164  * Defines for Hades-DMA control register
165  */
166 #define	SDH_BUSERR	0x02		/* 1 = Bus error		*/
167 #define SDH_EOP		0x01		/* 1 = Signal EOP on 5380	*/
168 #define	SDH_ZERO	0x40		/* 1 = Byte counter is zero	*/
169 
170 /*
171  * Define the 5380 register set
172  */
173 struct scsi_5380 {
174 	volatile u_char	scsi_5380[16];	/* use only the odd bytes	*/
175 };
176 #endif /* TT_SCSI */
177 
178 /**********************************************
179  * Variables present for both TT and Falcon.  *
180  **********************************************/
181 
182 /*
183  * Softc of currently active controller (a bit of fake; we only have one)
184  */
185 static struct ncr_softc	*cur_softc;
186 
187 #if defined(TT_SCSI) && !defined(FALCON_SCSI)
188 /*
189  * We can be more efficient for some functions when only TT_SCSI is selected
190  */
191 #define	GET_5380_REG(rnum)	SCSI_5380->scsi_5380[(rnum << 1) | 1]
192 #define	SET_5380_REG(rnum,val)	(SCSI_5380->scsi_5380[(rnum << 1) | 1] = val)
193 
194 #define scsi_mach_init(sc)	scsi_tt_init(sc)
195 #define scsi_ienable()		scsi_tt_ienable()
196 #define scsi_idisable()		scsi_tt_idisable()
197 #define	scsi_clr_ipend()	scsi_tt_clr_ipend()
198 #define scsi_ipending()		(GET_5380_REG(NCR5380_DMSTAT) & SC_IRQ_SET)
199 #define scsi_dma_setup(r,p,m)	scsi_tt_dmasetup(r, p, m)
200 #define wrong_dma_range(r,d)	tt_wrong_dma_range(r, d)
201 #define poll_edma(reqp)		tt_poll_edma(reqp)
202 #define get_dma_result(r, b)	tt_get_dma_result(r, b)
203 #define	can_access_5380()	1
204 #define emulated_dma()		((machineid & ATARI_HADES) ? 1 : 0)
205 
206 #define fair_to_keep_dma()	1
207 #define claimed_dma()		1
208 #define reconsider_dma()
209 
210 #endif /* defined(TT_SCSI) && !defined(FALCON_SCSI) */
211 
212 #if defined(TT_SCSI)
213 
214 /*
215  * Prototype functions defined below
216  */
217 #ifdef NO_TTRAM_DMA
218 static int tt_wrong_dma_range __P((SC_REQ *, struct dma_chain *));
219 #endif
220 static void	scsi_tt_init __P((struct ncr_softc *));
221 static u_char	get_tt_5380_reg __P((u_short));
222 static void	set_tt_5380_reg __P((u_short, u_short));
223 static void	scsi_tt_dmasetup __P((SC_REQ *, u_int, u_char));
224 static int	tt_poll_edma __P((SC_REQ *));
225 static u_char	*ptov __P((SC_REQ *, u_long*));
226 static int	tt_get_dma_result __P((SC_REQ *, u_long *));
227        void	scsi_tt_ienable __P((void));
228        void	scsi_tt_idisable __P((void));
229        void	scsi_tt_clr_ipend __P((void));
230 
231 /*
232  * Define these too, so we can use them locally...
233  */
234 #define	GET_TT_REG(rnum)	SCSI_5380->scsi_5380[(rnum << 1) | 1]
235 #define	SET_TT_REG(rnum,val)	(SCSI_5380->scsi_5380[(rnum << 1) | 1] = val)
236 
237 #ifdef NO_TTRAM_DMA
238 static int
239 tt_wrong_dma_range(reqp, dm)
240 SC_REQ			*reqp;
241 struct dma_chain	*dm;
242 {
243 	if (dm->dm_addr & 0xff000000) {
244 		reqp->dr_flag |= DRIVER_BOUNCING;
245 		return(1);
246 	}
247 	return(0);
248 }
249 #else
250 #define	tt_wrong_dma_range(reqp, dm)	0
251 #endif
252 
253 static void
254 scsi_tt_init(struct ncr_softc *sc)
255 {
256 	/*
257 	 * Enable SCSI-related interrupts
258 	 */
259 	MFP2->mf_aer  |= 0x80;		/* SCSI IRQ goes HIGH!!!!!	*/
260 
261 	if (machineid & ATARI_TT) {
262 		/* SCSI-DMA interrupts		*/
263 		MFP2->mf_ierb |= IB_SCDM;
264 		MFP2->mf_iprb  = (u_int8_t)~IB_SCDM;
265 		MFP2->mf_imrb |= IB_SCDM;
266 	}
267 	else if (machineid & ATARI_HADES) {
268 		SCSI_DMA->s_hdma_ctrl = 0;
269 
270 		if (intr_establish(2, AUTO_VEC, 0,
271 					(hw_ifun_t)ncr5380_drq_intr,
272 					NULL) == NULL)
273 		panic("scsi_tt_init: Can't establish drq-interrupt");
274 	}
275 	else panic("scsi_tt_init: should not come here");
276 
277 	MFP2->mf_iera |= IA_SCSI;	/* SCSI-5380 interrupts		*/
278 	MFP2->mf_ipra  = (u_int8_t)~IA_SCSI;
279 	MFP2->mf_imra |= IA_SCSI;
280 
281 	/*
282 	 * LWP: DMA transfers to TT-ram causes data to be garbeled
283 	 * without notice on some revisons of the TT-mainboard.
284 	 * When program's generate misterious Segmentations faults,
285 	 * try turning on NO_TTRAM_DMA.
286 	 */
287 #ifdef NO_TTRAM_DMA
288 	printf(": DMA to TT-RAM is disabled!");
289 #endif
290 }
291 
292 static u_char
293 get_tt_5380_reg(u_short rnum)
294 {
295 	return(SCSI_5380->scsi_5380[(rnum << 1) | 1]);
296 }
297 
298 static void
299 set_tt_5380_reg(u_short rnum, u_short val)
300 {
301 	SCSI_5380->scsi_5380[(rnum << 1) | 1] = val;
302 }
303 
304 extern inline void
305 scsi_tt_ienable(void)
306 {
307 	if (machineid & ATARI_TT)
308 		single_inst_bset_b(MFP2->mf_imrb, IB_SCDM);
309 	single_inst_bset_b(MFP2->mf_imra, IA_SCSI);
310 }
311 
312 extern inline void
313 scsi_tt_idisable(void)
314 {
315 	if (machineid & ATARI_TT)
316 		single_inst_bclr_b(MFP2->mf_imrb, IB_SCDM);
317 	single_inst_bclr_b(MFP2->mf_imra, IA_SCSI);
318 }
319 
320 extern inline void
321 scsi_tt_clr_ipend(void)
322 {
323 	int	tmp;
324 
325 	SCSI_DMA->s_dma_ctrl = 0;
326 	tmp = GET_TT_REG(NCR5380_IRCV);
327 	if (machineid & ATARI_TT)
328 		MFP2->mf_iprb = (u_int8_t)~IB_SCDM;
329 	MFP2->mf_ipra = (u_int8_t)~IA_SCSI;
330 
331 	/*
332 	 * Remove interrupts already scheduled.
333 	 */
334 	rem_sicallback((si_farg)ncr_ctrl_intr);
335 	rem_sicallback((si_farg)ncr_dma_intr);
336 }
337 
338 static void
339 scsi_tt_dmasetup(SC_REQ *reqp, u_int phase, u_char	mode)
340 {
341 	if (PH_IN(phase)) {
342 		SCSI_DMA->s_dma_ctrl = SD_IN;
343 		if (machineid & ATARI_HADES)
344 		    SCSI_DMA->s_hdma_ctrl &= ~(SDH_BUSERR|SDH_EOP);
345 		set_scsi_dma(&(SCSI_DMA->s_dma_ptr), reqp->dm_cur->dm_addr);
346 		set_scsi_dma(&(SCSI_DMA->s_dma_cnt), reqp->dm_cur->dm_count);
347 		SET_TT_REG(NCR5380_ICOM, 0);
348 		SET_TT_REG(NCR5380_MODE, mode);
349 		SCSI_DMA->s_dma_ctrl = SD_ENABLE;
350 		SET_TT_REG(NCR5380_IRCV, 0);
351 	}
352 	else {
353 		SCSI_DMA->s_dma_ctrl = SD_OUT;
354 		if (machineid & ATARI_HADES)
355 		    SCSI_DMA->s_hdma_ctrl &= ~(SDH_BUSERR|SDH_EOP);
356 		set_scsi_dma(&(SCSI_DMA->s_dma_ptr), reqp->dm_cur->dm_addr);
357 		set_scsi_dma(&(SCSI_DMA->s_dma_cnt), reqp->dm_cur->dm_count);
358 		SET_TT_REG(NCR5380_MODE, mode);
359 		SET_TT_REG(NCR5380_ICOM, SC_ADTB);
360 		SET_TT_REG(NCR5380_DMSTAT, 0);
361 		SCSI_DMA->s_dma_ctrl = SD_ENABLE|SD_OUT;
362 	}
363 }
364 
365 static int
366 tt_poll_edma(SC_REQ *reqp)
367 {
368 	u_char	dmstat, dmastat;
369 	int	timeout = 9000; /* XXX */
370 
371 	/*
372 	 * We wait here until the DMA has finished. This can be
373 	 * achieved by checking the following conditions:
374 	 *   - 5380:
375 	 *	- End of DMA flag is set
376 	 *	- We lost BSY (error!!)
377 	 *	- A phase mismatch has occurred (partial transfer)
378 	 *   - DMA-controller:
379 	 *	- A bus error occurred (Kernel error!!)
380 	 *	- All bytes are transferred
381 	 * If one of the terminating conditions was met, we call
382 	 * 'dma_ready' to check errors and perform the bookkeeping.
383 	 */
384 
385 	scsi_tt_idisable();
386 	for (;;) {
387 		delay(20);
388 		if (--timeout <= 0) {
389 			ncr_tprint(reqp, "timeout on polled transfer\n");
390 			reqp->xs->error = XS_TIMEOUT;
391 			scsi_tt_ienable();
392 			return(0);
393 		}
394 		dmstat  = GET_TT_REG(NCR5380_DMSTAT);
395 
396 		if ((machineid & ATARI_HADES) && (dmstat & SC_DMA_REQ)) {
397 			ncr5380_drq_intr(1);
398 			dmstat  = GET_TT_REG(NCR5380_DMSTAT);
399 		}
400 
401 		dmastat = SCSI_DMA->s_dma_ctrl;
402 		if (dmstat & (SC_END_DMA|SC_BSY_ERR|SC_IRQ_SET))
403 			break;
404 		if (!(dmstat & SC_PHS_MTCH))
405 			break;
406 		if (dmastat & (SD_BUSERR|SD_ZERO))
407 			break;
408 	}
409 	scsi_tt_ienable();
410 	return(1);
411 }
412 
413 /*
414  * Convert physical DMA address to a virtual address.
415  */
416 static u_char *
417 ptov(SC_REQ *reqp, u_long *phaddr)
418 {
419 	struct dma_chain	*dm;
420 	u_char			*vaddr;
421 
422 	dm = reqp->dm_chain;
423 	vaddr = reqp->xdata_ptr;
424 	for(; dm < reqp->dm_cur; dm++)
425 		vaddr += dm->dm_count;
426 	vaddr += (u_long)phaddr - dm->dm_addr;
427 	return(vaddr);
428 }
429 
430 static int
431 tt_get_dma_result(SC_REQ *reqp, u_long *bytes_left)
432 {
433 	int	dmastat, dmstat;
434 	u_char	*byte_p;
435 	u_long	leftover, ptr;
436 
437 	dmastat = SCSI_DMA->s_dma_ctrl;
438 	dmstat  = GET_TT_REG(NCR5380_DMSTAT);
439 	get_scsi_dma(SCSI_DMA->s_dma_cnt, leftover);
440 	get_scsi_dma(SCSI_DMA->s_dma_ptr, ptr);
441 	byte_p = (u_char *)ptr;
442 
443 	if (dmastat & SD_BUSERR) {
444 		/*
445 		 * The DMA-controller seems to access 8 bytes beyond
446 		 * it's limits on output. Therefore check also the byte
447 		 * count. If it's zero, ignore the bus error.
448 		 */
449 		if (leftover != 0) {
450 			ncr_tprint(reqp,
451 				"SCSI-DMA buserror - accessing 0x%x\n", byte_p);
452 			reqp->xs->error = XS_DRIVER_STUFFUP;
453 		}
454 	}
455 
456 	/*
457 	 * We handle the following special condition below:
458 	 *  -- The device disconnects in the middle of a write operation --
459 	 * In this case, the 5380 has already pre-fetched the next byte from
460 	 * the DMA-controller before the phase mismatch occurs. Therefore,
461 	 * leftover is 1 too low.
462 	 * This does not always happen! Therefore, we only do this when
463 	 * leftover is odd. This assumes that DMA transfers are _even_! This
464 	 * is normally the case on disks and types but might not always be.
465 	 * XXX: Check if ACK is consistently high on these occasions LWP
466 	 */
467 	if ((leftover & 1) && !(dmstat & SC_PHS_MTCH) && PH_OUT(reqp->phase))
468 		leftover++;
469 
470 	/*
471 	 * Check if there are some 'restbytes' left in the DMA-controller.
472 	 */
473 	if ((machineid & ATARI_TT) && ((u_long)byte_p & 3)
474 	    && PH_IN(reqp->phase)) {
475 		u_char	*p, *q;
476 
477 		p = ptov(reqp, (u_long *)((u_long)byte_p & ~3));
478 		q = (u_char*)&(SCSI_DMA->s_dma_res);
479 		switch ((u_long)byte_p & 3) {
480 			case 3: *p++ = *q++;
481 			case 2: *p++ = *q++;
482 			case 1: *p++ = *q++;
483 		}
484 	}
485 	*bytes_left = leftover;
486 	return ((dmastat & (SD_BUSERR|SD_ZERO)) ? 1 : 0);
487 }
488 
489 static u_char *dma_ptr;
490 void
491 ncr5380_drq_intr(poll)
492 int poll;
493 {
494 extern	int			*nofault;
495 	label_t			faultbuf;
496 	int			write;
497 	u_long	 		count, t;
498 	u_char			*data_p = (u_char*)(stio_addr+0x741);
499 
500 	/*
501 	 * Block SCSI interrupts while emulating DMA. They come
502 	 * at a higher priority.
503 	 */
504 	single_inst_bclr_b(MFP2->mf_imra, IA_SCSI);
505 
506 	/*
507 	 * Setup for a possible bus error caused by SCSI controller
508 	 * switching out of DATA-IN/OUT before we're done with the
509 	 * current transfer.
510 	 */
511 	nofault = (int *) &faultbuf;
512 
513 	if (setjmp((label_t *) nofault)) {
514 		u_char	*ptr;
515 		u_long	cnt, tmp;
516 
517 		PID("drq berr");
518 		nofault = (int *) 0;
519 
520 		/*
521 		 * Determine number of bytes transferred
522 		 */
523 		get_scsi_dma(SCSI_DMA->s_dma_ptr, tmp);
524 		ptr = (u_char *)tmp;
525 		cnt = dma_ptr - ptr;
526 
527 		if (cnt != 0) {
528 			/*
529 			 * Update the DMA pointer/count fields
530 			 */
531 			set_scsi_dma(SCSI_DMA->s_dma_ptr, dma_ptr);
532 			get_scsi_dma(SCSI_DMA->s_dma_cnt, tmp);
533 			set_scsi_dma(SCSI_DMA->s_dma_cnt, tmp - cnt);
534 
535 			if (tmp > cnt) {
536 				/*
537 				 * Still more to transfer
538 				 */
539 				if (!poll)
540 				   single_inst_bset_b(MFP2->mf_imra, IA_SCSI);
541 				return;
542 			}
543 
544 			/*
545 			 * Signal EOP to 5380
546 			 */
547 			SCSI_DMA->s_hdma_ctrl |= SDH_EOP;
548 		}
549 		else {
550 			nofault = (int *) &faultbuf;
551 
552 			/*
553 			 * Try to figure out if the byte-count was
554 			 * zero because there was no (more) data or
555 			 * because the dma_ptr is bogus.
556 			 */
557 			if (setjmp((label_t *) nofault)) {
558 				/*
559 				 * Set the bus-error bit
560 				 */
561 				SCSI_DMA->s_hdma_ctrl |= SDH_BUSERR;
562 			}
563 			__asm volatile ("tstb	%0@(0)": : "a" (dma_ptr));
564 			nofault = (int *)0;
565 		}
566 
567 		/*
568 		 * Schedule an interrupt
569 		 */
570 		if (!poll && (SCSI_DMA->s_dma_ctrl & SD_ENABLE))
571 		    add_sicallback((si_farg)ncr_dma_intr, (void *)cur_softc, 0);
572 
573 		/*
574 		 * Clear DMA-mode
575 		 */
576 		SCSI_DMA->s_dma_ctrl &= ~SD_ENABLE;
577 		if (!poll)
578 			single_inst_bset_b(MFP2->mf_imra, IA_SCSI);
579 
580 		return;
581 	}
582 
583 	write = (SCSI_DMA->s_dma_ctrl & SD_OUT) ? 1 : 0;
584 #if DBG_PID
585 	if (write) {
586 		PID("drq (in)");
587 	} else {
588 		PID("drq (out)");
589 	}
590 #endif
591 
592 	get_scsi_dma(SCSI_DMA->s_dma_cnt, count);
593 	get_scsi_dma(SCSI_DMA->s_dma_ptr, t);
594 	dma_ptr = (u_char *)t;
595 
596 	/*
597 	 * Keep pushing bytes until we're done or a bus-error
598 	 * signals that the SCSI controller is not ready.
599 	 * NOTE: I tried some optimalizations in these loops,
600 	 *       but they had no effect on transfer speed.
601 	 */
602 	if (write) {
603 		while(count--) {
604 			*data_p = *dma_ptr++;
605 		}
606 	}
607 	else {
608 		while(count--) {
609 			*dma_ptr++ = *data_p;
610 		}
611 	}
612 
613 	/*
614 	 * OK.  No bus error occurred above.  Clear the nofault flag
615 	 * so we no longer short-circuit bus errors.
616 	 */
617 	nofault = (int *) 0;
618 
619 	/*
620 	 * Schedule an interrupt
621 	 */
622 	if (!poll && (SCSI_DMA->s_dma_ctrl & SD_ENABLE))
623 	    add_sicallback((si_farg)ncr_dma_intr, (void *)cur_softc, 0);
624 
625 	/*
626 	 * Clear DMA-mode
627 	 */
628 	SCSI_DMA->s_dma_ctrl &= ~SD_ENABLE;
629 
630 	/*
631 	 * Update the DMA 'registers' to reflect that all bytes
632 	 * have been transfered and tell this to the 5380 too.
633 	 */
634 	set_scsi_dma(SCSI_DMA->s_dma_ptr, (u_long)dma_ptr);
635 	set_scsi_dma(SCSI_DMA->s_dma_cnt, 0);
636 	SCSI_DMA->s_hdma_ctrl |= SDH_EOP;
637 
638 	PID("end drq");
639 	if (!poll)
640 		single_inst_bset_b(MFP2->mf_imra, IA_SCSI);
641 
642 	return;
643 }
644 
645 #endif /* defined(TT_SCSI) */
646 
647 #if defined(FALCON_SCSI) && !defined(TT_SCSI)
648 
649 #define	GET_5380_REG(rnum)	get_falcon_5380_reg(rnum)
650 #define	SET_5380_REG(rnum,val)	set_falcon_5380_reg(rnum, val)
651 #define scsi_mach_init(sc)	scsi_falcon_init(sc)
652 #define scsi_ienable()		scsi_falcon_ienable()
653 #define scsi_idisable()		scsi_falcon_idisable()
654 #define	scsi_clr_ipend()	scsi_falcon_clr_ipend()
655 #define	scsi_ipending()		scsi_falcon_ipending()
656 #define scsi_dma_setup(r,p,m)	scsi_falcon_dmasetup(r, p, m)
657 #define wrong_dma_range(r,d)	falcon_wrong_dma_range(r, d)
658 #define poll_edma(reqp)		falcon_poll_edma(reqp)
659 #define get_dma_result(r, b)	falcon_get_dma_result(r, b)
660 #define	can_access_5380()	falcon_can_access_5380()
661 #define	emulated_dma()		0
662 
663 #define fair_to_keep_dma()	(!st_dmawanted())
664 #define claimed_dma()		falcon_claimed_dma()
665 #define reconsider_dma()	falcon_reconsider_dma()
666 
667 #endif /* defined(FALCON_SCSI) && !defined(TT_SCSI) */
668 
669 #if defined(FALCON_SCSI)
670 
671 /*
672  * Prototype functions defined below
673  */
674 static void	scsi_falcon_init __P((struct ncr_softc *));
675 static u_char	get_falcon_5380_reg __P((u_short));
676 static void	set_falcon_5380_reg __P((u_short, u_short));
677 static int	falcon_wrong_dma_range __P((SC_REQ *, struct dma_chain *));
678 static void	fal1_dma __P((u_int, u_int, SC_REQ *));
679 static void	scsi_falcon_dmasetup __P((SC_REQ  *, u_int, u_char));
680 static int	falcon_poll_edma __P((SC_REQ  *));
681 static int	falcon_get_dma_result __P((SC_REQ  *, u_long *));
682        int	falcon_can_access_5380 __P((void));
683        void	scsi_falcon_clr_ipend __P((void));
684        void	scsi_falcon_idisable __P((void));
685        void	scsi_falcon_ienable __P((void));
686        int	scsi_falcon_ipending __P((void));
687        int	falcon_claimed_dma __P((void));
688        void	falcon_reconsider_dma __P((void));
689 
690 static void
691 scsi_falcon_init(sc)
692 struct ncr_softc	*sc;
693 {
694 	/*
695 	 * Enable disk related interrupts
696 	 */
697 	MFP->mf_ierb  |= IB_DINT;
698 	MFP->mf_iprb   = (u_int8_t)~IB_DINT;
699 	MFP->mf_imrb  |= IB_DINT;
700 }
701 
702 static u_char
703 get_falcon_5380_reg(rnum)
704 u_short	rnum;
705 {
706 	DMA->dma_mode = DMA_SCSI + rnum;
707 	return(DMA->dma_data);
708 }
709 
710 static void
711 set_falcon_5380_reg(rnum, val)
712 u_short	rnum, val;
713 {
714 	DMA->dma_mode = DMA_SCSI + rnum;
715 	DMA->dma_data = val;
716 }
717 
718 extern inline void
719 scsi_falcon_ienable()
720 {
721 	single_inst_bset_b(MFP->mf_imrb, IB_DINT);
722 }
723 
724 extern inline void
725 scsi_falcon_idisable()
726 {
727 	single_inst_bclr_b(MFP->mf_imrb, IB_DINT);
728 }
729 
730 extern inline void
731 scsi_falcon_clr_ipend()
732 {
733 	int	tmp;
734 
735 	tmp = get_falcon_5380_reg(NCR5380_IRCV);
736 	rem_sicallback((si_farg)ncr_ctrl_intr);
737 }
738 
739 extern inline int
740 scsi_falcon_ipending()
741 {
742 	if (connected && (connected->dr_flag & DRIVER_IN_DMA)) {
743 		/*
744 		 *  XXX: When DMA is running, we are only allowed to
745 		 *       check the 5380 when DMA _might_ be finished.
746 		 */
747 		if (MFP->mf_gpip & IO_DINT)
748 		    return (0); /* XXX: Actually: we're not allowed to check */
749 
750 		/* LWP: 28-06, must be a DMA interrupt! should the
751 		 * ST-DMA unit be taken out of DMA mode?????
752 		 */
753 		DMA->dma_mode = 0x90;
754 
755 	}
756 	return(get_falcon_5380_reg(NCR5380_DMSTAT) & SC_IRQ_SET);
757 }
758 
759 static int
760 falcon_wrong_dma_range(reqp, dm)
761 SC_REQ			*reqp;
762 struct dma_chain	*dm;
763 {
764 	/*
765 	 * Do not allow chains yet! See also comment with
766 	 * falcon_poll_edma() !!!
767 	 */
768 	if (((dm - reqp->dm_chain) > 0) || (dm->dm_addr & 0xff000000)) {
769 		reqp->dr_flag |= DRIVER_BOUNCING;
770 		return(1);
771 	}
772 	/*
773 	 * Never allow DMA to happen on a Falcon when the transfer
774 	 * size is no multiple of 512. This is the transfer unit of the
775 	 * ST DMA-controller.
776 	 */
777 	if(dm->dm_count & 511)
778 		return(1);
779 	return(0);
780 }
781 
782 static	int falcon_lock = 0;
783 
784 extern inline int
785 falcon_claimed_dma()
786 {
787 	if (falcon_lock != DMA_LOCK_GRANT) {
788 		if (falcon_lock == DMA_LOCK_REQ) {
789 			/*
790 			 * DMA access is being claimed.
791 			 */
792 			return(0);
793 		}
794 		if (!st_dmagrab((dma_farg)ncr_ctrl_intr, (dma_farg)run_main,
795 						cur_softc, &falcon_lock, 1))
796 			return(0);
797 	}
798 	return(1);
799 }
800 
801 extern inline void
802 falcon_reconsider_dma()
803 {
804 	if (falcon_lock && (connected == NULL) && (discon_q == NULL)) {
805 		/*
806 		 * No need to keep DMA locked by us as we are not currently
807 		 * connected and no disconnected jobs are pending.
808 		 */
809 		rem_sicallback((si_farg)ncr_ctrl_intr);
810 		st_dmafree(cur_softc, &falcon_lock);
811 	}
812 
813 	if (!falcon_lock && (issue_q != NULL)) {
814 		/*
815 		 * We must (re)claim DMA access as there are jobs
816 		 * waiting in the issue queue.
817 		 */
818 		st_dmagrab((dma_farg)ncr_ctrl_intr, (dma_farg)run_main,
819 						cur_softc, &falcon_lock, 0);
820 	}
821 }
822 
823 static void
824 fal1_dma(dir, nsects, reqp)
825 u_int	dir, nsects;
826 SC_REQ	*reqp;
827 {
828 	dir <<= 8;
829 	st_dmaaddr_set((caddr_t)reqp->dm_cur->dm_addr);
830 	DMA->dma_mode = 0x90 | dir;
831 	DMA->dma_mode = 0x90 | (dir ^ DMA_WRBIT);
832 	DMA->dma_mode = 0x90 | dir;
833 	DMA->dma_data = nsects;
834 	delay(2);	/* _really_ needed (Thomas Gerner) */
835 	DMA->dma_mode = 0x10 | dir;
836 }
837 
838 static void
839 scsi_falcon_dmasetup(reqp, phase, mode)
840 SC_REQ	*reqp;
841 u_int	phase;
842 u_char	mode;
843 {
844 	int	nsects = reqp->dm_cur->dm_count / 512; /* XXX */
845 
846 	/*
847 	 * XXX: We should probably clear the fifo before putting the
848 	 *      5380 into DMA-mode.
849 	 */
850 	if (PH_IN(phase)) {
851 		set_falcon_5380_reg(NCR5380_ICOM, 0);
852 		set_falcon_5380_reg(NCR5380_MODE, mode);
853 		set_falcon_5380_reg(NCR5380_IRCV, 0);
854 		fal1_dma(0, nsects, reqp);
855 	}
856 	else {
857 		set_falcon_5380_reg(NCR5380_MODE, mode);
858 		set_falcon_5380_reg(NCR5380_ICOM, SC_ADTB);
859 		set_falcon_5380_reg(NCR5380_DMSTAT, 0);
860 		fal1_dma(1, nsects, reqp);
861 	}
862 }
863 
864 static int
865 falcon_poll_edma(reqp)
866 SC_REQ	*reqp;
867 {
868 	int	timeout = 9000; /* XXX */
869 
870 	/*
871 	 * Because of the Falcon hardware, it is impossible to reach
872 	 * the 5380 while doing DMA-transfers. So we have to rely on
873 	 * the interrupt line to determine if DMA-has finished. the
874 	 * DMA-controller itself will never fire an interrupt. This means
875 	 * that 'broken-up' DMA transfers are not (yet) possible on the
876 	 * Falcon.
877 	 */
878 	for (;;) {
879 		delay(20);
880 		if (--timeout <= 0) {
881 			ncr_tprint(reqp, "Timeout on polled transfer\n");
882 			reqp->xs->error = XS_TIMEOUT;
883 			return(0);
884 		}
885 		if (!(MFP->mf_gpip & IO_DINT))
886 			break;
887 	}
888 	return(1);
889 }
890 
891 static int
892 falcon_get_dma_result(reqp, bytes_left)
893 SC_REQ	*reqp;
894 u_long	*bytes_left;
895 {
896 	int	rv = 0;
897 	int	st_dmastat;
898 	u_long	bytes_done;
899 
900 	/*
901 	 * Select sector counter register first (See Atari docu.)
902 	 */
903 	DMA->dma_mode = 0x90;
904 	if (!(st_dmastat = DMA->dma_stat) & 0x01) {
905 		/*
906 		 * Misc. DMA-error according to Atari...
907 		 */
908 		ncr_tprint(reqp, "Unknow ST-SCSI error near 0x%x\n",
909 							st_dmaaddr_get());
910 		reqp->xs->error = XS_DRIVER_STUFFUP;
911 		rv = 1;
912 	}
913 	/*
914 	 * Because we NEVER start DMA on the Falcon when the data size
915 	 * is not a multiple of 512 bytes, we can safely round down the
916 	 * byte count on writes. We need to because in case of a disconnect,
917 	 * the DMA has already prefetched the next couple of bytes.
918 	 * On read, these byte counts are an error. They are logged and
919 	 * should be handled by the mi-part of the driver.
920 	 * NOTE: We formerly did this by using the 'byte-count-zero' bit
921 	 *       of the DMA controller, but this didn't seem to work???
922          *       [lwp 29/06/96]
923 	 */
924 	bytes_done = st_dmaaddr_get() - reqp->dm_cur->dm_addr;
925 	if (bytes_done & 511) {
926 		if (PH_IN(reqp->phase)) {
927 			ncr_tprint(reqp, "Byte count on read not a multiple "
928 					 "of 512 (%ld)\n", bytes_done);
929 		}
930 		bytes_done &= ~511;
931 	}
932 	if ((*bytes_left = reqp->dm_cur->dm_count - bytes_done) == 0)
933 		rv = 1;
934 	return(rv);
935 }
936 
937 static int
938 falcon_can_access_5380()
939 {
940 	if (connected && (connected->dr_flag & DRIVER_IN_DMA)
941 		&& (MFP->mf_gpip & IO_DINT))
942 			return(0);
943 	return(1);
944 }
945 
946 #endif /* defined(FALCON_SCSI) */
947 
948 #if defined(TT_SCSI) && defined(FALCON_SCSI)
949 /*
950  * Define some functions to support _both_ TT and Falcon SCSI
951  */
952 
953 /*
954  * The prototypes first...
955  */
956 static void	scsi_mach_init __P((struct ncr_softc *));
957        void	scsi_ienable __P((void));
958        void	scsi_idisable __P((void));
959        void	scsi_clr_ipend __P((void));
960        int	scsi_ipending __P((void));
961        void	scsi_dma_setup __P((SC_REQ *, u_int, u_char));
962        int	wrong_dma_range __P((SC_REQ *, struct dma_chain *));
963        int	poll_edma __P((SC_REQ *));
964        int	get_dma_result __P((SC_REQ *, u_long *));
965        int	can_access_5380 __P((void));
966 
967 /*
968  * Register access will be done through the following 2 function pointers.
969  */
970 static u_char	(*get_5380_reg) __P((u_short));
971 static void	(*set_5380_reg) __P((u_short, u_short));
972 
973 #define	GET_5380_REG	(*get_5380_reg)
974 #define	SET_5380_REG	(*set_5380_reg)
975 
976 static void
977 scsi_mach_init(sc)
978 struct ncr_softc	*sc;
979 {
980 	if (machineid & ATARI_FALCON) {
981 		get_5380_reg = get_falcon_5380_reg;
982 		set_5380_reg = set_falcon_5380_reg;
983 		scsi_falcon_init(sc);
984 	}
985 	else {
986 		get_5380_reg = get_tt_5380_reg;
987 		set_5380_reg = set_tt_5380_reg;
988 		scsi_tt_init(sc);
989 	}
990 }
991 
992 extern inline void
993 scsi_ienable()
994 {
995 	if (machineid & ATARI_FALCON)
996 		scsi_falcon_ienable();
997 	else scsi_tt_ienable();
998 }
999 
1000 extern inline void
1001 scsi_idisable()
1002 {
1003 	if (machineid & ATARI_FALCON)
1004 		scsi_falcon_idisable();
1005 	else scsi_tt_idisable();
1006 }
1007 
1008 extern inline void
1009 scsi_clr_ipend()
1010 {
1011 	if (machineid & ATARI_FALCON)
1012 		scsi_falcon_clr_ipend();
1013 	else scsi_tt_clr_ipend();
1014 }
1015 
1016 extern inline int
1017 scsi_ipending()
1018 {
1019 	if (machineid & ATARI_FALCON)
1020 		return(scsi_falcon_ipending());
1021 	else return (GET_TT_REG(NCR5380_DMSTAT) & SC_IRQ_SET);
1022 }
1023 
1024 extern inline void
1025 scsi_dma_setup(reqp, phase, mbase)
1026 SC_REQ	*reqp;
1027 u_int	phase;
1028 u_char	mbase;
1029 {
1030 	if (machineid & ATARI_FALCON)
1031 		scsi_falcon_dmasetup(reqp, phase, mbase);
1032 	else scsi_tt_dmasetup(reqp, phase, mbase);
1033 }
1034 
1035 extern inline int
1036 wrong_dma_range(reqp, dm)
1037 SC_REQ			*reqp;
1038 struct dma_chain	*dm;
1039 {
1040 	if (machineid & ATARI_FALCON)
1041 		return(falcon_wrong_dma_range(reqp, dm));
1042 	else return(tt_wrong_dma_range(reqp, dm));
1043 }
1044 
1045 extern inline int
1046 poll_edma(reqp)
1047 SC_REQ	*reqp;
1048 {
1049 	if (machineid & ATARI_FALCON)
1050 		return(falcon_poll_edma(reqp));
1051 	else return(tt_poll_edma(reqp));
1052 }
1053 
1054 extern inline int
1055 get_dma_result(reqp, bytes_left)
1056 SC_REQ	*reqp;
1057 u_long	*bytes_left;
1058 {
1059 	if (machineid & ATARI_FALCON)
1060 		return(falcon_get_dma_result(reqp, bytes_left));
1061 	else return(tt_get_dma_result(reqp, bytes_left));
1062 }
1063 
1064 extern inline int
1065 can_access_5380()
1066 {
1067 	if (machineid & ATARI_FALCON)
1068 		return(falcon_can_access_5380());
1069 	return(1);
1070 }
1071 
1072 #define emulated_dma()		((machineid & ATARI_HADES) ? 1 : 0)
1073 
1074 /*
1075  * Locking stuff. All turns into NOP's on the TT.
1076  */
1077 #define	fair_to_keep_dma()	((machineid & ATARI_FALCON) ?		\
1078 						!st_dmawanted() : 1)
1079 #define	claimed_dma()		((machineid & ATARI_FALCON) ?		\
1080 						falcon_claimed_dma() : 1)
1081 #define reconsider_dma()	{					\
1082 					if(machineid & ATARI_FALCON)	\
1083 						falcon_reconsider_dma();\
1084 				}
1085 #endif /* defined(TT_SCSI) && defined(FALCON_SCSI) */
1086 
1087 /**********************************************
1088  * Functions present for both TT and Falcon.  *
1089  **********************************************/
1090 /*
1091  * Our autoconfig matching function
1092  */
1093 static int
1094 machine_match(struct device *pdp, void *match, void *auxp,
1095 						struct cfdriver *cd)
1096 {
1097 	static int	we_matched = 0; /* Only one unit	*/
1098 
1099 	if (strcmp(auxp, cd->cd_name) || we_matched)
1100 		return(0);
1101 
1102 	we_matched = 1;
1103 	return(1);
1104 }
1105 
1106 /*
1107  * Bounce buffer (de)allocation. Those buffers are gotten from the ST-mem
1108  * pool. Allocation here is both contiguous and in the lower 16Mb of
1109  * the address space. Thus being DMA-able for all controllers.
1110  */
1111 static u_char *
1112 alloc_bounceb(u_long len)
1113 {
1114 	void	*tmp;
1115 
1116 	return((u_char *)alloc_stmem(len, &tmp));
1117 }
1118 
1119 static void
1120 free_bounceb(u_char *bounceb)
1121 {
1122 	free_stmem(bounceb);
1123 }
1124 
1125 /*
1126  * 5380 interrupt.
1127  */
1128 void
1129 scsi_ctrl(int sr)
1130 {
1131 	if (GET_5380_REG(NCR5380_DMSTAT) & SC_IRQ_SET) {
1132 		scsi_idisable();
1133 		if (!BASEPRI(sr))
1134 			add_sicallback((si_farg)ncr_ctrl_intr,
1135 						(void *)cur_softc, 0);
1136 		else {
1137 			spl1();
1138 			ncr_ctrl_intr(cur_softc);
1139 			spl0();
1140 		}
1141 	}
1142 }
1143 
1144 /*
1145  * DMA controller interrupt
1146  */
1147 void
1148 scsi_dma(int sr)
1149 {
1150 	SC_REQ	*reqp;
1151 
1152 	if ((reqp = connected) && (reqp->dr_flag & DRIVER_IN_DMA)) {
1153 		scsi_idisable();
1154 		if (!BASEPRI(sr))
1155 			add_sicallback((si_farg)ncr_dma_intr,
1156 					(void *)cur_softc, 0);
1157 		else {
1158 			spl1();
1159 			ncr_dma_intr(cur_softc);
1160 			spl0();
1161 		}
1162 	}
1163 }
1164 
1165 /*
1166  * Last but not least... Include the general driver code
1167  */
1168 #include <atari/dev/ncr5380.c>
1169