1 /* $NetBSD: conf.c,v 1.5 2002/04/19 01:04:42 wiz Exp $ */ 2 3 /* 4 * Copyright (c) 1994-1998 Mark Brinicombe. 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 Mark Brinicombe 18 * for the NetBSD Project. 19 * 4. The name of the company nor the name of the author may be used to 20 * endorse or promote products derived from this software without specific 21 * prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 29 * 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 * RiscBSD kernel project 36 * 37 * conf.c 38 * 39 * Character and Block Device configuration 40 * Console configuration 41 * 42 * Defines the structures cdevsw and constab 43 * 44 * Created : 17/09/94 45 */ 46 47 #include "opt_footbridge.h" 48 49 #include <sys/param.h> 50 #include <sys/systm.h> 51 #include <sys/buf.h> 52 #include <sys/ioctl.h> 53 #include <sys/tty.h> 54 #include <sys/conf.h> 55 #include <sys/vnode.h> 56 57 #include <machine/conf.h> 58 59 #include "wd.h" 60 #include "fdc.h" 61 #include "md.h" 62 #include "sd.h" 63 #include "st.h" 64 #include "cd.h" 65 #include "vnd.h" 66 #include "ccd.h" 67 #include "raid.h" 68 69 /* Block devices */ 70 71 struct bdevsw bdevsw[] = { 72 bdev_lkm_dummy(), /* 0: */ 73 bdev_swap_init(1, sw), /* 1: swap pseudo-device */ 74 bdev_lkm_dummy(), /* 2: */ 75 bdev_lkm_dummy(), /* 3: */ 76 bdev_lkm_dummy(), /* 4: */ 77 bdev_lkm_dummy(), /* 5: */ 78 bdev_lkm_dummy(), /* 6: */ 79 bdev_lkm_dummy(), /* 7: */ 80 bdev_lkm_dummy(), /* 8: */ 81 bdev_lkm_dummy(), /* 9: */ 82 bdev_lkm_dummy(), /* 10: */ 83 bdev_lkm_dummy(), /* 11: */ 84 bdev_lkm_dummy(), /* 12: */ 85 bdev_lkm_dummy(), /* 13: */ 86 bdev_lkm_dummy(), /* 14: */ 87 bdev_lkm_dummy(), /* 15: */ 88 bdev_disk_init(NWD, wd), /* 16: Internal IDE disk */ 89 bdev_disk_init(NFDC, fd), /* 17: floppy diskette */ 90 bdev_disk_init(NMD, md), /* 18: memory disk */ 91 bdev_disk_init(NVND,vnd), /* 19: vnode disk driver */ 92 bdev_lkm_dummy(), /* 20: */ 93 bdev_disk_init(NCCD,ccd), /* 21: concatenated disk driver */ 94 bdev_lkm_dummy(), /* 22: */ 95 bdev_lkm_dummy(), /* 23: */ 96 bdev_disk_init(NSD,sd), /* 24: SCSI disk */ 97 bdev_tape_init(NST,st), /* 25: SCSI tape */ 98 bdev_disk_init(NCD,cd), /* 26: SCSI cdrom */ 99 bdev_lkm_dummy(), /* 27: */ 100 bdev_lkm_dummy(), /* 28: */ 101 bdev_lkm_dummy(), /* 29: */ 102 bdev_lkm_dummy(), /* 30: */ 103 bdev_lkm_dummy(), /* 31: */ 104 bdev_lkm_dummy(), /* 32: */ 105 bdev_lkm_dummy(), /* 33: */ 106 bdev_lkm_dummy(), /* 34: */ 107 bdev_lkm_dummy(), /* 35: */ 108 bdev_lkm_dummy(), /* 36: */ 109 bdev_lkm_dummy(), /* 37: */ 110 bdev_lkm_dummy(), /* 38: */ 111 bdev_lkm_dummy(), /* 39: */ 112 bdev_lkm_dummy(), /* 40: */ 113 bdev_lkm_dummy(), /* 41: */ 114 bdev_lkm_dummy(), /* 42: */ 115 bdev_lkm_dummy(), /* 43: */ 116 bdev_lkm_dummy(), /* 44: */ 117 bdev_lkm_dummy(), /* 45: */ 118 bdev_lkm_dummy(), /* 46: */ 119 bdev_lkm_dummy(), /* 47: */ 120 bdev_lkm_dummy(), /* 48: */ 121 bdev_lkm_dummy(), /* 49: */ 122 bdev_lkm_dummy(), /* 50: */ 123 bdev_lkm_dummy(), /* 51: */ 124 bdev_lkm_dummy(), /* 52: */ 125 bdev_lkm_dummy(), /* 53: */ 126 bdev_lkm_dummy(), /* 54: */ 127 bdev_lkm_dummy(), /* 55: */ 128 bdev_lkm_dummy(), /* 56: */ 129 bdev_lkm_dummy(), /* 57: */ 130 bdev_lkm_dummy(), /* 58: */ 131 bdev_lkm_dummy(), /* 59: */ 132 bdev_lkm_dummy(), /* 60: */ 133 bdev_lkm_dummy(), /* 61: */ 134 bdev_lkm_dummy(), /* 62: */ 135 bdev_lkm_dummy(), /* 63: */ 136 bdev_lkm_dummy(), /* 64: */ 137 bdev_lkm_dummy(), /* 65: */ 138 bdev_lkm_dummy(), /* 66: */ 139 bdev_lkm_dummy(), /* 67: */ 140 bdev_lkm_dummy(), /* 68: */ 141 bdev_lkm_dummy(), /* 69: */ 142 bdev_lkm_dummy(), /* 70: */ 143 bdev_disk_init(NRAID,raid), /* 71: RAIDframe disk driver */ 144 bdev_lkm_dummy(), /* 72: */ 145 bdev_lkm_dummy(), /* 73: */ 146 bdev_lkm_dummy(), /* 74: */ 147 bdev_lkm_dummy(), /* 75: */ 148 bdev_lkm_dummy(), /* 76: */ 149 bdev_lkm_dummy(), /* 77: */ 150 bdev_lkm_dummy(), /* 78: */ 151 bdev_lkm_dummy(), /* 79: */ 152 bdev_lkm_dummy(), /* 80: */ 153 bdev_lkm_dummy(), /* 81: */ 154 bdev_lkm_dummy(), /* 82: */ 155 bdev_lkm_dummy(), /* 83: */ 156 bdev_lkm_dummy(), /* 84: */ 157 }; 158 159 int nblkdev = sizeof(bdevsw) / sizeof(bdevsw[0]); 160 161 #include "isdn.h" 162 #include "isdnctl.h" 163 #include "isdntrc.h" 164 #include "isdnbchan.h" 165 #include "isdntel.h" 166 cdev_decl(isdn); 167 cdev_decl(isdnctl); 168 cdev_decl(isdntrc); 169 cdev_decl(isdnbchan); 170 cdev_decl(isdntel); 171 172 #include "vt.h" 173 #include "vidcconsole.h" 174 #include "pty.h" 175 #define ptstty ptytty 176 #define ptsioctl ptyioctl 177 #define ptctty ptytty 178 #define ptcioctl ptyioctl 179 #include "com.h" 180 #include "lpt.h" 181 #include "bpfilter.h" 182 #include "ch.h" 183 #include "uk.h" 184 #include "ss.h" 185 #include "tun.h" 186 #include "qms.h" 187 #include "opms.h" 188 #include "beep.h" 189 #include "kbd.h" 190 #include "audio.h" 191 #include "midi.h" 192 #include "sequencer.h" 193 #include "iic.h" 194 #include "rtc.h" 195 #include "vidcconsole.h" 196 #include "ipfilter.h" 197 #include "rnd.h" 198 199 #include "vcoda.h" /* coda file system */ 200 #include "wsdisplay.h" 201 #include "wskbd.h" 202 #include "wsmouse.h" 203 #include "wsmux.h" 204 #include "scsibus.h" 205 #include "clockctl.h" 206 cdev_decl(clockctl); 207 208 /* Character devices */ 209 210 struct cdevsw cdevsw[] = { 211 cdev_mm_init(1, mm), /* 0: /dev/{null,mem,kmem,...} */ 212 cdev_swap_init(1, sw), /* 1: /dev/drum (swap pseudo-device) */ 213 cdev_cn_init(1, cn), /* 2: virtual console */ 214 cdev_ctty_init(1,ctty), /* 3: controlling terminal */ 215 #if NVIDCCONSOLE>0 216 cdev_physcon_init(NVT, physcon),/* 4: RPC console */ 217 #else 218 cdev_notdef(), /* 4: */ 219 #endif 220 cdev_log_init(1,log), /* 5: /dev/klog */ 221 cdev_ptc_init(NPTY,ptc), /* 6: pseudo-tty master */ 222 cdev_tty_init(NPTY,pts), /* 7: pseudo-tty slave */ 223 cdev_lpt_init(NLPT,lpt), /* 8: parallel printer */ 224 cdev_mouse_init(NQMS,qms), /* 9: qms driver */ 225 cdev_beep_init(NBEEP,beep), /* 10: simple beep device */ 226 cdev_kbd_init(NKBD,kbd), /* 11: kbd device */ 227 cdev_tty_init(NCOM,com), /* 12: serial port */ 228 cdev_lkm_dummy(), /* 13: */ 229 cdev_lkm_dummy(), /* 14: */ 230 cdev_lkm_dummy(), /* 15: */ 231 cdev_disk_init(NWD, wd), /* 16: ST506/ESDI/IDE disk */ 232 cdev_disk_init(NFDC, fd), /* 17: floppy diskette */ 233 cdev_disk_init(NMD, md), /* 18: memory disk driver */ 234 cdev_disk_init(NVND,vnd), /* 19: vnode disk driver */ 235 cdev_lkm_dummy(), /* 20: */ 236 cdev_disk_init(NCCD,ccd), /* 21: concatenated disk driver */ 237 cdev_lkm_dummy(), /* 22: */ 238 cdev_lkm_dummy(), /* 23: */ 239 cdev_disk_init(NSD,sd), /* 24: SCSI disk */ 240 cdev_tape_init(NST,st), /* 25: SCSI tape */ 241 cdev_disk_init(NCD,cd), /* 26: SCSI CD-ROM */ 242 cdev_ch_init(NCH,ch), /* 27: SCSI autochanger */ 243 cdev_uk_init(NUK,uk), /* 28: SCSI unknown */ 244 cdev_scanner_init(NSS,ss), /* 29: SCSI scanner */ 245 cdev_lkm_dummy(), /* 30: */ 246 cdev_lkm_dummy(), /* 31: */ 247 cdev_bpftun_init(NBPFILTER,bpf),/* 32: Berkeley packet filter */ 248 cdev_bpftun_init(NTUN,tun), /* 33: network tunnel */ 249 cdev_fd_init(1,filedesc), /* 34: file descriptor pseudo-device */ 250 cdev_lkm_init(NLKM,lkm), /* 35: loadable module driver */ 251 cdev_audio_init(NAUDIO,audio), /* 36: generic audio I/O */ 252 cdev_vidcvid_init(NVIDCCONSOLE,vidcconsole), /* 37: vidcconsole device */ 253 cdev_lkm_dummy(), /* 38: removed cpu device */ 254 cdev_lkm_dummy(), /* 39: reserved */ 255 cdev_mouse_init(NOPMS,opms), /* 40: PS2 mouse driver */ 256 cdev_lkm_dummy(), /* 41: reserved */ 257 cdev_iic_init(NIIC, iic), /* 42: IIC bus driver */ 258 cdev_rtc_init(NRTC, rtc), /* 43: RTC driver */ 259 cdev_lkm_dummy(), /* 44: reserved */ 260 cdev_lkm_dummy(), /* 45: reserved */ 261 cdev_ipf_init(NIPFILTER,ipl), /* 46: ip-filter device */ 262 cdev_lkm_dummy(), /* 47: reserved */ 263 cdev_lkm_dummy(), /* 48: reserved */ 264 cdev_notdef(), /* 49: ofrom */ 265 cdev_notdef(), /* 50: Smart card reader */ 266 cdev_notdef(), /* 51: reserved */ 267 cdev_rnd_init(NRND,rnd), /* 52: random source pseudo-device */ 268 cdev_notdef(), /* 53: fiq Profiler; not for acorn32 */ 269 cdev_notdef(), /* 54: FOOTBRIDGE console */ 270 cdev_lkm_dummy(), /* 55: Reserved for bypass device */ 271 cdev_notdef(), /* 56: ISA joystick */ 272 cdev_midi_init(NMIDI,midi), /* 57: MIDI I/O */ 273 cdev_midi_init(NSEQUENCER,sequencer), /* 58: sequencer I/O */ 274 cdev_vc_nb_init(NVCODA,vc_nb_), /* 59: coda file system psdev */ 275 cdev_wsdisplay_init(NWSDISPLAY, wsdisplay), /* 60: frame buffers, etc. */ 276 cdev_mouse_init(NWSKBD, wskbd), /* 61: keyboards */ 277 cdev_mouse_init(NWSMOUSE, wsmouse), /* 62: mice */ 278 cdev_lkm_dummy(), /* 63: reserved */ 279 cdev_notdef(), /* 64: USB controller */ 280 cdev_notdef(), /* 65: USB generic HID */ 281 cdev_notdef(), /* 66: USB printer */ 282 cdev_lkm_dummy(), /* 67: reserved */ 283 cdev_lkm_dummy(), /* 68: reserved */ 284 cdev_lkm_dummy(), /* 69: reserved */ 285 cdev_scsibus_init(NSCSIBUS,scsibus), /* 70: SCSI bus */ 286 cdev_disk_init(NRAID,raid), /* 71: RAIDframe disk driver */ 287 cdev_notdef(), /* 72: USB generic driver */ 288 cdev_mouse_init(NWSMUX,wsmux), /* 73: ws multiplexor */ 289 cdev_notdef(), /* 74: USB tty */ 290 cdev_notdef(), /* 75: USB Diamond Rio 500 */ 291 cdev_notdef(), /* 76: USB scanner */ 292 cdev_notdef(), /* 77: */ 293 cdev_notdef(), /* 78: bicons pseudo-dev */ 294 cdev_isdn_init(NISDN, isdn), /* 79: isdn main device */ 295 cdev_isdnctl_init(NISDNCTL, isdnctl), /* 80: isdn control device */ 296 cdev_isdnbchan_init(NISDNBCHAN, isdnbchan), /* 81: isdn raw b-channel access */ 297 cdev_isdntrc_init(NISDNTRC, isdntrc), /* 82: isdn trace device */ 298 cdev_isdntel_init(NISDNTEL, isdntel), /* 83: isdn phone device */ 299 cdev_clockctl_init(NCLOCKCTL, clockctl),/* 84: clockctl pseudo device */ 300 }; 301 302 int nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]); 303 304 int mem_no = 0; /* major device number of memory special file */ 305 306 /* 307 * Swapdev is a fake device implemented 308 * in sw.c used only internally to get to swstrategy. 309 * It cannot be provided to the users, because the 310 * swstrategy routine munches the b_dev and b_blkno entries 311 * before calling the appropriate driver. This would horribly 312 * confuse, e.g. the hashing routines. Instead, /dev/drum is 313 * provided as a character (raw) device. 314 */ 315 dev_t swapdev = makedev(1, 0); 316 317 /* 318 * Returns true if dev is /dev/mem or /dev/kmem. 319 */ 320 int 321 iskmemdev(dev) 322 dev_t dev; 323 { 324 return (major(dev) == mem_no && minor(dev) < 2); 325 } 326 327 /* 328 * Returns true if dev is /dev/zero. 329 */ 330 int 331 iszerodev(dev) 332 dev_t dev; 333 { 334 return (major(dev) == mem_no && minor(dev) == 3); 335 } 336 337 338 static int chrtoblktbl[] = { 339 /* XXXX This needs to be dynamic for LKMs. */ 340 /*VCHR*/ /*VBLK*/ 341 /* 0 */ NODEV, 342 /* 1 */ 1, 343 /* 2 */ NODEV, 344 /* 3 */ NODEV, 345 /* 4 */ NODEV, 346 /* 5 */ NODEV, 347 /* 6 */ NODEV, 348 /* 7 */ NODEV, 349 /* 8 */ NODEV, 350 /* 9 */ NODEV, 351 /* 10 */ NODEV, 352 /* 11 */ NODEV, 353 /* 12 */ NODEV, 354 /* 13 */ NODEV, 355 /* 14 */ NODEV, 356 /* 15 */ NODEV, 357 /* 16 */ 16, 358 /* 17 */ 17, 359 /* 18 */ 18, 360 /* 19 */ 19, 361 /* 20 */ NODEV, 362 /* 21 */ 21, 363 /* 22 */ NODEV, 364 /* 23 */ NODEV, 365 /* 24 */ 24, 366 /* 25 */ 25, 367 /* 26 */ 26, 368 /* 27 */ NODEV, 369 /* 28 */ NODEV, 370 /* 29 */ NODEV, 371 /* 30 */ NODEV, 372 /* 31 */ NODEV, 373 /* 32 */ NODEV, 374 /* 33 */ NODEV, 375 /* 34 */ NODEV, 376 /* 35 */ NODEV, 377 /* 36 */ NODEV, 378 /* 37 */ NODEV, 379 /* 38 */ NODEV, 380 /* 39 */ NODEV, 381 /* 40 */ NODEV, 382 /* 41 */ NODEV, 383 /* 42 */ NODEV, 384 /* 43 */ NODEV, 385 /* 44 */ NODEV, 386 /* 45 */ NODEV, 387 /* 46 */ NODEV, 388 /* 47 */ NODEV, 389 /* 48 */ NODEV, 390 /* 49 */ NODEV, 391 /* 50 */ NODEV, 392 /* 51 */ NODEV, 393 /* 52 */ NODEV, 394 /* 53 */ NODEV, 395 /* 54 */ NODEV, 396 /* 55 */ NODEV, 397 /* 56 */ NODEV, 398 /* 57 */ NODEV, 399 /* 58 */ NODEV, 400 /* 59 */ NODEV, 401 /* 60 */ NODEV, 402 /* 61 */ NODEV, 403 /* 62 */ NODEV, 404 /* 63 */ NODEV, 405 /* 64 */ NODEV, 406 /* 65 */ NODEV, 407 /* 66 */ NODEV, 408 /* 67 */ NODEV, 409 /* 68 */ NODEV, 410 /* 69 */ NODEV, 411 /* 70 */ NODEV, 412 /* 71 */ 71, 413 /* 72 */ NODEV, 414 /* 73 */ NODEV, 415 /* 74 */ NODEV, 416 /* 75 */ NODEV, 417 /* 76 */ NODEV, 418 /* 77 */ NODEV, 419 /* 78 */ NODEV, 420 /* 79 */ NODEV, 421 /* 80 */ NODEV, 422 /* 81 */ NODEV, 423 /* 82 */ NODEV, 424 /* 83 */ NODEV, 425 /* 84 */ NODEV, 426 }; 427 428 /* 429 * Convert a character device number to a block device number. 430 */ 431 432 dev_t 433 chrtoblk(dev) 434 dev_t dev; 435 { 436 int blkmaj; 437 438 if (major(dev) >= nchrdev) 439 return (NODEV); 440 441 blkmaj = chrtoblktbl[major(dev)]; 442 if (blkmaj == NODEV) 443 return (NODEV); 444 return (makedev(blkmaj, minor(dev))); 445 } 446 447 /* 448 * This entire table could be autoconfig()ed but that would mean that 449 * the kernel's idea of the console would be out of sync with that of 450 * the standalone boot. I think it best that they both use the same 451 * known algorithm unless we see a pressing need otherwise. 452 */ 453 454 #include <dev/cons.h> 455 456 cons_decl(rpcconsole); 457 cons_decl(com); 458 cons_decl(ofcons_); 459 cons_decl(pc); 460 461 struct consdev constab[] = { 462 #if (NCOM > 0) 463 cons_init(com), 464 #endif 465 #if (NVT + NRPC > 0) 466 cons_init(rpcconsole), 467 #elif (NPC > 0) 468 cons_init(pc), 469 #elif (NOFCONS > 0) /* XXX should work together */ 470 cons_init(ofcons_), 471 #endif 472 { 0 }, 473 }; 474 475 476 /* End of conf.c */ 477