1*415Sbill /* mba.c 1.3 07/28/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 18*415Sbill struct mba_info mbainfo[] = { 19*415Sbill PHYSMBA0, 20*415Sbill PHYSMBA1, 21*415Sbill }; 22*415Sbill 23323Sbill mbastart(io, adcr, func) 24323Sbill register struct iob *io; 25323Sbill int *adcr; 26323Sbill { 27323Sbill register int i; 28323Sbill int npf; 29323Sbill unsigned v; 30323Sbill register struct pte *pte; 31323Sbill int o; 32323Sbill int vaddr; 33323Sbill extern int mbanum[], *mbaloc[]; 34323Sbill register struct mba_regs *mbap; 35323Sbill 36391Sbill mbap = (struct mba_regs *)mbaloc[mbanum[io->i_ino.i_dev]]; 37323Sbill pte = (struct pte *)mbap; 38323Sbill pte += (MBA_MAP + 128*4)/4; 39323Sbill v = btop(io->i_ma); 40323Sbill o = (int)io->i_ma & PGOFSET; 41323Sbill npf = btoc(io->i_cc + o); 42323Sbill vaddr = (128 << 9) | o; 43323Sbill v &= 0x1fffff; /* drop to physical addr */ 44323Sbill while (--npf >= 0) 45323Sbill *(int *)pte++ = v++ | PG_V; 46323Sbill mbap->mba_sr = -1; /* clear status (error) bits */ 47323Sbill mbap->mba_bcr = -io->i_cc; 48323Sbill mbap->mba_var = vaddr; 49323Sbill if (func == READ) 50323Sbill *adcr = MBARCOM | GO; 51323Sbill else if (func == WRITE) { 52323Sbill *adcr = MBAWCOM | GO; 53323Sbill } 54323Sbill } 55*415Sbill 56*415Sbill mbainit(mbanum) 57*415Sbill int mbanum; 58*415Sbill { 59*415Sbill register struct mba_regs *mbap = mbainfo[mbanum]; 60*415Sbill 61*415Sbill mbap->mba_cr = MBA_INIT; 62*415Sbill mbaact |= 1<<mbanum; 63*415Sbill } 64