xref: /csrg-svn/sys/vax/uba/kgclock.c (revision 11358)
1*11358Smckusick /*	kgclock.c	4.2	83/03/01	*/
211357Smckusick 
311357Smckusick #ifdef KGCLOCK		/* kl-11 as profiling clock */
411357Smckusick 
511357Smckusick #include "../h/map.h"
611357Smckusick #include "../h/pte.h"
711357Smckusick #include "../h/buf.h"
811357Smckusick #include "../h/ubavar.h"
911357Smckusick #include "../h/psl.h"
1011357Smckusick 
11*11358Smckusick int	phz = 0;
1211357Smckusick int	kgprobe(), kgattach();
1311357Smckusick struct	uba_device *kginfo[1];
1411357Smckusick u_short	kgstd[] = { 0177560, 0 };
1511357Smckusick struct	uba_driver kgdriver =
1611357Smckusick     { kgprobe, 0, kgattach, 0, kgstd, "kg", kginfo };
1711357Smckusick 
1811357Smckusick struct klregs {
1911357Smckusick 	u_short	fill[2];
2011357Smckusick 	u_short	tcsr;
2111357Smckusick 	u_short	tbuf;
2211357Smckusick };
2311357Smckusick #define	KLSTRT	0300		/* intr enbl + done */
2411357Smckusick struct	klregs *klbase;
2511357Smckusick 
2611357Smckusick kgprobe(reg)
2711357Smckusick caddr_t reg;
2811357Smckusick {
2911357Smckusick 	register int br, cvec;	/* value-result */
3011357Smckusick 	register struct klregs *klp = (struct klregs *)reg;
3111357Smckusick 
3211357Smckusick 	klp->tcsr = KLSTRT;
3311357Smckusick 	DELAY(100000);
3411357Smckusick 	klp->tcsr = 0;
3511357Smckusick }
3611357Smckusick 
3711357Smckusick kgattach(ui)
3811357Smckusick struct uba_device *ui;
3911357Smckusick {
4011357Smckusick 	klbase = (struct klregs *)ui->ui_addr;
4111357Smckusick }
4211357Smckusick 
4311357Smckusick /*
4411357Smckusick  * start the sampling clock
4511357Smckusick  */
4611357Smckusick startkgclock()
4711357Smckusick {
4811357Smckusick 	if (klbase)
4911357Smckusick 		klbase->tcsr = KLSTRT;	/* enable interrupts */
5011357Smckusick }
5111357Smckusick 
5211357Smckusick /* ARGSUSED */
5311357Smckusick kgclock(dev, r0, r1, r2, r3, r4 ,r5, pc, ps)
5411357Smckusick caddr_t pc;
5511357Smckusick {
5611357Smckusick 	register int k;
57*11358Smckusick 	static int otime = 0;
58*11358Smckusick 	static int calibrate;
5911357Smckusick 
6011357Smckusick 	klbase->tbuf = 0377;	/* reprime clock (scope sync too) */
61*11358Smckusick 	if (phz == 0) {
62*11358Smckusick 		if (otime == 0) {
63*11358Smckusick 			otime = time + 1;
64*11358Smckusick 			calibrate = 0;
65*11358Smckusick 		}
66*11358Smckusick 		if (time >= otime)
67*11358Smckusick 			calibrate++;
68*11358Smckusick 		if (time >= otime + 4) {
69*11358Smckusick 			phz = calibrate / 4;
70*11358Smckusick 			otime = 0;
71*11358Smckusick 		}
72*11358Smckusick 		return;
73*11358Smckusick 	}
7411357Smckusick 	gatherstats();		/* this routine lives in kern_clock.c */
7511357Smckusick }
7611357Smckusick #endif KGCLOCK
77