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

1.1     ! root        1: /*
        !             2:  * memory controller support for nautilus
        !             3:  *
        !             4:  * an interpretation of the VMS code
        !             5:  */
        !             6: 
        !             7: #include "sys/param.h"
        !             8: #include "sys/systm.h"
        !             9: 
        !            10: extern long *mcrcsr;   /* virt addr of mem csrs; filled in when spt built */
        !            11: 
        !            12: /*
        !            13:  * mem csrs have no names, just numbers 0-7
        !            14:  * 0-3 have control and status bits
        !            15:  * 4-7 are just magic places to read:
        !            16:  *     csr4 clears memory interrupt
        !            17:  *     csr5 clears memory (and nmi) fault
        !            18:  */
        !            19: 
        !            20: /*
        !            21:  * csr0
        !            22:  */
        !            23: 
        !            24: #define        TOCODE  0x7000000       /* timeout code */
        !            25: #define        ILTO    0x2000000       /* interlock timeout */
        !            26: 
        !            27: /*
        !            28:  * csr1
        !            29:  */
        !            30: 
        !            31: #define        WENABLE 0x100000        /* decode ram write enable -- make sure off */
        !            32: 
        !            33: /*
        !            34:  * csr2
        !            35:  */
        !            36: 
        !            37: #define        RDSHER  0x80000000      /* rds thick and fast */
        !            38: #define        RDS     0x40000000      /* read data substitute (hard error) */
        !            39: #define        CRD     0x20000000      /* corrected read data (soft error) */
        !            40: #define        RDFORCE 0x10000000      /* RDS really NMI bus error */
        !            41: 
        !            42: /*
        !            43:  * csr3
        !            44:  */
        !            45: 
        !            46: #define        IEINTERR 0x80000000     /* internal error intr enab */
        !            47: #define        IEILERR 0x40000000      /* interlock error ie */
        !            48: #define        IECRD   0x20000000      /* soft error ie */
        !            49: #define        IERDS   0x10000000      /* hard error ie */
        !            50: #define        INTERR  0x2000000       /* internal error */
        !            51: 
        !            52: #define        IE      (IEINTERR|IEILERR|IECRD|IERDS)
        !            53: 
        !            54: /*
        !            55:  * init the memory controller:
        !            56:  * enable interrupts
        !            57:  */
        !            58: 
        !            59: mcrinit()
        !            60: {
        !            61:        register long junk;
        !            62:        register long *m;
        !            63: 
        !            64:        if ((m = mcrcsr) == 0)
        !            65:                panic("mcrinit");
        !            66:        mcrclr();
        !            67:        m[3] = IE;
        !            68: }
        !            69: 
        !            70: /*
        !            71:  * here on memory interrupt
        !            72:  * guess whether it's an error
        !            73:  */
        !            74: 
        !            75: mcrint()
        !            76: {
        !            77:        register long *m;
        !            78: 
        !            79:        if ((m = mcrcsr) == 0)
        !            80:                return;
        !            81:        /* cknofault? */
        !            82:        mcrerr();
        !            83: }
        !            84: 
        !            85: /*
        !            86:  * memory error, because controller interrupted or otherwise
        !            87:  */
        !            88: static int crdoff;
        !            89: int mcrreenb();
        !            90: 
        !            91: mcrerr()
        !            92: {
        !            93:        register long *m;
        !            94:        register long csr0, csr1, csr2, csr3;
        !            95:        register long xcsr1;            /* eventually toss out */
        !            96:        register int hard;
        !            97:        static time_t lastcrd;
        !            98: 
        !            99:        if ((m = mcrcsr) == 0)
        !           100:                return;         /* hopeless */
        !           101:        csr0 = m[0];
        !           102:        xcsr1 = m[1];
        !           103:        m[1] = xcsr1 & ~WENABLE;
        !           104:        csr1 = m[1];
        !           105:        csr2 = m[2];
        !           106:        csr3 = m[3];
        !           107:        mcrclr();
        !           108:        hard = 0;
        !           109:        if (csr3 & INTERR)
        !           110:                hard++;
        !           111:        if ((csr0 & TOCODE) == ILTO)
        !           112:                hard++;
        !           113:        if (csr2 & (RDS|RDFORCE))
        !           114:                hard++;
        !           115:        printf("mem %s err: %x %x %x %x (%x)\n", hard ? "hard" : "soft",
        !           116:                csr0, csr1, csr2, csr3, xcsr1);
        !           117:        if (hard)
        !           118:                panic("mcrerr");
        !           119:        if (lastcrd && lastcrd + 5 < time) {
        !           120:                if (crdoff++ == 0)
        !           121:                        timeout(mcrreenb, (caddr_t)0, 15*HZ);
        !           122:                m[3] = (IE &~ IECRD);
        !           123:        }
        !           124:        else
        !           125:                lastcrd = time;
        !           126: }
        !           127: 
        !           128: mcrreenb(x)
        !           129: caddr_t x;
        !           130: {
        !           131:        crdoff = 0;
        !           132:        mcrcsr[3] = IE;
        !           133: }
        !           134: 
        !           135: mcrclr()
        !           136: {
        !           137:        register long junk;
        !           138:        register long *m;
        !           139: 
        !           140:        if ((m = mcrcsr) == 0)
        !           141:                return;
        !           142:        junk = m[4];
        !           143:        junk = m[5];
        !           144:        m[0] = m[0]|TOCODE;
        !           145:        m[1] = m[1];
        !           146:        m[2] = m[2];
        !           147: }

unix.superglobalmegacorp.com

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