xref: /original-bsd/sys/luna68k/luna68k/conf.c (revision 403c148d)
1 /*-
2  * Copyright (c) 1992 OMRON Corporation.
3  * Copyright (c) 1991, 1992 The Regents of the University of California.
4  * All rights reserved.
5  *
6  * %sccs.include.redist.c%
7  *
8  * from: hp300/hp300/conf.c	7.13 (Berkeley) 7/9/92
9  *
10  *	@(#)conf.c	7.2 (Berkeley) 07/23/92
11  */
12 
13 #include "sys/param.h"
14 #include "sys/systm.h"
15 #include "sys/buf.h"
16 #include "sys/ioctl.h"
17 #include "sys/proc.h"
18 #include "sys/tty.h"
19 #include "sys/conf.h"
20 
21 int	rawread		__P((dev_t, struct uio *, int));
22 int	rawwrite	__P((dev_t, struct uio *, int));
23 int	swstrategy	__P((struct buf *));
24 int	ttselect	__P((dev_t, int, struct proc *));
25 
26 #define	dev_type_open(n)	int n __P((dev_t, int, int, struct proc *))
27 #define	dev_type_close(n)	int n __P((dev_t, int, int, struct proc *))
28 #define	dev_type_strategy(n)	int n __P((struct buf *))
29 #define	dev_type_ioctl(n) \
30 	int n __P((dev_t, int, caddr_t, int, struct proc *))
31 
32 /* bdevsw-specific types */
33 #define	dev_type_dump(n)	int n __P(())
34 #define	dev_type_size(n)	int n __P((dev_t))
35 
36 #define	dev_decl(n,t)	__CONCAT(dev_type_,t)(__CONCAT(n,t))
37 #define	dev_init(c,n,t) \
38 	(c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio)
39 
40 /* bdevsw-specific initializations */
41 #define	dev_size_init(c,n)	(c > 0 ? __CONCAT(n,size) : 0)
42 
43 #define	bdev_decl(n) \
44 	dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \
45 	dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size)
46 
47 #define	bdev_disk_init(c,n) { \
48 	dev_init(c,n,open), (dev_type_close((*))) nullop, \
49 	dev_init(c,n,strategy), dev_init(c,n,ioctl), \
50 	dev_init(c,n,dump), dev_size_init(c,n), 0 }
51 
52 #define	bdev_tape_init(c,n) { \
53 	dev_init(c,n,open), dev_init(c,n,close), \
54 	dev_init(c,n,strategy), dev_init(c,n,ioctl), \
55 	dev_init(c,n,dump), 0, B_TAPE }
56 
57 #define	bdev_swap_init() { \
58 	(dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
59 	swstrategy, (dev_type_ioctl((*))) enodev, \
60 	(dev_type_dump((*))) enodev, 0, 0 }
61 
62 #define	bdev_notdef()	bdev_tape_init(0,no)
63 bdev_decl(no);	/* dummy declarations */
64 
65 #include "st.h"
66 #include "sd.h"
67 #include "vn.h"
68 
69 bdev_decl(st);
70 bdev_decl(sd);
71 bdev_decl(vn);
72 
73 struct bdevsw	bdevsw[] =
74 {
75 	bdev_notdef(),		/* 0 */
76 	bdev_notdef(),		/* 1 */
77 	bdev_notdef(),		/* 2: ram disk */
78 	bdev_swap_init(),	/* 3: swap pseudo-device */
79 	bdev_disk_init(NSD,sd),	/* 4: scsi disk */
80 	bdev_notdef(),		/* 5 */
81 	bdev_disk_init(NVN,vn),	/* 6: vnode disk driver (swap to files) */
82 	bdev_tape_init(NST,st),	/* 7: scsi tape */
83 };
84 
85 int	nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]);
86 
87 /* cdevsw-specific types */
88 #define	dev_type_read(n)	int n __P((dev_t, struct uio *, int))
89 #define	dev_type_write(n)	int n __P((dev_t, struct uio *, int))
90 #define	dev_type_stop(n)	int n __P((struct tty *, int))
91 #define	dev_type_reset(n)	int n __P((int))
92 #define	dev_type_select(n)	int n __P((dev_t, int, struct proc *))
93 #define	dev_type_map(n)	int n __P(())
94 
95 #define	cdev_decl(n) \
96 	dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \
97 	dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \
98 	dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \
99 	dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[]
100 
101 #define	dev_tty_init(c,n)	(c > 0 ? __CONCAT(n,_tty) : 0)
102 
103 /* open, read, write, ioctl, strategy */
104 #define	cdev_disk_init(c,n) { \
105 	dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
106 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
107 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
108 	dev_init(c,n,strategy) }
109 
110 /* open, close, read, write, ioctl, strategy */
111 #define	cdev_tape_init(c,n) { \
112 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
113 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
114 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
115 	dev_init(c,n,strategy) }
116 
117 /* open, close, read, write, ioctl, stop, tty */
118 #define	cdev_tty_init(c,n) { \
119 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
120 	dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \
121 	(dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \
122 	(dev_type_map((*))) enodev, 0 }
123 
124 #define	cdev_notdef() { \
125 	(dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
126 	(dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
127 	(dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
128 	(dev_type_reset((*))) nullop, 0, seltrue, \
129 	(dev_type_map((*))) enodev, 0 }
130 
131 cdev_decl(no);			/* dummy declarations */
132 
133 cdev_decl(cn);
134 /* open, close, read, write, ioctl, select -- XXX should be a tty */
135 #define	cdev_cn_init(c,n) { \
136 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
137 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
138 	(dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \
139 	(dev_type_map((*))) enodev, 0 }
140 
141 cdev_decl(ctty);
142 /* open, read, write, ioctl, select -- XXX should be a tty */
143 #define	cdev_ctty_init(c,n) { \
144 	dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
145 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
146 	(dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \
147 	(dev_type_map((*))) enodev, 0 }
148 
149 dev_type_read(mmrw);
150 /* read/write */
151 #define	cdev_mm_init(c,n) { \
152 	(dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \
153 	mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \
154 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 }
155 
156 /* read, write, strategy */
157 #define	cdev_swap_init(c,n) { \
158 	(dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \
159 	rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
160 	(dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \
161 	(dev_type_map((*))) enodev, dev_init(c,n,strategy) }
162 
163 #include "pty.h"
164 #define	pts_tty		pt_tty
165 #define	ptsioctl	ptyioctl
166 cdev_decl(pts);
167 #define	ptc_tty		pt_tty
168 #define	ptcioctl	ptyioctl
169 cdev_decl(ptc);
170 
171 /* open, close, read, write, ioctl, tty, select */
172 #define	cdev_ptc_init(c,n) { \
173 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
174 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
175 	(dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \
176 	(dev_type_map((*))) enodev, 0 }
177 
178 cdev_decl(log);
179 /* open, close, read, ioctl, select -- XXX should be a generic device */
180 #define	cdev_log_init(c,n) { \
181 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
182 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
183 	(dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \
184 	dev_init(c,n,select), (dev_type_map((*))) enodev, 0 }
185 
186 cdev_decl(st);
187 cdev_decl(sd);
188 
189 #include "sio.h"
190 cdev_decl(sio);
191 
192 cdev_decl(cd);
193 
194 cdev_decl(vn);
195 /* open, read, write, ioctl -- XXX should be a disk */
196 #define	cdev_vn_init(c,n) { \
197 	dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
198 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
199 	(dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
200 	0 }
201 
202 dev_type_open(fdopen);
203 /* open */
204 #define	cdev_fd_init(c,n) { \
205 	dev_init(c,n,open), (dev_type_close((*))) enodev, \
206 	(dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
207 	(dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
208 	(dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \
209 	(dev_type_map((*))) enodev, 0 }
210 
211 #include "bpfilter.h"
212 cdev_decl(bpf);
213 /* open, close, read, write, ioctl, select -- XXX should be generic device */
214 #define	cdev_bpf_init(c,n) { \
215 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
216 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
217 	(dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \
218 	(dev_type_map((*))) enodev, 0 }
219 
220 struct cdevsw	cdevsw[] =
221 {
222 	cdev_cn_init(1,cn),		/* 0: virtual console */
223 	cdev_ctty_init(1,ctty),		/* 1: controlling terminal */
224 	cdev_mm_init(1,mm),		/* 2: /dev/{null,mem,kmem,...} */
225 	cdev_swap_init(1,sw),		/* 3: /dev/drum (swap pseudo-device) */
226 	cdev_tty_init(NPTY,pts),	/* 4: pseudo-tty slave */
227 	cdev_ptc_init(NPTY,ptc),	/* 5: pseudo-tty master */
228 	cdev_log_init(1,log),		/* 6: /dev/klog */
229 	cdev_notdef(),			/* 7 */
230 	cdev_disk_init(NSD,sd),		/* 8: scsi disk */
231 	cdev_notdef(),			/* 9: ram disk */
232 	cdev_notdef(),			/* 10 */
233 	cdev_notdef(),			/* 11 */
234 	cdev_tty_init(NSIO,sio),	/* 12: built-in single-port serial */
235 	cdev_notdef(),			/* 13 */
236 	cdev_notdef(),			/* 14 */
237 	cdev_notdef(),			/* 15 */
238 	cdev_notdef(),			/* 16 */
239 	cdev_notdef(),			/* 17 */
240 	cdev_notdef(),			/* 18 */
241 	cdev_vn_init(NVN,vn),		/* 19: vnode disk */
242 	cdev_tape_init(NST,st),		/* 20: scsi tape */
243 	cdev_fd_init(1,fd),		/* 21: file descriptor pseudo-dev */
244 	cdev_bpf_init(NBPFILTER,bpf),	/* 22: berkeley packet filter */
245 };
246 
247 int	nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]);
248 
249 int	mem_no = 2; 	/* major device number of memory special file */
250 
251 /*
252  * Swapdev is a fake device implemented
253  * in sw.c used only internally to get to swstrategy.
254  * It cannot be provided to the users, because the
255  * swstrategy routine munches the b_dev and b_blkno entries
256  * before calling the appropriate driver.  This would horribly
257  * confuse, e.g. the hashing routines. Instead, /dev/drum is
258  * provided as a character (raw) device.
259  */
260 dev_t	swapdev = makedev(3, 0);
261