BSD 4_3_Tahoe release
[unix-history] / usr / src / sys / vax / ka630.c
CommitLineData
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
24extern struct pte Clockmap[];
25extern struct pte Ka630map[];
26struct ka630clock ka630clock;
27struct ka630cpu ka630cpu;
9d2503c6 28
9a0de372 29ka630_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 */
50ka630_clkstartrt()
51{
52
53 mtpr(ICCS, ICCS_IE);
54}
55
56/* init system time from tod clock */
57/* ARGSUSED */
58ka630_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 90ka630_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
116ka630_memnop()
117{
118
119 /* void */
120}
121
122#define NMC630 10
123char *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
129struct 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
138ka630_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