* Ikonas Frame Buffer Interface -- Bill Reeves.
#include "../machine/pte.h"
#include "../vaxuba/ubareg.h"
#include "../vaxuba/ubavar.h"
#include "../vaxuba/ikreg.h"
#define IKDMAPRI (PZERO-1)
#define IKWAITPRI (PZERO+1)
int ikprobe(), ikattach(), ikintr();
struct uba_device
*ikdinfo
[NIK
];
u_short ikstd
[] = { 0772460, 0000000, 0 };
struct uba_driver ikdriver
=
{ ikprobe
, 0, ikattach
, 0, ikstd
, "ik", ikdinfo
, 0, 0 };
#define IKUNIT(dev) (minor(dev))
register int br
, cvec
; /* value-result */
register struct ikdevice
*ikaddr
= (struct ikdevice
*) reg
;
br
= 0; cvec
= br
; br
= cvec
;
ikaddr
->ik_ustat
= IK_IENABLE
| IK_GO
;
return (sizeof (struct ikdevice
));
register struct ik_softc
*ikp
;
register struct uba_device
*ui
;
if (IKUNIT(dev
) >= NIK
|| (ikp
= &ik_softc
[minor(dev
)])->ik_open
||
(ui
= ikdinfo
[IKUNIT(dev
)]) == 0 || ui
->ui_alive
== 0)
ik_softc
[minor(dev
)].ik_open
= 0;
ik_softc
[minor(dev
)].ik_state
= 0;
unmaptouser(ikdinfo
[IKUNIT(dev
)]->ui_addr
);
register int unit
= IKUNIT(dev
);
return (physio(ikstrategy
, &rikbuf
[unit
], dev
, B_READ
, ikminphys
, uio
));
register int unit
= IKUNIT(dev
);
return (physio(ikstrategy
, &rikbuf
[unit
], dev
, B_WRITE
, ikminphys
, uio
));
if (bp
->b_bcount
> 65536) /* may be able to do twice as much */
register struct ik_softc
*ikp
= &ik_softc
[IKUNIT(bp
->b_dev
)];
register struct uba_device
*ui
;
if (IKUNIT(bp
->b_dev
) >= NIK
|| (ui
= ikdinfo
[IKUNIT(bp
->b_dev
)]) == 0
while (ikp
->ik_state
& IKBUSY
)
sleep((caddr_t
)ikp
, IKDMAPRI
+1);
ikp
->ik_ubinfo
= ubasetup(ui
->ui_ubanum
, bp
, UBA_NEEDBDP
);
ikp
->ik_bufp
= ikp
->ik_ubinfo
& 0x3ffff;
ikp
->ik_count
= -(bp
->b_bcount
>>1); /* its a word count */
while (ikp
->ik_state
&IKBUSY
)
sleep((caddr_t
)ikp
, IKDMAPRI
);
ubarelse(ui
->ui_ubanum
, &ikp
->ik_ubinfo
);
register struct uba_device
*ui
;
register struct ikdevice
*ikaddr
= (struct ikdevice
*) ui
->ui_addr
;
register struct ik_softc
*ikp
= &ik_softc
[IKUNIT(ui
->ui_unit
)];
istat
= ikaddr
->ik_istat
|DMAENABLE
;
ikaddr
->ik_istat
= istat
;
ikaddr
->ik_wc
= ikp
->ik_count
;
ikaddr
->ik_ubaddr
= ikp
->ik_bufp
;
ikaddr
->ik_ustat
= IK_GO
|IK_IENABLE
|((ikp
->ik_bufp
>>12)&060);
ikioctl(dev
, cmd
, data
, flag
)
register struct uba_device
*ui
= ikdinfo
[IKUNIT(dev
)];
register struct ik_softc
*ikp
;
*(caddr_t
*)data
= ui
->ui_addr
;
ikp
= &ik_softc
[IKUNIT(dev
)];
while (ikp
->ik_state
&IKBUSY
)
sleep((caddr_t
)ikp
, IKWAITPRI
);
register struct ikdevice
*ikaddr
=
(struct ikdevice
*) ikdinfo
[IKUNIT(dev
)]->ui_addr
;
register struct ik_softc
*ikp
= &ik_softc
[IKUNIT(dev
)];
if (ikp
->ik_state
&IKBUSY
) {
ikp
->ik_state
&= ~IKBUSY
;
register struct uba_device
*ui
;
register struct ik_softc
*ikp
= ik_softc
;
for (i
= 0; i
< NIK
; i
++, ikp
++) {
if ((ui
= ikdinfo
[i
]) == 0 || ui
->ui_alive
== 0 ||
ui
->ui_ubanum
!= uban
|| ikp
->ik_open
== 0)
if ((ikp
->ik_state
&IKBUSY
) == 0)
ubasetup(ui
->ui_ubanum
, ikp
->ik_bp
, UBA_NEEDBDP
);
ikp
->ik_count
= -(ikp
->ik_bp
->b_bcount
/2);