1 /*        $NetBSD: conf.h,v 1.162 2024/04/17 18:01:29 riastradh Exp $ */
2 
3 /*-
4  * Copyright (c) 1990, 1993
5  *        The Regents of the University of California.  All rights reserved.
6  * (c) UNIX System Laboratories, Inc.
7  * All or some portions of this file are derived from material licensed
8  * to the University of California by American Telephone and Telegraph
9  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
10  * the permission of UNIX System Laboratories, Inc.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  *        @(#)conf.h          8.5 (Berkeley) 1/9/95
37  */
38 
39 #ifndef _SYS_CONF_H_
40 #define _SYS_CONF_H_
41 
42 /*
43  * Definitions of device driver entry switches
44  */
45 
46 #include <sys/device_if.h>
47 #include <sys/queue.h>
48 #include <sys/types.h>
49 
50 struct buf;
51 struct knote;
52 struct lwp;
53 struct tty;
54 struct uio;
55 struct vnode;
56 
57 /*
58  * Types for d_flag
59  */
60 #define D_OTHER               0x0000
61 #define   D_TAPE              0x0001
62 #define   D_DISK              0x0002
63 #define   D_TTY               0x0003
64 #define   D_TYPEMASK          0x00ff
65 #define   D_MPSAFE  0x0100
66 #define   D_NEGOFFSAFE        0x0200
67 #define   D_UNUSED0 0x0400    /* was D_MCLOSE */
68 
69 /*
70  * Block device switch table
71  */
72 struct bdevsw {
73           int                 (*d_open)(dev_t, int, int, struct lwp *);
74           int                 (*d_cancel)(dev_t, int, int, struct lwp *);
75           int                 (*d_close)(dev_t, int, int, struct lwp *);
76           void                (*d_strategy)(struct buf *);
77           int                 (*d_ioctl)(dev_t, u_long, void *, int, struct lwp *);
78           int                 (*d_dump)(dev_t, daddr_t, void *, size_t);
79           int                 (*d_psize)(dev_t);
80           int                 (*d_discard)(dev_t, off_t, off_t);
81           int                 (*d_devtounit)(dev_t);
82           struct cfdriver     *d_cfdriver;
83           int                 d_flag;
84 };
85 
86 /*
87  * Character device switch table
88  */
89 struct cdevsw {
90           int                 (*d_open)(dev_t, int, int, struct lwp *);
91           int                 (*d_cancel)(dev_t, int, int, struct lwp *);
92           int                 (*d_close)(dev_t, int, int, struct lwp *);
93           int                 (*d_read)(dev_t, struct uio *, int);
94           int                 (*d_write)(dev_t, struct uio *, int);
95           int                 (*d_ioctl)(dev_t, u_long, void *, int, struct lwp *);
96           void                (*d_stop)(struct tty *, int);
97           struct tty *        (*d_tty)(dev_t);
98           int                 (*d_poll)(dev_t, int, struct lwp *);
99           paddr_t             (*d_mmap)(dev_t, off_t, int);
100           int                 (*d_kqfilter)(dev_t, struct knote *);
101           int                 (*d_discard)(dev_t, off_t, off_t);
102           int                 (*d_devtounit)(dev_t);
103           struct cfdriver     *d_cfdriver;
104           int                 d_flag;
105 };
106 
107 #ifdef _KERNEL
108 
109 #include <sys/mutex.h>
110 extern kmutex_t device_lock;
111 
112 int devsw_attach(const char *, const struct bdevsw *, devmajor_t *,
113     const struct cdevsw *, devmajor_t *);
114 void devsw_detach(const struct bdevsw *, const struct cdevsw *);
115 const struct bdevsw *bdevsw_lookup(dev_t);
116 const struct cdevsw *cdevsw_lookup(dev_t);
117 devmajor_t bdevsw_lookup_major(const struct bdevsw *);
118 devmajor_t cdevsw_lookup_major(const struct cdevsw *);
119 
120 typedef int dev_open_t(dev_t, int, int, struct lwp *);
121 typedef int dev_cancel_t(dev_t, int, int, struct lwp *);
122 typedef int dev_close_t(dev_t, int, int, struct lwp *);
123 typedef int dev_read_t(dev_t, struct uio *, int);
124 typedef int dev_write_t(dev_t, struct uio *, int);
125 typedef int dev_ioctl_t(dev_t, u_long, void *, int, struct lwp *);
126 typedef void dev_stop_t(struct tty *, int);
127 typedef struct tty *dev_tty_t(dev_t);
128 typedef int dev_poll_t(dev_t, int, struct lwp *);
129 typedef paddr_t dev_mmap_t(dev_t, off_t, int);
130 typedef void dev_strategy_t(struct buf *);
131 typedef int dev_dump_t(dev_t, daddr_t, void *, size_t);
132 typedef int dev_size_t(dev_t);
133 typedef int dev_kqfilter_t(dev_t, struct knote *);
134 typedef int dev_discard_t(dev_t, off_t, off_t);
135 
136 #define   dev_type_open(n)    dev_open_t n
137 #define   dev_type_cancel(n)  dev_cancel_t n
138 #define   dev_type_close(n)   dev_close_t n
139 #define   dev_type_read(n)    dev_read_t n
140 #define   dev_type_write(n)   dev_write_t n
141 #define   dev_type_ioctl(n)   dev_ioctl_t n
142 #define   dev_type_stop(n)    dev_stop_t n
143 #define   dev_type_tty(n)               dev_tty_t n
144 #define   dev_type_poll(n)    dev_poll_t n
145 #define   dev_type_mmap(n)    dev_mmap_t n
146 #define   dev_type_strategy(n)          dev_strategy_t n
147 #define   dev_type_dump(n)    dev_dump_t n
148 #define   dev_type_size(n)    dev_size_t n
149 #define   dev_type_kqfilter(n)          dev_kqfilter_t n
150 #define dev_type_discard(n)   dev_discard_t n
151 
152 int devenodev(dev_t, ...);
153 int deveopnotsupp(dev_t, ...);
154 int devnullop(dev_t, ...);
155 int ttyenodev(struct tty *, ...);
156 void ttyvenodev(struct tty *, ...);
157 void ttyvnullop(struct tty *, ...);
158 
159 #define   noopen              ((dev_open_t *)devenodev)
160 #define   noclose             ((dev_close_t *)devenodev)
161 #define   noread              ((dev_read_t *)devenodev)
162 #define   nowrite             ((dev_write_t *)devenodev)
163 #define   noioctl             ((dev_ioctl_t *)devenodev)
164 #define   nostop              ((dev_stop_t *)ttyvenodev)
165 #define   notty               NULL
166 #define   nopoll              seltrue
167 paddr_t   nommap(dev_t, off_t, int);
168 #define   nodump              ((dev_dump_t *)devenodev)
169 #define   nosize              NULL
170 #define   nokqfilter          seltrue_kqfilter
171 #define   nodiscard ((dev_discard_t *)devenodev)
172 
173 #define   nullopen  ((dev_open_t *)devnullop)
174 #define   nullclose ((dev_close_t *)devnullop)
175 #define   nullread  ((dev_read_t *)devnullop)
176 #define   nullwrite ((dev_write_t *)devnullop)
177 #define   nullioctl ((dev_ioctl_t *)devnullop)
178 #define   nullstop  ((dev_stop_t *)ttyvnullop)
179 #define   nullpoll  ((dev_poll_t *)devnullop)
180 #define   nulldump  ((dev_dump_t *)devnullop)
181 #define   nullkqfilter        ((dev_kqfilter_t *)deveopnotsupp)
182 #define   nulldiscard         ((dev_discard_t *)devnullop)
183 
184 /* device access wrappers. */
185 
186 dev_type_open(bdev_open);
187 dev_type_cancel(bdev_cancel);
188 dev_type_close(bdev_close);
189 dev_type_strategy(bdev_strategy);
190 dev_type_ioctl(bdev_ioctl);
191 dev_type_dump(bdev_dump);
192 dev_type_size(bdev_size);
193 dev_type_discard(bdev_discard);
194 
195 void      bdev_detached(dev_t);
196 
197 dev_type_open(cdev_open);
198 dev_type_cancel(cdev_cancel);
199 dev_type_close(cdev_close);
200 dev_type_read(cdev_read);
201 dev_type_write(cdev_write);
202 dev_type_ioctl(cdev_ioctl);
203 dev_type_stop(cdev_stop);
204 dev_type_tty(cdev_tty);
205 dev_type_poll(cdev_poll);
206 dev_type_mmap(cdev_mmap);
207 dev_type_kqfilter(cdev_kqfilter);
208 dev_type_discard(cdev_discard);
209 
210 void      cdev_detached(dev_t);
211 
212 int       cdev_type(dev_t);
213 int       cdev_flags(dev_t);
214 int       bdev_type(dev_t);
215 int       bdev_flags(dev_t);
216 
217 /* symbolic sleep message strings */
218 extern    const char devopn[], devio[], devwait[], devin[], devout[];
219 extern    const char devioc[], devcls[];
220 
221 #endif /* _KERNEL */
222 
223 /*
224  * Line discipline switch table
225  */
226 struct linesw {
227           const char *l_name; /* Linesw name */
228 
229           LIST_ENTRY(linesw) l_list;
230           u_int     l_refcnt; /* locked by ttyldisc_list_slock */
231           int       l_no;               /* legacy discipline number (for TIOCGETD) */
232 
233           int       (*l_open) (dev_t, struct tty *);
234           int       (*l_close)          (struct tty *, int);
235           int       (*l_read) (struct tty *, struct uio *, int);
236           int       (*l_write)          (struct tty *, struct uio *, int);
237           int       (*l_ioctl)          (struct tty *, u_long, void *, int,
238                                             struct lwp *);
239           int       (*l_rint) (int, struct tty *);
240           int       (*l_start)          (struct tty *);
241           int       (*l_modem)          (struct tty *, int);
242           int       (*l_poll) (struct tty *, int, struct lwp *);
243 };
244 
245 #ifdef _KERNEL
246 void             ttyldisc_init(void);
247 int              ttyldisc_attach(struct linesw *);
248 int              ttyldisc_detach(struct linesw *);
249 struct linesw *ttyldisc_lookup(const char *);
250 struct linesw *ttyldisc_lookup_bynum(int);
251 struct linesw *ttyldisc_default(void);
252 void             ttyldisc_release(struct linesw *);
253 
254 /* For those defining their own line disciplines: */
255 #define   ttynodisc ((int (*)(dev_t, struct tty *))devenodev)
256 #define   ttyerrclose ((int (*)(struct tty *, int))ttyenodev)
257 #define   ttyerrio ((int (*)(struct tty *, struct uio *, int))ttyenodev)
258 #define   ttyerrstart ((int (*)(struct tty *))ttyenodev)
259 
260 int       ttyerrpoll (struct tty *, int, struct lwp *);
261 int       ttynullioctl(struct tty *, u_long, void *, int, struct lwp *);
262 
263 int       iskmemdev(dev_t);
264 int       seltrue_kqfilter(dev_t, struct knote *);
265 #endif
266 
267 #ifdef _KERNEL
268 
269 #define   DEV_MEM             0         /* minor device 0 is physical memory */
270 #define   DEV_KMEM  1         /* minor device 1 is kernel memory */
271 #define   DEV_NULL  2         /* minor device 2 is EOF/rathole */
272 #ifdef COMPAT_16
273 #define   _DEV_ZERO_oARM      3         /* reserved: old ARM /dev/zero minor */
274 #endif
275 #define DEV_FULL    11        /* minor device 11 is '\0'/ENOSPC */
276 #define   DEV_ZERO  12        /* minor device 12 is '\0'/rathole */
277 
278 enum devnode_class {
279           DEVNODE_DONTBOTHER,
280           DEVNODE_SINGLE,
281           DEVNODE_VECTOR,
282 };
283 #define DEVNODE_FLAG_LINKZERO 0x01      /* create name -> name0 link */
284 #define DEVNODE_FLAG_ISMINOR0 0x02      /* vector[0] specifies minor */
285 #ifdef notyet
286 #define DEVNODE_FLAG_ISMINOR1 0x04      /* vector[1] specifies starting minor */
287 #endif
288 
289 struct devsw_conv {
290           const char *d_name;
291           devmajor_t d_bmajor;
292           devmajor_t d_cmajor;
293 
294           /* information about /dev nodes related to the device */
295           enum devnode_class d_class;
296           int d_flags;
297           int d_vectdim[2];
298 };
299 
300 void devsw_init(void);
301 const char *devsw_blk2name(devmajor_t);
302 const char *cdevsw_getname(devmajor_t);
303 const char *bdevsw_getname(devmajor_t);
304 devmajor_t devsw_name2blk(const char *, char *, size_t);
305 devmajor_t devsw_name2chr(const char *, char *, size_t);
306 dev_t devsw_chr2blk(dev_t);
307 dev_t devsw_blk2chr(dev_t);
308 int dev_minor_unit(dev_t);
309 
310 void mm_init(void);
311 #endif /* _KERNEL */
312 
313 #ifdef _KERNEL
314 void      setroot(device_t, int);
315 void      rootconf(void);
316 void      swapconf(void);
317 #endif /* _KERNEL */
318 
319 #endif /* !_SYS_CONF_H_ */
320