Annotation of researchv10dc/sys/md/mcrcomet.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.