|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 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: *
6: * @(#)ka780.c 7.2 (Berkeley) 7/9/88
7: */
8:
9: #if VAX780
10:
11: /*
12: * 780-specific code.
13: */
14:
15: #include "param.h"
16:
17: #include "cpu.h"
18: #include "mem.h"
19: #include "mtpr.h"
20:
21: /*
22: * Memory controller register usage varies per controller.
23: */
24: struct mcr780 {
25: int mc_reg[4];
26: };
27:
28: #define M780_ICRD 0x40000000 /* inhibit crd interrupts, in [2] */
29: #define M780_HIER 0x20000000 /* high error rate, in reg[2] */
30: #define M780_ERLOG 0x10000000 /* error log request, in reg[2] */
31: /* on a 780, memory crd's occur only when bit 15 is set in the SBIER */
32: /* register; bit 14 there is an error bit which we also clear */
33: /* these bits are in the back of the ``red book'' (or in the VMS code) */
34:
35: #define M780C_INH(mcr) \
36: (((mcr)->mc_reg[2] = (M780_ICRD|M780_HIER|M780_ERLOG)), mtpr(SBIER, 0))
37: #define M780C_ENA(mcr) \
38: (((mcr)->mc_reg[2] = (M780_HIER|M780_ERLOG)), mtpr(SBIER, 3<<14))
39: #define M780C_ERR(mcr) \
40: ((mcr)->mc_reg[2] & (M780_ERLOG))
41:
42: #define M780C_SYN(mcr) ((mcr)->mc_reg[2] & 0xff)
43: #define M780C_ADDR(mcr) (((mcr)->mc_reg[2] >> 8) & 0xfffff)
44:
45: #define M780EL_INH(mcr) \
46: (((mcr)->mc_reg[2] = (M780_ICRD|M780_HIER|M780_ERLOG)), mtpr(SBIER, 0))
47: #define M780EL_ENA(mcr) \
48: (((mcr)->mc_reg[2] = (M780_HIER|M780_ERLOG)), mtpr(SBIER, 3<<14))
49: #define M780EL_ERR(mcr) \
50: ((mcr)->mc_reg[2] & (M780_ERLOG))
51:
52: #define M780EL_SYN(mcr) ((mcr)->mc_reg[2] & 0x7f)
53: #define M780EL_ADDR(mcr) (((mcr)->mc_reg[2] >> 11) & 0x1ffff)
54:
55: #define M780EU_INH(mcr) \
56: (((mcr)->mc_reg[3] = (M780_ICRD|M780_HIER|M780_ERLOG)), mtpr(SBIER, 0))
57: #define M780EU_ENA(mcr) \
58: (((mcr)->mc_reg[3] = (M780_HIER|M780_ERLOG)), mtpr(SBIER, 3<<14))
59: #define M780EU_ERR(mcr) \
60: ((mcr)->mc_reg[3] & (M780_ERLOG))
61:
62: #define M780EU_SYN(mcr) ((mcr)->mc_reg[3] & 0x7f)
63: #define M780EU_ADDR(mcr) (((mcr)->mc_reg[3] >> 11) & 0x1ffff)
64:
65: /* enable crd interrrupts */
66: ka780_memenable()
67: {
68: register struct mcr780 *mcr;
69: register int m;
70:
71: for (m = 0; m < nmcr; m++) {
72: mcr = (struct mcr780 *)mcraddr[m];
73: switch (mcrtype[m]) {
74:
75: case M780C:
76: M780C_ENA(mcr);
77: break;
78:
79: case M780EL:
80: M780EL_ENA(mcr);
81: break;
82:
83: case M780EU:
84: M780EU_ENA(mcr);
85: break;
86: }
87: }
88: }
89:
90: /* log crd errors */
91: ka780_memerr()
92: {
93: register struct mcr780 *mcr;
94: register int m;
95:
96: for (m = 0; m < nmcr; m++) {
97: mcr = (struct mcr780 *)mcraddr[m];
98: switch (mcrtype[m]) {
99:
100: case M780C:
101: if (M780C_ERR(mcr)) {
102: printf("mcr%d: soft ecc addr %x syn %x\n",
103: m, M780C_ADDR(mcr), M780C_SYN(mcr));
104: #ifdef TRENDATA
105: memlog(m, mcr);
106: #endif
107: M780C_INH(mcr);
108: }
109: break;
110:
111: case M780EL:
112: if (M780EL_ERR(mcr)) {
113: printf("mcr%d: soft ecc addr %x syn %x\n",
114: m, M780EL_ADDR(mcr), M780EL_SYN(mcr));
115: M780EL_INH(mcr);
116: }
117: break;
118:
119: case M780EU:
120: if (M780EU_ERR(mcr)) {
121: printf("mcr%d: soft ecc addr %x syn %x\n",
122: m, M780EU_ADDR(mcr), M780EU_SYN(mcr));
123: M780EU_INH(mcr);
124: }
125: break;
126: }
127: }
128: }
129:
130: #ifdef TRENDATA
131: /*
132: * Figure out what chip to replace on Trendata boards.
133: * Assumes all your memory is Trendata or the non-Trendata
134: * memory never fails..
135: */
136: struct {
137: u_char m_syndrome;
138: char m_chip[4];
139: } memlogtab[] = {
140: 0x01, "C00", 0x02, "C01", 0x04, "C02", 0x08, "C03",
141: 0x10, "C04", 0x19, "L01", 0x1A, "L02", 0x1C, "L04",
142: 0x1F, "L07", 0x20, "C05", 0x38, "L00", 0x3B, "L03",
143: 0x3D, "L05", 0x3E, "L06", 0x40, "C06", 0x49, "L09",
144: 0x4A, "L10", 0x4c, "L12", 0x4F, "L15", 0x51, "L17",
145: 0x52, "L18", 0x54, "L20", 0x57, "L23", 0x58, "L24",
146: 0x5B, "L27", 0x5D, "L29", 0x5E, "L30", 0x68, "L08",
147: 0x6B, "L11", 0x6D, "L13", 0x6E, "L14", 0x70, "L16",
148: 0x73, "L19", 0x75, "L21", 0x76, "L22", 0x79, "L25",
149: 0x7A, "L26", 0x7C, "L28", 0x7F, "L31", 0x80, "C07",
150: 0x89, "U01", 0x8A, "U02", 0x8C, "U04", 0x8F, "U07",
151: 0x91, "U09", 0x92, "U10", 0x94, "U12", 0x97, "U15",
152: 0x98, "U16", 0x9B, "U19", 0x9D, "U21", 0x9E, "U22",
153: 0xA8, "U00", 0xAB, "U03", 0xAD, "U05", 0xAE, "U06",
154: 0xB0, "U08", 0xB3, "U11", 0xB5, "U13", 0xB6, "U14",
155: 0xB9, "U17", 0xBA, "U18", 0xBC, "U20", 0xBF, "U23",
156: 0xC1, "U25", 0xC2, "U26", 0xC4, "U28", 0xC7, "U31",
157: 0xE0, "U24", 0xE3, "U27", 0xE5, "U29", 0xE6, "U30"
158: };
159:
160: memlog(m, mcr)
161: int m;
162: struct mcr780 *mcr;
163: {
164: register i;
165:
166: for (i = 0; i < (sizeof (memlogtab) / sizeof (memlogtab[0])); i++)
167: if ((u_char)(M780C_SYN(mcr)) == memlogtab[i].m_syndrome) {
168: printf (
169: "mcr%d: replace %s chip in %s bank of memory board %d (0-15)\n",
170: m,
171: memlogtab[i].m_chip,
172: (M780C_ADDR(mcr) & 0x8000) ? "upper" : "lower",
173: (M780C_ADDR(mcr) >> 16));
174: return;
175: }
176: printf ("mcr%d: multiple errors, not traceable\n", m);
177: break;
178: }
179: #endif TRENDATA
180:
181: extern char *mc780750[];
182:
183: struct mc780frame {
184: int mc8_bcnt; /* byte count == 0x28 */
185: int mc8_summary; /* summary parameter (as above) */
186: int mc8_cpues; /* cpu error status */
187: int mc8_upc; /* micro pc */
188: int mc8_vaviba; /* va/viba register */
189: int mc8_dreg; /* d register */
190: int mc8_tber0; /* tbuf error reg 0 */
191: int mc8_tber1; /* tbuf error reg 1 */
192: int mc8_timo; /* timeout address divided by 4 */
193: int mc8_parity; /* parity */
194: int mc8_sbier; /* sbi error register */
195: int mc8_pc; /* trapped pc */
196: int mc8_psl; /* trapped psl */
197: };
198:
199: ka780_mchk(cmcf)
200: caddr_t cmcf;
201: {
202: register struct mc780frame *mcf = (struct mc780frame *)cmcf;
203: register int type = mcf->mc8_summary;
204: register int sbifs;
205:
206: printf("machine check %x: %s%s\n", type, mc780750[type&0xf],
207: (type&0xf0) ? " abort" : " fault");
208: printf("\tcpues %x upc %x va/viba %x dreg %x tber %x %x\n",
209: mcf->mc8_cpues, mcf->mc8_upc, mcf->mc8_vaviba,
210: mcf->mc8_dreg, mcf->mc8_tber0, mcf->mc8_tber1);
211: sbifs = mfpr(SBIFS);
212: printf("\ttimo %x parity %x sbier %x pc %x psl %x sbifs %x\n",
213: mcf->mc8_timo*4, mcf->mc8_parity, mcf->mc8_sbier,
214: mcf->mc8_pc, mcf->mc8_psl, sbifs);
215: /* THE FUNNY BITS IN THE FOLLOWING ARE FROM THE ``BLACK BOOK'' */
216: /* AND SHOULD BE PUT IN AN ``sbi.h'' */
217: mtpr(SBIFS, sbifs &~ 0x2000000);
218: mtpr(SBIER, mfpr(SBIER) | 0x70c0);
219: return (MCHK_PANIC);
220: }
221: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.