xref: /original-bsd/sys/vax/vax/ka630.c (revision b424313c)
1 /*
2  *	@(#)ka630.c	7.4 (Berkeley) 05/07/88
3  */
4 
5 #ifdef VAX630
6 #include "param.h"
7 #include "time.h"
8 #include "kernel.h"
9 #include "vmmac.h"
10 
11 #include "mtpr.h"
12 #include "cpu.h"
13 #include "clock.h"
14 #include "pte.h"
15 #include "ka630.h"
16 
17 /*
18  * 630-specific routines
19  */
20 extern struct pte Clockmap[];
21 extern struct pte Ka630map[];
22 struct ka630clock ka630clock;
23 struct ka630cpu ka630cpu;
24 
25 ka630_init()
26 {
27 
28 	/*
29 	 * Map in the clock and the CPU.
30 	 */
31 	ioaccess((caddr_t)0x200b8000, &Clockmap[0], sizeof(struct ka630clock));
32 	ioaccess((caddr_t)0x20080000, &Ka630map[0], sizeof(struct ka630cpu));
33 
34 	/*
35 	 * Clear restart and boot in progress flags in the CPMBX.
36 	 */
37 	ka630clock.cpmbx = (ka630clock.cpmbx & KA630CLK_LANG) | KA630CLK_REBOOT;
38 
39 	/*
40 	 * Enable memory parity error detection.
41 	 */
42 	ka630cpu.ka630_mser = KA630MSER_PAREN;
43 }
44 
45 /* Start the real-time clock */
46 ka630_clkstartrt()
47 {
48 
49 	mtpr(ICCS, ICCS_IE);
50 }
51 
52 /* init system time from tod clock */
53 /* ARGSUSED */
54 ka630_clkread(base)
55 	time_t base;
56 {
57 	register struct ka630clock *claddr = &ka630clock;
58 	struct chiptime c;
59 
60 	claddr->csr1 = KA630CLK_SET;
61 	while ((claddr->csr0 & KA630CLK_UIP) != 0)
62 		;
63 	/* If the clock is valid, use it. */
64 	if ((claddr->csr3 & KA630CLK_VRT) != 0 &&
65 	    (claddr->csr1 & KA630CLK_ENABLE) == KA630CLK_ENABLE) {
66 		c.sec = claddr->sec;
67 		c.min = claddr->min;
68 		c.hour = claddr->hr;
69 		c.day = claddr->day;
70 		c.mon = claddr->mon;
71 		c.year = claddr->yr;
72 #ifndef lint
73 		{ int t = claddr->csr2; }	/* ??? */
74 #endif
75 		claddr->csr0 = KA630CLK_RATE;
76 		claddr->csr1 = KA630CLK_ENABLE;
77 
78 		time.tv_sec = chiptotime(&c);
79 		return (time.tv_sec ? CLKREAD_OK : CLKREAD_BAD);
80 	}
81 	printf("WARNING: TOY clock invalid");
82 	return (CLKREAD_BAD);
83 }
84 
85 /* Set the time of day clock, called via. stime system call.. */
86 ka630_clkwrite()
87 {
88 	register struct ka630clock *claddr = &ka630clock;
89 	struct chiptime c;
90 	int s;
91 
92 	timetochip(&c);
93 	s = splhigh();
94 	claddr->csr1 = KA630CLK_SET;
95 	while ((claddr->csr0 & KA630CLK_UIP) != 0)
96 		;
97 	claddr->sec = c.sec;
98 	claddr->min = c.min;
99 	claddr->hr = c.hour;
100 	claddr->day = c.day;
101 	claddr->mon = c.mon;
102 	claddr->yr = c.year;
103 #ifndef lint
104 	{ int t = claddr->csr2; }	/* ??? */
105 	{ int t = claddr->csr3; }	/* ??? */
106 #endif
107 	claddr->csr0 = KA630CLK_RATE;
108 	claddr->csr1 = KA630CLK_ENABLE;
109 	splx(s);
110 }
111 
112 ka630_memnop()
113 {
114 
115 	/* void */
116 }
117 
118 #define NMC630	10
119 char *mc630[] = {
120 	0,		"immcr (fsd)",	"immcr (ssd)",	"fpu err 0",
121 	"fpu err 7",	"mmu st(tb)",	"mmu st(m=0)",	"pte in p0",
122 	"pte in p1",	"un intr id",
123 };
124 
125 struct mc630frame {
126 	int	mc63_bcnt;		/* byte count == 0xc */
127 	int	mc63_summary;		/* summary parameter */
128 	int	mc63_mrvaddr;		/* most recent vad */
129 	int	mc63_istate;		/* internal state */
130 	int	mc63_pc;		/* trapped pc */
131 	int	mc63_psl;		/* trapped psl */
132 };
133 
134 ka630_mchk(cmcf)
135 	caddr_t cmcf;
136 {
137 	register struct ka630cpu *ka630addr = &ka630cpu;
138 	register struct mc630frame *mcf = (struct mc630frame *)cmcf;
139 	register u_int type = mcf->mc63_summary;
140 
141 	printf("machine check %x: %s\n", type,
142 	    type < NMC630 ? mc630[type] : "???");
143 	printf("\tvap %x istate %x pc %x psl %x\n",
144 	    mcf->mc63_mrvaddr, mcf->mc63_istate,
145 	    mcf->mc63_pc, mcf->mc63_psl);
146 	if (ka630addr->ka630_mser & KA630MSER_MERR) {
147 		printf("\tmser=0x%x ", ka630addr->ka630_mser);
148 		if (ka630addr->ka630_mser & KA630MSER_CPUER)
149 			printf("page=%d", ka630addr->ka630_cear);
150 		if (ka630addr->ka630_mser & KA630MSER_DQPE)
151 			printf("page=%d", ka630addr->ka630_dear);
152 		printf("\n");
153 	}
154 	return (MCHK_PANIC);
155 }
156 #endif
157