1 /* $NetBSD: conf.c,v 1.57 2002/01/12 15:17:17 manu Exp $ */ 2 3 /*- 4 * Copyright (c) 1982, 1986 The Regents of the University of California. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * @(#)conf.c 7.18 (Berkeley) 5/9/91 36 */ 37 38 #include <sys/param.h> 39 #include <sys/systm.h> 40 #include <sys/buf.h> 41 #include <sys/ioctl.h> 42 #include <sys/tty.h> 43 #include <sys/conf.h> 44 #include <sys/vnode.h> 45 #include <machine/cpu.h> 46 47 #include "opt_cputype.h" 48 49 #include "hp.h" /* 0 */ 50 bdev_decl(hp); 51 52 #include "ht.h" 53 bdev_decl(ht); 54 55 #include "rk.h" 56 bdev_decl(rk); 57 58 bdev_decl(sw); 59 60 #include "te.h" 61 bdev_decl(tm); 62 63 #include "mt.h" 64 bdev_decl(mt); 65 66 #include "ts.h" 67 bdev_decl(ts); 68 69 #include "mu.h" 70 bdev_decl(mu); 71 72 #if VAX750 || VAXANY 73 #define NCTU 1 74 #else 75 #define NCTU 0 76 #endif 77 bdev_decl(ctu); 78 79 #include "ra.h" 80 bdev_decl(ra); 81 bdev_decl(rx); 82 83 #include "up.h" 84 bdev_decl(up); 85 86 #include "tj.h" 87 bdev_decl(ut); 88 89 #include "rb.h" 90 bdev_decl(idc); 91 92 #include "uu.h" 93 bdev_decl(uu); 94 95 #include "rl.h" 96 bdev_decl(rl); 97 98 #include "ccd.h" 99 bdev_decl(ccd); 100 101 #include "raid.h" 102 bdev_decl(raid); 103 104 #include "vnd.h" 105 bdev_decl(vnd); 106 107 #include "ry.h" 108 bdev_decl(rd); 109 bdev_decl(ry); 110 111 #include "sd.h" 112 bdev_decl(sd); 113 114 #include "st.h" 115 bdev_decl(st); 116 117 #include "cd.h" 118 bdev_decl(cd); 119 120 #include "md.h" 121 bdev_decl(md); 122 123 struct bdevsw bdevsw[] = 124 { 125 bdev_disk_init(NHP,hp), /* 0: RP0?/RM0? */ 126 bdev_tape_init(NHT,ht), /* 1: TU77 w/ TM03 */ 127 bdev_disk_init(NUP,up), /* 2: SC-21/SC-31 */ 128 bdev_disk_init(NRK,rk), /* 3: RK06/07 */ 129 bdev_swap_init(1,sw), /* 4: swap pseudo-device */ 130 bdev_tape_init(NTE,tm), /* 5: TM11/TE10 */ 131 bdev_tape_init(NTS,ts), /* 6: TS11 */ 132 bdev_tape_init(NMU,mu), /* 7: TU78 */ 133 bdev_tape_init(NCTU,ctu), /* 8: Console TU58 on 730/750 */ 134 bdev_disk_init(NRA,ra), /* 9: MSCP disk */ 135 bdev_tape_init(NTJ,ut), /* 10: TU45 */ 136 bdev_disk_init(NRB,idc), /* 11: IDC (RB730) */ 137 bdev_disk_init(NRX,rx), /* 12: RX?? on MSCP */ 138 bdev_disk_init(NUU,uu), /* 13: TU58 on DL11 */ 139 bdev_disk_init(NRL,rl), /* 14: RL01/02 */ 140 bdev_tape_init(NMT,mt), /* 15: MSCP tape */ 141 bdev_notdef(), /* 16: was: KDB50/RA?? */ 142 bdev_disk_init(NCCD,ccd), /* 17: concatenated disk driver */ 143 bdev_disk_init(NVND,vnd), /* 18: vnode disk driver */ 144 bdev_disk_init(NRD,rd), /* 19: VS3100 ST506 disk */ 145 bdev_disk_init(NSD,sd), /* 20: SCSI disk */ 146 bdev_tape_init(NST,st), /* 21: SCSI tape */ 147 bdev_disk_init(NCD,cd), /* 22: SCSI CD-ROM */ 148 bdev_disk_init(NMD,md), /* 23: memory disk driver */ 149 bdev_disk_init(NRY,ry), /* 24: VS3100 floppy */ 150 bdev_disk_init(NRAID,raid), /* 25: RAIDframe disk driver */ 151 }; 152 int nblkdev = sizeof(bdevsw) / sizeof(bdevsw[0]); 153 154 /* 155 * Console routines for VAX console. 156 */ 157 #include <dev/cons.h> 158 159 #include "smg.h" 160 #include "wskbd.h" 161 #if NSMG > 0 162 #if NWSKBD > 0 163 #define smgcngetc wskbd_cngetc 164 #else 165 static int 166 smgcngetc(dev_t dev) 167 { 168 return 0; 169 } 170 #endif 171 172 #define smgcnputc wsdisplay_cnputc 173 #define smgcnpollc nullcnpollc 174 #endif 175 176 cons_decl(gen); 177 cons_decl(dz); 178 cons_decl(qd); 179 cons_decl(smg); 180 #include "qv.h" 181 #include "qd.h" 182 183 struct consdev constab[]={ 184 #if VAX8600 || VAX8200 || VAX780 || VAX750 || VAX650 || VAX630 || VAX660 || \ 185 VAX670 || VAX680 || VAX8800 || VAXANY 186 #define NGEN 1 187 cons_init(gen), /* Generic console type; mtpr/mfpr */ 188 #else 189 #define NGEN 0 190 #endif 191 #if VAX410 || VAX43 || VAX46 || VAX48 || VAX49 || VAX53 || VAXANY 192 cons_init(dz), /* DZ11-like serial console on VAXstations */ 193 #endif 194 #if VAX650 || VAX630 || VAXANY 195 #if NQV 196 cons_init(qv), /* QVSS/QDSS bit-mapped console driver */ 197 #endif 198 #if NQD 199 cons_init(qd), 200 #endif 201 #endif 202 #if NSMG 203 cons_init(smg), 204 #endif 205 206 #ifdef notyet 207 /* We may not always use builtin console, sometimes RD */ 208 { rdcnprobe, rdcninit, rdcngetc, rdcnputc }, 209 #endif 210 { 0 } 211 }; 212 213 /* Special for console storage */ 214 #define dev_type_rw(n) int n __P((dev_t, int, int, struct proc *)) 215 216 /* plotters */ 217 /* open, close, write, ioctl, poll */ 218 #define cdev_plotter_init(c,n) { \ 219 dev_init(c,n,open), dev_init(c,n,close), dev_noimpl(read,enodev), \ 220 dev_init(c,n,write), dev_init(c,n,ioctl), dev_noimpl(stop,enodev), \ 221 0, dev_init(c,n,poll), dev_noimpl(mmap,enodev) } 222 223 /* console mass storage */ 224 /* open, close, read, write */ 225 #define cdev_cnstore_init(c,n) { \ 226 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 227 dev_init(c,n,write), dev_noimpl(ioctl,enodev), \ 228 dev_noimpl(stop,enodev), 0, seltrue, dev_noimpl(mmap,enodev) } 229 230 /* open, close, write */ 231 #define cdev_lp_init(c,n) { \ 232 dev_init(c,n,open), dev_init(c,n,close), dev_noimpl(read,enodev), \ 233 dev_init(c,n,write), dev_noimpl(ioctl,enodev), \ 234 dev_noimpl(stop,enodev), 0, seltrue, dev_noimpl(mmap,enodev) } 235 236 /* graphic display adapters */ 237 /* open, close, read, write, ioctl, stop, poll */ 238 #define cdev_graph_init(c,n) cdev__ocrwisp_init(c,n) 239 240 /* Ingres */ 241 /* open, close, (read), (write), ioctl */ 242 #define cdev_ingres_init(c,n) { \ 243 dev_init(c,n,open), dev_init(c,n,close), dev_noimpl(read,nullop), \ 244 dev_noimpl(write,nullop), dev_init(c,n,ioctl), \ 245 dev_noimpl(stop,enodev), 0, seltrue, dev_noimpl(mmap,enodev) } 246 247 248 249 cdev_decl(cn); 250 cdev_decl(ctty); 251 #define mmread mmrw 252 #define mmwrite mmrw 253 cdev_decl(mm); 254 cdev_decl(sw); 255 #include "pty.h" 256 #define ptstty ptytty 257 #define ptsioctl ptyioctl 258 cdev_decl(pts); 259 #define ptctty ptytty 260 #define ptcioctl ptyioctl 261 cdev_decl(ptc); 262 cdev_decl(log); 263 264 cdev_decl(hp); 265 cdev_decl(rk); 266 cdev_decl(tm); 267 cdev_decl(mt); 268 cdev_decl(ts); 269 cdev_decl(mu); 270 cdev_decl(ra); 271 cdev_decl(up); 272 cdev_decl(ut); 273 cdev_decl(idc); 274 cdev_decl(fd); 275 cdev_decl(gencn); 276 cdev_decl(rx); 277 cdev_decl(rl); 278 cdev_decl(ccd); 279 cdev_decl(raid); 280 cdev_decl(rd); 281 cdev_decl(ry); 282 cdev_decl(sd); 283 cdev_decl(st); 284 285 #include "ct.h" 286 cdev_decl(ct); 287 #include "dh.h" 288 cdev_decl(dh); 289 #include "dmf.h" 290 cdev_decl(dmf); 291 292 #if VAX8600 || VAXANY 293 #define NCRL 1 294 #else 295 #define NCRL 0 296 #endif 297 #define crlread crlrw 298 #define crlwrite crlrw 299 cdev_decl(crl); 300 301 #if VAX8200 || VAXANY 302 #define NCRX 1 303 #else 304 #define NCRX 0 305 #endif 306 #define crxread crxrw 307 #define crxwrite crxrw 308 cdev_decl(crx); 309 310 #if VAX780 || VAXANY 311 #define NCFL 1 312 #else 313 #define NCFL 0 314 #endif 315 #define cflread cflrw 316 #define cflwrite cflrw 317 cdev_decl(cfl); 318 319 #include "dz.h" 320 cdev_decl(dz); 321 322 #include "vp.h" 323 cdev_decl(vp); 324 325 #include "lp.h" 326 cdev_decl(lp); 327 328 #include "va.h" 329 cdev_decl(va); 330 331 #include "lpa.h" 332 cdev_decl(lpa); 333 334 #include "dn.h" 335 cdev_decl(dn); 336 337 #include "ik.h" 338 cdev_decl(ik); 339 340 #include "ps.h" 341 cdev_decl(ps); 342 343 #include "ad.h" 344 cdev_decl(ad); 345 346 #include "dhu.h" 347 cdev_decl(dhu); 348 349 #include "dmz.h" 350 cdev_decl(dmz); 351 352 cdev_decl(qv); 353 cdev_decl(qd); 354 355 #include "ipfilter.h" 356 cdev_decl(ipl); 357 358 #include "dl.h" 359 cdev_decl(dl); 360 361 #if defined(INGRES) 362 #define NII 1 363 #else 364 #define NII 0 365 #endif 366 cdev_decl(ii); 367 368 cdev_decl(vnd); 369 370 #include "bpfilter.h" 371 cdev_decl(bpf); 372 373 #include "tun.h" 374 cdev_decl(tun); 375 cdev_decl(cd); 376 #include "ch.h" 377 cdev_decl(ch); 378 cdev_decl(md); 379 #include "ss.h" 380 cdev_decl(ss); 381 #include "uk.h" 382 cdev_decl(uk); 383 384 #include "rnd.h" 385 386 dev_decl(filedesc,open); 387 388 #include "wsdisplay.h" 389 cdev_decl(wsdisplay); 390 #include "wskbd.h" 391 cdev_decl(wskbd); 392 #include "wsmouse.h" 393 cdev_decl(wsmouse); 394 #include "wsmux.h" 395 cdev_decl(wsmux); 396 397 #include "scsibus.h" 398 cdev_decl(scsibus); 399 400 #include "clockctl.h" 401 cdev_decl(clockctl); 402 403 struct cdevsw cdevsw[] = 404 { 405 cdev_cn_init(1,cn), /* 0: virtual console */ 406 cdev_tty_init(NDZ,dz), /* 1: DZ11 */ 407 cdev_ctty_init(1,ctty), /* 2: controlling terminal */ 408 cdev_mm_init(1,mm), /* 3: /dev/{null,mem,kmem,...} */ 409 cdev_disk_init(NHP,hp), /* 4: Massbuss disk */ 410 cdev_notdef(), /* 5 */ 411 cdev_plotter_init(NVP,vp), /* 6: Versatec plotter */ 412 cdev_swap_init(1,sw), /* 7 */ 413 cdev_cnstore_init(NCFL,cfl), /* 8: 11/780 console floppy */ 414 cdev_disk_init(NRA,ra), /* 9: MSCP disk interface */ 415 cdev_plotter_init(NVA,va), /* 10: Benson-Varian plotter */ 416 cdev_disk_init(NRK,rk), /* 11: RK06/07 */ 417 cdev_tty_init(NDH,dh), /* 12: DH-11/DM-11 */ 418 cdev_disk_init(NUP,up), /* 13: SC-21/SC-31 */ 419 cdev_tape_init(NTE,tm), /* 14: TM11/TE10 */ 420 cdev_lp_init(NLP,lp), /* 15: LP-11 line printer */ 421 cdev_tape_init(NTS,ts), /* 16: TS11 */ 422 cdev_tape_init(NTJ,ut), /* 17: TU45 */ 423 cdev_lp_init(NCT,ct), /* 18: phototypesetter interface */ 424 cdev_tape_init(NMU,mu), /* 19: TU78 */ 425 cdev_tty_init(NPTY,pts), /* 20: pseudo-tty slave */ 426 cdev_ptc_init(NPTY,ptc), /* 21: pseudo-tty master */ 427 cdev_tty_init(NDMF,dmf), /* 22: DMF32 */ 428 cdev_disk_init(NRB,idc), /* 23: IDC (RB730) */ 429 cdev_lp_init(NDN,dn), /* 24: DN-11 autocall unit */ 430 cdev_tty_init(NGEN,gencn), /* 25: Generic console (mtpr...) */ 431 cdev_audio_init(NLPA,lpa), /* 26 ??? */ 432 cdev_graph_init(NPS,ps), /* 27: E/S graphics device */ 433 cdev_lkm_init(NLKM,lkm), /* 28: loadable module driver */ 434 cdev_ch_init(NAD,ad), /* 29: DT A/D converter */ 435 cdev_disk_init(NRX,rx), /* 30: RX?? on MSCP */ 436 cdev_graph_init(NIK,ik), /* 31: Ikonas frame buffer */ 437 cdev_disk_init(NRL,rl), /* 32: RL01/02 on unibus */ 438 cdev_log_init(1,log), /* 33: /dev/klog */ 439 cdev_tty_init(NDHU,dhu), /* 34: DHU-11 */ 440 cdev_cnstore_init(NCRL,crl), /* 35: Console RL02 on 8600 */ 441 cdev_notdef(), /* 36 */ 442 cdev_tty_init(NDMZ,dmz), /* 37: DMZ32 */ 443 cdev_tape_init(NMT,mt), /* 38: MSCP tape */ 444 cdev_notdef(), /* 39 was NP Intelligent Board */ 445 cdev_graph_init(NQV,qv), /* 40: QVSS graphic display */ 446 cdev_graph_init(NQD,qd), /* 41: QDSS graphic display */ 447 cdev_ipf_init(NIPFILTER,ipl), /* 42: Packet filter */ 448 cdev_ingres_init(NII,ii), /* 43: Ingres device */ 449 cdev_notdef(), /* 44 was Datakit */ 450 cdev_notdef(), /* 45 was Datakit */ 451 cdev_notdef(), /* 46 was Datakit */ 452 cdev_notdef(), /* 47 */ 453 cdev_notdef(), /* 48 */ 454 cdev_notdef(), /* 49 */ 455 cdev_notdef(), /* 50 */ 456 cdev_cnstore_init(NCRX,crx), /* 51: Console RX50 at 8200 */ 457 cdev_notdef(), /* 52: was: KDB50/RA?? */ 458 cdev_fd_init(1,filedesc), /* 53: file descriptor pseudo-device */ 459 cdev_disk_init(NCCD,ccd), /* 54: concatenated disk driver */ 460 cdev_disk_init(NVND,vnd), /* 55: vnode disk driver */ 461 cdev_bpftun_init(NBPFILTER,bpf),/* 56: berkeley packet filter */ 462 cdev_bpftun_init(NTUN,tun), /* 57: tunnel filter */ 463 cdev_disk_init(NRD,rd), /* 58: HDC9224/RD?? */ 464 cdev_disk_init(NSD,sd), /* 59: SCSI disk */ 465 cdev_tape_init(NST,st), /* 60: SCSI tape */ 466 cdev_disk_init(NCD,cd), /* 61: SCSI CD-ROM */ 467 cdev_disk_init(NMD,md), /* 62: memory disk driver */ 468 cdev_ch_init(NCH,ch), /* 63: SCSI autochanger */ 469 cdev_scanner_init(NSS,ss), /* 64: SCSI scanner */ 470 cdev_uk_init(NUK,uk), /* 65: SCSI unknown */ 471 cdev_tty_init(NDL,dl), /* 66: DL11 */ 472 cdev_rnd_init(NRND,rnd), /* 67: random source pseudo-device */ 473 cdev_wsdisplay_init(NWSDISPLAY, 474 wsdisplay), /* 68: frame buffers, etc. */ 475 476 cdev_mouse_init(NWSKBD, wskbd), /* 69: keyboards */ 477 cdev_mouse_init(NWSMOUSE, 478 wsmouse), /* 70: mice */ 479 cdev_disk_init(NRY,ry), /* 71: VS floppy */ 480 cdev_scsibus_init(NSCSIBUS,scsibus), /* 72: SCSI bus */ 481 cdev_disk_init(NRAID,raid), /* 73: RAIDframe disk driver */ 482 cdev_mouse_init(NWSMUX, wsmux), /* 74: ws multiplexor */ 483 cdev_clockctl_init(NCLOCKCTL, clockctl),/* 75: clockctl pseudo device */ 484 }; 485 int nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]); 486 487 int mem_no = 3; /* major device number of memory special file */ 488 489 /* 490 * Swapdev is a fake device implemented 491 * in sw.c used only internally to get to swstrategy. 492 * It cannot be provided to the users, because the 493 * swstrategy routine munches the b_dev and b_blkno entries 494 * before calling the appropriate driver. This would horribly 495 * confuse, e.g. the hashing routines. Instead, /dev/drum is 496 * provided as a character (raw) device. 497 */ 498 dev_t swapdev = makedev(4, 0); 499 500 int chrtoblktbl[] = { 501 NODEV, /* 0 */ 502 NODEV, /* 1 */ 503 NODEV, /* 2 */ 504 NODEV, /* 3 */ 505 0, /* 4 */ 506 1, /* 5 */ 507 NODEV, /* 6 */ 508 NODEV, /* 7 */ 509 NODEV, /* 8 */ 510 9, /* 9 */ 511 NODEV, /* 10 */ 512 3, /* 11 */ 513 NODEV, /* 12 */ 514 2, /* 13 */ 515 5, /* 14 */ 516 NODEV, /* 15 */ 517 6, /* 16 */ 518 10, /* 17 */ 519 NODEV, /* 18 */ 520 7, /* 19 */ 521 NODEV, /* 20 */ 522 NODEV, /* 21 */ 523 NODEV, /* 22 */ 524 11, /* 23 */ 525 NODEV, /* 24 */ 526 NODEV, /* 25 */ 527 NODEV, /* 26 */ 528 NODEV, /* 27 */ 529 NODEV, /* 28 */ 530 NODEV, /* 29 */ 531 12, /* 30 */ 532 NODEV, /* 31 */ 533 14, /* 32 */ 534 NODEV, /* 33 */ 535 NODEV, /* 34 */ 536 NODEV, /* 35 */ 537 NODEV, /* 36 */ 538 NODEV, /* 37 */ 539 15, /* 38 */ 540 NODEV, /* 39 */ 541 NODEV, /* 40 */ 542 NODEV, /* 41 */ 543 NODEV, /* 42 */ 544 NODEV, /* 43 */ 545 NODEV, /* 44 */ 546 NODEV, /* 45 */ 547 NODEV, /* 46 */ 548 NODEV, /* 47 */ 549 NODEV, /* 48 */ 550 NODEV, /* 49 */ 551 NODEV, /* 50 */ 552 NODEV, /* 51 */ 553 16, /* 52 */ 554 NODEV, /* 53 */ 555 17, /* 54 */ 556 18, /* 55 */ 557 NODEV, /* 56 */ 558 NODEV, /* 57 */ 559 19, /* 58 */ 560 20, /* 59 */ 561 21, /* 60 */ 562 22, /* 61 */ 563 23, /* 62 */ 564 NODEV, /* 63 */ 565 NODEV, /* 64 */ 566 NODEV, /* 65 */ 567 NODEV, /* 66 */ 568 NODEV, /* 67 */ 569 NODEV, /* 68 */ 570 NODEV, /* 69 */ 571 NODEV, /* 70 */ 572 NODEV, /* 71 */ 573 NODEV, /* 72 */ 574 25, /* 73 */ 575 NODEV, /* 74 */ 576 NODEV, /* 75 */ 577 }; 578 579 dev_t 580 chrtoblk(dev) 581 dev_t dev; 582 { 583 if(major(dev)>=nchrdev) return(NODEV); 584 return chrtoblktbl[major(dev)]==NODEV?NODEV: 585 makedev(chrtoblktbl[major(dev)],minor(dev)); 586 } 587 588 /* 589 * Returns true if dev is /dev/mem or /dev/kmem. 590 */ 591 int 592 iskmemdev(dev) 593 dev_t dev; 594 { 595 596 return (major(dev) == 3 && minor(dev) < 2); 597 } 598 599 /* 600 * Returns true if dev is /dev/zero. 601 * ?? Shall I use 12 as /dev/zero? 602 */ 603 int 604 iszerodev(dev) 605 dev_t dev; 606 { 607 608 return (major(dev) == 3 && minor(dev) == 12); 609 } 610 611 int 612 getmajor(void *ptr) 613 { 614 int i; 615 616 for (i = 0; i < nchrdev; i++) 617 if (cdevsw[i].d_open == ptr) 618 return i; 619 panic("getmajor"); 620 } 621