|
|
1.1 root 1: /*
2: * comet memory controller
3: */
4:
5: #include "sys/param.h"
6: #include "sys/systm.h"
7: #include "sys/nxaddr.h"
8:
9: /*
10: * intentional overlays:
11: * if no memory controller configured,
12: * mcrcnt will be 0
13: * but there will be no undefined symbols
14: */
15:
16: int mcrcnt;
17: struct nxaddr mcraddr[1]; /* one or more */
18: caddr_t mcrregs[1]; /* one or more */
19: time_t mcrtime[1]; /* one or more */
20:
21: int mcrtimeout = 60; /* seconds between soft error reports */
22:
23: struct device {
24: long csr0;
25: long csr1;
26: long csr2;
27: };
28:
29: /*
30: * csr0
31: */
32: #define HARDERR 0x80000000 /* uncorrectable error */
33: #define HARDLST 0x40000000 /* nested hard error */
34: #define SOFTERR 0x20000000 /* corrected error */
35:
36: /*
37: * csr1
38: */
39: #define CRDENB 0x10000000 /* enable reporting soft errors */
40:
41: mcrinit()
42: {
43: register int i;
44: register struct device *m;
45:
46: for (i = 0; i < mcrcnt; i++)
47: if ((m = (struct device *)nxaddr(&mcraddr[i])) == NULL
48: || badaddr(&m->csr0, sizeof(long)))
49: printf("mcr%d absent\n", i);
50: else {
51: mcrregs[i] = (caddr_t)m;
52: mcrenable((caddr_t)m);
53: }
54: }
55:
56: mcrenable(mm)
57: caddr_t mm;
58: {
59: ((struct device *)mm)->csr1 = CRDENB;
60: }
61:
62: memerr()
63: {
64: register int i;
65: register struct device *m;
66: long csr[3];
67:
68: if (mcrcnt == 0) {
69: printf("mem err, no controllers configured\n");
70: return; /* and hope */
71: }
72: for (i = 0; i < mcrcnt; i++) {
73: if ((m = (struct device *)mcrregs[i]) == NULL)
74: continue;
75: if (m->csr0 & (HARDERR|SOFTERR)) {
76: csr[0] = m->csr0;
77: csr[1] = m->csr1;
78: csr[2] = m->csr2;
79: m->csr0 = m->csr0;
80: if (mcrtime[i] != time)
81: mcrtime[i] = time;
82: else {
83: m->csr1 = 0;
84: timeout(mcrenable, (caddr_t)m, mcrtimeout*HZ);
85: }
86: printf("mcr%d: mem %s error %x %x %x\n", i,
87: csr[0]&HARDERR?"hard":"soft", csr[0], csr[1], csr[2]);
88: if (csr[0]&HARDERR)
89: panic("memerr");
90: }
91: }
92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.