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

1.1     ! root        1: /*
        !             2:  * general UNIBUS map setup routines
        !             3:  */
        !             4: 
        !             5: #include "sys/param.h"
        !             6: #include "sys/ubaddr.h"
        !             7: #include "sys/map.h"
        !             8: #include "sys/uba.h"
        !             9: #include "sys/buf.h"
        !            10: #include "sys/stream.h"
        !            11: #include "sys/vmmac.h"
        !            12: #include "sys/pte.h"
        !            13: 
        !            14: extern struct uba uba[];
        !            15: extern struct block cblock[];
        !            16: extern struct buf *cblkbuf[];
        !            17: extern int blkcnt, blkbcnt;
        !            18: 
        !            19: extern uaddr_t ubmsetmap();
        !            20: 
        !            21: /*
        !            22:  * init data structures:
        !            23:  * grab a place to store map for the stream buffers
        !            24:  */
        !            25: 
        !            26: ubmstart(u)
        !            27: int u;
        !            28: {
        !            29:        register struct uba *ub;
        !            30:        register struct buf *bp;
        !            31: 
        !            32:        ub = &uba[u];
        !            33:        if ((bp = geteblk()) == NULL)
        !            34:                return (0);
        !            35:        if ((blkbcnt*sizeof(ubm_t) + blkbcnt*sizeof(uaddr_t)) > bp->b_bcount) {
        !            36:                printf("ub%d: too many stream bufs\n", u);
        !            37:                brelse(bp);
        !            38:                return (0);
        !            39:        }
        !            40:        clrbuf(bp);
        !            41:        ub->sbmap = (ubm_t *)bp->b_un.b_addr;
        !            42:        ub->sbaddr = (uaddr_t *)(ub->sbmap + blkbcnt);
        !            43:        ub->shmap = 0;
        !            44:        return (1);
        !            45: }
        !            46: 
        !            47: /*
        !            48:  * after hardware reset:
        !            49:  * clear out junk for stream data
        !            50:  */
        !            51: ubminit(u)
        !            52: int u;
        !            53: {
        !            54:        register struct uba *ub;
        !            55:        register int i;
        !            56: 
        !            57:        ub = &uba[u];
        !            58:        for (i = 0; i < blkbcnt; i++)
        !            59:                if (ub->sbmap[i]) {
        !            60:                        ubmfree(u, ub->sbmap[i]);
        !            61:                        ub->sbmap[i] = 0;
        !            62:                }
        !            63:        if (ub->shmap) {
        !            64:                ubmfree(u, ub->shmap);
        !            65:                ub->shmap = 0;
        !            66:        }
        !            67: }
        !            68: 
        !            69: /*
        !            70:  * general map-allocation routine
        !            71:  */
        !            72: 
        !            73: ubm_t
        !            74: ubmalloc(u, size, flag)
        !            75: int u;
        !            76: int size;
        !            77: register int flag;
        !            78: {
        !            79:        register struct uba *ub;
        !            80:        int base, nreg, path;
        !            81:        int s;
        !            82: 
        !            83:        ub = &uba[u];
        !            84:        nreg = btoc(size);
        !            85:        if ((flag & UPAG) == 0)
        !            86:                nreg++;         /* allow for alignment */
        !            87:        nreg++;                 /* allow for endmarker for DW780 */
        !            88:        s = spl6();
        !            89:        while ((base = rmalloc(ub->map, nreg)) == 0) {
        !            90:                if ((flag & USLP) == 0)
        !            91:                        return (0);
        !            92:                ub->flags |= UBMWANT;
        !            93:                sleep((caddr_t)ub->map, PZERO);
        !            94:        }
        !            95:        splx(s);
        !            96:        if (flag & UBDP)
        !            97:                path = ubmapath(u);
        !            98:        else
        !            99:                path = 0;
        !           100:        return ((base<<UMFIRST) | ((nreg-UMSZERO)<<UMSIZE) | (path<<UMDP));
        !           101: }
        !           102:        
        !           103: ubmfree(u, um)
        !           104: ubm_t um;
        !           105: {
        !           106:        register struct uba *ub;
        !           107:        register int path;
        !           108:        register int s;
        !           109: 
        !           110:        if (um == NOMAP)
        !           111:                return;
        !           112:        ub = &uba[u];
        !           113:        s = spl6();
        !           114:        if ((path = ubmpath(um)) != 0) {
        !           115:                ubmflush(u, path);
        !           116:                ub->path |= 1<<path;
        !           117:        }
        !           118:        rmfree(ub->map, ubmsize(um), ubmfirst(um));
        !           119:        if (ub->flags & UBMWANT) {
        !           120:                wakeup((caddr_t)ub->map);
        !           121:                ub->flags &=~ UBMWANT;
        !           122:        }
        !           123:        splx(s);
        !           124: }
        !           125: 
        !           126: /*
        !           127:  * general-purpose address mapper
        !           128:  * for kernel address space
        !           129:  * don't use this if there's a better choice below
        !           130:  */
        !           131: 
        !           132: uaddr_t
        !           133: ubmaddr(u, cp, size, um)
        !           134: int u;
        !           135: caddr_t cp;
        !           136: ubm_t um;
        !           137: int size;
        !           138: {
        !           139:        register int off;
        !           140: 
        !           141:        off = (int)cp & PGOFSET;
        !           142:        return (ubmsetmap(u, &Sysmap[btop((int)cp & ~KSTART)],
        !           143:                btoc(size + off), um) + off);
        !           144: }
        !           145: 
        !           146: /*
        !           147:  * allocate/set maps for various kinds of object
        !           148:  * ubmxxx returns a map sufficient for the object;
        !           149:  * ubadxxx sets the map, and returns a unibus-space address
        !           150:  * sometimes ubmxxx will return NOMAP,
        !           151:  * which means the space was pre-mapped (and any data path will be ignored)
        !           152:  */
        !           153: 
        !           154: 
        !           155: /*
        !           156:  * io buffers
        !           157:  */
        !           158: 
        !           159: ubm_t
        !           160: ubmbuf(u, bp, flags)
        !           161: int u;
        !           162: register struct buf *bp;
        !           163: int flags;
        !           164: {
        !           165: 
        !           166:        if ((bp->b_flags & B_PHYS) == 0)
        !           167:                flags |= UPAG;
        !           168:        return (ubmalloc(u, bp->b_bcount, flags));
        !           169: }
        !           170: 
        !           171: uaddr_t
        !           172: ubadbuf(u, bp, um)
        !           173: int u;
        !           174: register struct buf *bp;
        !           175: ubm_t um;
        !           176: {
        !           177:        register int off;
        !           178: 
        !           179:        off = (int)bp->b_un.b_addr & PGOFSET;
        !           180:        return (ubmsetmap(u, btopte(bp), btoc(bp->b_bcount + off), um) + off);
        !           181: }
        !           182: 
        !           183: /*
        !           184:  * stream blocks
        !           185:  * headers (and the tiny bit of data in them) pre-mapped
        !           186:  * the rest of the data mapped a buf at a time, when first touched
        !           187:  */
        !           188: 
        !           189: ubm_t
        !           190: ubmblk(u, bp, flags)
        !           191: int u;
        !           192: register struct block *bp;
        !           193: int flags;
        !           194: {
        !           195:        register int i;
        !           196:        register struct uba *ub;
        !           197:        register struct buf *bf;
        !           198: 
        !           199:        ub = &uba[u];
        !           200:        flags &=~ UBDP;
        !           201:        if ((i = bp->bufix) == NOBUFIX) {       /* data all in the header */
        !           202:                if (ub->shmap)
        !           203:                        return (NOMAP);
        !           204:                if ((ub->shmap = ubmalloc(u, blkcnt*sizeof(struct block), flags)) == 0)
        !           205:                        return (0);
        !           206:                ub->shaddr = ubmaddr(u, (char *)cblock, blkcnt*sizeof(struct block), ub->shmap);
        !           207:                return (NOMAP);
        !           208:        }
        !           209:        if (ub->sbmap[i])                       /* this buf already mapped */
        !           210:                return (NOMAP);
        !           211:        bf = cblkbuf[i];
        !           212:        if ((ub->sbmap[i] = ubmbuf(u, bf, flags)) == 0)
        !           213:                return (0);
        !           214:        ub->sbaddr[i] = ubmsetmap(u, btopte(bf), btoc(bf->b_bcount), ub->sbmap[i]);
        !           215:        return (NOMAP);
        !           216: }
        !           217: 
        !           218: /*
        !           219:  * ubadwptr returns the unibus address of the write pointer
        !           220:  * ubadrptr for the read pointer
        !           221:  */
        !           222: 
        !           223: uaddr_t
        !           224: ubadwptr(u, bp, um)
        !           225: int u;
        !           226: register struct block *bp;
        !           227: ubm_t um;
        !           228: {
        !           229:        register struct uba *ub;
        !           230:        register int i;
        !           231: 
        !           232:        ub = &uba[u];
        !           233:        if ((i = bp->bufix) == NOBUFIX)
        !           234:                return ((uaddr_t)(bp->wptr-(u_char *)cblock + (int)ub->shaddr));
        !           235:        if (ub->sbmap[i] == 0)
        !           236:                panic("ubadwptr");
        !           237:        return (ub->sbaddr[i]+bp->wptr-(u_char *)cblkbuf[i]->b_un.b_addr);
        !           238: }
        !           239: 
        !           240: uaddr_t
        !           241: ubadrptr(u, bp, um)
        !           242: int u;
        !           243: register struct block *bp;
        !           244: ubm_t um;
        !           245: {
        !           246:        register struct uba *ub;
        !           247:        register int i;
        !           248: 
        !           249:        ub = &uba[u];
        !           250:        if ((i = bp->bufix) == NOBUFIX)
        !           251:                return ((uaddr_t)(bp->rptr-(u_char *)cblock + (int)ub->shaddr));
        !           252:        if (ub->sbmap[i] == 0)
        !           253:                panic("ubadrptr");
        !           254:        return (ub->sbaddr[i]+bp->rptr-(u_char *)cblkbuf[i]->b_un.b_addr);
        !           255: }

unix.superglobalmegacorp.com

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