xref: /csrg-svn/sys/hp300/hp300/conf.c (revision 57336)
149610Sdonn /*-
249610Sdonn  * Copyright (c) 1991 The Regents of the University of California.
341475Smckusick  * All rights reserved.
441475Smckusick  *
541475Smckusick  * %sccs.include.redist.c%
641475Smckusick  *
7*57336Shibler  *      @(#)conf.c	7.15 (Berkeley) 12/27/92
841475Smckusick  */
941475Smckusick 
1056508Sbostic #include <sys/param.h>
1156508Sbostic #include <sys/systm.h>
1256508Sbostic #include <sys/buf.h>
1356508Sbostic #include <sys/ioctl.h>
1456508Sbostic #include <sys/proc.h>
1556508Sbostic #include <sys/tty.h>
1656508Sbostic #include <sys/conf.h>
1741475Smckusick 
1849623Skarels int	rawread		__P((dev_t, struct uio *, int));
1949623Skarels int	rawwrite	__P((dev_t, struct uio *, int));
2049623Skarels int	swstrategy	__P((struct buf *));
2149623Skarels int	ttselect	__P((dev_t, int, struct proc *));
2241475Smckusick 
2349623Skarels #define	dev_type_open(n)	int n __P((dev_t, int, int, struct proc *))
2449623Skarels #define	dev_type_close(n)	int n __P((dev_t, int, int, struct proc *))
2549623Skarels #define	dev_type_strategy(n)	int n __P((struct buf *))
2649623Skarels #define	dev_type_ioctl(n) \
2749623Skarels 	int n __P((dev_t, int, caddr_t, int, struct proc *))
2849610Sdonn 
2949610Sdonn /* bdevsw-specific types */
3052520Smckusick #define	dev_type_dump(n)	int n __P(())
3149623Skarels #define	dev_type_size(n)	int n __P((dev_t))
3249610Sdonn 
3349623Skarels #define	dev_decl(n,t)	__CONCAT(dev_type_,t)(__CONCAT(n,t))
3449610Sdonn #define	dev_init(c,n,t) \
3549623Skarels 	(c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio)
3649610Sdonn 
3749610Sdonn /* bdevsw-specific initializations */
3849623Skarels #define	dev_size_init(c,n)	(c > 0 ? __CONCAT(n,size) : 0)
3949610Sdonn 
4049623Skarels #define	bdev_decl(n) \
4149623Skarels 	dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \
4249623Skarels 	dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size)
4349610Sdonn 
44*57336Shibler /* disk without close routine */
4549623Skarels #define	bdev_disk_init(c,n) { \
4649623Skarels 	dev_init(c,n,open), (dev_type_close((*))) nullop, \
4749623Skarels 	dev_init(c,n,strategy), dev_init(c,n,ioctl), \
4849623Skarels 	dev_init(c,n,dump), dev_size_init(c,n), 0 }
4949610Sdonn 
50*57336Shibler /* disk with close routine */
51*57336Shibler #define	bdev_ldisk_init(c,n) { \
52*57336Shibler 	dev_init(c,n,open), dev_init(c,n,close), \
53*57336Shibler 	dev_init(c,n,strategy), dev_init(c,n,ioctl), \
54*57336Shibler 	dev_init(c,n,dump), dev_size_init(c,n), 0 }
55*57336Shibler 
5649623Skarels #define	bdev_tape_init(c,n) { \
5749623Skarels 	dev_init(c,n,open), dev_init(c,n,close), \
5849623Skarels 	dev_init(c,n,strategy), dev_init(c,n,ioctl), \
5949623Skarels 	dev_init(c,n,dump), 0, B_TAPE }
6049610Sdonn 
6149623Skarels #define	bdev_swap_init() { \
6249623Skarels 	(dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
6349623Skarels 	swstrategy, (dev_type_ioctl((*))) enodev, \
6449623Skarels 	(dev_type_dump((*))) enodev, 0, 0 }
6549610Sdonn 
6649623Skarels #define	bdev_notdef()	bdev_tape_init(0,no)
6749610Sdonn bdev_decl(no);	/* dummy declarations */
6849610Sdonn 
6941475Smckusick #include "ct.h"
7049912Smckusick #include "st.h"
7141475Smckusick #include "rd.h"
7241475Smckusick #include "sd.h"
7341475Smckusick #include "cd.h"
7449328Shibler #include "vn.h"
7549610Sdonn 
7649610Sdonn bdev_decl(ct);
7749912Smckusick bdev_decl(st);
7849610Sdonn bdev_decl(rd);
7949610Sdonn bdev_decl(sd);
8049610Sdonn bdev_decl(cd);
8149610Sdonn bdev_decl(vn);
8249610Sdonn 
8341475Smckusick struct bdevsw	bdevsw[] =
8441475Smckusick {
8549610Sdonn 	bdev_tape_init(NCT,ct),	/* 0: cs80 cartridge tape */
8649610Sdonn 	bdev_notdef(),		/* 1 */
87*57336Shibler 	bdev_ldisk_init(NRD,rd),/* 2: hpib disk */
8849610Sdonn 	bdev_swap_init(),	/* 3: swap pseudo-device */
89*57336Shibler 	bdev_ldisk_init(NSD,sd),/* 4: scsi disk */
9049610Sdonn 	bdev_disk_init(NCD,cd),	/* 5: concatenated disk driver */
9149610Sdonn 	bdev_disk_init(NVN,vn),	/* 6: vnode disk driver (swap to files) */
9249912Smckusick 	bdev_tape_init(NST,st),	/* 7: exabyte tape */
9341475Smckusick };
9449610Sdonn 
9541475Smckusick int	nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]);
9641475Smckusick 
9749610Sdonn /* cdevsw-specific types */
9849623Skarels #define	dev_type_read(n)	int n __P((dev_t, struct uio *, int))
9949623Skarels #define	dev_type_write(n)	int n __P((dev_t, struct uio *, int))
10049623Skarels #define	dev_type_stop(n)	int n __P((struct tty *, int))
10149623Skarels #define	dev_type_reset(n)	int n __P((int))
10249610Sdonn #define	dev_type_select(n)	int n __P((dev_t, int, struct proc *))
10349610Sdonn #define	dev_type_map(n)	int n __P(())
10441475Smckusick 
10549623Skarels #define	cdev_decl(n) \
10649623Skarels 	dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \
10749623Skarels 	dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \
10849623Skarels 	dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \
10949623Skarels 	dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[]
11041475Smckusick 
11149610Sdonn #define	dev_tty_init(c,n)	(c > 0 ? __CONCAT(n,_tty) : 0)
11241475Smckusick 
11349610Sdonn /* open, read, write, ioctl, strategy */
11449623Skarels #define	cdev_disk_init(c,n) { \
11549623Skarels 	dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
11649623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
11749623Skarels 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
11849623Skarels 	dev_init(c,n,strategy) }
11949610Sdonn 
12049610Sdonn /* open, close, read, write, ioctl, strategy */
121*57336Shibler #define	cdev_ldisk_init(c,n) { \
122*57336Shibler 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
123*57336Shibler 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
124*57336Shibler 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
125*57336Shibler 	dev_init(c,n,strategy) }
126*57336Shibler 
127*57336Shibler /* open, close, read, write, ioctl, strategy */
12849623Skarels #define	cdev_tape_init(c,n) { \
12949623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
13049623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
13149623Skarels 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
13249623Skarels 	dev_init(c,n,strategy) }
13349610Sdonn 
13449610Sdonn /* open, close, read, write, ioctl, stop, tty */
13549623Skarels #define	cdev_tty_init(c,n) { \
13649623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
13749623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \
13849623Skarels 	(dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \
13949623Skarels 	(dev_type_map((*))) enodev, 0 }
14049610Sdonn 
14149623Skarels #define	cdev_notdef() { \
14249623Skarels 	(dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
14349623Skarels 	(dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
14449623Skarels 	(dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
14549623Skarels 	(dev_type_reset((*))) nullop, 0, seltrue, \
14649623Skarels 	(dev_type_map((*))) enodev, 0 }
14749610Sdonn 
14849610Sdonn cdev_decl(no);			/* dummy declarations */
14949610Sdonn 
15049610Sdonn cdev_decl(cn);
15149610Sdonn /* open, close, read, write, ioctl, select -- XXX should be a tty */
15249623Skarels #define	cdev_cn_init(c,n) { \
15349623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
15449623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
15549623Skarels 	(dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \
15649623Skarels 	(dev_type_map((*))) enodev, 0 }
15749610Sdonn 
15849610Sdonn cdev_decl(ctty);
15949610Sdonn /* open, read, write, ioctl, select -- XXX should be a tty */
16049623Skarels #define	cdev_ctty_init(c,n) { \
16149623Skarels 	dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
16249623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
16349623Skarels 	(dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \
16449623Skarels 	(dev_type_map((*))) enodev, 0 }
16549610Sdonn 
16649610Sdonn dev_type_read(mmrw);
16749610Sdonn /* read/write */
16849623Skarels #define	cdev_mm_init(c,n) { \
16949623Skarels 	(dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \
17049623Skarels 	mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \
17149623Skarels 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 }
17249610Sdonn 
17349610Sdonn /* read, write, strategy */
17449623Skarels #define	cdev_swap_init(c,n) { \
17549623Skarels 	(dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \
17649623Skarels 	rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
17749623Skarels 	(dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \
17849623Skarels 	(dev_type_map((*))) enodev, dev_init(c,n,strategy) }
17949610Sdonn 
18041475Smckusick #include "pty.h"
18149610Sdonn #define	pts_tty		pt_tty
18249610Sdonn #define	ptsioctl	ptyioctl
18349610Sdonn cdev_decl(pts);
18449610Sdonn #define	ptc_tty		pt_tty
18549610Sdonn #define	ptcioctl	ptyioctl
18649610Sdonn cdev_decl(ptc);
18741475Smckusick 
18849610Sdonn /* open, close, read, write, ioctl, tty, select */
18949623Skarels #define	cdev_ptc_init(c,n) { \
19049623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
19149623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
19249623Skarels 	(dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \
19349623Skarels 	(dev_type_map((*))) enodev, 0 }
19449610Sdonn 
19549610Sdonn cdev_decl(log);
19649610Sdonn /* open, close, read, ioctl, select -- XXX should be a generic device */
19749623Skarels #define	cdev_log_init(c,n) { \
19849623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
19949623Skarels 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
20049623Skarels 	(dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \
20149623Skarels 	dev_init(c,n,select), (dev_type_map((*))) enodev, 0 }
20249610Sdonn 
20349610Sdonn cdev_decl(ct);
20449912Smckusick cdev_decl(st);
20549610Sdonn cdev_decl(sd);
20649610Sdonn cdev_decl(rd);
20749610Sdonn 
20853933Shibler #include "grf.h"
20949610Sdonn cdev_decl(grf);
21049610Sdonn /* open, close, ioctl, select, map -- XXX should be a map device */
21149623Skarels #define	cdev_grf_init(c,n) { \
21249623Skarels 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \
21349623Skarels 	(dev_type_write((*))) nullop, dev_init(c,n,ioctl), \
21449623Skarels 	(dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \
21549623Skarels 	dev_init(c,n,select), dev_init(c,n,map), 0 }
21649610Sdonn 
21741475Smckusick #include "ppi.h"
21849610Sdonn cdev_decl(ppi);
21949610Sdonn /* open, close, read, write, ioctl -- XXX should be a generic device */
22049623Skarels #define	cdev_ppi_init(c,n) { \
22149623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
22249623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
22349623Skarels 	(dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \
22449623Skarels 	(dev_type_map((*))) enodev, 0 }
22541475Smckusick 
22649610Sdonn #include "dca.h"
22749610Sdonn cdev_decl(dca);
22849610Sdonn 
22941475Smckusick #include "ite.h"
23049610Sdonn cdev_decl(ite);
23149610Sdonn /* open, close, read, write, ioctl, tty -- XXX should be a tty! */
23249623Skarels #define	cdev_ite_init(c,n) { \
23349623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
23449623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
23549623Skarels 	(dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \
23649623Skarels 	(dev_type_map((*))) enodev, 0 }
23741475Smckusick 
23849610Sdonn /* XXX shouldn't this be optional? */
23949610Sdonn cdev_decl(hil);
24049610Sdonn /* open, close, read, ioctl, select, map -- XXX should be a map device */
24149623Skarels #define	cdev_hil_init(c,n) { \
24249623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
24349623Skarels 	(dev_type_write((*))) nullop, dev_init(c,n,ioctl), \
24449623Skarels 	(dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \
24549623Skarels 	dev_init(c,n,select), dev_init(c,n,map), 0 }
24641475Smckusick 
24741475Smckusick #include "dcm.h"
24849610Sdonn cdev_decl(dcm);
24941475Smckusick 
25049610Sdonn cdev_decl(cd);
25149610Sdonn 
25249610Sdonn cdev_decl(vn);
25349610Sdonn /* open, read, write, ioctl -- XXX should be a disk */
25449623Skarels #define	cdev_vn_init(c,n) { \
25549623Skarels 	dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
25649623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
25749623Skarels 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
25849623Skarels 	0 }
25947583Smccanne 
26049610Sdonn dev_type_open(fdopen);
26149610Sdonn /* open */
26249623Skarels #define	cdev_fd_init(c,n) { \
26349623Skarels 	dev_init(c,n,open), (dev_type_close((*))) enodev, \
26449623Skarels 	(dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
26549623Skarels 	(dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
26649623Skarels 	(dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \
26749623Skarels 	(dev_type_map((*))) enodev, 0 }
26841475Smckusick 
26949610Sdonn #include "bpfilter.h"
27049610Sdonn cdev_decl(bpf);
27149610Sdonn /* open, close, read, write, ioctl, select -- XXX should be generic device */
27249623Skarels #define	cdev_bpf_init(c,n) { \
27349623Skarels 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
27449623Skarels 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
27549623Skarels 	(dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \
27649623Skarels 	(dev_type_map((*))) enodev, 0 }
27747581Skarels 
27841475Smckusick struct cdevsw	cdevsw[] =
27941475Smckusick {
28049610Sdonn 	cdev_cn_init(1,cn),		/* 0: virtual console */
28149610Sdonn 	cdev_ctty_init(1,ctty),		/* 1: controlling terminal */
28249610Sdonn 	cdev_mm_init(1,mm),		/* 2: /dev/{null,mem,kmem,...} */
28349610Sdonn 	cdev_swap_init(1,sw),		/* 3: /dev/drum (swap pseudo-device) */
28449610Sdonn 	cdev_tty_init(NPTY,pts),	/* 4: pseudo-tty slave */
28549610Sdonn 	cdev_ptc_init(NPTY,ptc),	/* 5: pseudo-tty master */
28649610Sdonn 	cdev_log_init(1,log),		/* 6: /dev/klog */
28749610Sdonn 	cdev_tape_init(NCT,ct),		/* 7: cs80 cartridge tape */
288*57336Shibler 	cdev_ldisk_init(NSD,sd),	/* 8: scsi disk */
289*57336Shibler 	cdev_ldisk_init(NRD,rd),	/* 9: hpib disk */
29053933Shibler 	cdev_grf_init(NGRF,grf),	/* 10: frame buffer */
29149610Sdonn 	cdev_ppi_init(NPPI,ppi),	/* 11: printer/plotter interface */
29249610Sdonn 	cdev_tty_init(NDCA,dca),	/* 12: built-in single-port serial */
29349610Sdonn 	cdev_ite_init(NITE,ite),	/* 13: console terminal emulator */
29449610Sdonn 	cdev_hil_init(1,hil),		/* 14: human interface loop */
29549610Sdonn 	cdev_tty_init(NDCM,dcm),	/* 15: 4-port serial */
29649610Sdonn 	cdev_notdef(),			/* 16 */
29749610Sdonn 	cdev_disk_init(NCD,cd),		/* 17: concatenated disk */
29854866Smckusick 	cdev_notdef(),			/* 18 */
29949610Sdonn 	cdev_vn_init(NVN,vn),		/* 19: vnode disk */
30049912Smckusick 	cdev_tape_init(NST,st),		/* 20: exabyte tape */
30149610Sdonn 	cdev_fd_init(1,fd),		/* 21: file descriptor pseudo-dev */
30249610Sdonn 	cdev_bpf_init(NBPFILTER,bpf),	/* 22: berkeley packet filter */
30341475Smckusick };
30449610Sdonn 
30541475Smckusick int	nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]);
30641475Smckusick 
30741475Smckusick int	mem_no = 2; 	/* major device number of memory special file */
30841475Smckusick 
30941475Smckusick /*
31041475Smckusick  * Swapdev is a fake device implemented
31141475Smckusick  * in sw.c used only internally to get to swstrategy.
31241475Smckusick  * It cannot be provided to the users, because the
31341475Smckusick  * swstrategy routine munches the b_dev and b_blkno entries
31441475Smckusick  * before calling the appropriate driver.  This would horribly
31541475Smckusick  * confuse, e.g. the hashing routines. Instead, /dev/drum is
31641475Smckusick  * provided as a character (raw) device.
31741475Smckusick  */
31841475Smckusick dev_t	swapdev = makedev(3, 0);
319