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