| 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_ */ |