xref: /original-bsd/sys/vax/uba/kgclock.c (revision 3109f15a)
1 /*	kgclock.c	6.3	84/08/29	*/
2 
3 #include "kg.h"
4 #if NKG > 0
5 /*
6  * KL-11 as profiling clock
7  */
8 #include "../machine/pte.h"
9 #include "../machine/psl.h"
10 
11 #include "param.h"
12 #include "map.h"
13 #include "buf.h"
14 #include "time.h"
15 #include "kernel.h"
16 
17 #include "ubavar.h"
18 
19 int	kgprobe(), kgattach();
20 struct	uba_device *kginfo[1];
21 u_short	kgstd[] = { 0177560, 0 };
22 struct	uba_driver kgdriver =
23     { kgprobe, 0, kgattach, 0, kgstd, "kg", kginfo };
24 
25 struct klregs {
26 	u_short	fill[2];
27 	u_short	tcsr;
28 	u_short	tbuf;
29 };
30 #define	KLSTRT	0300		/* intr enbl + done */
31 struct	klregs *klbase;
32 
33 int	usekgclock = 1;		/* if zero, kgclock is disabled */
34 
35 kgprobe(reg)
36 	caddr_t reg;
37 {
38 	register int br, cvec;	/* value-result */
39 	register struct klregs *klp = (struct klregs *)reg;
40 
41 	klp->tcsr = KLSTRT;
42 	DELAY(100000);
43 	klp->tcsr = 0;
44 }
45 
46 kgattach(ui)
47 	struct uba_device *ui;
48 {
49 
50 	klbase = (struct klregs *)ui->ui_addr;
51 }
52 
53 /*
54  * start the sampling clock
55  */
56 startkgclock()
57 {
58 
59 	if (klbase && usekgclock && phz == 0)
60 		klbase->tcsr = KLSTRT;	/* enable interrupts */
61 }
62 
63 /* ARGSUSED */
64 kgclock(dev, r0, r1, r2, r3, r4 ,r5, pc, ps)
65 	caddr_t pc;
66 	int ps;
67 {
68 	register int k;
69 	static long otime;
70 	static long calibrate;
71 
72 	if (usekgclock == 0) {
73 		phz = 0;
74 		otime = 0;
75 		return;
76 	}
77 	klbase->tbuf = 0377;	/* reprime clock (scope sync too) */
78 	if (phz == 0) {
79 		if (otime == 0) {
80 			otime = time.tv_sec + 1;
81 			calibrate = 0;
82 		}
83 		if (time.tv_sec >= otime)
84 			calibrate++;
85 		if (time.tv_sec >= otime + 4) {
86 			phz = calibrate / 4;
87 			otime = 0;
88 		}
89 		return;
90 	}
91 	gatherstats(pc, ps);	/* this routine lives in kern_clock.c */
92 }
93 #endif
94