IOCC Performance/Programming Questions

Mike Massa massa at aurora.cis.upenn.edu
Wed Apr 17 07:38:42 AEST 1991


I'm writing device drivers for some MCA cards with 8-bit register ports. I'm
trying to achieve as high a data transfer rate as possible. The best I've
been able to do so far is 2.5 MB/s with an assembly language routine that 
loads 16 general purpose registers from memory and then stores them to the 
card's single 8-bit register via the IOCC using the load/store multiple 
instructions (code at end of post). The cards are currently wired to decode 
a 64-byte wide address space for one 8-bit register so all data is only 
written to one register.

I put a scope on the iowrite line of the card and noted the following:
    - each 1-byte transfer from the IOCC to the device register requires
      2 bus cylces (200 ns)
    - the IOCC misses 1 bus cycle between each 1 byte transfer - total xfer 
      time is therefore 3 bus cycles (300 ns)
    - there is a 2 microsecond delay between 64-byte (16 word) bursts on the
      MCA. This seems to be the IOCC synching with the CPU and executing
      the transfer loop.
    
I assume that the IOCC is missing a cycle because it is performing dynamic
bus sizing to accomodate the 8-bit card. I was able to get back-to-back
32-bit transfers using a true 32-bit card. 

Questions:

- is there any way to achieve back-to-back 8-bit transfers from the IOCC?
- can multiple transfers be made to a single io address - ie can I prevent
  the IOCC from incrementing the address ptr between words/bytes
- can the 2 microsecond delay between bursts be decreased?
- is there a better way to do this?

Thanks,

Mike Massa
Distributed Systems Laboratory
University of Pennsylvania
massa at aurora.cis.upenn.edu

------------------------------------------------------------------------------

###################
# Transfer code
##################

# buf_p = pointer to data to write
# ioreg_p = pointer to device register
# blkcnt = number of 16 word (64 byte) blocks to write

	mtctr	blkcnt			# load blkcnt into counter register
	b	test			# jump to loop test
loop:     				# write 16-word blocks out	
	lm	16,0(buf_p)		# read  block from buf in memory
	stm	16,0(ioreg_p)		# write block to device register
	ai	buf_p,buf_p,64		# increment buffer src address
test:
	bdn	loop			# decrement blkcnt & jump if not zero



More information about the Comp.unix.aix mailing list