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