* startup routine for MBA controllers.
register struct pte
*pte
, *io
;
register struct mba_regs
*mbap
;
mbap
= mbainfo
[mbanum
[major(bp
->b_dev
)]].mi_loc
;
v
= btop(bp
->b_un
.b_addr
);
o
= (int)bp
->b_un
.b_addr
& PGOFSET
;
npf
= btoc(bp
->b_bcount
+ o
);
rp
= bp
->b_flags
&B_DIRTY
? &proc
[2] : bp
->b_proc
;
if (bp
->b_flags
& B_UAREA
) {
for (i
= 0; i
< UPAGES
; i
++) {
if (rp
->p_addr
[i
].pg_pfnum
== 0)
panic("mba: zero upage");
*(int *)io
++ = rp
->p_addr
[i
].pg_pfnum
| PG_V
;
} else if ((bp
->b_flags
& B_PHYS
) == 0) {
pte
= &Sysmap
[btop(((int)bp
->b_un
.b_addr
)&0x7fffffff)];
*(int *)io
++ = pte
++->pg_pfnum
| PG_V
;
if (bp
->b_flags
& B_PAGET
)
pte
= &Usrptmap
[btokmx((struct pte
*)bp
->b_un
.b_addr
)];
panic("mba, zero entry");
*(int *)io
++ = pte
++->pg_pfnum
| PG_V
;
mbap
->mba_sr
= -1; /* clear status (error) bits */
mbap
->mba_bcr
= -bp
->b_bcount
;
if (bp
->b_flags
& B_READ
)
register struct mba_info
*mi
;
register struct mba_regs
*mbap
;
v
= btop((int)mi
->mi_phys
);
for (i
= 0; i
< 8192; i
+= NBPG
) {
*(int *)b
++ = PG_V
| PG_KW
| v
;