Annotation of cci/d/ioex/xylog.c, revision 1.1.1.1

1.1       root        1: #include "xylog.h"
                      2: #include "pte.h"
                      3: 
                      4: 
                      5: /*     This table contains drive type for each
                      6:        drive attached to Xylogic controller.
                      7:        e.g Drive 0 is EAGLE type. This info. is
                      8:        configuration dependent.
                      9: */
                     10: 
                     11: #define DUMMY  EAGLE
                     12: struct DTYPE dtype[MAXXYDRIVES] = {
                     13:        EAGLE,DUMMY,DUMMY,DUMMY
                     14: };
                     15: 
                     16: struct TYPEPAR typepar[2] = {
                     17:        20,46,842,"Eagle",
                     18:        0,0,0,""
                     19: };
                     20: 
                     21: extern long unused, IOinit;
                     22: struct Xreg *Xyreg;
                     23: struct IOPB xiopb;
                     24: long Xdone=0;
                     25: long ForMat = 1;
                     26: 
                     27: xylog()
                     28: {      register long r12;
                     29:        long oldvec;
                     30: 
                     31:        writes("\n      ** Xylogics test **\n");
                     32:        m_xy();                 /* Map register I/O address */
                     33: 
                     34:        /* Set handler for Xylogics interrupt */
                     35:        asm("movab xyhdlr,r12");
                     36:        set_handler(XYVEC,&oldvec,r12);
                     37: 
                     38:        if (xy_reset()) {               /* Reset controller */
                     39:                writes("\nXylogic controller is at ");
                     40:                writeh(XBASE+XOFFS);
                     41:                }
                     42:           else {
                     43:                writes("\nXylogic not found...\n");
                     44:                return(0); }
                     45:        xy_ex();                /* Exercise controller */
                     46:        return(1);
                     47: }
                     48: 
                     49: xy_ex()
                     50: {      register long ix, stat;
                     51:        register struct TYPEPAR *tp;
                     52:        char Buff[NBPG];
                     53: 
                     54:        for(ix=0;ix<MAXXYDRIVES;ix++) setdr(dtype[ix].type);
                     55:        if (ForMat) Form(0);
                     56:        tp = &typepar[0];
                     57:        for (ix=0;ix<NBPG;ix++) Buff[ix] = 0xab;
                     58:        /* Write last sector */
                     59:        stat = xyop(0,XYWRITE,1,tp->nocyls-1,tp->noheads-1,tp->nosecs-1,Buff);
                     60:        if (stat) { writes("\nWrite error ... \n");
                     61:                return; }
                     62:        for (ix=0;ix<NBPG;ix++) Buff[ix] = 0;
                     63:        /* Read last sector */
                     64:        stat = xyop(0,XYREAD,1,tp->nocyls-1,tp->noheads-1,tp->nosecs-1,Buff);
                     65:        if (stat) { writes("\nRead error ... \n");
                     66:                return; }
                     67:        for (ix=0;ix<512;ix++) {
                     68:                if (Buff[ix] != 0xab) {
                     69:                        writes("\ncompare error, expect "); writeh(0xab);
                     70:                        writes(" ,actual "); writeh(Buff[ix]&0xff);
                     71:                        writes(" ,address "); writeh(&Buff[ix]);
                     72:                        }
                     73:                }
                     74: }
                     75: 
                     76: Form(devno)
                     77: long devno;
                     78: {      register long  cyl, trak;
                     79:        struct TYPEPAR *tp;
                     80: 
                     81:        tp = &typepar[devno];
                     82:        writes("\nFormating drive "); writeh(devno); writes(" ...\n");
                     83:        for (cyl=0; cyl < tp->nocyls-1; cyl++) {
                     84:                if (format(devno,cyl)) {
                     85:                        writes("\nformat error ...\n");
                     86:                        return;
                     87:                        }
                     88:                writed(cyl);
                     89:                }
                     90:        writes("\nFormat completed ...\n");
                     91: }
                     92: 
                     93: 
                     94: setdr(type)
                     95: long  type;
                     96: {      struct IOPB *iop;
                     97: 
                     98:        iop = &xiopb;
                     99:        iop->comm = SETDRIVE | IEN | AUD;
                    100:        iop->imode = IEI;
                    101:        iop->stat1 = iop->stat2 = iop->throt = (char)0;
                    102:        iop->devno = (type&0x3) << 7;   
                    103:        iop->headr = typepar[type].noheads -1;
                    104:        iop->secadr = typepar[type].nosecs -1;
                    105:        iop->calow = (char)((typepar[type].nocyls -1) & 0xff);
                    106:        iop->cahig = (char)(((typepar[type].nocyls-1) >> 8) & 0x3);
                    107:        iop->hoffs = (char)0;
                    108:        if (xygo(iop)) 
                    109:                writes("\nset drive error..\n");
                    110:           else writes("\nset drive completed.\n");
                    111: }
                    112: 
                    113: format(devno,cyl)
                    114: long devno, cyl;
                    115: {      struct IOPB *iop;
                    116:        register long nosecs;
                    117: 
                    118:        iop = &xiopb;
                    119:        iop->comm = XFORMAT | IEN | AUD;
                    120:        iop->imode = IEI;
                    121:        iop->stat1 = iop->stat2 = iop->throt = (char)0;
                    122:        iop->devno = devno | ((dtype[devno].type & 3) << 7);
                    123:        iop->headr = 0;
                    124:        iop->secadr = 0;
                    125:        iop->calow = (char)(cyl & 0xff);
                    126:        iop->cahig = (char)((cyl & 0x300) >> 8);
                    127:        nosecs = typepar[devno].nosecs * typepar[devno].noheads;
                    128:        iop->sclow = (char)(nosecs & 0xff);
                    129:        iop->schig = (char)((nosecs >> 8) & 0xff);
                    130:        return(xygo(iop)); 
                    131: }
                    132: 
                    133: xyop(devno,op,len,cyl,head,sec,buf)
                    134: long devno, cyl, len, head, sec;
                    135: char op, *buf;
                    136: {      struct IOPB *iop;
                    137:        register long nosecs;
                    138: 
                    139:        iop = &xiopb;
                    140:        iop->comm = op | IEN | AUD;
                    141:        iop->imode = IEI;
                    142:        iop->stat1 = iop->stat2 = iop->throt = (char)0;
                    143:        iop->devno = devno | ((dtype[devno].type & 3) << 7);
                    144:        iop->headr = head;
                    145:        iop->secadr = sec;
                    146:        iop->calow = (char)(cyl & 0xff);
                    147:        iop->cahig = (char)((cyl & 0x300) >> 8);
                    148:        iop->sclow = (char)(len & 0xff);
                    149:        iop->schig = (char)((len >> 8) & 0xff);
                    150:        iop->dalow = (char)((long)buf & 0xff);
                    151:        iop->dahig = (char)(((long)buf >> 8) & 0xff);
                    152:        iop->drlow = (char)(((long)buf >> 16)&0xff);
                    153:        iop->drhig = 0;
                    154:        return(xygo(iop)); 
                    155: }
                    156: 
                    157: /*     Map register I/O address of Xylogics controller
                    158: */
                    159: m_xy()
                    160: {      register long r12;
                    161:        long phys_pg, pte, old_pte, which1;
                    162: 
                    163:        /* physical page of Xylogics' registers in IO space */
                    164:        phys_pg = ((XBASE+IOBASE) >> PGSHIFT) & 0x3fffff;
                    165:        /* Virtual address of Xylogics IO registers */
                    166:        Xyreg = (struct Xreg *)((unused << PGSHIFT) + XOFFS);
                    167:        pte = phys_pg | PG_KW | PG_V | PG_NC;
                    168:        fix_pte(SBR,unused,&old_pte,pte);
                    169:        unused++;
                    170:        pte = (phys_pg+1) | PG_KW | PG_V | PG_NC;
                    171:        fix_pte(SBR,unused,&old_pte,pte);
                    172:        asm("mfpr $SLR,r12");
                    173:        r12 += 2;
                    174:        asm("mtpr r12,$SLR");
                    175:        unused++;
                    176: }
                    177: 
                    178: 
                    179: xy_reset()
                    180: {      char c, movib();
                    181:        register long cnt;
                    182: 
                    183:        movib(&Xyreg->crr);     /* Reset controller by reading this register */
                    184:        cnt = 0xff0;
                    185:        while (!((movib(&Xyreg->csr)) & DRDY)) {
                    186:                DELAY(0xff00);
                    187:                if (--cnt <= 0) { writes("\nReset time out..\n");
                    188:                        return(0); }
                    189:                }
                    190:        return(1);
                    191: }
                    192: 
                    193: 
                    194: /*     All ready to go,issue command to Xylogic
                    195: */
                    196: xygo(iopb)
                    197: struct IOPB *iopb;
                    198: {      register long r12;
                    199: 
                    200:        r12 = (long)iopb;
                    201:        if (!xyrdy()) return(1);
                    202:        movob(&Xyreg->adlow,(char)(r12 & 0xff));
                    203:        movob(&Xyreg->adhig,(char)((r12&0xff00)>>8));
                    204:        movob(&Xyreg->relow,(char)((r12&0xff0000)>>16));
                    205:        movob(&Xyreg->rehig,(char)0);
                    206:        movob(&Xyreg->csr,(char)(GBSY|ADRM));
                    207:        return(waitxy());       /* Return 0 if cmd O.K else error status */
                    208: }
                    209: 
                    210: xyrdy()
                    211: {      register cnt;
                    212:        char movib();
                    213:        cnt = 0xfff0;
                    214:        while ((movib(&Xyreg->csr))&0x80) {
                    215:                if (--cnt == 0) { 
                    216:                        writes("\nXY not ready time out !\n");
                    217:                        return(0);
                    218:                }
                    219:        }
                    220:        return(1);
                    221: }
                    222: 
                    223: waitxy()
                    224: {      register long cnt;
                    225:        Xdone = 0;
                    226:        cnt = 0xff00;
                    227:        while (!Xdone) {
                    228:                DELAY(0xff00);
                    229:                if (--cnt == 0) {
                    230:                        writes("\ntime out on Xylogic..\n");
                    231:                        return(1);
                    232:                        }
                    233:                }
                    234:        if (Xdone==2) return(Xdone);
                    235:                else return(0);
                    236: }
                    237: 
                    238: 
                    239: movob(addr,byte)
                    240: char *addr, byte;
                    241: {      register long r12;
                    242: 
                    243:        r12 = (long)addr;
                    244:        asm("movob 11(fp),(r12)");
                    245:        DELAY(80);
                    246: }
                    247: 
                    248: char movib(addr)
                    249: char *addr;
                    250: {      register long r12, r11;
                    251: 
                    252:        r12 = (long)addr;
                    253:        asm("movob (r12),r11");
                    254:        DELAY(80);
                    255:        return((char)r11);
                    256: }
                    257: 
                    258: mk32(adr,rel)
                    259: long adr, rel;
                    260: {      register long a32;
                    261: 
                    262:        a32 = (adr&0xffff) | ((rel&0xffff)<<16);
                    263:        return(a32&0xffffff);
                    264: }
                    265: 
                    266: /*     Xylogics interrupt handler 
                    267: */
                    268: xyintr()
                    269: {      char err, movib();
                    270:        register long r12;
                    271: 
                    272:        err = movib(&Xyreg->csr);       /* Get error code from CSR */
                    273:        r12 = (long)&xiopb;             /* Uncache 1st longword in IOPB */
                    274:        uncache(r12); uncache(r12+4);
                    275:        if ((err & (ERR|DERR)) || (((long)xiopb.stat1) & XS_ERR)) {
                    276:                movob(&Xyreg->csr,IPND|ERR);    /* Clear interrupt,error */
                    277:                writes("\nXy hard error, csr "); writeh(((long)err)&0xff);
                    278:                writes("\niopb_stat2 "); writeh(((long)xiopb.stat2)&0xff);
                    279:                return(0);
                    280:                }
                    281:        movob(&Xyreg->csr,IPND);        /* Clear interrupt */
                    282:        return(1);
                    283: }
                    284: 
                    285: 
                    286: Xyhdr()
                    287: {
                    288: asm(".align 2");
                    289: asm("xyhdlr:");
                    290:        asm("svpctx");
                    291:        if (xyintr()) Xdone = 1;
                    292:                else Xdone = 2;         /* Command error */
                    293:        asm("ldpctx");
                    294:        asm("rei");
                    295: }

unix.superglobalmegacorp.com

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