1*391Sbill /* mba.c 1.2 07/21/80 */ 2323Sbill 3323Sbill #include "../h/param.h" 4323Sbill #include "../h/inode.h" 5323Sbill #include "../h/pte.h" 6323Sbill #include "../h/mba.h" 7323Sbill #include "../h/mtpr.h" 8323Sbill #include "../h/vm.h" 9323Sbill #include "saio.h" 10323Sbill 11323Sbill /* 12323Sbill * startup routine for MBA controllers. 13323Sbill */ 14323Sbill #define MBAWCOM 0x30 15323Sbill #define MBARCOM 0x38 16323Sbill #define GO 01 17323Sbill 18323Sbill mbastart(io, adcr, func) 19323Sbill register struct iob *io; 20323Sbill int *adcr; 21323Sbill { 22323Sbill register int i; 23323Sbill int npf; 24323Sbill unsigned v; 25323Sbill register struct pte *pte; 26323Sbill int o; 27323Sbill int vaddr; 28323Sbill extern int mbanum[], *mbaloc[]; 29323Sbill register struct mba_regs *mbap; 30323Sbill 31*391Sbill mbap = (struct mba_regs *)mbaloc[mbanum[io->i_ino.i_dev]]; 32323Sbill pte = (struct pte *)mbap; 33323Sbill pte += (MBA_MAP + 128*4)/4; 34323Sbill v = btop(io->i_ma); 35323Sbill o = (int)io->i_ma & PGOFSET; 36323Sbill npf = btoc(io->i_cc + o); 37323Sbill vaddr = (128 << 9) | o; 38323Sbill v &= 0x1fffff; /* drop to physical addr */ 39323Sbill while (--npf >= 0) 40323Sbill *(int *)pte++ = v++ | PG_V; 41323Sbill mbap->mba_sr = -1; /* clear status (error) bits */ 42323Sbill mbap->mba_bcr = -io->i_cc; 43323Sbill mbap->mba_var = vaddr; 44323Sbill if (func == READ) 45323Sbill *adcr = MBARCOM | GO; 46323Sbill else if (func == WRITE) { 47323Sbill *adcr = MBAWCOM | GO; 48323Sbill } 49323Sbill } 50