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