|
|
1.1 ! root 1: /* ! 2: * nexus device routines; ! 3: * both sbi and vaxbi nexus ! 4: */ ! 5: ! 6: #include "mkconf.h" ! 7: ! 8: /* ! 9: * addressing fields ! 10: */ ! 11: ! 12: static char *sbifields[] = { ! 13: "bus", "tr", "voff", NULL ! 14: }; ! 15: ! 16: #define a_adp addr[0] /* adapter: which sbi, which vaxbi */ ! 17: #define a_tr addr[1] /* nexus number within that adapter */ ! 18: #define a_svoff addr[2] /* sbi devices (like unibus adapter): vector offset */ ! 19: ! 20: static char *vbifields[] = { ! 21: "bi", "node", "vec", "voff", NULL ! 22: }; ! 23: ! 24: #define a_bvec addr[2] /* vaxbi: vector */ ! 25: #define a_bvoff addr[3] /* vaxbi adapter devices (like dw): vector offset */ ! 26: ! 27: #define VFMT "X%s%d%d" /* name of vector interface routine */ ! 28: ! 29: #define MAXNEX 20 /* this many nexus, not highest hardware tr */ ! 30: ! 31: struct nextab { ! 32: char adp; ! 33: char nex; ! 34: } nextab[MAXNEX]; ! 35: ! 36: int nextnex; ! 37: ! 38: sbisyntax(dp, ap, n) ! 39: register Dev *dp; ! 40: char **ap; ! 41: int n; ! 42: { ! 43: char *p; ! 44: ! 45: dp->a_svoff = 0; ! 46: if ((p = keyread(dp->addr, ap, n, sbifields)) != NULL) { ! 47: fprint(STDERR, "%s %d: bad field %s\n", dp->mdev->name, dp->id, p); ! 48: errs++; ! 49: return (1); ! 50: } ! 51: dp->vecoff = dp->a_svoff; ! 52: return (0); ! 53: } ! 54: ! 55: vbisyntax(dp, ap, n) ! 56: register Dev *dp; ! 57: char **ap; ! 58: int n; ! 59: { ! 60: char *p; ! 61: ! 62: dp->a_bvoff = 0; ! 63: if ((p = keyread(dp->addr, ap, n, vbifields)) != NULL) { ! 64: fprint(STDERR, "%s %d: bad field %s\n", dp->mdev->name, dp->id, p); ! 65: errs++; ! 66: return (1); ! 67: } ! 68: dp->vecoff = dp->a_bvoff; ! 69: return (0); ! 70: } ! 71: ! 72: /* ! 73: * fixup routine: ! 74: * compute and insert our (fixed) interrupt vectors ! 75: * insert our entry in the table of nexus ! 76: * and replace our `nexus' address with the appropriate index ! 77: */ ! 78: int ! 79: sbifixup(dp) ! 80: register Dev *dp; ! 81: { ! 82: register int vec; ! 83: register int i; ! 84: register Mdev *mp; ! 85: char vname[20]; ! 86: ! 87: nexparent(dp); ! 88: mp = dp->mdev; ! 89: if (mp->nvec) { ! 90: vec = dp->a_tr*4; /* honest nexus number, mod 16 */ ! 91: vec += 0x100; /* -> br4 vector */ ! 92: if (dp->parent) ! 93: vec += dp->parent->vecoff; ! 94: sprint(vname, VFMT, mp->tag, dp->id, 0); ! 95: for (i = 0; i < 4; i++) { ! 96: newvec(vec, SINTR, vname); ! 97: vec += 0x40; ! 98: } ! 99: } ! 100: newnex(dp); ! 101: } ! 102: ! 103: int ! 104: vbifixup(dp) ! 105: register Dev *dp; ! 106: { ! 107: register int vec; ! 108: register Mdev *mp; ! 109: register int i; ! 110: char vname[20]; ! 111: ! 112: nexparent(dp); ! 113: mp = dp->mdev; ! 114: vec = dp->a_bvec; ! 115: if (dp->parent) /* && vec > 0x200? */ ! 116: vec += dp->parent->vecoff; ! 117: for (i = 0; i < mp->nvec; i++, vec += 4) { ! 118: sprint(vname, VFMT, mp->tag, dp->id, i); ! 119: newvec(vec, SINTR, vname); ! 120: } ! 121: newnex(dp); ! 122: } ! 123: ! 124: newnex(dp) ! 125: register Dev *dp; ! 126: { ! 127: if (nextnex >= MAXNEX) { ! 128: fprint(STDERR, "%s %d: too many nexus\n", dp->mdev->name, dp->id); ! 129: errs++; ! 130: return; ! 131: } ! 132: nextab[nextnex].adp = dp->a_adp; ! 133: nextab[nextnex].nex = dp->a_tr; ! 134: dp->addr[1] = nextnex; ! 135: nextnex++; ! 136: } ! 137: ! 138: nexparent(dp) ! 139: register Dev *dp; ! 140: { ! 141: register Dev *ep; ! 142: ! 143: for (ep = dlist; ep; ep = ep->next) ! 144: if (ep->mdev->adptype == dp->mdev->atype ! 145: && ep->id == dp->a_adp) ! 146: break; ! 147: dp->parent = ep; ! 148: } ! 149: ! 150: sbiputaddr(fd, dp) ! 151: int fd; ! 152: register Dev *dp; ! 153: { ! 154: register int count; ! 155: register Mdev *mp; ! 156: ! 157: nexputtab(fd); ! 158: mp = dp->mdev; ! 159: count = 0; ! 160: fprint(fd, "struct nxaddr %saddr[] = {\n", mp->tag); ! 161: for (mp = dp->mdev; dp && dp->mdev == mp; dp = dp->next) { ! 162: while (count++ < dp->id) ! 163: fprint(fd, "\t{-1, 0},\n"); ! 164: fprint(fd, "\t{%ld, %ld, 0x%lx},\n", dp->a_tr, dp->a_adp, dp->a_svoff); ! 165: } ! 166: count *= mp->rept; ! 167: fprint(fd, "};\nint %scnt = %d;\n", mp->tag, count); ! 168: putstrs(fd, mp, count); ! 169: } ! 170: ! 171: vbiputaddr(fd, dp) ! 172: int fd; ! 173: register Dev *dp; ! 174: { ! 175: register int count; ! 176: register Mdev *mp; ! 177: ! 178: nexputtab(fd); ! 179: mp = dp->mdev; ! 180: count = 0; ! 181: fprint(fd, "struct biaddr %saddr[] = {\n", mp->tag); ! 182: for (mp = dp->mdev; dp && dp->mdev == mp; dp = dp->next) { ! 183: while (count++ < dp->id) ! 184: fprint(fd, "\t{-1},\n"); ! 185: fprint(fd, "\t{%ld, 0x%lx, 0x%lx, %ld},\n", ! 186: dp->a_tr, dp->a_bvec, dp->a_bvoff, dp->a_adp); ! 187: } ! 188: count *= mp->rept; ! 189: fprint(fd, "};\nint %scnt = %d;\n", mp->tag, count); ! 190: putstrs(fd, mp, count); ! 191: } ! 192: ! 193: /* ! 194: * put out nexus tables ! 195: */ ! 196: ! 197: nexputtab(fd) ! 198: int fd; ! 199: { ! 200: register int i; ! 201: static int done = 0; ! 202: ! 203: if (done++) ! 204: return; ! 205: fprint(fd, "\nstruct nextab nextab[] = {\n"); ! 206: for (i = 0; i < nextnex; i++) ! 207: fprint(fd, "\t%d, %d,\n", nextab[i].adp, nextab[i].nex); ! 208: fprint(fd, "\t-1\n};\n"); ! 209: } ! 210: ! 211: /* ! 212: * put out vectors ! 213: */ ! 214: ! 215: nexputvec(fd, dp) ! 216: int fd; ! 217: register Dev *dp; ! 218: { ! 219: register int i; ! 220: char vname[30]; ! 221: ! 222: for (i = 0; i < dp->mdev->nvec; i++) { ! 223: sprint(vname, VFMT, dp->mdev->tag, dp->id, i); ! 224: stdputvec(fd, dp, vname, i); ! 225: } ! 226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.