Subject: Quadra AV SCSI DMA Code
To: None <port-mac68k@netbsd.org>
From: Michael R.Zucca <mrz5149@acm.org>
List: port-mac68k
Date: 06/08/2003 18:41:08
--Apple-Mail-5--504542747
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=US-ASCII;
	format=flowed

Ok, attached to this email is my first cut of the Quadra AV SCSI DMA 
code. I'm working with a kernel that is basically a -current snapshot 
from between 1.5 and 1.6. However, I think esp.c and psc.c haven't 
changed all that much so the code should be easy to incorporate to the 
current 1.6 sources.

However, let it be known that this code doesn't offer any kind of super 
performance boost. There are a number of reasons for this:

1. The code does not handle odd-sized/unaligned transfers using PIO. 
This is mainly due to the fact that the DMA engine only does transfers 
2 bytes at a time and it only does them on 16 byte boundaries (at least 
for the SCSI DMA channel). This causes the synchronous transfer code to 
fail. Apparently, if the sync negotiation doesn't occur completely 
using DMA, then the NCR code uses async transfers, which are much 
slower. Fixing this problem would probably yield a significant 
performance benefit since the DMA engine would likely move much more 
data, much faster, using synchronous transfers.

Fixing this problem isn't straight forward. I think what is needed is a 
hack that copies unaligned buffers under 4k to an aligned bounce 
buffer. Then, when an odd sized transfer occurs, the transfer is padded 
using a transfer pad or the last byte is somehow stuffed in the FIFO on 
the DMA interrupt (not the SCSI interrupt, which is too late).

2. The code only DMA's one physically contiguous block at a time. After 
a block is transferred, the code has to go through the whole SCSI loop 
again. Ideally, the code would hook into the SCSI DMA interrupt and 
just pick up the next contiguous block from the bus_dma information and 
slam the DMA engine to continue the transfer. This would result in less 
interrupt latency since the code wouldn't have to mess around in the 
SCSI state machine. Basically, this is faking chained DMA using the 
bus_dma information instead of DMA packets.

I would have spent more time on fixing 1 and 2 myself but I've come to 
the realization that I'm just too short of time. So before we all grow 
old and die, I thought I'd share the code I have in the hopes that 
others could work on it as well. Then, perhaps I'll pick up their 
improvements and contribute more when I have time. Basically, the joys 
and benefits of open source :-)

So without further ado, here's the source...


--Apple-Mail-5--504542747
Content-Disposition: attachment;
	filename=avdma.tar.gz
Content-Transfer-Encoding: base64
Content-Type: application/x-gzip;
	x-unix-mode=0644;
	name="avdma.tar.gz"

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

--Apple-Mail-5--504542747
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=US-ASCII;
	format=flowed



-- 
----------------------------------------------
  Michael Zucca - mrz5149@acm.org
----------------------------------------------
  "I'm too old to use Emacs." -- Rod MacDonald
----------------------------------------------
--Apple-Mail-5--504542747--