xref: /netbsd/sys/arch/acorn32/acorn32/conf.c (revision bf9ec67e)
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