32V/usr/src/slowsys/sys/mba.c
#
/*
*/
#include "../h/param.h"
#include "../h/buf.h"
#include "../h/conf.h"
#include "../h/systm.h"
#include "../h/dir.h"
#include "../h/user.h"
#include "../h/proc.h"
#include "../h/seg.h"
#include "../h/page.h"
#include "../h/uba.h"
#include "../h/map.h"
#include "../h/mba.h"
#include "../h/mtpr.h"
/*
* startup routine for MBA controllers.
*/
#define MBAWCOM 0x30
#define MBARCOM 0x38
#define GO 01
int mbaboff;
mbastart(bp, adcr)
register struct buf *bp;
int *adcr;
{
register int vaddr, com, *io, num;
register struct mba_regs *mbap;
int *pt, pf;
extern int mbanum[], *mbaloc[];
extern char buffers[][];
mbap = (struct mba_regs *)(mbaloc[mbanum[major(bp->b_dev)]]);
if ( (bp->b_flags & B_PHYS) == 0 ) {
vaddr = (bp->b_un.b_addr - (char *)buffers) + mbaboff;
} else {
io = (int *)mbap;
io += (MBA_MAP + 128*4)/4;
num = btoc(bp->b_bcount) + 1;
pf = (int)bp->b_un.b_addr >> 9;
while ( num-->0)
*io++ = 0x80000000 | pf++;
vaddr = (128 << 9) | ((int)bp->b_un.b_addr & 0x1ff);
}
mbap->mba_sr = -1; /* clear status (error) bits */
mbap->mba_bcr = -bp->b_bcount;
mbap->mba_var = vaddr;
if (bp->b_flags & B_READ)
com = MBARCOM | GO;
else
com = MBAWCOM | GO;
*adcr = com; /* set cmd in device control and status register */
}
mbainit()
{
register int *io0, *io1, *b, t, j;
extern int Sysmap[], *mbaloc[];
extern char buffers[][];
io0 = mbaloc[0] + (MBA_MAP/4);
io1 = mbaloc[1] + (MBA_MAP/4);
b = Sysmap + ((((int) buffers)>>9)&0x1fffff);
j = NBUF + ((int)buffers & 0x1ff ? 1 : 0);
do {
t = 0x80000000 | (*b++ & 0x1fffff);
*io0++ = t;
*io1++ = t;
} while (--j>0);
*io0 = 0; /* invalidate next entry */
*io1 = 0;
mbaboff = (int)buffers & 0x1ff;
}