Annotation of researchv10dc/sys/md/ubauvax.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Q-bus adapter routines for MicroVAX II
                      3:  * The names imply `UNIBUS'; most of the system knows no difference
                      4:  */
                      5: 
                      6: #include "sys/param.h"
                      7: #include "sys/ubaddr.h"
                      8: #include "sys/map.h"
                      9: #include "sys/uba.h"
                     10: #include "sys/pte.h"
                     11: #include "sys/vmparam.h"
                     12: #include "sys/qbio.h"
                     13: 
                     14: extern struct uba uba[];
                     15: extern struct nxaddr ubaaddr[];
                     16: extern int ubacnt;
                     17: 
                     18: /*
                     19:  * bits in map register
                     20:  */
                     21: 
                     22: #define        MPAGE   0x3fff          /* physical page number -- small on comet */
                     23: #define        MRV     0x80000000      /* map register valid */
                     24: 
                     25: #define        QIOBASE 0760000         /* base address in Q-bus io space */
                     26: 
                     27: #define        ICR     0777500         /* interprocessor control register */
                     28: #define        LMEAE   040             /* local memory external access enable */
                     29: 
                     30: /*
                     31:  * return the register address for a unibus device
                     32:  */
                     33: 
                     34: caddr_t
                     35: ubaddr(up)
                     36: register struct ubaddr *up;
                     37: {
                     38:        register struct uba *ub;
                     39: 
                     40:        if (up->ubno < 0 || up->ubno > ubacnt) {
                     41:                printf("bad qbus no %d\n", up->ubno);
                     42:                return (0);
                     43:        }
                     44:        ub = &uba[up->ubno];
                     45:        if ((ub->flags & UBINIT) == 0)
                     46:                if (ubstart(up->ubno) == 0)
                     47:                        return (0);
                     48:        return ((caddr_t)&ub->addr->ioreg[up->uboff-QIOBASE]);
                     49: }
                     50: 
                     51: /*
                     52:  * init the unibus adapter
                     53:  */
                     54: 
                     55: ubstart(u)
                     56: int u;
                     57: {
                     58:        register struct uba *ub;
                     59:        extern caddr_t qbaaddr();
                     60: 
                     61:        ub = &uba[u];
                     62:        if ((ub->addr = (struct ubadev *)qbaaddr(u)) == 0)
                     63:                return (0);
                     64:        rminit(ub->map, UBNMAP, NQMREG-1, 1);   /* NQMREG-1 because can't alloc 0 */
                     65:        if (ubmstart(u) == 0)
                     66:                return (0);
                     67:        ubinit(u);
                     68:        ub->flags |= UBINIT|UBQBUS;
                     69:        return (1);
                     70: }
                     71: 
                     72: /*
                     73:  * init the unibus adapter hardware
                     74:  */
                     75: 
                     76: ubinit(u)
                     77: int u;
                     78: {
                     79:        register struct uba *ub;
                     80:        register int i;
                     81:        register long *p;
                     82: 
                     83:        ub = &uba[u];
                     84:        *(short *)&ub->addr->ioreg[ICR-QIOBASE] |= LMEAE;
                     85:        for (i = 0, p = ub->addr->mreg; i < NQMREG; i++)
                     86:                *p++ = 0;
                     87:        ubminit(u);
                     88: }
                     89: 
                     90: /*
                     91:  * determine whether a particular address,
                     92:  * which happens to be in UNIBUS space,
                     93:  * exists
                     94:  * -- on MicroVAX, you just get a machine check on error
                     95:  */
                     96: ubbadaddr(u, a, s)
                     97: int u, s;
                     98: caddr_t a;
                     99: {
                    100: 
                    101:        return (badaddr(a, s));
                    102: }
                    103: 
                    104: /*
                    105:  * get/put a single byte to a particular unibus address
                    106:  * intended for use by ECC code
                    107:  * work it out from first principles,
                    108:  * because UNIBUS adapter may loop and hang otherwise
                    109:  */
                    110: 
                    111: static long
                    112: ubphys(ubno, addr)
                    113: unsigned int ubno;
                    114: uaddr_t addr;
                    115: {
                    116:        register struct uba *ub;
                    117:        register int pg;
                    118:        register long m;
                    119: 
                    120:        if (ubno >= ubacnt)
                    121:                panic("ubphys");
                    122:        ub = &uba[ubno];
                    123:        if (ub->addr == NULL)
                    124:                panic("ubphys");
                    125:        pg = addr / NBPG;
                    126:        if (pg >= NQMREG)
                    127:                return (-1);    /* addr too big */
                    128:        m = ub->addr->mreg[pg];
                    129:        if ((m & MRV) == 0)
                    130:                return (-1);    /* invalid */
                    131:        return ((m & MPAGE) * NBPG + addr % NBPG);
                    132: }
                    133: 
                    134: int
                    135: ubgetc(ubno, addr)
                    136: unsigned int ubno;
                    137: uaddr_t addr;
                    138: {
                    139:        register long phys;
                    140: 
                    141:        phys = ubphys(ubno, addr);
                    142:        if (phys < 0)
                    143:                return (-1);
                    144:        return (phgetc(phys));
                    145: }
                    146: 
                    147: int
                    148: ubputc(ubno, addr, c)
                    149: unsigned int ubno;
                    150: uaddr_t addr;
                    151: char c;
                    152: {
                    153:        register long phys;
                    154: 
                    155:        phys = ubphys(ubno, addr);
                    156:        if (phys < 0)
                    157:                return (-1);
                    158:        return (phputc(phys, c));
                    159: }
                    160: 
                    161: /*
                    162:  * allocate a BDP: MicroVAXes have none
                    163:  */
                    164: 
                    165: int
                    166: ubmapath(u)
                    167: int u;
                    168: {
                    169:        return (0);
                    170: }
                    171: 
                    172: ubmflush(u, path)
                    173: int u;
                    174: int path;
                    175: {
                    176: }
                    177: 
                    178: /*
                    179:  * fill in a piece of unibus map
                    180:  * return the address of the base
                    181:  *
                    182:  * hardware bug: successive writes to map registers
                    183:  * can block Q-bus DMA
                    184:  * workaround: CPU write to memory after each map reg write,
                    185:  * to slow it down enough
                    186:  */
                    187: 
                    188: uaddr_t
                    189: ubmsetmap(u, p, nreg, um)
                    190: int u;
                    191: register struct pte *p;
                    192: register int nreg;
                    193: ubm_t um;
                    194: {
                    195:        register long *m;
                    196:        int junk;
                    197: 
                    198:        m = &uba[u].addr->mreg[ubmfirst(um)];
                    199:        if (nreg > ubmsize(um)-1)
                    200:                panic("ubmsetmap");
                    201:        while (--nreg >= 0) {
                    202:                *m++ = p++->pg_pfnum | MRV;
                    203:                junk = 0;
                    204:        }
                    205:        return (ctob(ubmfirst(um)));
                    206: }

unix.superglobalmegacorp.com

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