xref: /freebsd-13.1/sys/kern/subr_bus.c (revision 034c2781)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 1997,1998,2003 Doug Rabson
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  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 
32 #include "opt_bus.h"
33 #include "opt_ddb.h"
34 
35 #include <sys/param.h>
36 #include <sys/conf.h>
37 #include <sys/domainset.h>
38 #include <sys/eventhandler.h>
39 #include <sys/filio.h>
40 #include <sys/lock.h>
41 #include <sys/kernel.h>
42 #include <sys/kobj.h>
43 #include <sys/limits.h>
44 #include <sys/malloc.h>
45 #include <sys/module.h>
46 #include <sys/mutex.h>
47 #include <sys/poll.h>
48 #include <sys/priv.h>
49 #include <sys/proc.h>
50 #include <sys/condvar.h>
51 #include <sys/queue.h>
52 #include <machine/bus.h>
53 #include <sys/random.h>
54 #include <sys/rman.h>
55 #include <sys/sbuf.h>
56 #include <sys/selinfo.h>
57 #include <sys/signalvar.h>
58 #include <sys/smp.h>
59 #include <sys/sysctl.h>
60 #include <sys/systm.h>
61 #include <sys/uio.h>
62 #include <sys/bus.h>
63 #include <sys/cpuset.h>
64 
65 #include <net/vnet.h>
66 
67 #include <machine/cpu.h>
68 #include <machine/stdarg.h>
69 
70 #include <vm/uma.h>
71 #include <vm/vm.h>
72 
73 #include <ddb/ddb.h>
74 
75 SYSCTL_NODE(_hw, OID_AUTO, bus, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL,
76     NULL);
77 SYSCTL_ROOT_NODE(OID_AUTO, dev, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL,
78     NULL);
79 
80 /*
81  * Used to attach drivers to devclasses.
82  */
83 typedef struct driverlink *driverlink_t;
84 struct driverlink {
85 	kobj_class_t	driver;
86 	TAILQ_ENTRY(driverlink) link;	/* list of drivers in devclass */
87 	int		pass;
88 	int		flags;
89 #define DL_DEFERRED_PROBE	1	/* Probe deferred on this */
90 	TAILQ_ENTRY(driverlink) passlink;
91 };
92 
93 /*
94  * Forward declarations
95  */
96 typedef TAILQ_HEAD(devclass_list, devclass) devclass_list_t;
97 typedef TAILQ_HEAD(driver_list, driverlink) driver_list_t;
98 typedef TAILQ_HEAD(device_list, _device) device_list_t;
99 
100 struct devclass {
101 	TAILQ_ENTRY(devclass) link;
102 	devclass_t	parent;		/* parent in devclass hierarchy */
103 	driver_list_t	drivers;     /* bus devclasses store drivers for bus */
104 	char		*name;
105 	device_t	*devices;	/* array of devices indexed by unit */
106 	int		maxunit;	/* size of devices array */
107 	int		flags;
108 #define DC_HAS_CHILDREN		1
109 
110 	struct sysctl_ctx_list sysctl_ctx;
111 	struct sysctl_oid *sysctl_tree;
112 };
113 
114 /**
115  * @brief Implementation of _device.
116  *
117  * The structure is named "_device" instead of "device" to avoid type confusion
118  * caused by other subsystems defining a (struct device).
119  */
120 struct _device {
121 	/*
122 	 * A device is a kernel object. The first field must be the
123 	 * current ops table for the object.
124 	 */
125 	KOBJ_FIELDS;
126 
127 	/*
128 	 * Device hierarchy.
129 	 */
130 	TAILQ_ENTRY(_device)	link;	/**< list of devices in parent */
131 	TAILQ_ENTRY(_device)	devlink; /**< global device list membership */
132 	device_t	parent;		/**< parent of this device  */
133 	device_list_t	children;	/**< list of child devices */
134 
135 	/*
136 	 * Details of this device.
137 	 */
138 	driver_t	*driver;	/**< current driver */
139 	devclass_t	devclass;	/**< current device class */
140 	int		unit;		/**< current unit number */
141 	char*		nameunit;	/**< name+unit e.g. foodev0 */
142 	char*		desc;		/**< driver specific description */
143 	int		busy;		/**< count of calls to device_busy() */
144 	device_state_t	state;		/**< current device state  */
145 	uint32_t	devflags;	/**< api level flags for device_get_flags() */
146 	u_int		flags;		/**< internal device flags  */
147 	u_int	order;			/**< order from device_add_child_ordered() */
148 	void	*ivars;			/**< instance variables  */
149 	void	*softc;			/**< current driver's variables  */
150 
151 	struct sysctl_ctx_list sysctl_ctx; /**< state for sysctl variables  */
152 	struct sysctl_oid *sysctl_tree;	/**< state for sysctl variables */
153 };
154 
155 static MALLOC_DEFINE(M_BUS, "bus", "Bus data structures");
156 static MALLOC_DEFINE(M_BUS_SC, "bus-sc", "Bus data structures, softc");
157 
158 EVENTHANDLER_LIST_DEFINE(device_attach);
159 EVENTHANDLER_LIST_DEFINE(device_detach);
160 EVENTHANDLER_LIST_DEFINE(dev_lookup);
161 
162 static int bus_child_location_sb(device_t child, struct sbuf *sb);
163 static int bus_child_pnpinfo_sb(device_t child, struct sbuf *sb);
164 static void devctl2_init(void);
165 static bool device_frozen;
166 
167 #define DRIVERNAME(d)	((d)? d->name : "no driver")
168 #define DEVCLANAME(d)	((d)? d->name : "no devclass")
169 
170 #ifdef BUS_DEBUG
171 
172 static int bus_debug = 1;
173 SYSCTL_INT(_debug, OID_AUTO, bus_debug, CTLFLAG_RWTUN, &bus_debug, 0,
174     "Bus debug level");
175 #define PDEBUG(a)	if (bus_debug) {printf("%s:%d: ", __func__, __LINE__), printf a; printf("\n");}
176 #define DEVICENAME(d)	((d)? device_get_name(d): "no device")
177 
178 /**
179  * Produce the indenting, indent*2 spaces plus a '.' ahead of that to
180  * prevent syslog from deleting initial spaces
181  */
182 #define indentprintf(p)	do { int iJ; printf("."); for (iJ=0; iJ<indent; iJ++) printf("  "); printf p ; } while (0)
183 
184 static void print_device_short(device_t dev, int indent);
185 static void print_device(device_t dev, int indent);
186 void print_device_tree_short(device_t dev, int indent);
187 void print_device_tree(device_t dev, int indent);
188 static void print_driver_short(driver_t *driver, int indent);
189 static void print_driver(driver_t *driver, int indent);
190 static void print_driver_list(driver_list_t drivers, int indent);
191 static void print_devclass_short(devclass_t dc, int indent);
192 static void print_devclass(devclass_t dc, int indent);
193 void print_devclass_list_short(void);
194 void print_devclass_list(void);
195 
196 #else
197 /* Make the compiler ignore the function calls */
198 #define PDEBUG(a)			/* nop */
199 #define DEVICENAME(d)			/* nop */
200 
201 #define print_device_short(d,i)		/* nop */
202 #define print_device(d,i)		/* nop */
203 #define print_device_tree_short(d,i)	/* nop */
204 #define print_device_tree(d,i)		/* nop */
205 #define print_driver_short(d,i)		/* nop */
206 #define print_driver(d,i)		/* nop */
207 #define print_driver_list(d,i)		/* nop */
208 #define print_devclass_short(d,i)	/* nop */
209 #define print_devclass(d,i)		/* nop */
210 #define print_devclass_list_short()	/* nop */
211 #define print_devclass_list()		/* nop */
212 #endif
213 
214 /*
215  * dev sysctl tree
216  */
217 
218 enum {
219 	DEVCLASS_SYSCTL_PARENT,
220 };
221 
222 static int
devclass_sysctl_handler(SYSCTL_HANDLER_ARGS)223 devclass_sysctl_handler(SYSCTL_HANDLER_ARGS)
224 {
225 	devclass_t dc = (devclass_t)arg1;
226 	const char *value;
227 
228 	switch (arg2) {
229 	case DEVCLASS_SYSCTL_PARENT:
230 		value = dc->parent ? dc->parent->name : "";
231 		break;
232 	default:
233 		return (EINVAL);
234 	}
235 	return (SYSCTL_OUT_STR(req, value));
236 }
237 
238 static void
devclass_sysctl_init(devclass_t dc)239 devclass_sysctl_init(devclass_t dc)
240 {
241 	if (dc->sysctl_tree != NULL)
242 		return;
243 	sysctl_ctx_init(&dc->sysctl_ctx);
244 	dc->sysctl_tree = SYSCTL_ADD_NODE(&dc->sysctl_ctx,
245 	    SYSCTL_STATIC_CHILDREN(_dev), OID_AUTO, dc->name,
246 	    CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
247 	SYSCTL_ADD_PROC(&dc->sysctl_ctx, SYSCTL_CHILDREN(dc->sysctl_tree),
248 	    OID_AUTO, "%parent",
249 	    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
250 	    dc, DEVCLASS_SYSCTL_PARENT, devclass_sysctl_handler, "A",
251 	    "parent class");
252 }
253 
254 enum {
255 	DEVICE_SYSCTL_DESC,
256 	DEVICE_SYSCTL_DRIVER,
257 	DEVICE_SYSCTL_LOCATION,
258 	DEVICE_SYSCTL_PNPINFO,
259 	DEVICE_SYSCTL_PARENT,
260 };
261 
262 static int
device_sysctl_handler(SYSCTL_HANDLER_ARGS)263 device_sysctl_handler(SYSCTL_HANDLER_ARGS)
264 {
265 	struct sbuf sb;
266 	device_t dev = (device_t)arg1;
267 	int error;
268 
269 	sbuf_new_for_sysctl(&sb, NULL, 1024, req);
270 	sbuf_clear_flags(&sb, SBUF_INCLUDENUL);
271 	switch (arg2) {
272 	case DEVICE_SYSCTL_DESC:
273 		sbuf_cat(&sb, dev->desc ? dev->desc : "");
274 		break;
275 	case DEVICE_SYSCTL_DRIVER:
276 		sbuf_cat(&sb, dev->driver ? dev->driver->name : "");
277 		break;
278 	case DEVICE_SYSCTL_LOCATION:
279 		bus_child_location_sb(dev, &sb);
280 		break;
281 	case DEVICE_SYSCTL_PNPINFO:
282 		bus_child_pnpinfo_sb(dev, &sb);
283 		break;
284 	case DEVICE_SYSCTL_PARENT:
285 		sbuf_cat(&sb, dev->parent ? dev->parent->nameunit : "");
286 		break;
287 	default:
288 		sbuf_delete(&sb);
289 		return (EINVAL);
290 	}
291 	error = sbuf_finish(&sb);
292 	sbuf_delete(&sb);
293 	return (error);
294 }
295 
296 static void
device_sysctl_init(device_t dev)297 device_sysctl_init(device_t dev)
298 {
299 	devclass_t dc = dev->devclass;
300 	int domain;
301 
302 	if (dev->sysctl_tree != NULL)
303 		return;
304 	devclass_sysctl_init(dc);
305 	sysctl_ctx_init(&dev->sysctl_ctx);
306 	dev->sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&dev->sysctl_ctx,
307 	    SYSCTL_CHILDREN(dc->sysctl_tree), OID_AUTO,
308 	    dev->nameunit + strlen(dc->name),
309 	    CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "", "device_index");
310 	SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
311 	    OID_AUTO, "%desc", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT,
312 	    dev, DEVICE_SYSCTL_DESC, device_sysctl_handler, "A",
313 	    "device description");
314 	SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
315 	    OID_AUTO, "%driver",
316 	    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT,
317 	    dev, DEVICE_SYSCTL_DRIVER, device_sysctl_handler, "A",
318 	    "device driver name");
319 	SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
320 	    OID_AUTO, "%location",
321 	    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT,
322 	    dev, DEVICE_SYSCTL_LOCATION, device_sysctl_handler, "A",
323 	    "device location relative to parent");
324 	SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
325 	    OID_AUTO, "%pnpinfo",
326 	    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT,
327 	    dev, DEVICE_SYSCTL_PNPINFO, device_sysctl_handler, "A",
328 	    "device identification");
329 	SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
330 	    OID_AUTO, "%parent",
331 	    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT,
332 	    dev, DEVICE_SYSCTL_PARENT, device_sysctl_handler, "A",
333 	    "parent device");
334 	if (bus_get_domain(dev, &domain) == 0)
335 		SYSCTL_ADD_INT(&dev->sysctl_ctx,
336 		    SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%domain",
337 		    CTLFLAG_RD, NULL, domain, "NUMA domain");
338 }
339 
340 static void
device_sysctl_update(device_t dev)341 device_sysctl_update(device_t dev)
342 {
343 	devclass_t dc = dev->devclass;
344 
345 	if (dev->sysctl_tree == NULL)
346 		return;
347 	sysctl_rename_oid(dev->sysctl_tree, dev->nameunit + strlen(dc->name));
348 }
349 
350 static void
device_sysctl_fini(device_t dev)351 device_sysctl_fini(device_t dev)
352 {
353 	if (dev->sysctl_tree == NULL)
354 		return;
355 	sysctl_ctx_free(&dev->sysctl_ctx);
356 	dev->sysctl_tree = NULL;
357 }
358 
359 /*
360  * /dev/devctl implementation
361  */
362 
363 /*
364  * This design allows only one reader for /dev/devctl.  This is not desirable
365  * in the long run, but will get a lot of hair out of this implementation.
366  * Maybe we should make this device a clonable device.
367  *
368  * Also note: we specifically do not attach a device to the device_t tree
369  * to avoid potential chicken and egg problems.  One could argue that all
370  * of this belongs to the root node.
371  */
372 
373 #define DEVCTL_DEFAULT_QUEUE_LEN 1000
374 static int sysctl_devctl_queue(SYSCTL_HANDLER_ARGS);
375 static int devctl_queue_length = DEVCTL_DEFAULT_QUEUE_LEN;
376 SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_queue, CTLTYPE_INT | CTLFLAG_RWTUN |
377     CTLFLAG_MPSAFE, NULL, 0, sysctl_devctl_queue, "I", "devctl queue length");
378 
379 static d_open_t		devopen;
380 static d_close_t	devclose;
381 static d_read_t		devread;
382 static d_ioctl_t	devioctl;
383 static d_poll_t		devpoll;
384 static d_kqfilter_t	devkqfilter;
385 
386 static struct cdevsw dev_cdevsw = {
387 	.d_version =	D_VERSION,
388 	.d_open =	devopen,
389 	.d_close =	devclose,
390 	.d_read =	devread,
391 	.d_ioctl =	devioctl,
392 	.d_poll =	devpoll,
393 	.d_kqfilter =	devkqfilter,
394 	.d_name =	"devctl",
395 };
396 
397 #define DEVCTL_BUFFER (1024 - sizeof(void *))
398 struct dev_event_info {
399 	STAILQ_ENTRY(dev_event_info) dei_link;
400 	char dei_data[DEVCTL_BUFFER];
401 };
402 
403 STAILQ_HEAD(devq, dev_event_info);
404 
405 static struct dev_softc {
406 	int		inuse;
407 	int		nonblock;
408 	int		queued;
409 	int		async;
410 	struct mtx	mtx;
411 	struct cv	cv;
412 	struct selinfo	sel;
413 	struct devq	devq;
414 	struct sigio	*sigio;
415 	uma_zone_t	zone;
416 } devsoftc;
417 
418 static void	filt_devctl_detach(struct knote *kn);
419 static int	filt_devctl_read(struct knote *kn, long hint);
420 
421 struct filterops devctl_rfiltops = {
422 	.f_isfd = 1,
423 	.f_detach = filt_devctl_detach,
424 	.f_event = filt_devctl_read,
425 };
426 
427 static struct cdev *devctl_dev;
428 
429 static void
devinit(void)430 devinit(void)
431 {
432 	int reserve;
433 	uma_zone_t z;
434 
435 	devctl_dev = make_dev_credf(MAKEDEV_ETERNAL, &dev_cdevsw, 0, NULL,
436 	    UID_ROOT, GID_WHEEL, 0600, "devctl");
437 	mtx_init(&devsoftc.mtx, "dev mtx", "devd", MTX_DEF);
438 	cv_init(&devsoftc.cv, "dev cv");
439 	STAILQ_INIT(&devsoftc.devq);
440 	knlist_init_mtx(&devsoftc.sel.si_note, &devsoftc.mtx);
441 	if (devctl_queue_length > 0) {
442 		/*
443 		 * Allocate a zone for the messages. Preallocate 2% of these for
444 		 * a reserve. Allow only devctl_queue_length slabs to cap memory
445 		 * usage.  The reserve usually allows coverage of surges of
446 		 * events during memory shortages. Normally we won't have to
447 		 * re-use events from the queue, but will in extreme shortages.
448 		 */
449 		z = devsoftc.zone = uma_zcreate("DEVCTL",
450 		    sizeof(struct dev_event_info), NULL, NULL, NULL, NULL,
451 		    UMA_ALIGN_PTR, 0);
452 		reserve = max(devctl_queue_length / 50, 100);	/* 2% reserve */
453 		uma_zone_set_max(z, devctl_queue_length);
454 		uma_zone_set_maxcache(z, 0);
455 		uma_zone_reserve(z, reserve);
456 		uma_prealloc(z, reserve);
457 	}
458 	devctl2_init();
459 }
460 
461 static int
devopen(struct cdev * dev,int oflags,int devtype,struct thread * td)462 devopen(struct cdev *dev, int oflags, int devtype, struct thread *td)
463 {
464 	mtx_lock(&devsoftc.mtx);
465 	if (devsoftc.inuse) {
466 		mtx_unlock(&devsoftc.mtx);
467 		return (EBUSY);
468 	}
469 	/* move to init */
470 	devsoftc.inuse = 1;
471 	mtx_unlock(&devsoftc.mtx);
472 	return (0);
473 }
474 
475 static int
devclose(struct cdev * dev,int fflag,int devtype,struct thread * td)476 devclose(struct cdev *dev, int fflag, int devtype, struct thread *td)
477 {
478 	mtx_lock(&devsoftc.mtx);
479 	devsoftc.inuse = 0;
480 	devsoftc.nonblock = 0;
481 	devsoftc.async = 0;
482 	cv_broadcast(&devsoftc.cv);
483 	funsetown(&devsoftc.sigio);
484 	mtx_unlock(&devsoftc.mtx);
485 	return (0);
486 }
487 
488 /*
489  * The read channel for this device is used to report changes to
490  * userland in realtime.  We are required to free the data as well as
491  * the n1 object because we allocate them separately.  Also note that
492  * we return one record at a time.  If you try to read this device a
493  * character at a time, you will lose the rest of the data.  Listening
494  * programs are expected to cope.
495  */
496 static int
devread(struct cdev * dev,struct uio * uio,int ioflag)497 devread(struct cdev *dev, struct uio *uio, int ioflag)
498 {
499 	struct dev_event_info *n1;
500 	int rv;
501 
502 	mtx_lock(&devsoftc.mtx);
503 	while (STAILQ_EMPTY(&devsoftc.devq)) {
504 		if (devsoftc.nonblock) {
505 			mtx_unlock(&devsoftc.mtx);
506 			return (EAGAIN);
507 		}
508 		rv = cv_wait_sig(&devsoftc.cv, &devsoftc.mtx);
509 		if (rv) {
510 			/*
511 			 * Need to translate ERESTART to EINTR here? -- jake
512 			 */
513 			mtx_unlock(&devsoftc.mtx);
514 			return (rv);
515 		}
516 	}
517 	n1 = STAILQ_FIRST(&devsoftc.devq);
518 	STAILQ_REMOVE_HEAD(&devsoftc.devq, dei_link);
519 	devsoftc.queued--;
520 	mtx_unlock(&devsoftc.mtx);
521 	rv = uiomove(n1->dei_data, strlen(n1->dei_data), uio);
522 	uma_zfree(devsoftc.zone, n1);
523 	return (rv);
524 }
525 
526 static	int
devioctl(struct cdev * dev,u_long cmd,caddr_t data,int fflag,struct thread * td)527 devioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
528 {
529 	switch (cmd) {
530 	case FIONBIO:
531 		if (*(int*)data)
532 			devsoftc.nonblock = 1;
533 		else
534 			devsoftc.nonblock = 0;
535 		return (0);
536 	case FIOASYNC:
537 		if (*(int*)data)
538 			devsoftc.async = 1;
539 		else
540 			devsoftc.async = 0;
541 		return (0);
542 	case FIOSETOWN:
543 		return fsetown(*(int *)data, &devsoftc.sigio);
544 	case FIOGETOWN:
545 		*(int *)data = fgetown(&devsoftc.sigio);
546 		return (0);
547 
548 		/* (un)Support for other fcntl() calls. */
549 	case FIOCLEX:
550 	case FIONCLEX:
551 	case FIONREAD:
552 	default:
553 		break;
554 	}
555 	return (ENOTTY);
556 }
557 
558 static	int
devpoll(struct cdev * dev,int events,struct thread * td)559 devpoll(struct cdev *dev, int events, struct thread *td)
560 {
561 	int	revents = 0;
562 
563 	mtx_lock(&devsoftc.mtx);
564 	if (events & (POLLIN | POLLRDNORM)) {
565 		if (!STAILQ_EMPTY(&devsoftc.devq))
566 			revents = events & (POLLIN | POLLRDNORM);
567 		else
568 			selrecord(td, &devsoftc.sel);
569 	}
570 	mtx_unlock(&devsoftc.mtx);
571 
572 	return (revents);
573 }
574 
575 static int
devkqfilter(struct cdev * dev,struct knote * kn)576 devkqfilter(struct cdev *dev, struct knote *kn)
577 {
578 	int error;
579 
580 	if (kn->kn_filter == EVFILT_READ) {
581 		kn->kn_fop = &devctl_rfiltops;
582 		knlist_add(&devsoftc.sel.si_note, kn, 0);
583 		error = 0;
584 	} else
585 		error = EINVAL;
586 	return (error);
587 }
588 
589 static void
filt_devctl_detach(struct knote * kn)590 filt_devctl_detach(struct knote *kn)
591 {
592 	knlist_remove(&devsoftc.sel.si_note, kn, 0);
593 }
594 
595 static int
filt_devctl_read(struct knote * kn,long hint)596 filt_devctl_read(struct knote *kn, long hint)
597 {
598 	kn->kn_data = devsoftc.queued;
599 	return (kn->kn_data != 0);
600 }
601 
602 /**
603  * @brief Return whether the userland process is running
604  */
605 bool
devctl_process_running(void)606 devctl_process_running(void)
607 {
608 	return (devsoftc.inuse == 1);
609 }
610 
611 static struct dev_event_info *
devctl_alloc_dei(void)612 devctl_alloc_dei(void)
613 {
614 	struct dev_event_info *dei = NULL;
615 
616 	mtx_lock(&devsoftc.mtx);
617 	if (devctl_queue_length == 0)
618 		goto out;
619 	dei = uma_zalloc(devsoftc.zone, M_NOWAIT);
620 	if (dei == NULL)
621 		dei = uma_zalloc(devsoftc.zone, M_NOWAIT | M_USE_RESERVE);
622 	if (dei == NULL) {
623 		/*
624 		 * Guard against no items in the queue. Normally, this won't
625 		 * happen, but if lots of events happen all at once and there's
626 		 * a chance we're out of allocated space but none have yet been
627 		 * queued when we get here, leaving nothing to steal. This can
628 		 * also happen with error injection. Fail safe by returning
629 		 * NULL in that case..
630 		 */
631 		if (devsoftc.queued == 0)
632 			goto out;
633 		dei = STAILQ_FIRST(&devsoftc.devq);
634 		STAILQ_REMOVE_HEAD(&devsoftc.devq, dei_link);
635 		devsoftc.queued--;
636 	}
637 	MPASS(dei != NULL);
638 	*dei->dei_data = '\0';
639 out:
640 	mtx_unlock(&devsoftc.mtx);
641 	return (dei);
642 }
643 
644 static struct dev_event_info *
devctl_alloc_dei_sb(struct sbuf * sb)645 devctl_alloc_dei_sb(struct sbuf *sb)
646 {
647 	struct dev_event_info *dei;
648 
649 	dei = devctl_alloc_dei();
650 	if (dei != NULL)
651 		sbuf_new(sb, dei->dei_data, sizeof(dei->dei_data), SBUF_FIXEDLEN);
652 	return (dei);
653 }
654 
655 static void
devctl_free_dei(struct dev_event_info * dei)656 devctl_free_dei(struct dev_event_info *dei)
657 {
658 	uma_zfree(devsoftc.zone, dei);
659 }
660 
661 static void
devctl_queue(struct dev_event_info * dei)662 devctl_queue(struct dev_event_info *dei)
663 {
664 	mtx_lock(&devsoftc.mtx);
665 	STAILQ_INSERT_TAIL(&devsoftc.devq, dei, dei_link);
666 	devsoftc.queued++;
667 	cv_broadcast(&devsoftc.cv);
668 	KNOTE_LOCKED(&devsoftc.sel.si_note, 0);
669 	mtx_unlock(&devsoftc.mtx);
670 	selwakeup(&devsoftc.sel);
671 	if (devsoftc.async && devsoftc.sigio != NULL)
672 		pgsigio(&devsoftc.sigio, SIGIO, 0);
673 }
674 
675 /**
676  * @brief Send a 'notification' to userland, using standard ways
677  */
678 void
devctl_notify(const char * system,const char * subsystem,const char * type,const char * data)679 devctl_notify(const char *system, const char *subsystem, const char *type,
680     const char *data)
681 {
682 	struct dev_event_info *dei;
683 	struct sbuf sb;
684 
685 	if (system == NULL || subsystem == NULL || type == NULL)
686 		return;
687 	dei = devctl_alloc_dei_sb(&sb);
688 	if (dei == NULL)
689 		return;
690 	sbuf_cpy(&sb, "!system=");
691 	sbuf_cat(&sb, system);
692 	sbuf_cat(&sb, " subsystem=");
693 	sbuf_cat(&sb, subsystem);
694 	sbuf_cat(&sb, " type=");
695 	sbuf_cat(&sb, type);
696 	if (data != NULL) {
697 		sbuf_putc(&sb, ' ');
698 		sbuf_cat(&sb, data);
699 	}
700 	sbuf_putc(&sb, '\n');
701 	if (sbuf_finish(&sb) != 0)
702 		devctl_free_dei(dei);	/* overflow -> drop it */
703 	else
704 		devctl_queue(dei);
705 }
706 
707 /*
708  * Common routine that tries to make sending messages as easy as possible.
709  * We allocate memory for the data, copy strings into that, but do not
710  * free it unless there's an error.  The dequeue part of the driver should
711  * free the data.  We don't send data when the device is disabled.  We do
712  * send data, even when we have no listeners, because we wish to avoid
713  * races relating to startup and restart of listening applications.
714  *
715  * devaddq is designed to string together the type of event, with the
716  * object of that event, plus the plug and play info and location info
717  * for that event.  This is likely most useful for devices, but less
718  * useful for other consumers of this interface.  Those should use
719  * the devctl_notify() interface instead.
720  *
721  * Output:
722  *	${type}${what} at $(location dev) $(pnp-info dev) on $(parent dev)
723  */
724 static void
devaddq(const char * type,const char * what,device_t dev)725 devaddq(const char *type, const char *what, device_t dev)
726 {
727 	struct dev_event_info *dei;
728 	const char *parstr;
729 	struct sbuf sb;
730 
731 	dei = devctl_alloc_dei_sb(&sb);
732 	if (dei == NULL)
733 		return;
734 	sbuf_cpy(&sb, type);
735 	sbuf_cat(&sb, what);
736 	sbuf_cat(&sb, " at ");
737 
738 	/* Add in the location */
739 	bus_child_location_sb(dev, &sb);
740 	sbuf_putc(&sb, ' ');
741 
742 	/* Add in pnpinfo */
743 	bus_child_pnpinfo_sb(dev, &sb);
744 
745 	/* Get the parent of this device, or / if high enough in the tree. */
746 	if (device_get_parent(dev) == NULL)
747 		parstr = ".";	/* Or '/' ? */
748 	else
749 		parstr = device_get_nameunit(device_get_parent(dev));
750 	sbuf_cat(&sb, " on ");
751 	sbuf_cat(&sb, parstr);
752 	sbuf_putc(&sb, '\n');
753 	if (sbuf_finish(&sb) != 0)
754 		goto bad;
755 	devctl_queue(dei);
756 	return;
757 bad:
758 	devctl_free_dei(dei);
759 }
760 
761 /*
762  * A device was added to the tree.  We are called just after it successfully
763  * attaches (that is, probe and attach success for this device).  No call
764  * is made if a device is merely parented into the tree.  See devnomatch
765  * if probe fails.  If attach fails, no notification is sent (but maybe
766  * we should have a different message for this).
767  */
768 static void
devadded(device_t dev)769 devadded(device_t dev)
770 {
771 	devaddq("+", device_get_nameunit(dev), dev);
772 }
773 
774 /*
775  * A device was removed from the tree.  We are called just before this
776  * happens.
777  */
778 static void
devremoved(device_t dev)779 devremoved(device_t dev)
780 {
781 	devaddq("-", device_get_nameunit(dev), dev);
782 }
783 
784 /*
785  * Called when there's no match for this device.  This is only called
786  * the first time that no match happens, so we don't keep getting this
787  * message.  Should that prove to be undesirable, we can change it.
788  * This is called when all drivers that can attach to a given bus
789  * decline to accept this device.  Other errors may not be detected.
790  */
791 static void
devnomatch(device_t dev)792 devnomatch(device_t dev)
793 {
794 	devaddq("?", "", dev);
795 }
796 
797 static int
sysctl_devctl_queue(SYSCTL_HANDLER_ARGS)798 sysctl_devctl_queue(SYSCTL_HANDLER_ARGS)
799 {
800 	int q, error;
801 
802 	q = devctl_queue_length;
803 	error = sysctl_handle_int(oidp, &q, 0, req);
804 	if (error || !req->newptr)
805 		return (error);
806 	if (q < 0)
807 		return (EINVAL);
808 
809 	/*
810 	 * When set as a tunable, we've not yet initialized the mutex.
811 	 * It is safe to just assign to devctl_queue_length and return
812 	 * as we're racing no one. We'll use whatever value set in
813 	 * devinit.
814 	 */
815 	if (!mtx_initialized(&devsoftc.mtx)) {
816 		devctl_queue_length = q;
817 		return (0);
818 	}
819 
820 	/*
821 	 * XXX It's hard to grow or shrink the UMA zone. Only allow
822 	 * disabling the queue size for the moment until underlying
823 	 * UMA issues can be sorted out.
824 	 */
825 	if (q != 0)
826 		return (EINVAL);
827 	if (q == devctl_queue_length)
828 		return (0);
829 	mtx_lock(&devsoftc.mtx);
830 	devctl_queue_length = 0;
831 	uma_zdestroy(devsoftc.zone);
832 	devsoftc.zone = 0;
833 	mtx_unlock(&devsoftc.mtx);
834 	return (0);
835 }
836 
837 /**
838  * @brief safely quotes strings that might have double quotes in them.
839  *
840  * The devctl protocol relies on quoted strings having matching quotes.
841  * This routine quotes any internal quotes so the resulting string
842  * is safe to pass to snprintf to construct, for example pnp info strings.
843  *
844  * @param sb	sbuf to place the characters into
845  * @param src	Original buffer.
846  */
847 void
devctl_safe_quote_sb(struct sbuf * sb,const char * src)848 devctl_safe_quote_sb(struct sbuf *sb, const char *src)
849 {
850 	while (*src != '\0') {
851 		if (*src == '"' || *src == '\\')
852 			sbuf_putc(sb, '\\');
853 		sbuf_putc(sb, *src++);
854 	}
855 }
856 
857 /* End of /dev/devctl code */
858 
859 static struct device_list bus_data_devices;
860 static int bus_data_generation = 1;
861 
862 static kobj_method_t null_methods[] = {
863 	KOBJMETHOD_END
864 };
865 
866 DEFINE_CLASS(null, null_methods, 0);
867 
868 /*
869  * Bus pass implementation
870  */
871 
872 static driver_list_t passes = TAILQ_HEAD_INITIALIZER(passes);
873 int bus_current_pass = BUS_PASS_ROOT;
874 
875 /**
876  * @internal
877  * @brief Register the pass level of a new driver attachment
878  *
879  * Register a new driver attachment's pass level.  If no driver
880  * attachment with the same pass level has been added, then @p new
881  * will be added to the global passes list.
882  *
883  * @param new		the new driver attachment
884  */
885 static void
driver_register_pass(struct driverlink * new)886 driver_register_pass(struct driverlink *new)
887 {
888 	struct driverlink *dl;
889 
890 	/* We only consider pass numbers during boot. */
891 	if (bus_current_pass == BUS_PASS_DEFAULT)
892 		return;
893 
894 	/*
895 	 * Walk the passes list.  If we already know about this pass
896 	 * then there is nothing to do.  If we don't, then insert this
897 	 * driver link into the list.
898 	 */
899 	TAILQ_FOREACH(dl, &passes, passlink) {
900 		if (dl->pass < new->pass)
901 			continue;
902 		if (dl->pass == new->pass)
903 			return;
904 		TAILQ_INSERT_BEFORE(dl, new, passlink);
905 		return;
906 	}
907 	TAILQ_INSERT_TAIL(&passes, new, passlink);
908 }
909 
910 /**
911  * @brief Raise the current bus pass
912  *
913  * Raise the current bus pass level to @p pass.  Call the BUS_NEW_PASS()
914  * method on the root bus to kick off a new device tree scan for each
915  * new pass level that has at least one driver.
916  */
917 void
bus_set_pass(int pass)918 bus_set_pass(int pass)
919 {
920 	struct driverlink *dl;
921 
922 	if (bus_current_pass > pass)
923 		panic("Attempt to lower bus pass level");
924 
925 	TAILQ_FOREACH(dl, &passes, passlink) {
926 		/* Skip pass values below the current pass level. */
927 		if (dl->pass <= bus_current_pass)
928 			continue;
929 
930 		/*
931 		 * Bail once we hit a driver with a pass level that is
932 		 * too high.
933 		 */
934 		if (dl->pass > pass)
935 			break;
936 
937 		/*
938 		 * Raise the pass level to the next level and rescan
939 		 * the tree.
940 		 */
941 		bus_current_pass = dl->pass;
942 		BUS_NEW_PASS(root_bus);
943 	}
944 
945 	/*
946 	 * If there isn't a driver registered for the requested pass,
947 	 * then bus_current_pass might still be less than 'pass'.  Set
948 	 * it to 'pass' in that case.
949 	 */
950 	if (bus_current_pass < pass)
951 		bus_current_pass = pass;
952 	KASSERT(bus_current_pass == pass, ("Failed to update bus pass level"));
953 }
954 
955 /*
956  * Devclass implementation
957  */
958 
959 static devclass_list_t devclasses = TAILQ_HEAD_INITIALIZER(devclasses);
960 
961 /**
962  * @internal
963  * @brief Find or create a device class
964  *
965  * If a device class with the name @p classname exists, return it,
966  * otherwise if @p create is non-zero create and return a new device
967  * class.
968  *
969  * If @p parentname is non-NULL, the parent of the devclass is set to
970  * the devclass of that name.
971  *
972  * @param classname	the devclass name to find or create
973  * @param parentname	the parent devclass name or @c NULL
974  * @param create	non-zero to create a devclass
975  */
976 static devclass_t
devclass_find_internal(const char * classname,const char * parentname,int create)977 devclass_find_internal(const char *classname, const char *parentname,
978 		       int create)
979 {
980 	devclass_t dc;
981 
982 	PDEBUG(("looking for %s", classname));
983 	if (!classname)
984 		return (NULL);
985 
986 	TAILQ_FOREACH(dc, &devclasses, link) {
987 		if (!strcmp(dc->name, classname))
988 			break;
989 	}
990 
991 	if (create && !dc) {
992 		PDEBUG(("creating %s", classname));
993 		dc = malloc(sizeof(struct devclass) + strlen(classname) + 1,
994 		    M_BUS, M_NOWAIT | M_ZERO);
995 		if (!dc)
996 			return (NULL);
997 		dc->parent = NULL;
998 		dc->name = (char*) (dc + 1);
999 		strcpy(dc->name, classname);
1000 		TAILQ_INIT(&dc->drivers);
1001 		TAILQ_INSERT_TAIL(&devclasses, dc, link);
1002 
1003 		bus_data_generation_update();
1004 	}
1005 
1006 	/*
1007 	 * If a parent class is specified, then set that as our parent so
1008 	 * that this devclass will support drivers for the parent class as
1009 	 * well.  If the parent class has the same name don't do this though
1010 	 * as it creates a cycle that can trigger an infinite loop in
1011 	 * device_probe_child() if a device exists for which there is no
1012 	 * suitable driver.
1013 	 */
1014 	if (parentname && dc && !dc->parent &&
1015 	    strcmp(classname, parentname) != 0) {
1016 		dc->parent = devclass_find_internal(parentname, NULL, TRUE);
1017 		dc->parent->flags |= DC_HAS_CHILDREN;
1018 	}
1019 
1020 	return (dc);
1021 }
1022 
1023 /**
1024  * @brief Create a device class
1025  *
1026  * If a device class with the name @p classname exists, return it,
1027  * otherwise create and return a new device class.
1028  *
1029  * @param classname	the devclass name to find or create
1030  */
1031 devclass_t
devclass_create(const char * classname)1032 devclass_create(const char *classname)
1033 {
1034 	return (devclass_find_internal(classname, NULL, TRUE));
1035 }
1036 
1037 /**
1038  * @brief Find a device class
1039  *
1040  * If a device class with the name @p classname exists, return it,
1041  * otherwise return @c NULL.
1042  *
1043  * @param classname	the devclass name to find
1044  */
1045 devclass_t
devclass_find(const char * classname)1046 devclass_find(const char *classname)
1047 {
1048 	return (devclass_find_internal(classname, NULL, FALSE));
1049 }
1050 
1051 /**
1052  * @brief Register that a device driver has been added to a devclass
1053  *
1054  * Register that a device driver has been added to a devclass.  This
1055  * is called by devclass_add_driver to accomplish the recursive
1056  * notification of all the children classes of dc, as well as dc.
1057  * Each layer will have BUS_DRIVER_ADDED() called for all instances of
1058  * the devclass.
1059  *
1060  * We do a full search here of the devclass list at each iteration
1061  * level to save storing children-lists in the devclass structure.  If
1062  * we ever move beyond a few dozen devices doing this, we may need to
1063  * reevaluate...
1064  *
1065  * @param dc		the devclass to edit
1066  * @param driver	the driver that was just added
1067  */
1068 static void
devclass_driver_added(devclass_t dc,driver_t * driver)1069 devclass_driver_added(devclass_t dc, driver_t *driver)
1070 {
1071 	devclass_t parent;
1072 	int i;
1073 
1074 	/*
1075 	 * Call BUS_DRIVER_ADDED for any existing buses in this class.
1076 	 */
1077 	for (i = 0; i < dc->maxunit; i++)
1078 		if (dc->devices[i] && device_is_attached(dc->devices[i]))
1079 			BUS_DRIVER_ADDED(dc->devices[i], driver);
1080 
1081 	/*
1082 	 * Walk through the children classes.  Since we only keep a
1083 	 * single parent pointer around, we walk the entire list of
1084 	 * devclasses looking for children.  We set the
1085 	 * DC_HAS_CHILDREN flag when a child devclass is created on
1086 	 * the parent, so we only walk the list for those devclasses
1087 	 * that have children.
1088 	 */
1089 	if (!(dc->flags & DC_HAS_CHILDREN))
1090 		return;
1091 	parent = dc;
1092 	TAILQ_FOREACH(dc, &devclasses, link) {
1093 		if (dc->parent == parent)
1094 			devclass_driver_added(dc, driver);
1095 	}
1096 }
1097 
1098 /**
1099  * @brief Add a device driver to a device class
1100  *
1101  * Add a device driver to a devclass. This is normally called
1102  * automatically by DRIVER_MODULE(). The BUS_DRIVER_ADDED() method of
1103  * all devices in the devclass will be called to allow them to attempt
1104  * to re-probe any unmatched children.
1105  *
1106  * @param dc		the devclass to edit
1107  * @param driver	the driver to register
1108  */
1109 int
devclass_add_driver(devclass_t dc,driver_t * driver,int pass,devclass_t * dcp)1110 devclass_add_driver(devclass_t dc, driver_t *driver, int pass, devclass_t *dcp)
1111 {
1112 	driverlink_t dl;
1113 	const char *parentname;
1114 
1115 	PDEBUG(("%s", DRIVERNAME(driver)));
1116 
1117 	/* Don't allow invalid pass values. */
1118 	if (pass <= BUS_PASS_ROOT)
1119 		return (EINVAL);
1120 
1121 	dl = malloc(sizeof *dl, M_BUS, M_NOWAIT|M_ZERO);
1122 	if (!dl)
1123 		return (ENOMEM);
1124 
1125 	/*
1126 	 * Compile the driver's methods. Also increase the reference count
1127 	 * so that the class doesn't get freed when the last instance
1128 	 * goes. This means we can safely use static methods and avoids a
1129 	 * double-free in devclass_delete_driver.
1130 	 */
1131 	kobj_class_compile((kobj_class_t) driver);
1132 
1133 	/*
1134 	 * If the driver has any base classes, make the
1135 	 * devclass inherit from the devclass of the driver's
1136 	 * first base class. This will allow the system to
1137 	 * search for drivers in both devclasses for children
1138 	 * of a device using this driver.
1139 	 */
1140 	if (driver->baseclasses)
1141 		parentname = driver->baseclasses[0]->name;
1142 	else
1143 		parentname = NULL;
1144 	*dcp = devclass_find_internal(driver->name, parentname, TRUE);
1145 
1146 	dl->driver = driver;
1147 	TAILQ_INSERT_TAIL(&dc->drivers, dl, link);
1148 	driver->refs++;		/* XXX: kobj_mtx */
1149 	dl->pass = pass;
1150 	driver_register_pass(dl);
1151 
1152 	if (device_frozen) {
1153 		dl->flags |= DL_DEFERRED_PROBE;
1154 	} else {
1155 		devclass_driver_added(dc, driver);
1156 	}
1157 	bus_data_generation_update();
1158 	return (0);
1159 }
1160 
1161 /**
1162  * @brief Register that a device driver has been deleted from a devclass
1163  *
1164  * Register that a device driver has been removed from a devclass.
1165  * This is called by devclass_delete_driver to accomplish the
1166  * recursive notification of all the children classes of busclass, as
1167  * well as busclass.  Each layer will attempt to detach the driver
1168  * from any devices that are children of the bus's devclass.  The function
1169  * will return an error if a device fails to detach.
1170  *
1171  * We do a full search here of the devclass list at each iteration
1172  * level to save storing children-lists in the devclass structure.  If
1173  * we ever move beyond a few dozen devices doing this, we may need to
1174  * reevaluate...
1175  *
1176  * @param busclass	the devclass of the parent bus
1177  * @param dc		the devclass of the driver being deleted
1178  * @param driver	the driver being deleted
1179  */
1180 static int
devclass_driver_deleted(devclass_t busclass,devclass_t dc,driver_t * driver)1181 devclass_driver_deleted(devclass_t busclass, devclass_t dc, driver_t *driver)
1182 {
1183 	devclass_t parent;
1184 	device_t dev;
1185 	int error, i;
1186 
1187 	/*
1188 	 * Disassociate from any devices.  We iterate through all the
1189 	 * devices in the devclass of the driver and detach any which are
1190 	 * using the driver and which have a parent in the devclass which
1191 	 * we are deleting from.
1192 	 *
1193 	 * Note that since a driver can be in multiple devclasses, we
1194 	 * should not detach devices which are not children of devices in
1195 	 * the affected devclass.
1196 	 *
1197 	 * If we're frozen, we don't generate NOMATCH events. Mark to
1198 	 * generate later.
1199 	 */
1200 	for (i = 0; i < dc->maxunit; i++) {
1201 		if (dc->devices[i]) {
1202 			dev = dc->devices[i];
1203 			if (dev->driver == driver && dev->parent &&
1204 			    dev->parent->devclass == busclass) {
1205 				if ((error = device_detach(dev)) != 0)
1206 					return (error);
1207 				if (device_frozen) {
1208 					dev->flags &= ~DF_DONENOMATCH;
1209 					dev->flags |= DF_NEEDNOMATCH;
1210 				} else {
1211 					BUS_PROBE_NOMATCH(dev->parent, dev);
1212 					devnomatch(dev);
1213 					dev->flags |= DF_DONENOMATCH;
1214 				}
1215 			}
1216 		}
1217 	}
1218 
1219 	/*
1220 	 * Walk through the children classes.  Since we only keep a
1221 	 * single parent pointer around, we walk the entire list of
1222 	 * devclasses looking for children.  We set the
1223 	 * DC_HAS_CHILDREN flag when a child devclass is created on
1224 	 * the parent, so we only walk the list for those devclasses
1225 	 * that have children.
1226 	 */
1227 	if (!(busclass->flags & DC_HAS_CHILDREN))
1228 		return (0);
1229 	parent = busclass;
1230 	TAILQ_FOREACH(busclass, &devclasses, link) {
1231 		if (busclass->parent == parent) {
1232 			error = devclass_driver_deleted(busclass, dc, driver);
1233 			if (error)
1234 				return (error);
1235 		}
1236 	}
1237 	return (0);
1238 }
1239 
1240 /**
1241  * @brief Delete a device driver from a device class
1242  *
1243  * Delete a device driver from a devclass. This is normally called
1244  * automatically by DRIVER_MODULE().
1245  *
1246  * If the driver is currently attached to any devices,
1247  * devclass_delete_driver() will first attempt to detach from each
1248  * device. If one of the detach calls fails, the driver will not be
1249  * deleted.
1250  *
1251  * @param dc		the devclass to edit
1252  * @param driver	the driver to unregister
1253  */
1254 int
devclass_delete_driver(devclass_t busclass,driver_t * driver)1255 devclass_delete_driver(devclass_t busclass, driver_t *driver)
1256 {
1257 	devclass_t dc = devclass_find(driver->name);
1258 	driverlink_t dl;
1259 	int error;
1260 
1261 	PDEBUG(("%s from devclass %s", driver->name, DEVCLANAME(busclass)));
1262 
1263 	if (!dc)
1264 		return (0);
1265 
1266 	/*
1267 	 * Find the link structure in the bus' list of drivers.
1268 	 */
1269 	TAILQ_FOREACH(dl, &busclass->drivers, link) {
1270 		if (dl->driver == driver)
1271 			break;
1272 	}
1273 
1274 	if (!dl) {
1275 		PDEBUG(("%s not found in %s list", driver->name,
1276 		    busclass->name));
1277 		return (ENOENT);
1278 	}
1279 
1280 	error = devclass_driver_deleted(busclass, dc, driver);
1281 	if (error != 0)
1282 		return (error);
1283 
1284 	TAILQ_REMOVE(&busclass->drivers, dl, link);
1285 	free(dl, M_BUS);
1286 
1287 	/* XXX: kobj_mtx */
1288 	driver->refs--;
1289 	if (driver->refs == 0)
1290 		kobj_class_free((kobj_class_t) driver);
1291 
1292 	bus_data_generation_update();
1293 	return (0);
1294 }
1295 
1296 /**
1297  * @brief Quiesces a set of device drivers from a device class
1298  *
1299  * Quiesce a device driver from a devclass. This is normally called
1300  * automatically by DRIVER_MODULE().
1301  *
1302  * If the driver is currently attached to any devices,
1303  * devclass_quiesece_driver() will first attempt to quiesce each
1304  * device.
1305  *
1306  * @param dc		the devclass to edit
1307  * @param driver	the driver to unregister
1308  */
1309 static int
devclass_quiesce_driver(devclass_t busclass,driver_t * driver)1310 devclass_quiesce_driver(devclass_t busclass, driver_t *driver)
1311 {
1312 	devclass_t dc = devclass_find(driver->name);
1313 	driverlink_t dl;
1314 	device_t dev;
1315 	int i;
1316 	int error;
1317 
1318 	PDEBUG(("%s from devclass %s", driver->name, DEVCLANAME(busclass)));
1319 
1320 	if (!dc)
1321 		return (0);
1322 
1323 	/*
1324 	 * Find the link structure in the bus' list of drivers.
1325 	 */
1326 	TAILQ_FOREACH(dl, &busclass->drivers, link) {
1327 		if (dl->driver == driver)
1328 			break;
1329 	}
1330 
1331 	if (!dl) {
1332 		PDEBUG(("%s not found in %s list", driver->name,
1333 		    busclass->name));
1334 		return (ENOENT);
1335 	}
1336 
1337 	/*
1338 	 * Quiesce all devices.  We iterate through all the devices in
1339 	 * the devclass of the driver and quiesce any which are using
1340 	 * the driver and which have a parent in the devclass which we
1341 	 * are quiescing.
1342 	 *
1343 	 * Note that since a driver can be in multiple devclasses, we
1344 	 * should not quiesce devices which are not children of
1345 	 * devices in the affected devclass.
1346 	 */
1347 	for (i = 0; i < dc->maxunit; i++) {
1348 		if (dc->devices[i]) {
1349 			dev = dc->devices[i];
1350 			if (dev->driver == driver && dev->parent &&
1351 			    dev->parent->devclass == busclass) {
1352 				if ((error = device_quiesce(dev)) != 0)
1353 					return (error);
1354 			}
1355 		}
1356 	}
1357 
1358 	return (0);
1359 }
1360 
1361 /**
1362  * @internal
1363  */
1364 static driverlink_t
devclass_find_driver_internal(devclass_t dc,const char * classname)1365 devclass_find_driver_internal(devclass_t dc, const char *classname)
1366 {
1367 	driverlink_t dl;
1368 
1369 	PDEBUG(("%s in devclass %s", classname, DEVCLANAME(dc)));
1370 
1371 	TAILQ_FOREACH(dl, &dc->drivers, link) {
1372 		if (!strcmp(dl->driver->name, classname))
1373 			return (dl);
1374 	}
1375 
1376 	PDEBUG(("not found"));
1377 	return (NULL);
1378 }
1379 
1380 /**
1381  * @brief Return the name of the devclass
1382  */
1383 const char *
devclass_get_name(devclass_t dc)1384 devclass_get_name(devclass_t dc)
1385 {
1386 	return (dc->name);
1387 }
1388 
1389 /**
1390  * @brief Find a device given a unit number
1391  *
1392  * @param dc		the devclass to search
1393  * @param unit		the unit number to search for
1394  *
1395  * @returns		the device with the given unit number or @c
1396  *			NULL if there is no such device
1397  */
1398 device_t
devclass_get_device(devclass_t dc,int unit)1399 devclass_get_device(devclass_t dc, int unit)
1400 {
1401 	if (dc == NULL || unit < 0 || unit >= dc->maxunit)
1402 		return (NULL);
1403 	return (dc->devices[unit]);
1404 }
1405 
1406 /**
1407  * @brief Find the softc field of a device given a unit number
1408  *
1409  * @param dc		the devclass to search
1410  * @param unit		the unit number to search for
1411  *
1412  * @returns		the softc field of the device with the given
1413  *			unit number or @c NULL if there is no such
1414  *			device
1415  */
1416 void *
devclass_get_softc(devclass_t dc,int unit)1417 devclass_get_softc(devclass_t dc, int unit)
1418 {
1419 	device_t dev;
1420 
1421 	dev = devclass_get_device(dc, unit);
1422 	if (!dev)
1423 		return (NULL);
1424 
1425 	return (device_get_softc(dev));
1426 }
1427 
1428 /**
1429  * @brief Get a list of devices in the devclass
1430  *
1431  * An array containing a list of all the devices in the given devclass
1432  * is allocated and returned in @p *devlistp. The number of devices
1433  * in the array is returned in @p *devcountp. The caller should free
1434  * the array using @c free(p, M_TEMP), even if @p *devcountp is 0.
1435  *
1436  * @param dc		the devclass to examine
1437  * @param devlistp	points at location for array pointer return
1438  *			value
1439  * @param devcountp	points at location for array size return value
1440  *
1441  * @retval 0		success
1442  * @retval ENOMEM	the array allocation failed
1443  */
1444 int
devclass_get_devices(devclass_t dc,device_t ** devlistp,int * devcountp)1445 devclass_get_devices(devclass_t dc, device_t **devlistp, int *devcountp)
1446 {
1447 	int count, i;
1448 	device_t *list;
1449 
1450 	count = devclass_get_count(dc);
1451 	list = malloc(count * sizeof(device_t), M_TEMP, M_NOWAIT|M_ZERO);
1452 	if (!list)
1453 		return (ENOMEM);
1454 
1455 	count = 0;
1456 	for (i = 0; i < dc->maxunit; i++) {
1457 		if (dc->devices[i]) {
1458 			list[count] = dc->devices[i];
1459 			count++;
1460 		}
1461 	}
1462 
1463 	*devlistp = list;
1464 	*devcountp = count;
1465 
1466 	return (0);
1467 }
1468 
1469 /**
1470  * @brief Get a list of drivers in the devclass
1471  *
1472  * An array containing a list of pointers to all the drivers in the
1473  * given devclass is allocated and returned in @p *listp.  The number
1474  * of drivers in the array is returned in @p *countp. The caller should
1475  * free the array using @c free(p, M_TEMP).
1476  *
1477  * @param dc		the devclass to examine
1478  * @param listp		gives location for array pointer return value
1479  * @param countp	gives location for number of array elements
1480  *			return value
1481  *
1482  * @retval 0		success
1483  * @retval ENOMEM	the array allocation failed
1484  */
1485 int
devclass_get_drivers(devclass_t dc,driver_t *** listp,int * countp)1486 devclass_get_drivers(devclass_t dc, driver_t ***listp, int *countp)
1487 {
1488 	driverlink_t dl;
1489 	driver_t **list;
1490 	int count;
1491 
1492 	count = 0;
1493 	TAILQ_FOREACH(dl, &dc->drivers, link)
1494 		count++;
1495 	list = malloc(count * sizeof(driver_t *), M_TEMP, M_NOWAIT);
1496 	if (list == NULL)
1497 		return (ENOMEM);
1498 
1499 	count = 0;
1500 	TAILQ_FOREACH(dl, &dc->drivers, link) {
1501 		list[count] = dl->driver;
1502 		count++;
1503 	}
1504 	*listp = list;
1505 	*countp = count;
1506 
1507 	return (0);
1508 }
1509 
1510 /**
1511  * @brief Get the number of devices in a devclass
1512  *
1513  * @param dc		the devclass to examine
1514  */
1515 int
devclass_get_count(devclass_t dc)1516 devclass_get_count(devclass_t dc)
1517 {
1518 	int count, i;
1519 
1520 	count = 0;
1521 	for (i = 0; i < dc->maxunit; i++)
1522 		if (dc->devices[i])
1523 			count++;
1524 	return (count);
1525 }
1526 
1527 /**
1528  * @brief Get the maximum unit number used in a devclass
1529  *
1530  * Note that this is one greater than the highest currently-allocated
1531  * unit.  If a null devclass_t is passed in, -1 is returned to indicate
1532  * that not even the devclass has been allocated yet.
1533  *
1534  * @param dc		the devclass to examine
1535  */
1536 int
devclass_get_maxunit(devclass_t dc)1537 devclass_get_maxunit(devclass_t dc)
1538 {
1539 	if (dc == NULL)
1540 		return (-1);
1541 	return (dc->maxunit);
1542 }
1543 
1544 /**
1545  * @brief Find a free unit number in a devclass
1546  *
1547  * This function searches for the first unused unit number greater
1548  * that or equal to @p unit.
1549  *
1550  * @param dc		the devclass to examine
1551  * @param unit		the first unit number to check
1552  */
1553 int
devclass_find_free_unit(devclass_t dc,int unit)1554 devclass_find_free_unit(devclass_t dc, int unit)
1555 {
1556 	if (dc == NULL)
1557 		return (unit);
1558 	while (unit < dc->maxunit && dc->devices[unit] != NULL)
1559 		unit++;
1560 	return (unit);
1561 }
1562 
1563 /**
1564  * @brief Set the parent of a devclass
1565  *
1566  * The parent class is normally initialised automatically by
1567  * DRIVER_MODULE().
1568  *
1569  * @param dc		the devclass to edit
1570  * @param pdc		the new parent devclass
1571  */
1572 void
devclass_set_parent(devclass_t dc,devclass_t pdc)1573 devclass_set_parent(devclass_t dc, devclass_t pdc)
1574 {
1575 	dc->parent = pdc;
1576 }
1577 
1578 /**
1579  * @brief Get the parent of a devclass
1580  *
1581  * @param dc		the devclass to examine
1582  */
1583 devclass_t
devclass_get_parent(devclass_t dc)1584 devclass_get_parent(devclass_t dc)
1585 {
1586 	return (dc->parent);
1587 }
1588 
1589 struct sysctl_ctx_list *
devclass_get_sysctl_ctx(devclass_t dc)1590 devclass_get_sysctl_ctx(devclass_t dc)
1591 {
1592 	return (&dc->sysctl_ctx);
1593 }
1594 
1595 struct sysctl_oid *
devclass_get_sysctl_tree(devclass_t dc)1596 devclass_get_sysctl_tree(devclass_t dc)
1597 {
1598 	return (dc->sysctl_tree);
1599 }
1600 
1601 /**
1602  * @internal
1603  * @brief Allocate a unit number
1604  *
1605  * On entry, @p *unitp is the desired unit number (or @c -1 if any
1606  * will do). The allocated unit number is returned in @p *unitp.
1607 
1608  * @param dc		the devclass to allocate from
1609  * @param unitp		points at the location for the allocated unit
1610  *			number
1611  *
1612  * @retval 0		success
1613  * @retval EEXIST	the requested unit number is already allocated
1614  * @retval ENOMEM	memory allocation failure
1615  */
1616 static int
devclass_alloc_unit(devclass_t dc,device_t dev,int * unitp)1617 devclass_alloc_unit(devclass_t dc, device_t dev, int *unitp)
1618 {
1619 	const char *s;
1620 	int unit = *unitp;
1621 
1622 	PDEBUG(("unit %d in devclass %s", unit, DEVCLANAME(dc)));
1623 
1624 	/* Ask the parent bus if it wants to wire this device. */
1625 	if (unit == -1)
1626 		BUS_HINT_DEVICE_UNIT(device_get_parent(dev), dev, dc->name,
1627 		    &unit);
1628 
1629 	/* If we were given a wired unit number, check for existing device */
1630 	/* XXX imp XXX */
1631 	if (unit != -1) {
1632 		if (unit >= 0 && unit < dc->maxunit &&
1633 		    dc->devices[unit] != NULL) {
1634 			if (bootverbose)
1635 				printf("%s: %s%d already exists; skipping it\n",
1636 				    dc->name, dc->name, *unitp);
1637 			return (EEXIST);
1638 		}
1639 	} else {
1640 		/* Unwired device, find the next available slot for it */
1641 		unit = 0;
1642 		for (unit = 0;; unit++) {
1643 			/* If this device slot is already in use, skip it. */
1644 			if (unit < dc->maxunit && dc->devices[unit] != NULL)
1645 				continue;
1646 
1647 			/* If there is an "at" hint for a unit then skip it. */
1648 			if (resource_string_value(dc->name, unit, "at", &s) ==
1649 			    0)
1650 				continue;
1651 
1652 			break;
1653 		}
1654 	}
1655 
1656 	/*
1657 	 * We've selected a unit beyond the length of the table, so let's
1658 	 * extend the table to make room for all units up to and including
1659 	 * this one.
1660 	 */
1661 	if (unit >= dc->maxunit) {
1662 		device_t *newlist, *oldlist;
1663 		int newsize;
1664 
1665 		oldlist = dc->devices;
1666 		newsize = roundup((unit + 1),
1667 		    MAX(1, MINALLOCSIZE / sizeof(device_t)));
1668 		newlist = malloc(sizeof(device_t) * newsize, M_BUS, M_NOWAIT);
1669 		if (!newlist)
1670 			return (ENOMEM);
1671 		if (oldlist != NULL)
1672 			bcopy(oldlist, newlist, sizeof(device_t) * dc->maxunit);
1673 		bzero(newlist + dc->maxunit,
1674 		    sizeof(device_t) * (newsize - dc->maxunit));
1675 		dc->devices = newlist;
1676 		dc->maxunit = newsize;
1677 		if (oldlist != NULL)
1678 			free(oldlist, M_BUS);
1679 	}
1680 	PDEBUG(("now: unit %d in devclass %s", unit, DEVCLANAME(dc)));
1681 
1682 	*unitp = unit;
1683 	return (0);
1684 }
1685 
1686 /**
1687  * @internal
1688  * @brief Add a device to a devclass
1689  *
1690  * A unit number is allocated for the device (using the device's
1691  * preferred unit number if any) and the device is registered in the
1692  * devclass. This allows the device to be looked up by its unit
1693  * number, e.g. by decoding a dev_t minor number.
1694  *
1695  * @param dc		the devclass to add to
1696  * @param dev		the device to add
1697  *
1698  * @retval 0		success
1699  * @retval EEXIST	the requested unit number is already allocated
1700  * @retval ENOMEM	memory allocation failure
1701  */
1702 static int
devclass_add_device(devclass_t dc,device_t dev)1703 devclass_add_device(devclass_t dc, device_t dev)
1704 {
1705 	int buflen, error;
1706 
1707 	PDEBUG(("%s in devclass %s", DEVICENAME(dev), DEVCLANAME(dc)));
1708 
1709 	buflen = snprintf(NULL, 0, "%s%d$", dc->name, INT_MAX);
1710 	if (buflen < 0)
1711 		return (ENOMEM);
1712 	dev->nameunit = malloc(buflen, M_BUS, M_NOWAIT|M_ZERO);
1713 	if (!dev->nameunit)
1714 		return (ENOMEM);
1715 
1716 	if ((error = devclass_alloc_unit(dc, dev, &dev->unit)) != 0) {
1717 		free(dev->nameunit, M_BUS);
1718 		dev->nameunit = NULL;
1719 		return (error);
1720 	}
1721 	dc->devices[dev->unit] = dev;
1722 	dev->devclass = dc;
1723 	snprintf(dev->nameunit, buflen, "%s%d", dc->name, dev->unit);
1724 
1725 	return (0);
1726 }
1727 
1728 /**
1729  * @internal
1730  * @brief Delete a device from a devclass
1731  *
1732  * The device is removed from the devclass's device list and its unit
1733  * number is freed.
1734 
1735  * @param dc		the devclass to delete from
1736  * @param dev		the device to delete
1737  *
1738  * @retval 0		success
1739  */
1740 static int
devclass_delete_device(devclass_t dc,device_t dev)1741 devclass_delete_device(devclass_t dc, device_t dev)
1742 {
1743 	if (!dc || !dev)
1744 		return (0);
1745 
1746 	PDEBUG(("%s in devclass %s", DEVICENAME(dev), DEVCLANAME(dc)));
1747 
1748 	if (dev->devclass != dc || dc->devices[dev->unit] != dev)
1749 		panic("devclass_delete_device: inconsistent device class");
1750 	dc->devices[dev->unit] = NULL;
1751 	if (dev->flags & DF_WILDCARD)
1752 		dev->unit = -1;
1753 	dev->devclass = NULL;
1754 	free(dev->nameunit, M_BUS);
1755 	dev->nameunit = NULL;
1756 
1757 	return (0);
1758 }
1759 
1760 /**
1761  * @internal
1762  * @brief Make a new device and add it as a child of @p parent
1763  *
1764  * @param parent	the parent of the new device
1765  * @param name		the devclass name of the new device or @c NULL
1766  *			to leave the devclass unspecified
1767  * @parem unit		the unit number of the new device of @c -1 to
1768  *			leave the unit number unspecified
1769  *
1770  * @returns the new device
1771  */
1772 static device_t
make_device(device_t parent,const char * name,int unit)1773 make_device(device_t parent, const char *name, int unit)
1774 {
1775 	device_t dev;
1776 	devclass_t dc;
1777 
1778 	PDEBUG(("%s at %s as unit %d", name, DEVICENAME(parent), unit));
1779 
1780 	if (name) {
1781 		dc = devclass_find_internal(name, NULL, TRUE);
1782 		if (!dc) {
1783 			printf("make_device: can't find device class %s\n",
1784 			    name);
1785 			return (NULL);
1786 		}
1787 	} else {
1788 		dc = NULL;
1789 	}
1790 
1791 	dev = malloc(sizeof(*dev), M_BUS, M_NOWAIT|M_ZERO);
1792 	if (!dev)
1793 		return (NULL);
1794 
1795 	dev->parent = parent;
1796 	TAILQ_INIT(&dev->children);
1797 	kobj_init((kobj_t) dev, &null_class);
1798 	dev->driver = NULL;
1799 	dev->devclass = NULL;
1800 	dev->unit = unit;
1801 	dev->nameunit = NULL;
1802 	dev->desc = NULL;
1803 	dev->busy = 0;
1804 	dev->devflags = 0;
1805 	dev->flags = DF_ENABLED;
1806 	dev->order = 0;
1807 	if (unit == -1)
1808 		dev->flags |= DF_WILDCARD;
1809 	if (name) {
1810 		dev->flags |= DF_FIXEDCLASS;
1811 		if (devclass_add_device(dc, dev)) {
1812 			kobj_delete((kobj_t) dev, M_BUS);
1813 			return (NULL);
1814 		}
1815 	}
1816 	if (parent != NULL && device_has_quiet_children(parent))
1817 		dev->flags |= DF_QUIET | DF_QUIET_CHILDREN;
1818 	dev->ivars = NULL;
1819 	dev->softc = NULL;
1820 
1821 	dev->state = DS_NOTPRESENT;
1822 
1823 	TAILQ_INSERT_TAIL(&bus_data_devices, dev, devlink);
1824 	bus_data_generation_update();
1825 
1826 	return (dev);
1827 }
1828 
1829 /**
1830  * @internal
1831  * @brief Print a description of a device.
1832  */
1833 static int
device_print_child(device_t dev,device_t child)1834 device_print_child(device_t dev, device_t child)
1835 {
1836 	int retval = 0;
1837 
1838 	if (device_is_alive(child))
1839 		retval += BUS_PRINT_CHILD(dev, child);
1840 	else
1841 		retval += device_printf(child, " not found\n");
1842 
1843 	return (retval);
1844 }
1845 
1846 /**
1847  * @brief Create a new device
1848  *
1849  * This creates a new device and adds it as a child of an existing
1850  * parent device. The new device will be added after the last existing
1851  * child with order zero.
1852  *
1853  * @param dev		the device which will be the parent of the
1854  *			new child device
1855  * @param name		devclass name for new device or @c NULL if not
1856  *			specified
1857  * @param unit		unit number for new device or @c -1 if not
1858  *			specified
1859  *
1860  * @returns		the new device
1861  */
1862 device_t
device_add_child(device_t dev,const char * name,int unit)1863 device_add_child(device_t dev, const char *name, int unit)
1864 {
1865 	return (device_add_child_ordered(dev, 0, name, unit));
1866 }
1867 
1868 /**
1869  * @brief Create a new device
1870  *
1871  * This creates a new device and adds it as a child of an existing
1872  * parent device. The new device will be added after the last existing
1873  * child with the same order.
1874  *
1875  * @param dev		the device which will be the parent of the
1876  *			new child device
1877  * @param order		a value which is used to partially sort the
1878  *			children of @p dev - devices created using
1879  *			lower values of @p order appear first in @p
1880  *			dev's list of children
1881  * @param name		devclass name for new device or @c NULL if not
1882  *			specified
1883  * @param unit		unit number for new device or @c -1 if not
1884  *			specified
1885  *
1886  * @returns		the new device
1887  */
1888 device_t
device_add_child_ordered(device_t dev,u_int order,const char * name,int unit)1889 device_add_child_ordered(device_t dev, u_int order, const char *name, int unit)
1890 {
1891 	device_t child;
1892 	device_t place;
1893 
1894 	PDEBUG(("%s at %s with order %u as unit %d",
1895 	    name, DEVICENAME(dev), order, unit));
1896 	KASSERT(name != NULL || unit == -1,
1897 	    ("child device with wildcard name and specific unit number"));
1898 
1899 	child = make_device(dev, name, unit);
1900 	if (child == NULL)
1901 		return (child);
1902 	child->order = order;
1903 
1904 	TAILQ_FOREACH(place, &dev->children, link) {
1905 		if (place->order > order)
1906 			break;
1907 	}
1908 
1909 	if (place) {
1910 		/*
1911 		 * The device 'place' is the first device whose order is
1912 		 * greater than the new child.
1913 		 */
1914 		TAILQ_INSERT_BEFORE(place, child, link);
1915 	} else {
1916 		/*
1917 		 * The new child's order is greater or equal to the order of
1918 		 * any existing device. Add the child to the tail of the list.
1919 		 */
1920 		TAILQ_INSERT_TAIL(&dev->children, child, link);
1921 	}
1922 
1923 	bus_data_generation_update();
1924 	return (child);
1925 }
1926 
1927 /**
1928  * @brief Delete a device
1929  *
1930  * This function deletes a device along with all of its children. If
1931  * the device currently has a driver attached to it, the device is
1932  * detached first using device_detach().
1933  *
1934  * @param dev		the parent device
1935  * @param child		the device to delete
1936  *
1937  * @retval 0		success
1938  * @retval non-zero	a unit error code describing the error
1939  */
1940 int
device_delete_child(device_t dev,device_t child)1941 device_delete_child(device_t dev, device_t child)
1942 {
1943 	int error;
1944 	device_t grandchild;
1945 
1946 	PDEBUG(("%s from %s", DEVICENAME(child), DEVICENAME(dev)));
1947 
1948 	/* detach parent before deleting children, if any */
1949 	if ((error = device_detach(child)) != 0)
1950 		return (error);
1951 
1952 	/* remove children second */
1953 	while ((grandchild = TAILQ_FIRST(&child->children)) != NULL) {
1954 		error = device_delete_child(child, grandchild);
1955 		if (error)
1956 			return (error);
1957 	}
1958 
1959 	if (child->devclass)
1960 		devclass_delete_device(child->devclass, child);
1961 	if (child->parent)
1962 		BUS_CHILD_DELETED(dev, child);
1963 	TAILQ_REMOVE(&dev->children, child, link);
1964 	TAILQ_REMOVE(&bus_data_devices, child, devlink);
1965 	kobj_delete((kobj_t) child, M_BUS);
1966 
1967 	bus_data_generation_update();
1968 	return (0);
1969 }
1970 
1971 /**
1972  * @brief Delete all children devices of the given device, if any.
1973  *
1974  * This function deletes all children devices of the given device, if
1975  * any, using the device_delete_child() function for each device it
1976  * finds. If a child device cannot be deleted, this function will
1977  * return an error code.
1978  *
1979  * @param dev		the parent device
1980  *
1981  * @retval 0		success
1982  * @retval non-zero	a device would not detach
1983  */
1984 int
device_delete_children(device_t dev)1985 device_delete_children(device_t dev)
1986 {
1987 	device_t child;
1988 	int error;
1989 
1990 	PDEBUG(("Deleting all children of %s", DEVICENAME(dev)));
1991 
1992 	error = 0;
1993 
1994 	while ((child = TAILQ_FIRST(&dev->children)) != NULL) {
1995 		error = device_delete_child(dev, child);
1996 		if (error) {
1997 			PDEBUG(("Failed deleting %s", DEVICENAME(child)));
1998 			break;
1999 		}
2000 	}
2001 	return (error);
2002 }
2003 
2004 /**
2005  * @brief Find a device given a unit number
2006  *
2007  * This is similar to devclass_get_devices() but only searches for
2008  * devices which have @p dev as a parent.
2009  *
2010  * @param dev		the parent device to search
2011  * @param unit		the unit number to search for.  If the unit is -1,
2012  *			return the first child of @p dev which has name
2013  *			@p classname (that is, the one with the lowest unit.)
2014  *
2015  * @returns		the device with the given unit number or @c
2016  *			NULL if there is no such device
2017  */
2018 device_t
device_find_child(device_t dev,const char * classname,int unit)2019 device_find_child(device_t dev, const char *classname, int unit)
2020 {
2021 	devclass_t dc;
2022 	device_t child;
2023 
2024 	dc = devclass_find(classname);
2025 	if (!dc)
2026 		return (NULL);
2027 
2028 	if (unit != -1) {
2029 		child = devclass_get_device(dc, unit);
2030 		if (child && child->parent == dev)
2031 			return (child);
2032 	} else {
2033 		for (unit = 0; unit < devclass_get_maxunit(dc); unit++) {
2034 			child = devclass_get_device(dc, unit);
2035 			if (child && child->parent == dev)
2036 				return (child);
2037 		}
2038 	}
2039 	return (NULL);
2040 }
2041 
2042 /**
2043  * @internal
2044  */
2045 static driverlink_t
first_matching_driver(devclass_t dc,device_t dev)2046 first_matching_driver(devclass_t dc, device_t dev)
2047 {
2048 	if (dev->devclass)
2049 		return (devclass_find_driver_internal(dc, dev->devclass->name));
2050 	return (TAILQ_FIRST(&dc->drivers));
2051 }
2052 
2053 /**
2054  * @internal
2055  */
2056 static driverlink_t
next_matching_driver(devclass_t dc,device_t dev,driverlink_t last)2057 next_matching_driver(devclass_t dc, device_t dev, driverlink_t last)
2058 {
2059 	if (dev->devclass) {
2060 		driverlink_t dl;
2061 		for (dl = TAILQ_NEXT(last, link); dl; dl = TAILQ_NEXT(dl, link))
2062 			if (!strcmp(dev->devclass->name, dl->driver->name))
2063 				return (dl);
2064 		return (NULL);
2065 	}
2066 	return (TAILQ_NEXT(last, link));
2067 }
2068 
2069 /**
2070  * @internal
2071  */
2072 int
device_probe_child(device_t dev,device_t child)2073 device_probe_child(device_t dev, device_t child)
2074 {
2075 	devclass_t dc;
2076 	driverlink_t best = NULL;
2077 	driverlink_t dl;
2078 	int result, pri = 0;
2079 	/* We should preserve the devclass (or lack of) set by the bus. */
2080 	int hasclass = (child->devclass != NULL);
2081 
2082 	GIANT_REQUIRED;
2083 
2084 	dc = dev->devclass;
2085 	if (!dc)
2086 		panic("device_probe_child: parent device has no devclass");
2087 
2088 	/*
2089 	 * If the state is already probed, then return.
2090 	 */
2091 	if (child->state == DS_ALIVE)
2092 		return (0);
2093 
2094 	for (; dc; dc = dc->parent) {
2095 		for (dl = first_matching_driver(dc, child);
2096 		     dl;
2097 		     dl = next_matching_driver(dc, child, dl)) {
2098 			/* If this driver's pass is too high, then ignore it. */
2099 			if (dl->pass > bus_current_pass)
2100 				continue;
2101 
2102 			PDEBUG(("Trying %s", DRIVERNAME(dl->driver)));
2103 			result = device_set_driver(child, dl->driver);
2104 			if (result == ENOMEM)
2105 				return (result);
2106 			else if (result != 0)
2107 				continue;
2108 			if (!hasclass) {
2109 				if (device_set_devclass(child,
2110 				    dl->driver->name) != 0) {
2111 					char const * devname =
2112 					    device_get_name(child);
2113 					if (devname == NULL)
2114 						devname = "(unknown)";
2115 					printf("driver bug: Unable to set "
2116 					    "devclass (class: %s "
2117 					    "devname: %s)\n",
2118 					    dl->driver->name,
2119 					    devname);
2120 					(void)device_set_driver(child, NULL);
2121 					continue;
2122 				}
2123 			}
2124 
2125 			/* Fetch any flags for the device before probing. */
2126 			resource_int_value(dl->driver->name, child->unit,
2127 			    "flags", &child->devflags);
2128 
2129 			result = DEVICE_PROBE(child);
2130 
2131 			/*
2132 			 * If the driver returns SUCCESS, there can be
2133 			 * no higher match for this device.
2134 			 */
2135 			if (result == 0) {
2136 				best = dl;
2137 				pri = 0;
2138 				break;
2139 			}
2140 
2141 			/* Reset flags and devclass before the next probe. */
2142 			child->devflags = 0;
2143 			if (!hasclass)
2144 				(void)device_set_devclass(child, NULL);
2145 
2146 			/*
2147 			 * Reset DF_QUIET in case this driver doesn't
2148 			 * end up as the best driver.
2149 			 */
2150 			device_verbose(child);
2151 
2152 			/*
2153 			 * Probes that return BUS_PROBE_NOWILDCARD or lower
2154 			 * only match on devices whose driver was explicitly
2155 			 * specified.
2156 			 */
2157 			if (result <= BUS_PROBE_NOWILDCARD &&
2158 			    !(child->flags & DF_FIXEDCLASS)) {
2159 				result = ENXIO;
2160 			}
2161 
2162 			/*
2163 			 * The driver returned an error so it
2164 			 * certainly doesn't match.
2165 			 */
2166 			if (result > 0) {
2167 				(void)device_set_driver(child, NULL);
2168 				continue;
2169 			}
2170 
2171 			/*
2172 			 * A priority lower than SUCCESS, remember the
2173 			 * best matching driver. Initialise the value
2174 			 * of pri for the first match.
2175 			 */
2176 			if (best == NULL || result > pri) {
2177 				best = dl;
2178 				pri = result;
2179 				continue;
2180 			}
2181 		}
2182 		/*
2183 		 * If we have an unambiguous match in this devclass,
2184 		 * don't look in the parent.
2185 		 */
2186 		if (best && pri == 0)
2187 			break;
2188 	}
2189 
2190 	if (best == NULL)
2191 		return (ENXIO);
2192 
2193 	/*
2194 	 * If we found a driver, change state and initialise the devclass.
2195 	 */
2196 	if (pri < 0) {
2197 		/* Set the winning driver, devclass, and flags. */
2198 		result = device_set_driver(child, best->driver);
2199 		if (result != 0)
2200 			return (result);
2201 		if (!child->devclass) {
2202 			result = device_set_devclass(child, best->driver->name);
2203 			if (result != 0) {
2204 				(void)device_set_driver(child, NULL);
2205 				return (result);
2206 			}
2207 		}
2208 		resource_int_value(best->driver->name, child->unit,
2209 		    "flags", &child->devflags);
2210 
2211 		/*
2212 		 * A bit bogus. Call the probe method again to make sure
2213 		 * that we have the right description.
2214 		 */
2215 		result = DEVICE_PROBE(child);
2216 		if (result > 0) {
2217 			if (!hasclass)
2218 				(void)device_set_devclass(child, NULL);
2219 			(void)device_set_driver(child, NULL);
2220 			return (result);
2221 		}
2222 	}
2223 
2224 	child->state = DS_ALIVE;
2225 	bus_data_generation_update();
2226 	return (0);
2227 }
2228 
2229 /**
2230  * @brief Return the parent of a device
2231  */
2232 device_t
device_get_parent(device_t dev)2233 device_get_parent(device_t dev)
2234 {
2235 	return (dev->parent);
2236 }
2237 
2238 /**
2239  * @brief Get a list of children of a device
2240  *
2241  * An array containing a list of all the children of the given device
2242  * is allocated and returned in @p *devlistp. The number of devices
2243  * in the array is returned in @p *devcountp. The caller should free
2244  * the array using @c free(p, M_TEMP).
2245  *
2246  * @param dev		the device to examine
2247  * @param devlistp	points at location for array pointer return
2248  *			value
2249  * @param devcountp	points at location for array size return value
2250  *
2251  * @retval 0		success
2252  * @retval ENOMEM	the array allocation failed
2253  */
2254 int
device_get_children(device_t dev,device_t ** devlistp,int * devcountp)2255 device_get_children(device_t dev, device_t **devlistp, int *devcountp)
2256 {
2257 	int count;
2258 	device_t child;
2259 	device_t *list;
2260 
2261 	count = 0;
2262 	TAILQ_FOREACH(child, &dev->children, link) {
2263 		count++;
2264 	}
2265 	if (count == 0) {
2266 		*devlistp = NULL;
2267 		*devcountp = 0;
2268 		return (0);
2269 	}
2270 
2271 	list = malloc(count * sizeof(device_t), M_TEMP, M_NOWAIT|M_ZERO);
2272 	if (!list)
2273 		return (ENOMEM);
2274 
2275 	count = 0;
2276 	TAILQ_FOREACH(child, &dev->children, link) {
2277 		list[count] = child;
2278 		count++;
2279 	}
2280 
2281 	*devlistp = list;
2282 	*devcountp = count;
2283 
2284 	return (0);
2285 }
2286 
2287 /**
2288  * @brief Return the current driver for the device or @c NULL if there
2289  * is no driver currently attached
2290  */
2291 driver_t *
device_get_driver(device_t dev)2292 device_get_driver(device_t dev)
2293 {
2294 	return (dev->driver);
2295 }
2296 
2297 /**
2298  * @brief Return the current devclass for the device or @c NULL if
2299  * there is none.
2300  */
2301 devclass_t
device_get_devclass(device_t dev)2302 device_get_devclass(device_t dev)
2303 {
2304 	return (dev->devclass);
2305 }
2306 
2307 /**
2308  * @brief Return the name of the device's devclass or @c NULL if there
2309  * is none.
2310  */
2311 const char *
device_get_name(device_t dev)2312 device_get_name(device_t dev)
2313 {
2314 	if (dev != NULL && dev->devclass)
2315 		return (devclass_get_name(dev->devclass));
2316 	return (NULL);
2317 }
2318 
2319 /**
2320  * @brief Return a string containing the device's devclass name
2321  * followed by an ascii representation of the device's unit number
2322  * (e.g. @c "foo2").
2323  */
2324 const char *
device_get_nameunit(device_t dev)2325 device_get_nameunit(device_t dev)
2326 {
2327 	return (dev->nameunit);
2328 }
2329 
2330 /**
2331  * @brief Return the device's unit number.
2332  */
2333 int
device_get_unit(device_t dev)2334 device_get_unit(device_t dev)
2335 {
2336 	return (dev->unit);
2337 }
2338 
2339 /**
2340  * @brief Return the device's description string
2341  */
2342 const char *
device_get_desc(device_t dev)2343 device_get_desc(device_t dev)
2344 {
2345 	return (dev->desc);
2346 }
2347 
2348 /**
2349  * @brief Return the device's flags
2350  */
2351 uint32_t
device_get_flags(device_t dev)2352 device_get_flags(device_t dev)
2353 {
2354 	return (dev->devflags);
2355 }
2356 
2357 struct sysctl_ctx_list *
device_get_sysctl_ctx(device_t dev)2358 device_get_sysctl_ctx(device_t dev)
2359 {
2360 	return (&dev->sysctl_ctx);
2361 }
2362 
2363 struct sysctl_oid *
device_get_sysctl_tree(device_t dev)2364 device_get_sysctl_tree(device_t dev)
2365 {
2366 	return (dev->sysctl_tree);
2367 }
2368 
2369 /**
2370  * @brief Print the name of the device followed by a colon and a space
2371  *
2372  * @returns the number of characters printed
2373  */
2374 int
device_print_prettyname(device_t dev)2375 device_print_prettyname(device_t dev)
2376 {
2377 	const char *name = device_get_name(dev);
2378 
2379 	if (name == NULL)
2380 		return (printf("unknown: "));
2381 	return (printf("%s%d: ", name, device_get_unit(dev)));
2382 }
2383 
2384 /**
2385  * @brief Print the name of the device followed by a colon, a space
2386  * and the result of calling vprintf() with the value of @p fmt and
2387  * the following arguments.
2388  *
2389  * @returns the number of characters printed
2390  */
2391 int
device_printf(device_t dev,const char * fmt,...)2392 device_printf(device_t dev, const char * fmt, ...)
2393 {
2394 	char buf[128];
2395 	struct sbuf sb;
2396 	const char *name;
2397 	va_list ap;
2398 	size_t retval;
2399 
2400 	retval = 0;
2401 
2402 	sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
2403 	sbuf_set_drain(&sb, sbuf_printf_drain, &retval);
2404 
2405 	name = device_get_name(dev);
2406 
2407 	if (name == NULL)
2408 		sbuf_cat(&sb, "unknown: ");
2409 	else
2410 		sbuf_printf(&sb, "%s%d: ", name, device_get_unit(dev));
2411 
2412 	va_start(ap, fmt);
2413 	sbuf_vprintf(&sb, fmt, ap);
2414 	va_end(ap);
2415 
2416 	sbuf_finish(&sb);
2417 	sbuf_delete(&sb);
2418 
2419 	return (retval);
2420 }
2421 
2422 /**
2423  * @internal
2424  */
2425 static void
device_set_desc_internal(device_t dev,const char * desc,int copy)2426 device_set_desc_internal(device_t dev, const char* desc, int copy)
2427 {
2428 	if (dev->desc && (dev->flags & DF_DESCMALLOCED)) {
2429 		free(dev->desc, M_BUS);
2430 		dev->flags &= ~DF_DESCMALLOCED;
2431 		dev->desc = NULL;
2432 	}
2433 
2434 	if (copy && desc) {
2435 		dev->desc = malloc(strlen(desc) + 1, M_BUS, M_NOWAIT);
2436 		if (dev->desc) {
2437 			strcpy(dev->desc, desc);
2438 			dev->flags |= DF_DESCMALLOCED;
2439 		}
2440 	} else {
2441 		/* Avoid a -Wcast-qual warning */
2442 		dev->desc = (char *)(uintptr_t) desc;
2443 	}
2444 
2445 	bus_data_generation_update();
2446 }
2447 
2448 /**
2449  * @brief Set the device's description
2450  *
2451  * The value of @c desc should be a string constant that will not
2452  * change (at least until the description is changed in a subsequent
2453  * call to device_set_desc() or device_set_desc_copy()).
2454  */
2455 void
device_set_desc(device_t dev,const char * desc)2456 device_set_desc(device_t dev, const char* desc)
2457 {
2458 	device_set_desc_internal(dev, desc, FALSE);
2459 }
2460 
2461 /**
2462  * @brief Set the device's description
2463  *
2464  * The string pointed to by @c desc is copied. Use this function if
2465  * the device description is generated, (e.g. with sprintf()).
2466  */
2467 void
device_set_desc_copy(device_t dev,const char * desc)2468 device_set_desc_copy(device_t dev, const char* desc)
2469 {
2470 	device_set_desc_internal(dev, desc, TRUE);
2471 }
2472 
2473 /**
2474  * @brief Set the device's flags
2475  */
2476 void
device_set_flags(device_t dev,uint32_t flags)2477 device_set_flags(device_t dev, uint32_t flags)
2478 {
2479 	dev->devflags = flags;
2480 }
2481 
2482 /**
2483  * @brief Return the device's softc field
2484  *
2485  * The softc is allocated and zeroed when a driver is attached, based
2486  * on the size field of the driver.
2487  */
2488 void *
device_get_softc(device_t dev)2489 device_get_softc(device_t dev)
2490 {
2491 	return (dev->softc);
2492 }
2493 
2494 /**
2495  * @brief Set the device's softc field
2496  *
2497  * Most drivers do not need to use this since the softc is allocated
2498  * automatically when the driver is attached.
2499  */
2500 void
device_set_softc(device_t dev,void * softc)2501 device_set_softc(device_t dev, void *softc)
2502 {
2503 	if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC))
2504 		free(dev->softc, M_BUS_SC);
2505 	dev->softc = softc;
2506 	if (dev->softc)
2507 		dev->flags |= DF_EXTERNALSOFTC;
2508 	else
2509 		dev->flags &= ~DF_EXTERNALSOFTC;
2510 }
2511 
2512 /**
2513  * @brief Free claimed softc
2514  *
2515  * Most drivers do not need to use this since the softc is freed
2516  * automatically when the driver is detached.
2517  */
2518 void
device_free_softc(void * softc)2519 device_free_softc(void *softc)
2520 {
2521 	free(softc, M_BUS_SC);
2522 }
2523 
2524 /**
2525  * @brief Claim softc
2526  *
2527  * This function can be used to let the driver free the automatically
2528  * allocated softc using "device_free_softc()". This function is
2529  * useful when the driver is refcounting the softc and the softc
2530  * cannot be freed when the "device_detach" method is called.
2531  */
2532 void
device_claim_softc(device_t dev)2533 device_claim_softc(device_t dev)
2534 {
2535 	if (dev->softc)
2536 		dev->flags |= DF_EXTERNALSOFTC;
2537 	else
2538 		dev->flags &= ~DF_EXTERNALSOFTC;
2539 }
2540 
2541 /**
2542  * @brief Get the device's ivars field
2543  *
2544  * The ivars field is used by the parent device to store per-device
2545  * state (e.g. the physical location of the device or a list of
2546  * resources).
2547  */
2548 void *
device_get_ivars(device_t dev)2549 device_get_ivars(device_t dev)
2550 {
2551 	KASSERT(dev != NULL, ("device_get_ivars(NULL, ...)"));
2552 	return (dev->ivars);
2553 }
2554 
2555 /**
2556  * @brief Set the device's ivars field
2557  */
2558 void
device_set_ivars(device_t dev,void * ivars)2559 device_set_ivars(device_t dev, void * ivars)
2560 {
2561 	KASSERT(dev != NULL, ("device_set_ivars(NULL, ...)"));
2562 	dev->ivars = ivars;
2563 }
2564 
2565 /**
2566  * @brief Return the device's state
2567  */
2568 device_state_t
device_get_state(device_t dev)2569 device_get_state(device_t dev)
2570 {
2571 	return (dev->state);
2572 }
2573 
2574 /**
2575  * @brief Set the DF_ENABLED flag for the device
2576  */
2577 void
device_enable(device_t dev)2578 device_enable(device_t dev)
2579 {
2580 	dev->flags |= DF_ENABLED;
2581 }
2582 
2583 /**
2584  * @brief Clear the DF_ENABLED flag for the device
2585  */
2586 void
device_disable(device_t dev)2587 device_disable(device_t dev)
2588 {
2589 	dev->flags &= ~DF_ENABLED;
2590 }
2591 
2592 /**
2593  * @brief Increment the busy counter for the device
2594  */
2595 void
device_busy(device_t dev)2596 device_busy(device_t dev)
2597 {
2598 	if (dev->state < DS_ATTACHING)
2599 		panic("device_busy: called for unattached device");
2600 	if (dev->busy == 0 && dev->parent)
2601 		device_busy(dev->parent);
2602 	dev->busy++;
2603 	if (dev->state == DS_ATTACHED)
2604 		dev->state = DS_BUSY;
2605 }
2606 
2607 /**
2608  * @brief Decrement the busy counter for the device
2609  */
2610 void
device_unbusy(device_t dev)2611 device_unbusy(device_t dev)
2612 {
2613 	if (dev->busy != 0 && dev->state != DS_BUSY &&
2614 	    dev->state != DS_ATTACHING)
2615 		panic("device_unbusy: called for non-busy device %s",
2616 		    device_get_nameunit(dev));
2617 	dev->busy--;
2618 	if (dev->busy == 0) {
2619 		if (dev->parent)
2620 			device_unbusy(dev->parent);
2621 		if (dev->state == DS_BUSY)
2622 			dev->state = DS_ATTACHED;
2623 	}
2624 }
2625 
2626 /**
2627  * @brief Set the DF_QUIET flag for the device
2628  */
2629 void
device_quiet(device_t dev)2630 device_quiet(device_t dev)
2631 {
2632 	dev->flags |= DF_QUIET;
2633 }
2634 
2635 /**
2636  * @brief Set the DF_QUIET_CHILDREN flag for the device
2637  */
2638 void
device_quiet_children(device_t dev)2639 device_quiet_children(device_t dev)
2640 {
2641 	dev->flags |= DF_QUIET_CHILDREN;
2642 }
2643 
2644 /**
2645  * @brief Clear the DF_QUIET flag for the device
2646  */
2647 void
device_verbose(device_t dev)2648 device_verbose(device_t dev)
2649 {
2650 	dev->flags &= ~DF_QUIET;
2651 }
2652 
2653 /**
2654  * @brief Return non-zero if the DF_QUIET_CHIDLREN flag is set on the device
2655  */
2656 int
device_has_quiet_children(device_t dev)2657 device_has_quiet_children(device_t dev)
2658 {
2659 	return ((dev->flags & DF_QUIET_CHILDREN) != 0);
2660 }
2661 
2662 /**
2663  * @brief Return non-zero if the DF_QUIET flag is set on the device
2664  */
2665 int
device_is_quiet(device_t dev)2666 device_is_quiet(device_t dev)
2667 {
2668 	return ((dev->flags & DF_QUIET) != 0);
2669 }
2670 
2671 /**
2672  * @brief Return non-zero if the DF_ENABLED flag is set on the device
2673  */
2674 int
device_is_enabled(device_t dev)2675 device_is_enabled(device_t dev)
2676 {
2677 	return ((dev->flags & DF_ENABLED) != 0);
2678 }
2679 
2680 /**
2681  * @brief Return non-zero if the device was successfully probed
2682  */
2683 int
device_is_alive(device_t dev)2684 device_is_alive(device_t dev)
2685 {
2686 	return (dev->state >= DS_ALIVE);
2687 }
2688 
2689 /**
2690  * @brief Return non-zero if the device currently has a driver
2691  * attached to it
2692  */
2693 int
device_is_attached(device_t dev)2694 device_is_attached(device_t dev)
2695 {
2696 	return (dev->state >= DS_ATTACHED);
2697 }
2698 
2699 /**
2700  * @brief Return non-zero if the device is currently suspended.
2701  */
2702 int
device_is_suspended(device_t dev)2703 device_is_suspended(device_t dev)
2704 {
2705 	return ((dev->flags & DF_SUSPENDED) != 0);
2706 }
2707 
2708 /**
2709  * @brief Set the devclass of a device
2710  * @see devclass_add_device().
2711  */
2712 int
device_set_devclass(device_t dev,const char * classname)2713 device_set_devclass(device_t dev, const char *classname)
2714 {
2715 	devclass_t dc;
2716 	int error;
2717 
2718 	if (!classname) {
2719 		if (dev->devclass)
2720 			devclass_delete_device(dev->devclass, dev);
2721 		return (0);
2722 	}
2723 
2724 	if (dev->devclass) {
2725 		printf("device_set_devclass: device class already set\n");
2726 		return (EINVAL);
2727 	}
2728 
2729 	dc = devclass_find_internal(classname, NULL, TRUE);
2730 	if (!dc)
2731 		return (ENOMEM);
2732 
2733 	error = devclass_add_device(dc, dev);
2734 
2735 	bus_data_generation_update();
2736 	return (error);
2737 }
2738 
2739 /**
2740  * @brief Set the devclass of a device and mark the devclass fixed.
2741  * @see device_set_devclass()
2742  */
2743 int
device_set_devclass_fixed(device_t dev,const char * classname)2744 device_set_devclass_fixed(device_t dev, const char *classname)
2745 {
2746 	int error;
2747 
2748 	if (classname == NULL)
2749 		return (EINVAL);
2750 
2751 	error = device_set_devclass(dev, classname);
2752 	if (error)
2753 		return (error);
2754 	dev->flags |= DF_FIXEDCLASS;
2755 	return (0);
2756 }
2757 
2758 /**
2759  * @brief Query the device to determine if it's of a fixed devclass
2760  * @see device_set_devclass_fixed()
2761  */
2762 bool
device_is_devclass_fixed(device_t dev)2763 device_is_devclass_fixed(device_t dev)
2764 {
2765 	return ((dev->flags & DF_FIXEDCLASS) != 0);
2766 }
2767 
2768 /**
2769  * @brief Set the driver of a device
2770  *
2771  * @retval 0		success
2772  * @retval EBUSY	the device already has a driver attached
2773  * @retval ENOMEM	a memory allocation failure occurred
2774  */
2775 int
device_set_driver(device_t dev,driver_t * driver)2776 device_set_driver(device_t dev, driver_t *driver)
2777 {
2778 	int domain;
2779 	struct domainset *policy;
2780 
2781 	if (dev->state >= DS_ATTACHED)
2782 		return (EBUSY);
2783 
2784 	if (dev->driver == driver)
2785 		return (0);
2786 
2787 	if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC)) {
2788 		free(dev->softc, M_BUS_SC);
2789 		dev->softc = NULL;
2790 	}
2791 	device_set_desc(dev, NULL);
2792 	kobj_delete((kobj_t) dev, NULL);
2793 	dev->driver = driver;
2794 	if (driver) {
2795 		kobj_init((kobj_t) dev, (kobj_class_t) driver);
2796 		if (!(dev->flags & DF_EXTERNALSOFTC) && driver->size > 0) {
2797 			if (bus_get_domain(dev, &domain) == 0)
2798 				policy = DOMAINSET_PREF(domain);
2799 			else
2800 				policy = DOMAINSET_RR();
2801 			dev->softc = malloc_domainset(driver->size, M_BUS_SC,
2802 			    policy, M_NOWAIT | M_ZERO);
2803 			if (!dev->softc) {
2804 				kobj_delete((kobj_t) dev, NULL);
2805 				kobj_init((kobj_t) dev, &null_class);
2806 				dev->driver = NULL;
2807 				return (ENOMEM);
2808 			}
2809 		}
2810 	} else {
2811 		kobj_init((kobj_t) dev, &null_class);
2812 	}
2813 
2814 	bus_data_generation_update();
2815 	return (0);
2816 }
2817 
2818 /**
2819  * @brief Probe a device, and return this status.
2820  *
2821  * This function is the core of the device autoconfiguration
2822  * system. Its purpose is to select a suitable driver for a device and
2823  * then call that driver to initialise the hardware appropriately. The
2824  * driver is selected by calling the DEVICE_PROBE() method of a set of
2825  * candidate drivers and then choosing the driver which returned the
2826  * best value. This driver is then attached to the device using
2827  * device_attach().
2828  *
2829  * The set of suitable drivers is taken from the list of drivers in
2830  * the parent device's devclass. If the device was originally created
2831  * with a specific class name (see device_add_child()), only drivers
2832  * with that name are probed, otherwise all drivers in the devclass
2833  * are probed. If no drivers return successful probe values in the
2834  * parent devclass, the search continues in the parent of that
2835  * devclass (see devclass_get_parent()) if any.
2836  *
2837  * @param dev		the device to initialise
2838  *
2839  * @retval 0		success
2840  * @retval ENXIO	no driver was found
2841  * @retval ENOMEM	memory allocation failure
2842  * @retval non-zero	some other unix error code
2843  * @retval -1		Device already attached
2844  */
2845 int
device_probe(device_t dev)2846 device_probe(device_t dev)
2847 {
2848 	int error;
2849 
2850 	GIANT_REQUIRED;
2851 
2852 	if (dev->state >= DS_ALIVE)
2853 		return (-1);
2854 
2855 	if (!(dev->flags & DF_ENABLED)) {
2856 		if (bootverbose && device_get_name(dev) != NULL) {
2857 			device_print_prettyname(dev);
2858 			printf("not probed (disabled)\n");
2859 		}
2860 		return (-1);
2861 	}
2862 	if ((error = device_probe_child(dev->parent, dev)) != 0) {
2863 		if (bus_current_pass == BUS_PASS_DEFAULT &&
2864 		    !(dev->flags & DF_DONENOMATCH)) {
2865 			BUS_PROBE_NOMATCH(dev->parent, dev);
2866 			devnomatch(dev);
2867 			dev->flags |= DF_DONENOMATCH;
2868 		}
2869 		return (error);
2870 	}
2871 	return (0);
2872 }
2873 
2874 /**
2875  * @brief Probe a device and attach a driver if possible
2876  *
2877  * calls device_probe() and attaches if that was successful.
2878  */
2879 int
device_probe_and_attach(device_t dev)2880 device_probe_and_attach(device_t dev)
2881 {
2882 	int error;
2883 
2884 	GIANT_REQUIRED;
2885 
2886 	error = device_probe(dev);
2887 	if (error == -1)
2888 		return (0);
2889 	else if (error != 0)
2890 		return (error);
2891 
2892 	CURVNET_SET_QUIET(vnet0);
2893 	error = device_attach(dev);
2894 	CURVNET_RESTORE();
2895 	return error;
2896 }
2897 
2898 /**
2899  * @brief Attach a device driver to a device
2900  *
2901  * This function is a wrapper around the DEVICE_ATTACH() driver
2902  * method. In addition to calling DEVICE_ATTACH(), it initialises the
2903  * device's sysctl tree, optionally prints a description of the device
2904  * and queues a notification event for user-based device management
2905  * services.
2906  *
2907  * Normally this function is only called internally from
2908  * device_probe_and_attach().
2909  *
2910  * @param dev		the device to initialise
2911  *
2912  * @retval 0		success
2913  * @retval ENXIO	no driver was found
2914  * @retval ENOMEM	memory allocation failure
2915  * @retval non-zero	some other unix error code
2916  */
2917 int
device_attach(device_t dev)2918 device_attach(device_t dev)
2919 {
2920 	uint64_t attachtime;
2921 	uint16_t attachentropy;
2922 	int error;
2923 
2924 	if (resource_disabled(dev->driver->name, dev->unit)) {
2925 		device_disable(dev);
2926 		if (bootverbose)
2927 			 device_printf(dev, "disabled via hints entry\n");
2928 		return (ENXIO);
2929 	}
2930 
2931 	device_sysctl_init(dev);
2932 	if (!device_is_quiet(dev))
2933 		device_print_child(dev->parent, dev);
2934 	attachtime = get_cyclecount();
2935 	dev->state = DS_ATTACHING;
2936 	if ((error = DEVICE_ATTACH(dev)) != 0) {
2937 		printf("device_attach: %s%d attach returned %d\n",
2938 		    dev->driver->name, dev->unit, error);
2939 		if (!(dev->flags & DF_FIXEDCLASS))
2940 			devclass_delete_device(dev->devclass, dev);
2941 		(void)device_set_driver(dev, NULL);
2942 		device_sysctl_fini(dev);
2943 		KASSERT(dev->busy == 0, ("attach failed but busy"));
2944 		dev->state = DS_NOTPRESENT;
2945 		return (error);
2946 	}
2947 	dev->flags |= DF_ATTACHED_ONCE;
2948 	/* We only need the low bits of this time, but ranges from tens to thousands
2949 	 * have been seen, so keep 2 bytes' worth.
2950 	 */
2951 	attachentropy = (uint16_t)(get_cyclecount() - attachtime);
2952 	random_harvest_direct(&attachentropy, sizeof(attachentropy), RANDOM_ATTACH);
2953 	device_sysctl_update(dev);
2954 	if (dev->busy)
2955 		dev->state = DS_BUSY;
2956 	else
2957 		dev->state = DS_ATTACHED;
2958 	dev->flags &= ~DF_DONENOMATCH;
2959 	EVENTHANDLER_DIRECT_INVOKE(device_attach, dev);
2960 	devadded(dev);
2961 	return (0);
2962 }
2963 
2964 /**
2965  * @brief Detach a driver from a device
2966  *
2967  * This function is a wrapper around the DEVICE_DETACH() driver
2968  * method. If the call to DEVICE_DETACH() succeeds, it calls
2969  * BUS_CHILD_DETACHED() for the parent of @p dev, queues a
2970  * notification event for user-based device management services and
2971  * cleans up the device's sysctl tree.
2972  *
2973  * @param dev		the device to un-initialise
2974  *
2975  * @retval 0		success
2976  * @retval ENXIO	no driver was found
2977  * @retval ENOMEM	memory allocation failure
2978  * @retval non-zero	some other unix error code
2979  */
2980 int
device_detach(device_t dev)2981 device_detach(device_t dev)
2982 {
2983 	int error;
2984 
2985 	GIANT_REQUIRED;
2986 
2987 	PDEBUG(("%s", DEVICENAME(dev)));
2988 	if (dev->state == DS_BUSY)
2989 		return (EBUSY);
2990 	if (dev->state == DS_ATTACHING) {
2991 		device_printf(dev, "device in attaching state! Deferring detach.\n");
2992 		return (EBUSY);
2993 	}
2994 	if (dev->state != DS_ATTACHED)
2995 		return (0);
2996 
2997 	EVENTHANDLER_DIRECT_INVOKE(device_detach, dev, EVHDEV_DETACH_BEGIN);
2998 	if ((error = DEVICE_DETACH(dev)) != 0) {
2999 		EVENTHANDLER_DIRECT_INVOKE(device_detach, dev,
3000 		    EVHDEV_DETACH_FAILED);
3001 		return (error);
3002 	} else {
3003 		EVENTHANDLER_DIRECT_INVOKE(device_detach, dev,
3004 		    EVHDEV_DETACH_COMPLETE);
3005 	}
3006 	devremoved(dev);
3007 	if (!device_is_quiet(dev))
3008 		device_printf(dev, "detached\n");
3009 	if (dev->parent)
3010 		BUS_CHILD_DETACHED(dev->parent, dev);
3011 
3012 	if (!(dev->flags & DF_FIXEDCLASS))
3013 		devclass_delete_device(dev->devclass, dev);
3014 
3015 	device_verbose(dev);
3016 	dev->state = DS_NOTPRESENT;
3017 	(void)device_set_driver(dev, NULL);
3018 	device_sysctl_fini(dev);
3019 
3020 	return (0);
3021 }
3022 
3023 /**
3024  * @brief Tells a driver to quiesce itself.
3025  *
3026  * This function is a wrapper around the DEVICE_QUIESCE() driver
3027  * method. If the call to DEVICE_QUIESCE() succeeds.
3028  *
3029  * @param dev		the device to quiesce
3030  *
3031  * @retval 0		success
3032  * @retval ENXIO	no driver was found
3033  * @retval ENOMEM	memory allocation failure
3034  * @retval non-zero	some other unix error code
3035  */
3036 int
device_quiesce(device_t dev)3037 device_quiesce(device_t dev)
3038 {
3039 	PDEBUG(("%s", DEVICENAME(dev)));
3040 	if (dev->state == DS_BUSY)
3041 		return (EBUSY);
3042 	if (dev->state != DS_ATTACHED)
3043 		return (0);
3044 
3045 	return (DEVICE_QUIESCE(dev));
3046 }
3047 
3048 /**
3049  * @brief Notify a device of system shutdown
3050  *
3051  * This function calls the DEVICE_SHUTDOWN() driver method if the
3052  * device currently has an attached driver.
3053  *
3054  * @returns the value returned by DEVICE_SHUTDOWN()
3055  */
3056 int
device_shutdown(device_t dev)3057 device_shutdown(device_t dev)
3058 {
3059 	if (dev->state < DS_ATTACHED)
3060 		return (0);
3061 	return (DEVICE_SHUTDOWN(dev));
3062 }
3063 
3064 /**
3065  * @brief Set the unit number of a device
3066  *
3067  * This function can be used to override the unit number used for a
3068  * device (e.g. to wire a device to a pre-configured unit number).
3069  */
3070 int
device_set_unit(device_t dev,int unit)3071 device_set_unit(device_t dev, int unit)
3072 {
3073 	devclass_t dc;
3074 	int err;
3075 
3076 	if (unit == dev->unit)
3077 		return (0);
3078 	dc = device_get_devclass(dev);
3079 	if (unit < dc->maxunit && dc->devices[unit])
3080 		return (EBUSY);
3081 	err = devclass_delete_device(dc, dev);
3082 	if (err)
3083 		return (err);
3084 	dev->unit = unit;
3085 	err = devclass_add_device(dc, dev);
3086 	if (err)
3087 		return (err);
3088 
3089 	bus_data_generation_update();
3090 	return (0);
3091 }
3092 
3093 /*======================================*/
3094 /*
3095  * Some useful method implementations to make life easier for bus drivers.
3096  */
3097 
3098 void
resource_init_map_request_impl(struct resource_map_request * args,size_t sz)3099 resource_init_map_request_impl(struct resource_map_request *args, size_t sz)
3100 {
3101 	bzero(args, sz);
3102 	args->size = sz;
3103 	args->memattr = VM_MEMATTR_DEVICE;
3104 }
3105 
3106 /**
3107  * @brief Initialise a resource list.
3108  *
3109  * @param rl		the resource list to initialise
3110  */
3111 void
resource_list_init(struct resource_list * rl)3112 resource_list_init(struct resource_list *rl)
3113 {
3114 	STAILQ_INIT(rl);
3115 }
3116 
3117 /**
3118  * @brief Reclaim memory used by a resource list.
3119  *
3120  * This function frees the memory for all resource entries on the list
3121  * (if any).
3122  *
3123  * @param rl		the resource list to free
3124  */
3125 void
resource_list_free(struct resource_list * rl)3126 resource_list_free(struct resource_list *rl)
3127 {
3128 	struct resource_list_entry *rle;
3129 
3130 	while ((rle = STAILQ_FIRST(rl)) != NULL) {
3131 		if (rle->res)
3132 			panic("resource_list_free: resource entry is busy");
3133 		STAILQ_REMOVE_HEAD(rl, link);
3134 		free(rle, M_BUS);
3135 	}
3136 }
3137 
3138 /**
3139  * @brief Add a resource entry.
3140  *
3141  * This function adds a resource entry using the given @p type, @p
3142  * start, @p end and @p count values. A rid value is chosen by
3143  * searching sequentially for the first unused rid starting at zero.
3144  *
3145  * @param rl		the resource list to edit
3146  * @param type		the resource entry type (e.g. SYS_RES_MEMORY)
3147  * @param start		the start address of the resource
3148  * @param end		the end address of the resource
3149  * @param count		XXX end-start+1
3150  */
3151 int
resource_list_add_next(struct resource_list * rl,int type,rman_res_t start,rman_res_t end,rman_res_t count)3152 resource_list_add_next(struct resource_list *rl, int type, rman_res_t start,
3153     rman_res_t end, rman_res_t count)
3154 {
3155 	int rid;
3156 
3157 	rid = 0;
3158 	while (resource_list_find(rl, type, rid) != NULL)
3159 		rid++;
3160 	resource_list_add(rl, type, rid, start, end, count);
3161 	return (rid);
3162 }
3163 
3164 /**
3165  * @brief Add or modify a resource entry.
3166  *
3167  * If an existing entry exists with the same type and rid, it will be
3168  * modified using the given values of @p start, @p end and @p
3169  * count. If no entry exists, a new one will be created using the
3170  * given values.  The resource list entry that matches is then returned.
3171  *
3172  * @param rl		the resource list to edit
3173  * @param type		the resource entry type (e.g. SYS_RES_MEMORY)
3174  * @param rid		the resource identifier
3175  * @param start		the start address of the resource
3176  * @param end		the end address of the resource
3177  * @param count		XXX end-start+1
3178  */
3179 struct resource_list_entry *
resource_list_add(struct resource_list * rl,int type,int rid,rman_res_t start,rman_res_t end,rman_res_t count)3180 resource_list_add(struct resource_list *rl, int type, int rid,
3181     rman_res_t start, rman_res_t end, rman_res_t count)
3182 {
3183 	struct resource_list_entry *rle;
3184 
3185 	rle = resource_list_find(rl, type, rid);
3186 	if (!rle) {
3187 		rle = malloc(sizeof(struct resource_list_entry), M_BUS,
3188 		    M_NOWAIT);
3189 		if (!rle)
3190 			panic("resource_list_add: can't record entry");
3191 		STAILQ_INSERT_TAIL(rl, rle, link);
3192 		rle->type = type;
3193 		rle->rid = rid;
3194 		rle->res = NULL;
3195 		rle->flags = 0;
3196 	}
3197 
3198 	if (rle->res)
3199 		panic("resource_list_add: resource entry is busy");
3200 
3201 	rle->start = start;
3202 	rle->end = end;
3203 	rle->count = count;
3204 	return (rle);
3205 }
3206 
3207 /**
3208  * @brief Determine if a resource entry is busy.
3209  *
3210  * Returns true if a resource entry is busy meaning that it has an
3211  * associated resource that is not an unallocated "reserved" resource.
3212  *
3213  * @param rl		the resource list to search
3214  * @param type		the resource entry type (e.g. SYS_RES_MEMORY)
3215  * @param rid		the resource identifier
3216  *
3217  * @returns Non-zero if the entry is busy, zero otherwise.
3218  */
3219 int
resource_list_busy(struct resource_list * rl,int type,int rid)3220 resource_list_busy(struct resource_list *rl, int type, int rid)
3221 {
3222 	struct resource_list_entry *rle;
3223 
3224 	rle = resource_list_find(rl, type, rid);
3225 	if (rle == NULL || rle->res == NULL)
3226 		return (0);
3227 	if ((rle->flags & (RLE_RESERVED | RLE_ALLOCATED)) == RLE_RESERVED) {
3228 		KASSERT(!(rman_get_flags(rle->res) & RF_ACTIVE),
3229 		    ("reserved resource is active"));
3230 		return (0);
3231 	}
3232 	return (1);
3233 }
3234 
3235 /**
3236  * @brief Determine if a resource entry is reserved.
3237  *
3238  * Returns true if a resource entry is reserved meaning that it has an
3239  * associated "reserved" resource.  The resource can either be
3240  * allocated or unallocated.
3241  *
3242  * @param rl		the resource list to search
3243  * @param type		the resource entry type (e.g. SYS_RES_MEMORY)
3244  * @param rid		the resource identifier
3245  *
3246  * @returns Non-zero if the entry is reserved, zero otherwise.
3247  */
3248 int
resource_list_reserved(struct resource_list * rl,int type,int rid)3249 resource_list_reserved(struct resource_list *rl, int type, int rid)
3250 {
3251 	struct resource_list_entry *rle;
3252 
3253 	rle = resource_list_find(rl, type, rid);
3254 	if (rle != NULL && rle->flags & RLE_RESERVED)
3255 		return (1);
3256 	return (0);
3257 }
3258 
3259 /**
3260  * @brief Find a resource entry by type and rid.
3261  *
3262  * @param rl		the resource list to search
3263  * @param type		the resource entry type (e.g. SYS_RES_MEMORY)
3264  * @param rid		the resource identifier
3265  *
3266  * @returns the resource entry pointer or NULL if there is no such
3267  * entry.
3268  */
3269 struct resource_list_entry *
resource_list_find(struct resource_list * rl,int type,int rid)3270 resource_list_find(struct resource_list *rl, int type, int rid)
3271 {
3272 	struct resource_list_entry *rle;
3273 
3274 	STAILQ_FOREACH(rle, rl, link) {
3275 		if (rle->type == type && rle->rid == rid)
3276 			return (rle);
3277 	}
3278 	return (NULL);
3279 }
3280 
3281 /**
3282  * @brief Delete a resource entry.
3283  *
3284  * @param rl		the resource list to edit
3285  * @param type		the resource entry type (e.g. SYS_RES_MEMORY)
3286  * @param rid		the resource identifier
3287  */
3288 void
resource_list_delete(struct resource_list * rl,int type,int rid)3289 resource_list_delete(struct resource_list *rl, int type, int rid)
3290 {
3291 	struct resource_list_entry *rle = resource_list_find(rl, type, rid);
3292 
3293 	if (rle) {
3294 		if (rle->res != NULL)
3295 			panic("resource_list_delete: resource has not been released");
3296 		STAILQ_REMOVE(rl, rle, resource_list_entry, link);
3297 		free(rle, M_BUS);
3298 	}
3299 }
3300 
3301 /**
3302  * @brief Allocate a reserved resource
3303  *
3304  * This can be used by buses to force the allocation of resources
3305  * that are always active in the system even if they are not allocated
3306  * by a driver (e.g. PCI BARs).  This function is usually called when
3307  * adding a new child to the bus.  The resource is allocated from the
3308  * parent bus when it is reserved.  The resource list entry is marked
3309  * with RLE_RESERVED to note that it is a reserved resource.
3310  *
3311  * Subsequent attempts to allocate the resource with
3312  * resource_list_alloc() will succeed the first time and will set
3313  * RLE_ALLOCATED to note that it has been allocated.  When a reserved
3314  * resource that has been allocated is released with
3315  * resource_list_release() the resource RLE_ALLOCATED is cleared, but
3316  * the actual resource remains allocated.  The resource can be released to
3317  * the parent bus by calling resource_list_unreserve().
3318  *
3319  * @param rl		the resource list to allocate from
3320  * @param bus		the parent device of @p child
3321  * @param child		the device for which the resource is being reserved
3322  * @param type		the type of resource to allocate
3323  * @param rid		a pointer to the resource identifier
3324  * @param start		hint at the start of the resource range - pass
3325  *			@c 0 for any start address
3326  * @param end		hint at the end of the resource range - pass
3327  *			@c ~0 for any end address
3328  * @param count		hint at the size of range required - pass @c 1
3329  *			for any size
3330  * @param flags		any extra flags to control the resource
3331  *			allocation - see @c RF_XXX flags in
3332  *			<sys/rman.h> for details
3333  *
3334  * @returns		the resource which was allocated or @c NULL if no
3335  *			resource could be allocated
3336  */
3337 struct resource *
resource_list_reserve(struct resource_list * rl,device_t bus,device_t child,int type,int * rid,rman_res_t start,rman_res_t end,rman_res_t count,u_int flags)3338 resource_list_reserve(struct resource_list *rl, device_t bus, device_t child,
3339     int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
3340 {
3341 	struct resource_list_entry *rle = NULL;
3342 	int passthrough = (device_get_parent(child) != bus);
3343 	struct resource *r;
3344 
3345 	if (passthrough)
3346 		panic(
3347     "resource_list_reserve() should only be called for direct children");
3348 	if (flags & RF_ACTIVE)
3349 		panic(
3350     "resource_list_reserve() should only reserve inactive resources");
3351 
3352 	r = resource_list_alloc(rl, bus, child, type, rid, start, end, count,
3353 	    flags);
3354 	if (r != NULL) {
3355 		rle = resource_list_find(rl, type, *rid);
3356 		rle->flags |= RLE_RESERVED;
3357 	}
3358 	return (r);
3359 }
3360 
3361 /**
3362  * @brief Helper function for implementing BUS_ALLOC_RESOURCE()
3363  *
3364  * Implement BUS_ALLOC_RESOURCE() by looking up a resource from the list
3365  * and passing the allocation up to the parent of @p bus. This assumes
3366  * that the first entry of @c device_get_ivars(child) is a struct
3367  * resource_list. This also handles 'passthrough' allocations where a
3368  * child is a remote descendant of bus by passing the allocation up to
3369  * the parent of bus.
3370  *
3371  * Typically, a bus driver would store a list of child resources
3372  * somewhere in the child device's ivars (see device_get_ivars()) and
3373  * its implementation of BUS_ALLOC_RESOURCE() would find that list and
3374  * then call resource_list_alloc() to perform the allocation.
3375  *
3376  * @param rl		the resource list to allocate from
3377  * @param bus		the parent device of @p child
3378  * @param child		the device which is requesting an allocation
3379  * @param type		the type of resource to allocate
3380  * @param rid		a pointer to the resource identifier
3381  * @param start		hint at the start of the resource range - pass
3382  *			@c 0 for any start address
3383  * @param end		hint at the end of the resource range - pass
3384  *			@c ~0 for any end address
3385  * @param count		hint at the size of range required - pass @c 1
3386  *			for any size
3387  * @param flags		any extra flags to control the resource
3388  *			allocation - see @c RF_XXX flags in
3389  *			<sys/rman.h> for details
3390  *
3391  * @returns		the resource which was allocated or @c NULL if no
3392  *			resource could be allocated
3393  */
3394 struct resource *
resource_list_alloc(struct resource_list * rl,device_t bus,device_t child,int type,int * rid,rman_res_t start,rman_res_t end,rman_res_t count,u_int flags)3395 resource_list_alloc(struct resource_list *rl, device_t bus, device_t child,
3396     int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
3397 {
3398 	struct resource_list_entry *rle = NULL;
3399 	int passthrough = (device_get_parent(child) != bus);
3400 	int isdefault = RMAN_IS_DEFAULT_RANGE(start, end);
3401 
3402 	if (passthrough) {
3403 		return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child,
3404 		    type, rid, start, end, count, flags));
3405 	}
3406 
3407 	rle = resource_list_find(rl, type, *rid);
3408 
3409 	if (!rle)
3410 		return (NULL);		/* no resource of that type/rid */
3411 
3412 	if (rle->res) {
3413 		if (rle->flags & RLE_RESERVED) {
3414 			if (rle->flags & RLE_ALLOCATED)
3415 				return (NULL);
3416 			if ((flags & RF_ACTIVE) &&
3417 			    bus_activate_resource(child, type, *rid,
3418 			    rle->res) != 0)
3419 				return (NULL);
3420 			rle->flags |= RLE_ALLOCATED;
3421 			return (rle->res);
3422 		}
3423 		device_printf(bus,
3424 		    "resource entry %#x type %d for child %s is busy\n", *rid,
3425 		    type, device_get_nameunit(child));
3426 		return (NULL);
3427 	}
3428 
3429 	if (isdefault) {
3430 		start = rle->start;
3431 		count = ulmax(count, rle->count);
3432 		end = ulmax(rle->end, start + count - 1);
3433 	}
3434 
3435 	rle->res = BUS_ALLOC_RESOURCE(device_get_parent(bus), child,
3436 	    type, rid, start, end, count, flags);
3437 
3438 	/*
3439 	 * Record the new range.
3440 	 */
3441 	if (rle->res) {
3442 		rle->start = rman_get_start(rle->res);
3443 		rle->end = rman_get_end(rle->res);
3444 		rle->count = count;
3445 	}
3446 
3447 	return (rle->res);
3448 }
3449 
3450 /**
3451  * @brief Helper function for implementing BUS_RELEASE_RESOURCE()
3452  *
3453  * Implement BUS_RELEASE_RESOURCE() using a resource list. Normally
3454  * used with resource_list_alloc().
3455  *
3456  * @param rl		the resource list which was allocated from
3457  * @param bus		the parent device of @p child
3458  * @param child		the device which is requesting a release
3459  * @param type		the type of resource to release
3460  * @param rid		the resource identifier
3461  * @param res		the resource to release
3462  *
3463  * @retval 0		success
3464  * @retval non-zero	a standard unix error code indicating what
3465  *			error condition prevented the operation
3466  */
3467 int
resource_list_release(struct resource_list * rl,device_t bus,device_t child,int type,int rid,struct resource * res)3468 resource_list_release(struct resource_list *rl, device_t bus, device_t child,
3469     int type, int rid, struct resource *res)
3470 {
3471 	struct resource_list_entry *rle = NULL;
3472 	int passthrough = (device_get_parent(child) != bus);
3473 	int error;
3474 
3475 	if (passthrough) {
3476 		return (BUS_RELEASE_RESOURCE(device_get_parent(bus), child,
3477 		    type, rid, res));
3478 	}
3479 
3480 	rle = resource_list_find(rl, type, rid);
3481 
3482 	if (!rle)
3483 		panic("resource_list_release: can't find resource");
3484 	if (!rle->res)
3485 		panic("resource_list_release: resource entry is not busy");
3486 	if (rle->flags & RLE_RESERVED) {
3487 		if (rle->flags & RLE_ALLOCATED) {
3488 			if (rman_get_flags(res) & RF_ACTIVE) {
3489 				error = bus_deactivate_resource(child, type,
3490 				    rid, res);
3491 				if (error)
3492 					return (error);
3493 			}
3494 			rle->flags &= ~RLE_ALLOCATED;
3495 			return (0);
3496 		}
3497 		return (EINVAL);
3498 	}
3499 
3500 	error = BUS_RELEASE_RESOURCE(device_get_parent(bus), child,
3501 	    type, rid, res);
3502 	if (error)
3503 		return (error);
3504 
3505 	rle->res = NULL;
3506 	return (0);
3507 }
3508 
3509 /**
3510  * @brief Release all active resources of a given type
3511  *
3512  * Release all active resources of a specified type.  This is intended
3513  * to be used to cleanup resources leaked by a driver after detach or
3514  * a failed attach.
3515  *
3516  * @param rl		the resource list which was allocated from
3517  * @param bus		the parent device of @p child
3518  * @param child		the device whose active resources are being released
3519  * @param type		the type of resources to release
3520  *
3521  * @retval 0		success
3522  * @retval EBUSY	at least one resource was active
3523  */
3524 int
resource_list_release_active(struct resource_list * rl,device_t bus,device_t child,int type)3525 resource_list_release_active(struct resource_list *rl, device_t bus,
3526     device_t child, int type)
3527 {
3528 	struct resource_list_entry *rle;
3529 	int error, retval;
3530 
3531 	retval = 0;
3532 	STAILQ_FOREACH(rle, rl, link) {
3533 		if (rle->type != type)
3534 			continue;
3535 		if (rle->res == NULL)
3536 			continue;
3537 		if ((rle->flags & (RLE_RESERVED | RLE_ALLOCATED)) ==
3538 		    RLE_RESERVED)
3539 			continue;
3540 		retval = EBUSY;
3541 		error = resource_list_release(rl, bus, child, type,
3542 		    rman_get_rid(rle->res), rle->res);
3543 		if (error != 0)
3544 			device_printf(bus,
3545 			    "Failed to release active resource: %d\n", error);
3546 	}
3547 	return (retval);
3548 }
3549 
3550 /**
3551  * @brief Fully release a reserved resource
3552  *
3553  * Fully releases a resource reserved via resource_list_reserve().
3554  *
3555  * @param rl		the resource list which was allocated from
3556  * @param bus		the parent device of @p child
3557  * @param child		the device whose reserved resource is being released
3558  * @param type		the type of resource to release
3559  * @param rid		the resource identifier
3560  * @param res		the resource to release
3561  *
3562  * @retval 0		success
3563  * @retval non-zero	a standard unix error code indicating what
3564  *			error condition prevented the operation
3565  */
3566 int
resource_list_unreserve(struct resource_list * rl,device_t bus,device_t child,int type,int rid)3567 resource_list_unreserve(struct resource_list *rl, device_t bus, device_t child,
3568     int type, int rid)
3569 {
3570 	struct resource_list_entry *rle = NULL;
3571 	int passthrough = (device_get_parent(child) != bus);
3572 
3573 	if (passthrough)
3574 		panic(
3575     "resource_list_unreserve() should only be called for direct children");
3576 
3577 	rle = resource_list_find(rl, type, rid);
3578 
3579 	if (!rle)
3580 		panic("resource_list_unreserve: can't find resource");
3581 	if (!(rle->flags & RLE_RESERVED))
3582 		return (EINVAL);
3583 	if (rle->flags & RLE_ALLOCATED)
3584 		return (EBUSY);
3585 	rle->flags &= ~RLE_RESERVED;
3586 	return (resource_list_release(rl, bus, child, type, rid, rle->res));
3587 }
3588 
3589 /**
3590  * @brief Print a description of resources in a resource list
3591  *
3592  * Print all resources of a specified type, for use in BUS_PRINT_CHILD().
3593  * The name is printed if at least one resource of the given type is available.
3594  * The format is used to print resource start and end.
3595  *
3596  * @param rl		the resource list to print
3597  * @param name		the name of @p type, e.g. @c "memory"
3598  * @param type		type type of resource entry to print
3599  * @param format	printf(9) format string to print resource
3600  *			start and end values
3601  *
3602  * @returns		the number of characters printed
3603  */
3604 int
resource_list_print_type(struct resource_list * rl,const char * name,int type,const char * format)3605 resource_list_print_type(struct resource_list *rl, const char *name, int type,
3606     const char *format)
3607 {
3608 	struct resource_list_entry *rle;
3609 	int printed, retval;
3610 
3611 	printed = 0;
3612 	retval = 0;
3613 	/* Yes, this is kinda cheating */
3614 	STAILQ_FOREACH(rle, rl, link) {
3615 		if (rle->type == type) {
3616 			if (printed == 0)
3617 				retval += printf(" %s ", name);
3618 			else
3619 				retval += printf(",");
3620 			printed++;
3621 			retval += printf(format, rle->start);
3622 			if (rle->count > 1) {
3623 				retval += printf("-");
3624 				retval += printf(format, rle->start +
3625 						 rle->count - 1);
3626 			}
3627 		}
3628 	}
3629 	return (retval);
3630 }
3631 
3632 /**
3633  * @brief Releases all the resources in a list.
3634  *
3635  * @param rl		The resource list to purge.
3636  *
3637  * @returns		nothing
3638  */
3639 void
resource_list_purge(struct resource_list * rl)3640 resource_list_purge(struct resource_list *rl)
3641 {
3642 	struct resource_list_entry *rle;
3643 
3644 	while ((rle = STAILQ_FIRST(rl)) != NULL) {
3645 		if (rle->res)
3646 			bus_release_resource(rman_get_device(rle->res),
3647 			    rle->type, rle->rid, rle->res);
3648 		STAILQ_REMOVE_HEAD(rl, link);
3649 		free(rle, M_BUS);
3650 	}
3651 }
3652 
3653 device_t
bus_generic_add_child(device_t dev,u_int order,const char * name,int unit)3654 bus_generic_add_child(device_t dev, u_int order, const char *name, int unit)
3655 {
3656 	return (device_add_child_ordered(dev, order, name, unit));
3657 }
3658 
3659 /**
3660  * @brief Helper function for implementing DEVICE_PROBE()
3661  *
3662  * This function can be used to help implement the DEVICE_PROBE() for
3663  * a bus (i.e. a device which has other devices attached to it). It
3664  * calls the DEVICE_IDENTIFY() method of each driver in the device's
3665  * devclass.
3666  */
3667 int
bus_generic_probe(device_t dev)3668 bus_generic_probe(device_t dev)
3669 {
3670 	devclass_t dc = dev->devclass;
3671 	driverlink_t dl;
3672 
3673 	TAILQ_FOREACH(dl, &dc->drivers, link) {
3674 		/*
3675 		 * If this driver's pass is too high, then ignore it.
3676 		 * For most drivers in the default pass, this will
3677 		 * never be true.  For early-pass drivers they will
3678 		 * only call the identify routines of eligible drivers
3679 		 * when this routine is called.  Drivers for later
3680 		 * passes should have their identify routines called
3681 		 * on early-pass buses during BUS_NEW_PASS().
3682 		 */
3683 		if (dl->pass > bus_current_pass)
3684 			continue;
3685 		DEVICE_IDENTIFY(dl->driver, dev);
3686 	}
3687 
3688 	return (0);
3689 }
3690 
3691 /**
3692  * @brief Helper function for implementing DEVICE_ATTACH()
3693  *
3694  * This function can be used to help implement the DEVICE_ATTACH() for
3695  * a bus. It calls device_probe_and_attach() for each of the device's
3696  * children.
3697  */
3698 int
bus_generic_attach(device_t dev)3699 bus_generic_attach(device_t dev)
3700 {
3701 	device_t child;
3702 
3703 	TAILQ_FOREACH(child, &dev->children, link) {
3704 		device_probe_and_attach(child);
3705 	}
3706 
3707 	return (0);
3708 }
3709 
3710 /**
3711  * @brief Helper function for delaying attaching children
3712  *
3713  * Many buses can't run transactions on the bus which children need to probe and
3714  * attach until after interrupts and/or timers are running.  This function
3715  * delays their attach until interrupts and timers are enabled.
3716  */
3717 int
bus_delayed_attach_children(device_t dev)3718 bus_delayed_attach_children(device_t dev)
3719 {
3720 	/* Probe and attach the bus children when interrupts are available */
3721 	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
3722 
3723 	return (0);
3724 }
3725 
3726 /**
3727  * @brief Helper function for implementing DEVICE_DETACH()
3728  *
3729  * This function can be used to help implement the DEVICE_DETACH() for
3730  * a bus. It calls device_detach() for each of the device's
3731  * children.
3732  */
3733 int
bus_generic_detach(device_t dev)3734 bus_generic_detach(device_t dev)
3735 {
3736 	device_t child;
3737 	int error;
3738 
3739 	if (dev->state != DS_ATTACHED)
3740 		return (EBUSY);
3741 
3742 	/*
3743 	 * Detach children in the reverse order.
3744 	 * See bus_generic_suspend for details.
3745 	 */
3746 	TAILQ_FOREACH_REVERSE(child, &dev->children, device_list, link) {
3747 		if ((error = device_detach(child)) != 0)
3748 			return (error);
3749 	}
3750 
3751 	return (0);
3752 }
3753 
3754 /**
3755  * @brief Helper function for implementing DEVICE_SHUTDOWN()
3756  *
3757  * This function can be used to help implement the DEVICE_SHUTDOWN()
3758  * for a bus. It calls device_shutdown() for each of the device's
3759  * children.
3760  */
3761 int
bus_generic_shutdown(device_t dev)3762 bus_generic_shutdown(device_t dev)
3763 {
3764 	device_t child;
3765 
3766 	/*
3767 	 * Shut down children in the reverse order.
3768 	 * See bus_generic_suspend for details.
3769 	 */
3770 	TAILQ_FOREACH_REVERSE(child, &dev->children, device_list, link) {
3771 		device_shutdown(child);
3772 	}
3773 
3774 	return (0);
3775 }
3776 
3777 /**
3778  * @brief Default function for suspending a child device.
3779  *
3780  * This function is to be used by a bus's DEVICE_SUSPEND_CHILD().
3781  */
3782 int
bus_generic_suspend_child(device_t dev,device_t child)3783 bus_generic_suspend_child(device_t dev, device_t child)
3784 {
3785 	int	error;
3786 
3787 	error = DEVICE_SUSPEND(child);
3788 
3789 	if (error == 0)
3790 		child->flags |= DF_SUSPENDED;
3791 
3792 	return (error);
3793 }
3794 
3795 /**
3796  * @brief Default function for resuming a child device.
3797  *
3798  * This function is to be used by a bus's DEVICE_RESUME_CHILD().
3799  */
3800 int
bus_generic_resume_child(device_t dev,device_t child)3801 bus_generic_resume_child(device_t dev, device_t child)
3802 {
3803 	DEVICE_RESUME(child);
3804 	child->flags &= ~DF_SUSPENDED;
3805 
3806 	return (0);
3807 }
3808 
3809 /**
3810  * @brief Helper function for implementing DEVICE_SUSPEND()
3811  *
3812  * This function can be used to help implement the DEVICE_SUSPEND()
3813  * for a bus. It calls DEVICE_SUSPEND() for each of the device's
3814  * children. If any call to DEVICE_SUSPEND() fails, the suspend
3815  * operation is aborted and any devices which were suspended are
3816  * resumed immediately by calling their DEVICE_RESUME() methods.
3817  */
3818 int
bus_generic_suspend(device_t dev)3819 bus_generic_suspend(device_t dev)
3820 {
3821 	int		error;
3822 	device_t	child;
3823 
3824 	/*
3825 	 * Suspend children in the reverse order.
3826 	 * For most buses all children are equal, so the order does not matter.
3827 	 * Other buses, such as acpi, carefully order their child devices to
3828 	 * express implicit dependencies between them.  For such buses it is
3829 	 * safer to bring down devices in the reverse order.
3830 	 */
3831 	TAILQ_FOREACH_REVERSE(child, &dev->children, device_list, link) {
3832 		error = BUS_SUSPEND_CHILD(dev, child);
3833 		if (error != 0) {
3834 			child = TAILQ_NEXT(child, link);
3835 			if (child != NULL) {
3836 				TAILQ_FOREACH_FROM(child, &dev->children, link)
3837 					BUS_RESUME_CHILD(dev, child);
3838 			}
3839 			return (error);
3840 		}
3841 	}
3842 	return (0);
3843 }
3844 
3845 /**
3846  * @brief Helper function for implementing DEVICE_RESUME()
3847  *
3848  * This function can be used to help implement the DEVICE_RESUME() for
3849  * a bus. It calls DEVICE_RESUME() on each of the device's children.
3850  */
3851 int
bus_generic_resume(device_t dev)3852 bus_generic_resume(device_t dev)
3853 {
3854 	device_t	child;
3855 
3856 	TAILQ_FOREACH(child, &dev->children, link) {
3857 		BUS_RESUME_CHILD(dev, child);
3858 		/* if resume fails, there's nothing we can usefully do... */
3859 	}
3860 	return (0);
3861 }
3862 
3863 /**
3864  * @brief Helper function for implementing BUS_RESET_POST
3865  *
3866  * Bus can use this function to implement common operations of
3867  * re-attaching or resuming the children after the bus itself was
3868  * reset, and after restoring bus-unique state of children.
3869  *
3870  * @param dev	The bus
3871  * #param flags	DEVF_RESET_*
3872  */
3873 int
bus_helper_reset_post(device_t dev,int flags)3874 bus_helper_reset_post(device_t dev, int flags)
3875 {
3876 	device_t child;
3877 	int error, error1;
3878 
3879 	error = 0;
3880 	TAILQ_FOREACH(child, &dev->children,link) {
3881 		BUS_RESET_POST(dev, child);
3882 		error1 = (flags & DEVF_RESET_DETACH) != 0 ?
3883 		    device_probe_and_attach(child) :
3884 		    BUS_RESUME_CHILD(dev, child);
3885 		if (error == 0 && error1 != 0)
3886 			error = error1;
3887 	}
3888 	return (error);
3889 }
3890 
3891 static void
bus_helper_reset_prepare_rollback(device_t dev,device_t child,int flags)3892 bus_helper_reset_prepare_rollback(device_t dev, device_t child, int flags)
3893 {
3894 	child = TAILQ_NEXT(child, link);
3895 	if (child == NULL)
3896 		return;
3897 	TAILQ_FOREACH_FROM(child, &dev->children,link) {
3898 		BUS_RESET_POST(dev, child);
3899 		if ((flags & DEVF_RESET_DETACH) != 0)
3900 			device_probe_and_attach(child);
3901 		else
3902 			BUS_RESUME_CHILD(dev, child);
3903 	}
3904 }
3905 
3906 /**
3907  * @brief Helper function for implementing BUS_RESET_PREPARE
3908  *
3909  * Bus can use this function to implement common operations of
3910  * detaching or suspending the children before the bus itself is
3911  * reset, and then save bus-unique state of children that must
3912  * persists around reset.
3913  *
3914  * @param dev	The bus
3915  * #param flags	DEVF_RESET_*
3916  */
3917 int
bus_helper_reset_prepare(device_t dev,int flags)3918 bus_helper_reset_prepare(device_t dev, int flags)
3919 {
3920 	device_t child;
3921 	int error;
3922 
3923 	if (dev->state != DS_ATTACHED)
3924 		return (EBUSY);
3925 
3926 	TAILQ_FOREACH_REVERSE(child, &dev->children, device_list, link) {
3927 		if ((flags & DEVF_RESET_DETACH) != 0) {
3928 			error = device_get_state(child) == DS_ATTACHED ?
3929 			    device_detach(child) : 0;
3930 		} else {
3931 			error = BUS_SUSPEND_CHILD(dev, child);
3932 		}
3933 		if (error == 0) {
3934 			error = BUS_RESET_PREPARE(dev, child);
3935 			if (error != 0) {
3936 				if ((flags & DEVF_RESET_DETACH) != 0)
3937 					device_probe_and_attach(child);
3938 				else
3939 					BUS_RESUME_CHILD(dev, child);
3940 			}
3941 		}
3942 		if (error != 0) {
3943 			bus_helper_reset_prepare_rollback(dev, child, flags);
3944 			return (error);
3945 		}
3946 	}
3947 	return (0);
3948 }
3949 
3950 /**
3951  * @brief Helper function for implementing BUS_PRINT_CHILD().
3952  *
3953  * This function prints the first part of the ascii representation of
3954  * @p child, including its name, unit and description (if any - see
3955  * device_set_desc()).
3956  *
3957  * @returns the number of characters printed
3958  */
3959 int
bus_print_child_header(device_t dev,device_t child)3960 bus_print_child_header(device_t dev, device_t child)
3961 {
3962 	int	retval = 0;
3963 
3964 	if (device_get_desc(child)) {
3965 		retval += device_printf(child, "<%s>", device_get_desc(child));
3966 	} else {
3967 		retval += printf("%s", device_get_nameunit(child));
3968 	}
3969 
3970 	return (retval);
3971 }
3972 
3973 /**
3974  * @brief Helper function for implementing BUS_PRINT_CHILD().
3975  *
3976  * This function prints the last part of the ascii representation of
3977  * @p child, which consists of the string @c " on " followed by the
3978  * name and unit of the @p dev.
3979  *
3980  * @returns the number of characters printed
3981  */
3982 int
bus_print_child_footer(device_t dev,device_t child)3983 bus_print_child_footer(device_t dev, device_t child)
3984 {
3985 	return (printf(" on %s\n", device_get_nameunit(dev)));
3986 }
3987 
3988 /**
3989  * @brief Helper function for implementing BUS_PRINT_CHILD().
3990  *
3991  * This function prints out the VM domain for the given device.
3992  *
3993  * @returns the number of characters printed
3994  */
3995 int
bus_print_child_domain(device_t dev,device_t child)3996 bus_print_child_domain(device_t dev, device_t child)
3997 {
3998 	int domain;
3999 
4000 	/* No domain? Don't print anything */
4001 	if (BUS_GET_DOMAIN(dev, child, &domain) != 0)
4002 		return (0);
4003 
4004 	return (printf(" numa-domain %d", domain));
4005 }
4006 
4007 /**
4008  * @brief Helper function for implementing BUS_PRINT_CHILD().
4009  *
4010  * This function simply calls bus_print_child_header() followed by
4011  * bus_print_child_footer().
4012  *
4013  * @returns the number of characters printed
4014  */
4015 int
bus_generic_print_child(device_t dev,device_t child)4016 bus_generic_print_child(device_t dev, device_t child)
4017 {
4018 	int	retval = 0;
4019 
4020 	retval += bus_print_child_header(dev, child);
4021 	retval += bus_print_child_domain(dev, child);
4022 	retval += bus_print_child_footer(dev, child);
4023 
4024 	return (retval);
4025 }
4026 
4027 /**
4028  * @brief Stub function for implementing BUS_READ_IVAR().
4029  *
4030  * @returns ENOENT
4031  */
4032 int
bus_generic_read_ivar(device_t dev,device_t child,int index,uintptr_t * result)4033 bus_generic_read_ivar(device_t dev, device_t child, int index,
4034     uintptr_t * result)
4035 {
4036 	return (ENOENT);
4037 }
4038 
4039 /**
4040  * @brief Stub function for implementing BUS_WRITE_IVAR().
4041  *
4042  * @returns ENOENT
4043  */
4044 int
bus_generic_write_ivar(device_t dev,device_t child,int index,uintptr_t value)4045 bus_generic_write_ivar(device_t dev, device_t child, int index,
4046     uintptr_t value)
4047 {
4048 	return (ENOENT);
4049 }
4050 
4051 /**
4052  * @brief Stub function for implementing BUS_GET_RESOURCE_LIST().
4053  *
4054  * @returns NULL
4055  */
4056 struct resource_list *
bus_generic_get_resource_list(device_t dev,device_t child)4057 bus_generic_get_resource_list(device_t dev, device_t child)
4058 {
4059 	return (NULL);
4060 }
4061 
4062 /**
4063  * @brief Helper function for implementing BUS_DRIVER_ADDED().
4064  *
4065  * This implementation of BUS_DRIVER_ADDED() simply calls the driver's
4066  * DEVICE_IDENTIFY() method to allow it to add new children to the bus
4067  * and then calls device_probe_and_attach() for each unattached child.
4068  */
4069 void
bus_generic_driver_added(device_t dev,driver_t * driver)4070 bus_generic_driver_added(device_t dev, driver_t *driver)
4071 {
4072 	device_t child;
4073 
4074 	DEVICE_IDENTIFY(driver, dev);
4075 	TAILQ_FOREACH(child, &dev->children, link) {
4076 		if (child->state == DS_NOTPRESENT)
4077 			device_probe_and_attach(child);
4078 	}
4079 }
4080 
4081 /**
4082  * @brief Helper function for implementing BUS_NEW_PASS().
4083  *
4084  * This implementing of BUS_NEW_PASS() first calls the identify
4085  * routines for any drivers that probe at the current pass.  Then it
4086  * walks the list of devices for this bus.  If a device is already
4087  * attached, then it calls BUS_NEW_PASS() on that device.  If the
4088  * device is not already attached, it attempts to attach a driver to
4089  * it.
4090  */
4091 void
bus_generic_new_pass(device_t dev)4092 bus_generic_new_pass(device_t dev)
4093 {
4094 	driverlink_t dl;
4095 	devclass_t dc;
4096 	device_t child;
4097 
4098 	dc = dev->devclass;
4099 	TAILQ_FOREACH(dl, &dc->drivers, link) {
4100 		if (dl->pass == bus_current_pass)
4101 			DEVICE_IDENTIFY(dl->driver, dev);
4102 	}
4103 	TAILQ_FOREACH(child, &dev->children, link) {
4104 		if (child->state >= DS_ATTACHED)
4105 			BUS_NEW_PASS(child);
4106 		else if (child->state == DS_NOTPRESENT)
4107 			device_probe_and_attach(child);
4108 	}
4109 }
4110 
4111 /**
4112  * @brief Helper function for implementing BUS_SETUP_INTR().
4113  *
4114  * This simple implementation of BUS_SETUP_INTR() simply calls the
4115  * BUS_SETUP_INTR() method of the parent of @p dev.
4116  */
4117 int
bus_generic_setup_intr(device_t dev,device_t child,struct resource * irq,int flags,driver_filter_t * filter,driver_intr_t * intr,void * arg,void ** cookiep)4118 bus_generic_setup_intr(device_t dev, device_t child, struct resource *irq,
4119     int flags, driver_filter_t *filter, driver_intr_t *intr, void *arg,
4120     void **cookiep)
4121 {
4122 	/* Propagate up the bus hierarchy until someone handles it. */
4123 	if (dev->parent)
4124 		return (BUS_SETUP_INTR(dev->parent, child, irq, flags,
4125 		    filter, intr, arg, cookiep));
4126 	return (EINVAL);
4127 }
4128 
4129 /**
4130  * @brief Helper function for implementing BUS_TEARDOWN_INTR().
4131  *
4132  * This simple implementation of BUS_TEARDOWN_INTR() simply calls the
4133  * BUS_TEARDOWN_INTR() method of the parent of @p dev.
4134  */
4135 int
bus_generic_teardown_intr(device_t dev,device_t child,struct resource * irq,void * cookie)4136 bus_generic_teardown_intr(device_t dev, device_t child, struct resource *irq,
4137     void *cookie)
4138 {
4139 	/* Propagate up the bus hierarchy until someone handles it. */
4140 	if (dev->parent)
4141 		return (BUS_TEARDOWN_INTR(dev->parent, child, irq, cookie));
4142 	return (EINVAL);
4143 }
4144 
4145 /**
4146  * @brief Helper function for implementing BUS_SUSPEND_INTR().
4147  *
4148  * This simple implementation of BUS_SUSPEND_INTR() simply calls the
4149  * BUS_SUSPEND_INTR() method of the parent of @p dev.
4150  */
4151 int
bus_generic_suspend_intr(device_t dev,device_t child,struct resource * irq)4152 bus_generic_suspend_intr(device_t dev, device_t child, struct resource *irq)
4153 {
4154 	/* Propagate up the bus hierarchy until someone handles it. */
4155 	if (dev->parent)
4156 		return (BUS_SUSPEND_INTR(dev->parent, child, irq));
4157 	return (EINVAL);
4158 }
4159 
4160 /**
4161  * @brief Helper function for implementing BUS_RESUME_INTR().
4162  *
4163  * This simple implementation of BUS_RESUME_INTR() simply calls the
4164  * BUS_RESUME_INTR() method of the parent of @p dev.
4165  */
4166 int
bus_generic_resume_intr(device_t dev,device_t child,struct resource * irq)4167 bus_generic_resume_intr(device_t dev, device_t child, struct resource *irq)
4168 {
4169 	/* Propagate up the bus hierarchy until someone handles it. */
4170 	if (dev->parent)
4171 		return (BUS_RESUME_INTR(dev->parent, child, irq));
4172 	return (EINVAL);
4173 }
4174 
4175 /**
4176  * @brief Helper function for implementing BUS_ADJUST_RESOURCE().
4177  *
4178  * This simple implementation of BUS_ADJUST_RESOURCE() simply calls the
4179  * BUS_ADJUST_RESOURCE() method of the parent of @p dev.
4180  */
4181 int
bus_generic_adjust_resource(device_t dev,device_t child,int type,struct resource * r,rman_res_t start,rman_res_t end)4182 bus_generic_adjust_resource(device_t dev, device_t child, int type,
4183     struct resource *r, rman_res_t start, rman_res_t end)
4184 {
4185 	/* Propagate up the bus hierarchy until someone handles it. */
4186 	if (dev->parent)
4187 		return (BUS_ADJUST_RESOURCE(dev->parent, child, type, r, start,
4188 		    end));
4189 	return (EINVAL);
4190 }
4191 
4192 /**
4193  * @brief Helper function for implementing BUS_ALLOC_RESOURCE().
4194  *
4195  * This simple implementation of BUS_ALLOC_RESOURCE() simply calls the
4196  * BUS_ALLOC_RESOURCE() method of the parent of @p dev.
4197  */
4198 struct resource *
bus_generic_alloc_resource(device_t dev,device_t child,int type,int * rid,rman_res_t start,rman_res_t end,rman_res_t count,u_int flags)4199 bus_generic_alloc_resource(device_t dev, device_t child, int type, int *rid,
4200     rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
4201 {
4202 	/* Propagate up the bus hierarchy until someone handles it. */
4203 	if (dev->parent)
4204 		return (BUS_ALLOC_RESOURCE(dev->parent, child, type, rid,
4205 		    start, end, count, flags));
4206 	return (NULL);
4207 }
4208 
4209 /**
4210  * @brief Helper function for implementing BUS_RELEASE_RESOURCE().
4211  *
4212  * This simple implementation of BUS_RELEASE_RESOURCE() simply calls the
4213  * BUS_RELEASE_RESOURCE() method of the parent of @p dev.
4214  */
4215 int
bus_generic_release_resource(device_t dev,device_t child,int type,int rid,struct resource * r)4216 bus_generic_release_resource(device_t dev, device_t child, int type, int rid,
4217     struct resource *r)
4218 {
4219 	/* Propagate up the bus hierarchy until someone handles it. */
4220 	if (dev->parent)
4221 		return (BUS_RELEASE_RESOURCE(dev->parent, child, type, rid,
4222 		    r));
4223 	return (EINVAL);
4224 }
4225 
4226 /**
4227  * @brief Helper function for implementing BUS_ACTIVATE_RESOURCE().
4228  *
4229  * This simple implementation of BUS_ACTIVATE_RESOURCE() simply calls the
4230  * BUS_ACTIVATE_RESOURCE() method of the parent of @p dev.
4231  */
4232 int
bus_generic_activate_resource(device_t dev,device_t child,int type,int rid,struct resource * r)4233 bus_generic_activate_resource(device_t dev, device_t child, int type, int rid,
4234     struct resource *r)
4235 {
4236 	/* Propagate up the bus hierarchy until someone handles it. */
4237 	if (dev->parent)
4238 		return (BUS_ACTIVATE_RESOURCE(dev->parent, child, type, rid,
4239 		    r));
4240 	return (EINVAL);
4241 }
4242 
4243 /**
4244  * @brief Helper function for implementing BUS_DEACTIVATE_RESOURCE().
4245  *
4246  * This simple implementation of BUS_DEACTIVATE_RESOURCE() simply calls the
4247  * BUS_DEACTIVATE_RESOURCE() method of the parent of @p dev.
4248  */
4249 int
bus_generic_deactivate_resource(device_t dev,device_t child,int type,int rid,struct resource * r)4250 bus_generic_deactivate_resource(device_t dev, device_t child, int type,
4251     int rid, struct resource *r)
4252 {
4253 	/* Propagate up the bus hierarchy until someone handles it. */
4254 	if (dev->parent)
4255 		return (BUS_DEACTIVATE_RESOURCE(dev->parent, child, type, rid,
4256 		    r));
4257 	return (EINVAL);
4258 }
4259 
4260 /**
4261  * @brief Helper function for implementing BUS_MAP_RESOURCE().
4262  *
4263  * This simple implementation of BUS_MAP_RESOURCE() simply calls the
4264  * BUS_MAP_RESOURCE() method of the parent of @p dev.
4265  */
4266 int
bus_generic_map_resource(device_t dev,device_t child,int type,struct resource * r,struct resource_map_request * args,struct resource_map * map)4267 bus_generic_map_resource(device_t dev, device_t child, int type,
4268     struct resource *r, struct resource_map_request *args,
4269     struct resource_map *map)
4270 {
4271 	/* Propagate up the bus hierarchy until someone handles it. */
4272 	if (dev->parent)
4273 		return (BUS_MAP_RESOURCE(dev->parent, child, type, r, args,
4274 		    map));
4275 	return (EINVAL);
4276 }
4277 
4278 /**
4279  * @brief Helper function for implementing BUS_UNMAP_RESOURCE().
4280  *
4281  * This simple implementation of BUS_UNMAP_RESOURCE() simply calls the
4282  * BUS_UNMAP_RESOURCE() method of the parent of @p dev.
4283  */
4284 int
bus_generic_unmap_resource(device_t dev,device_t child,int type,struct resource * r,struct resource_map * map)4285 bus_generic_unmap_resource(device_t dev, device_t child, int type,
4286     struct resource *r, struct resource_map *map)
4287 {
4288 	/* Propagate up the bus hierarchy until someone handles it. */
4289 	if (dev->parent)
4290 		return (BUS_UNMAP_RESOURCE(dev->parent, child, type, r, map));
4291 	return (EINVAL);
4292 }
4293 
4294 /**
4295  * @brief Helper function for implementing BUS_BIND_INTR().
4296  *
4297  * This simple implementation of BUS_BIND_INTR() simply calls the
4298  * BUS_BIND_INTR() method of the parent of @p dev.
4299  */
4300 int
bus_generic_bind_intr(device_t dev,device_t child,struct resource * irq,int cpu)4301 bus_generic_bind_intr(device_t dev, device_t child, struct resource *irq,
4302     int cpu)
4303 {
4304 	/* Propagate up the bus hierarchy until someone handles it. */
4305 	if (dev->parent)
4306 		return (BUS_BIND_INTR(dev->parent, child, irq, cpu));
4307 	return (EINVAL);
4308 }
4309 
4310 /**
4311  * @brief Helper function for implementing BUS_CONFIG_INTR().
4312  *
4313  * This simple implementation of BUS_CONFIG_INTR() simply calls the
4314  * BUS_CONFIG_INTR() method of the parent of @p dev.
4315  */
4316 int
bus_generic_config_intr(device_t dev,int irq,enum intr_trigger trig,enum intr_polarity pol)4317 bus_generic_config_intr(device_t dev, int irq, enum intr_trigger trig,
4318     enum intr_polarity pol)
4319 {
4320 	/* Propagate up the bus hierarchy until someone handles it. */
4321 	if (dev->parent)
4322 		return (BUS_CONFIG_INTR(dev->parent, irq, trig, pol));
4323 	return (EINVAL);
4324 }
4325 
4326 /**
4327  * @brief Helper function for implementing BUS_DESCRIBE_INTR().
4328  *
4329  * This simple implementation of BUS_DESCRIBE_INTR() simply calls the
4330  * BUS_DESCRIBE_INTR() method of the parent of @p dev.
4331  */
4332 int
bus_generic_describe_intr(device_t dev,device_t child,struct resource * irq,void * cookie,const char * descr)4333 bus_generic_describe_intr(device_t dev, device_t child, struct resource *irq,
4334     void *cookie, const char *descr)
4335 {
4336 	/* Propagate up the bus hierarchy until someone handles it. */
4337 	if (dev->parent)
4338 		return (BUS_DESCRIBE_INTR(dev->parent, child, irq, cookie,
4339 		    descr));
4340 	return (EINVAL);
4341 }
4342 
4343 /**
4344  * @brief Helper function for implementing BUS_GET_CPUS().
4345  *
4346  * This simple implementation of BUS_GET_CPUS() simply calls the
4347  * BUS_GET_CPUS() method of the parent of @p dev.
4348  */
4349 int
bus_generic_get_cpus(device_t dev,device_t child,enum cpu_sets op,size_t setsize,cpuset_t * cpuset)4350 bus_generic_get_cpus(device_t dev, device_t child, enum cpu_sets op,
4351     size_t setsize, cpuset_t *cpuset)
4352 {
4353 	/* Propagate up the bus hierarchy until someone handles it. */
4354 	if (dev->parent != NULL)
4355 		return (BUS_GET_CPUS(dev->parent, child, op, setsize, cpuset));
4356 	return (EINVAL);
4357 }
4358 
4359 /**
4360  * @brief Helper function for implementing BUS_GET_DMA_TAG().
4361  *
4362  * This simple implementation of BUS_GET_DMA_TAG() simply calls the
4363  * BUS_GET_DMA_TAG() method of the parent of @p dev.
4364  */
4365 bus_dma_tag_t
bus_generic_get_dma_tag(device_t dev,device_t child)4366 bus_generic_get_dma_tag(device_t dev, device_t child)
4367 {
4368 	/* Propagate up the bus hierarchy until someone handles it. */
4369 	if (dev->parent != NULL)
4370 		return (BUS_GET_DMA_TAG(dev->parent, child));
4371 	return (NULL);
4372 }
4373 
4374 /**
4375  * @brief Helper function for implementing BUS_GET_BUS_TAG().
4376  *
4377  * This simple implementation of BUS_GET_BUS_TAG() simply calls the
4378  * BUS_GET_BUS_TAG() method of the parent of @p dev.
4379  */
4380 bus_space_tag_t
bus_generic_get_bus_tag(device_t dev,device_t child)4381 bus_generic_get_bus_tag(device_t dev, device_t child)
4382 {
4383 	/* Propagate up the bus hierarchy until someone handles it. */
4384 	if (dev->parent != NULL)
4385 		return (BUS_GET_BUS_TAG(dev->parent, child));
4386 	return ((bus_space_tag_t)0);
4387 }
4388 
4389 /**
4390  * @brief Helper function for implementing BUS_GET_RESOURCE().
4391  *
4392  * This implementation of BUS_GET_RESOURCE() uses the
4393  * resource_list_find() function to do most of the work. It calls
4394  * BUS_GET_RESOURCE_LIST() to find a suitable resource list to
4395  * search.
4396  */
4397 int
bus_generic_rl_get_resource(device_t dev,device_t child,int type,int rid,rman_res_t * startp,rman_res_t * countp)4398 bus_generic_rl_get_resource(device_t dev, device_t child, int type, int rid,
4399     rman_res_t *startp, rman_res_t *countp)
4400 {
4401 	struct resource_list *		rl = NULL;
4402 	struct resource_list_entry *	rle = NULL;
4403 
4404 	rl = BUS_GET_RESOURCE_LIST(dev, child);
4405 	if (!rl)
4406 		return (EINVAL);
4407 
4408 	rle = resource_list_find(rl, type, rid);
4409 	if (!rle)
4410 		return (ENOENT);
4411 
4412 	if (startp)
4413 		*startp = rle->start;
4414 	if (countp)
4415 		*countp = rle->count;
4416 
4417 	return (0);
4418 }
4419 
4420 /**
4421  * @brief Helper function for implementing BUS_SET_RESOURCE().
4422  *
4423  * This implementation of BUS_SET_RESOURCE() uses the
4424  * resource_list_add() function to do most of the work. It calls
4425  * BUS_GET_RESOURCE_LIST() to find a suitable resource list to
4426  * edit.
4427  */
4428 int
bus_generic_rl_set_resource(device_t dev,device_t child,int type,int rid,rman_res_t start,rman_res_t count)4429 bus_generic_rl_set_resource(device_t dev, device_t child, int type, int rid,
4430     rman_res_t start, rman_res_t count)
4431 {
4432 	struct resource_list *		rl = NULL;
4433 
4434 	rl = BUS_GET_RESOURCE_LIST(dev, child);
4435 	if (!rl)
4436 		return (EINVAL);
4437 
4438 	resource_list_add(rl, type, rid, start, (start + count - 1), count);
4439 
4440 	return (0);
4441 }
4442 
4443 /**
4444  * @brief Helper function for implementing BUS_DELETE_RESOURCE().
4445  *
4446  * This implementation of BUS_DELETE_RESOURCE() uses the
4447  * resource_list_delete() function to do most of the work. It calls
4448  * BUS_GET_RESOURCE_LIST() to find a suitable resource list to
4449  * edit.
4450  */
4451 void
bus_generic_rl_delete_resource(device_t dev,device_t child,int type,int rid)4452 bus_generic_rl_delete_resource(device_t dev, device_t child, int type, int rid)
4453 {
4454 	struct resource_list *		rl = NULL;
4455 
4456 	rl = BUS_GET_RESOURCE_LIST(dev, child);
4457 	if (!rl)
4458 		return;
4459 
4460 	resource_list_delete(rl, type, rid);
4461 
4462 	return;
4463 }
4464 
4465 /**
4466  * @brief Helper function for implementing BUS_RELEASE_RESOURCE().
4467  *
4468  * This implementation of BUS_RELEASE_RESOURCE() uses the
4469  * resource_list_release() function to do most of the work. It calls
4470  * BUS_GET_RESOURCE_LIST() to find a suitable resource list.
4471  */
4472 int
bus_generic_rl_release_resource(device_t dev,device_t child,int type,int rid,struct resource * r)4473 bus_generic_rl_release_resource(device_t dev, device_t child, int type,
4474     int rid, struct resource *r)
4475 {
4476 	struct resource_list *		rl = NULL;
4477 
4478 	if (device_get_parent(child) != dev)
4479 		return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
4480 		    type, rid, r));
4481 
4482 	rl = BUS_GET_RESOURCE_LIST(dev, child);
4483 	if (!rl)
4484 		return (EINVAL);
4485 
4486 	return (resource_list_release(rl, dev, child, type, rid, r));
4487 }
4488 
4489 /**
4490  * @brief Helper function for implementing BUS_ALLOC_RESOURCE().
4491  *
4492  * This implementation of BUS_ALLOC_RESOURCE() uses the
4493  * resource_list_alloc() function to do most of the work. It calls
4494  * BUS_GET_RESOURCE_LIST() to find a suitable resource list.
4495  */
4496 struct resource *
bus_generic_rl_alloc_resource(device_t dev,device_t child,int type,int * rid,rman_res_t start,rman_res_t end,rman_res_t count,u_int flags)4497 bus_generic_rl_alloc_resource(device_t dev, device_t child, int type,
4498     int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
4499 {
4500 	struct resource_list *		rl = NULL;
4501 
4502 	if (device_get_parent(child) != dev)
4503 		return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
4504 		    type, rid, start, end, count, flags));
4505 
4506 	rl = BUS_GET_RESOURCE_LIST(dev, child);
4507 	if (!rl)
4508 		return (NULL);
4509 
4510 	return (resource_list_alloc(rl, dev, child, type, rid,
4511 	    start, end, count, flags));
4512 }
4513 
4514 /**
4515  * @brief Helper function for implementing BUS_CHILD_PRESENT().
4516  *
4517  * This simple implementation of BUS_CHILD_PRESENT() simply calls the
4518  * BUS_CHILD_PRESENT() method of the parent of @p dev.
4519  */
4520 int
bus_generic_child_present(device_t dev,device_t child)4521 bus_generic_child_present(device_t dev, device_t child)
4522 {
4523 	return (BUS_CHILD_PRESENT(device_get_parent(dev), dev));
4524 }
4525 
4526 int
bus_generic_get_domain(device_t dev,device_t child,int * domain)4527 bus_generic_get_domain(device_t dev, device_t child, int *domain)
4528 {
4529 	if (dev->parent)
4530 		return (BUS_GET_DOMAIN(dev->parent, dev, domain));
4531 
4532 	return (ENOENT);
4533 }
4534 
4535 /**
4536  * @brief Helper function for implementing BUS_RESCAN().
4537  *
4538  * This null implementation of BUS_RESCAN() always fails to indicate
4539  * the bus does not support rescanning.
4540  */
4541 int
bus_null_rescan(device_t dev)4542 bus_null_rescan(device_t dev)
4543 {
4544 	return (ENXIO);
4545 }
4546 
4547 /*
4548  * Some convenience functions to make it easier for drivers to use the
4549  * resource-management functions.  All these really do is hide the
4550  * indirection through the parent's method table, making for slightly
4551  * less-wordy code.  In the future, it might make sense for this code
4552  * to maintain some sort of a list of resources allocated by each device.
4553  */
4554 
4555 int
bus_alloc_resources(device_t dev,struct resource_spec * rs,struct resource ** res)4556 bus_alloc_resources(device_t dev, struct resource_spec *rs,
4557     struct resource **res)
4558 {
4559 	int i;
4560 
4561 	for (i = 0; rs[i].type != -1; i++)
4562 		res[i] = NULL;
4563 	for (i = 0; rs[i].type != -1; i++) {
4564 		res[i] = bus_alloc_resource_any(dev,
4565 		    rs[i].type, &rs[i].rid, rs[i].flags);
4566 		if (res[i] == NULL && !(rs[i].flags & RF_OPTIONAL)) {
4567 			bus_release_resources(dev, rs, res);
4568 			return (ENXIO);
4569 		}
4570 	}
4571 	return (0);
4572 }
4573 
4574 void
bus_release_resources(device_t dev,const struct resource_spec * rs,struct resource ** res)4575 bus_release_resources(device_t dev, const struct resource_spec *rs,
4576     struct resource **res)
4577 {
4578 	int i;
4579 
4580 	for (i = 0; rs[i].type != -1; i++)
4581 		if (res[i] != NULL) {
4582 			bus_release_resource(
4583 			    dev, rs[i].type, rs[i].rid, res[i]);
4584 			res[i] = NULL;
4585 		}
4586 }
4587 
4588 /**
4589  * @brief Wrapper function for BUS_ALLOC_RESOURCE().
4590  *
4591  * This function simply calls the BUS_ALLOC_RESOURCE() method of the
4592  * parent of @p dev.
4593  */
4594 struct resource *
bus_alloc_resource(device_t dev,int type,int * rid,rman_res_t start,rman_res_t end,rman_res_t count,u_int flags)4595 bus_alloc_resource(device_t dev, int type, int *rid, rman_res_t start,
4596     rman_res_t end, rman_res_t count, u_int flags)
4597 {
4598 	struct resource *res;
4599 
4600 	if (dev->parent == NULL)
4601 		return (NULL);
4602 	res = BUS_ALLOC_RESOURCE(dev->parent, dev, type, rid, start, end,
4603 	    count, flags);
4604 	return (res);
4605 }
4606 
4607 /**
4608  * @brief Wrapper function for BUS_ADJUST_RESOURCE().
4609  *
4610  * This function simply calls the BUS_ADJUST_RESOURCE() method of the
4611  * parent of @p dev.
4612  */
4613 int
bus_adjust_resource(device_t dev,int type,struct resource * r,rman_res_t start,rman_res_t end)4614 bus_adjust_resource(device_t dev, int type, struct resource *r, rman_res_t start,
4615     rman_res_t end)
4616 {
4617 	if (dev->parent == NULL)
4618 		return (EINVAL);
4619 	return (BUS_ADJUST_RESOURCE(dev->parent, dev, type, r, start, end));
4620 }
4621 
4622 /**
4623  * @brief Wrapper function for BUS_ACTIVATE_RESOURCE().
4624  *
4625  * This function simply calls the BUS_ACTIVATE_RESOURCE() method of the
4626  * parent of @p dev.
4627  */
4628 int
bus_activate_resource(device_t dev,int type,int rid,struct resource * r)4629 bus_activate_resource(device_t dev, int type, int rid, struct resource *r)
4630 {
4631 	if (dev->parent == NULL)
4632 		return (EINVAL);
4633 	return (BUS_ACTIVATE_RESOURCE(dev->parent, dev, type, rid, r));
4634 }
4635 
4636 /**
4637  * @brief Wrapper function for BUS_DEACTIVATE_RESOURCE().
4638  *
4639  * This function simply calls the BUS_DEACTIVATE_RESOURCE() method of the
4640  * parent of @p dev.
4641  */
4642 int
bus_deactivate_resource(device_t dev,int type,int rid,struct resource * r)4643 bus_deactivate_resource(device_t dev, int type, int rid, struct resource *r)
4644 {
4645 	if (dev->parent == NULL)
4646 		return (EINVAL);
4647 	return (BUS_DEACTIVATE_RESOURCE(dev->parent, dev, type, rid, r));
4648 }
4649 
4650 /**
4651  * @brief Wrapper function for BUS_MAP_RESOURCE().
4652  *
4653  * This function simply calls the BUS_MAP_RESOURCE() method of the
4654  * parent of @p dev.
4655  */
4656 int
bus_map_resource(device_t dev,int type,struct resource * r,struct resource_map_request * args,struct resource_map * map)4657 bus_map_resource(device_t dev, int type, struct resource *r,
4658     struct resource_map_request *args, struct resource_map *map)
4659 {
4660 	if (dev->parent == NULL)
4661 		return (EINVAL);
4662 	return (BUS_MAP_RESOURCE(dev->parent, dev, type, r, args, map));
4663 }
4664 
4665 /**
4666  * @brief Wrapper function for BUS_UNMAP_RESOURCE().
4667  *
4668  * This function simply calls the BUS_UNMAP_RESOURCE() method of the
4669  * parent of @p dev.
4670  */
4671 int
bus_unmap_resource(device_t dev,int type,struct resource * r,struct resource_map * map)4672 bus_unmap_resource(device_t dev, int type, struct resource *r,
4673     struct resource_map *map)
4674 {
4675 	if (dev->parent == NULL)
4676 		return (EINVAL);
4677 	return (BUS_UNMAP_RESOURCE(dev->parent, dev, type, r, map));
4678 }
4679 
4680 /**
4681  * @brief Wrapper function for BUS_RELEASE_RESOURCE().
4682  *
4683  * This function simply calls the BUS_RELEASE_RESOURCE() method of the
4684  * parent of @p dev.
4685  */
4686 int
bus_release_resource(device_t dev,int type,int rid,struct resource * r)4687 bus_release_resource(device_t dev, int type, int rid, struct resource *r)
4688 {
4689 	int rv;
4690 
4691 	if (dev->parent == NULL)
4692 		return (EINVAL);
4693 	rv = BUS_RELEASE_RESOURCE(dev->parent, dev, type, rid, r);
4694 	return (rv);
4695 }
4696 
4697 /**
4698  * @brief Wrapper function for BUS_SETUP_INTR().
4699  *
4700  * This function simply calls the BUS_SETUP_INTR() method of the
4701  * parent of @p dev.
4702  */
4703 int
bus_setup_intr(device_t dev,struct resource * r,int flags,driver_filter_t filter,driver_intr_t handler,void * arg,void ** cookiep)4704 bus_setup_intr(device_t dev, struct resource *r, int flags,
4705     driver_filter_t filter, driver_intr_t handler, void *arg, void **cookiep)
4706 {
4707 	int error;
4708 
4709 	if (dev->parent == NULL)
4710 		return (EINVAL);
4711 	error = BUS_SETUP_INTR(dev->parent, dev, r, flags, filter, handler,
4712 	    arg, cookiep);
4713 	if (error != 0)
4714 		return (error);
4715 	if (handler != NULL && !(flags & INTR_MPSAFE))
4716 		device_printf(dev, "[GIANT-LOCKED]\n");
4717 	return (0);
4718 }
4719 
4720 /**
4721  * @brief Wrapper function for BUS_TEARDOWN_INTR().
4722  *
4723  * This function simply calls the BUS_TEARDOWN_INTR() method of the
4724  * parent of @p dev.
4725  */
4726 int
bus_teardown_intr(device_t dev,struct resource * r,void * cookie)4727 bus_teardown_intr(device_t dev, struct resource *r, void *cookie)
4728 {
4729 	if (dev->parent == NULL)
4730 		return (EINVAL);
4731 	return (BUS_TEARDOWN_INTR(dev->parent, dev, r, cookie));
4732 }
4733 
4734 /**
4735  * @brief Wrapper function for BUS_SUSPEND_INTR().
4736  *
4737  * This function simply calls the BUS_SUSPEND_INTR() method of the
4738  * parent of @p dev.
4739  */
4740 int
bus_suspend_intr(device_t dev,struct resource * r)4741 bus_suspend_intr(device_t dev, struct resource *r)
4742 {
4743 	if (dev->parent == NULL)
4744 		return (EINVAL);
4745 	return (BUS_SUSPEND_INTR(dev->parent, dev, r));
4746 }
4747 
4748 /**
4749  * @brief Wrapper function for BUS_RESUME_INTR().
4750  *
4751  * This function simply calls the BUS_RESUME_INTR() method of the
4752  * parent of @p dev.
4753  */
4754 int
bus_resume_intr(device_t dev,struct resource * r)4755 bus_resume_intr(device_t dev, struct resource *r)
4756 {
4757 	if (dev->parent == NULL)
4758 		return (EINVAL);
4759 	return (BUS_RESUME_INTR(dev->parent, dev, r));
4760 }
4761 
4762 /**
4763  * @brief Wrapper function for BUS_BIND_INTR().
4764  *
4765  * This function simply calls the BUS_BIND_INTR() method of the
4766  * parent of @p dev.
4767  */
4768 int
bus_bind_intr(device_t dev,struct resource * r,int cpu)4769 bus_bind_intr(device_t dev, struct resource *r, int cpu)
4770 {
4771 	if (dev->parent == NULL)
4772 		return (EINVAL);
4773 	return (BUS_BIND_INTR(dev->parent, dev, r, cpu));
4774 }
4775 
4776 /**
4777  * @brief Wrapper function for BUS_DESCRIBE_INTR().
4778  *
4779  * This function first formats the requested description into a
4780  * temporary buffer and then calls the BUS_DESCRIBE_INTR() method of
4781  * the parent of @p dev.
4782  */
4783 int
bus_describe_intr(device_t dev,struct resource * irq,void * cookie,const char * fmt,...)4784 bus_describe_intr(device_t dev, struct resource *irq, void *cookie,
4785     const char *fmt, ...)
4786 {
4787 	va_list ap;
4788 	char descr[MAXCOMLEN + 1];
4789 
4790 	if (dev->parent == NULL)
4791 		return (EINVAL);
4792 	va_start(ap, fmt);
4793 	vsnprintf(descr, sizeof(descr), fmt, ap);
4794 	va_end(ap);
4795 	return (BUS_DESCRIBE_INTR(dev->parent, dev, irq, cookie, descr));
4796 }
4797 
4798 /**
4799  * @brief Wrapper function for BUS_SET_RESOURCE().
4800  *
4801  * This function simply calls the BUS_SET_RESOURCE() method of the
4802  * parent of @p dev.
4803  */
4804 int
bus_set_resource(device_t dev,int type,int rid,rman_res_t start,rman_res_t count)4805 bus_set_resource(device_t dev, int type, int rid,
4806     rman_res_t start, rman_res_t count)
4807 {
4808 	return (BUS_SET_RESOURCE(device_get_parent(dev), dev, type, rid,
4809 	    start, count));
4810 }
4811 
4812 /**
4813  * @brief Wrapper function for BUS_GET_RESOURCE().
4814  *
4815  * This function simply calls the BUS_GET_RESOURCE() method of the
4816  * parent of @p dev.
4817  */
4818 int
bus_get_resource(device_t dev,int type,int rid,rman_res_t * startp,rman_res_t * countp)4819 bus_get_resource(device_t dev, int type, int rid,
4820     rman_res_t *startp, rman_res_t *countp)
4821 {
4822 	return (BUS_GET_RESOURCE(device_get_parent(dev), dev, type, rid,
4823 	    startp, countp));
4824 }
4825 
4826 /**
4827  * @brief Wrapper function for BUS_GET_RESOURCE().
4828  *
4829  * This function simply calls the BUS_GET_RESOURCE() method of the
4830  * parent of @p dev and returns the start value.
4831  */
4832 rman_res_t
bus_get_resource_start(device_t dev,int type,int rid)4833 bus_get_resource_start(device_t dev, int type, int rid)
4834 {
4835 	rman_res_t start;
4836 	rman_res_t count;
4837 	int error;
4838 
4839 	error = BUS_GET_RESOURCE(device_get_parent(dev), dev, type, rid,
4840 	    &start, &count);
4841 	if (error)
4842 		return (0);
4843 	return (start);
4844 }
4845 
4846 /**
4847  * @brief Wrapper function for BUS_GET_RESOURCE().
4848  *
4849  * This function simply calls the BUS_GET_RESOURCE() method of the
4850  * parent of @p dev and returns the count value.
4851  */
4852 rman_res_t
bus_get_resource_count(device_t dev,int type,int rid)4853 bus_get_resource_count(device_t dev, int type, int rid)
4854 {
4855 	rman_res_t start;
4856 	rman_res_t count;
4857 	int error;
4858 
4859 	error = BUS_GET_RESOURCE(device_get_parent(dev), dev, type, rid,
4860 	    &start, &count);
4861 	if (error)
4862 		return (0);
4863 	return (count);
4864 }
4865 
4866 /**
4867  * @brief Wrapper function for BUS_DELETE_RESOURCE().
4868  *
4869  * This function simply calls the BUS_DELETE_RESOURCE() method of the
4870  * parent of @p dev.
4871  */
4872 void
bus_delete_resource(device_t dev,int type,int rid)4873 bus_delete_resource(device_t dev, int type, int rid)
4874 {
4875 	BUS_DELETE_RESOURCE(device_get_parent(dev), dev, type, rid);
4876 }
4877 
4878 /**
4879  * @brief Wrapper function for BUS_CHILD_PRESENT().
4880  *
4881  * This function simply calls the BUS_CHILD_PRESENT() method of the
4882  * parent of @p dev.
4883  */
4884 int
bus_child_present(device_t child)4885 bus_child_present(device_t child)
4886 {
4887 	return (BUS_CHILD_PRESENT(device_get_parent(child), child));
4888 }
4889 
4890 /**
4891  * @brief Wrapper function for BUS_CHILD_PNPINFO_STR().
4892  *
4893  * This function simply calls the BUS_CHILD_PNPINFO_STR() method of the
4894  * parent of @p dev.
4895  */
4896 int
bus_child_pnpinfo_str(device_t child,char * buf,size_t buflen)4897 bus_child_pnpinfo_str(device_t child, char *buf, size_t buflen)
4898 {
4899 	device_t parent;
4900 
4901 	parent = device_get_parent(child);
4902 	if (parent == NULL) {
4903 		*buf = '\0';
4904 		return (0);
4905 	}
4906 	return (BUS_CHILD_PNPINFO_STR(parent, child, buf, buflen));
4907 }
4908 
4909 /**
4910  * @brief Wrapper function for BUS_CHILD_LOCATION_STR().
4911  *
4912  * This function simply calls the BUS_CHILD_LOCATION_STR() method of the
4913  * parent of @p dev.
4914  */
4915 int
bus_child_location_str(device_t child,char * buf,size_t buflen)4916 bus_child_location_str(device_t child, char *buf, size_t buflen)
4917 {
4918 	device_t parent;
4919 
4920 	parent = device_get_parent(child);
4921 	if (parent == NULL) {
4922 		*buf = '\0';
4923 		return (0);
4924 	}
4925 	return (BUS_CHILD_LOCATION_STR(parent, child, buf, buflen));
4926 }
4927 
4928 /**
4929  * @brief Wrapper function for bus_child_pnpinfo_str using sbuf
4930  *
4931  * A convenient wrapper frunction for bus_child_pnpinfo_str that allows
4932  * us to splat that into an sbuf. It uses unholy knowledge of sbuf to
4933  * accomplish this, however. It is an interim function until we can convert
4934  * this interface more fully.
4935  */
4936 /* Note: we reach inside of sbuf because it's API isn't rich enough to do this */
4937 #define	SPACE(s)	((s)->s_size - (s)->s_len)
4938 #define EOB(s)		((s)->s_buf + (s)->s_len)
4939 
4940 static int
bus_child_pnpinfo_sb(device_t dev,struct sbuf * sb)4941 bus_child_pnpinfo_sb(device_t dev, struct sbuf *sb)
4942 {
4943 	char *p;
4944 	ssize_t space;
4945 
4946 	MPASS((sb->s_flags & SBUF_INCLUDENUL) == 0);
4947 	MPASS(sb->s_size >= sb->s_len);
4948 	if (sb->s_error != 0)
4949 		return (-1);
4950 	space = SPACE(sb);
4951 	if (space <= 1) {
4952 		sb->s_error = ENOMEM;
4953 		return (-1);
4954 	}
4955 	p = EOB(sb);
4956 	*p = '\0';	/* sbuf buffer isn't NUL terminated until sbuf_finish() */
4957 	bus_child_pnpinfo_str(dev, p, space);
4958 	sb->s_len += strlen(p);
4959 	return (0);
4960 }
4961 
4962 /**
4963  * @brief Wrapper function for bus_child_pnpinfo_str using sbuf
4964  *
4965  * A convenient wrapper frunction for bus_child_pnpinfo_str that allows
4966  * us to splat that into an sbuf. It uses unholy knowledge of sbuf to
4967  * accomplish this, however. It is an interim function until we can convert
4968  * this interface more fully.
4969  */
4970 static int
bus_child_location_sb(device_t dev,struct sbuf * sb)4971 bus_child_location_sb(device_t dev, struct sbuf *sb)
4972 {
4973 	char *p;
4974 	ssize_t space;
4975 
4976 	MPASS((sb->s_flags & SBUF_INCLUDENUL) == 0);
4977 	MPASS(sb->s_size >= sb->s_len);
4978 	if (sb->s_error != 0)
4979 		return (-1);
4980 	space = SPACE(sb);
4981 	if (space <= 1) {
4982 		sb->s_error = ENOMEM;
4983 		return (-1);
4984 	}
4985 	p = EOB(sb);
4986 	*p = '\0';	/* sbuf buffer isn't NUL terminated until sbuf_finish() */
4987 	bus_child_location_str(dev, p, space);
4988 	sb->s_len += strlen(p);
4989 	return (0);
4990 }
4991 #undef SPACE
4992 #undef EOB
4993 
4994 /**
4995  * @brief Wrapper function for BUS_GET_CPUS().
4996  *
4997  * This function simply calls the BUS_GET_CPUS() method of the
4998  * parent of @p dev.
4999  */
5000 int
bus_get_cpus(device_t dev,enum cpu_sets op,size_t setsize,cpuset_t * cpuset)5001 bus_get_cpus(device_t dev, enum cpu_sets op, size_t setsize, cpuset_t *cpuset)
5002 {
5003 	device_t parent;
5004 
5005 	parent = device_get_parent(dev);
5006 	if (parent == NULL)
5007 		return (EINVAL);
5008 	return (BUS_GET_CPUS(parent, dev, op, setsize, cpuset));
5009 }
5010 
5011 /**
5012  * @brief Wrapper function for BUS_GET_DMA_TAG().
5013  *
5014  * This function simply calls the BUS_GET_DMA_TAG() method of the
5015  * parent of @p dev.
5016  */
5017 bus_dma_tag_t
bus_get_dma_tag(device_t dev)5018 bus_get_dma_tag(device_t dev)
5019 {
5020 	device_t parent;
5021 
5022 	parent = device_get_parent(dev);
5023 	if (parent == NULL)
5024 		return (NULL);
5025 	return (BUS_GET_DMA_TAG(parent, dev));
5026 }
5027 
5028 /**
5029  * @brief Wrapper function for BUS_GET_BUS_TAG().
5030  *
5031  * This function simply calls the BUS_GET_BUS_TAG() method of the
5032  * parent of @p dev.
5033  */
5034 bus_space_tag_t
bus_get_bus_tag(device_t dev)5035 bus_get_bus_tag(device_t dev)
5036 {
5037 	device_t parent;
5038 
5039 	parent = device_get_parent(dev);
5040 	if (parent == NULL)
5041 		return ((bus_space_tag_t)0);
5042 	return (BUS_GET_BUS_TAG(parent, dev));
5043 }
5044 
5045 /**
5046  * @brief Wrapper function for BUS_GET_DOMAIN().
5047  *
5048  * This function simply calls the BUS_GET_DOMAIN() method of the
5049  * parent of @p dev.
5050  */
5051 int
bus_get_domain(device_t dev,int * domain)5052 bus_get_domain(device_t dev, int *domain)
5053 {
5054 	return (BUS_GET_DOMAIN(device_get_parent(dev), dev, domain));
5055 }
5056 
5057 /* Resume all devices and then notify userland that we're up again. */
5058 static int
root_resume(device_t dev)5059 root_resume(device_t dev)
5060 {
5061 	int error;
5062 
5063 	error = bus_generic_resume(dev);
5064 	if (error == 0) {
5065 		devctl_notify("kern", "power", "resume", NULL); /* Deprecated gone in 14 */
5066 		devctl_notify("kernel", "power", "resume", NULL);
5067 	}
5068 	return (error);
5069 }
5070 
5071 static int
root_print_child(device_t dev,device_t child)5072 root_print_child(device_t dev, device_t child)
5073 {
5074 	int	retval = 0;
5075 
5076 	retval += bus_print_child_header(dev, child);
5077 	retval += printf("\n");
5078 
5079 	return (retval);
5080 }
5081 
5082 static int
root_setup_intr(device_t dev,device_t child,struct resource * irq,int flags,driver_filter_t * filter,driver_intr_t * intr,void * arg,void ** cookiep)5083 root_setup_intr(device_t dev, device_t child, struct resource *irq, int flags,
5084     driver_filter_t *filter, driver_intr_t *intr, void *arg, void **cookiep)
5085 {
5086 	/*
5087 	 * If an interrupt mapping gets to here something bad has happened.
5088 	 */
5089 	panic("root_setup_intr");
5090 }
5091 
5092 /*
5093  * If we get here, assume that the device is permanent and really is
5094  * present in the system.  Removable bus drivers are expected to intercept
5095  * this call long before it gets here.  We return -1 so that drivers that
5096  * really care can check vs -1 or some ERRNO returned higher in the food
5097  * chain.
5098  */
5099 static int
root_child_present(device_t dev,device_t child)5100 root_child_present(device_t dev, device_t child)
5101 {
5102 	return (-1);
5103 }
5104 
5105 static int
root_get_cpus(device_t dev,device_t child,enum cpu_sets op,size_t setsize,cpuset_t * cpuset)5106 root_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize,
5107     cpuset_t *cpuset)
5108 {
5109 	switch (op) {
5110 	case INTR_CPUS:
5111 		/* Default to returning the set of all CPUs. */
5112 		if (setsize != sizeof(cpuset_t))
5113 			return (EINVAL);
5114 		*cpuset = all_cpus;
5115 		return (0);
5116 	default:
5117 		return (EINVAL);
5118 	}
5119 }
5120 
5121 static kobj_method_t root_methods[] = {
5122 	/* Device interface */
5123 	KOBJMETHOD(device_shutdown,	bus_generic_shutdown),
5124 	KOBJMETHOD(device_suspend,	bus_generic_suspend),
5125 	KOBJMETHOD(device_resume,	root_resume),
5126 
5127 	/* Bus interface */
5128 	KOBJMETHOD(bus_print_child,	root_print_child),
5129 	KOBJMETHOD(bus_read_ivar,	bus_generic_read_ivar),
5130 	KOBJMETHOD(bus_write_ivar,	bus_generic_write_ivar),
5131 	KOBJMETHOD(bus_setup_intr,	root_setup_intr),
5132 	KOBJMETHOD(bus_child_present,	root_child_present),
5133 	KOBJMETHOD(bus_get_cpus,	root_get_cpus),
5134 
5135 	KOBJMETHOD_END
5136 };
5137 
5138 static driver_t root_driver = {
5139 	"root",
5140 	root_methods,
5141 	1,			/* no softc */
5142 };
5143 
5144 device_t	root_bus;
5145 devclass_t	root_devclass;
5146 
5147 static int
root_bus_module_handler(module_t mod,int what,void * arg)5148 root_bus_module_handler(module_t mod, int what, void* arg)
5149 {
5150 	switch (what) {
5151 	case MOD_LOAD:
5152 		TAILQ_INIT(&bus_data_devices);
5153 		kobj_class_compile((kobj_class_t) &root_driver);
5154 		root_bus = make_device(NULL, "root", 0);
5155 		root_bus->desc = "System root bus";
5156 		kobj_init((kobj_t) root_bus, (kobj_class_t) &root_driver);
5157 		root_bus->driver = &root_driver;
5158 		root_bus->state = DS_ATTACHED;
5159 		root_devclass = devclass_find_internal("root", NULL, FALSE);
5160 		devinit();
5161 		return (0);
5162 
5163 	case MOD_SHUTDOWN:
5164 		device_shutdown(root_bus);
5165 		return (0);
5166 	default:
5167 		return (EOPNOTSUPP);
5168 	}
5169 
5170 	return (0);
5171 }
5172 
5173 static moduledata_t root_bus_mod = {
5174 	"rootbus",
5175 	root_bus_module_handler,
5176 	NULL
5177 };
5178 DECLARE_MODULE(rootbus, root_bus_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
5179 
5180 /**
5181  * @brief Automatically configure devices
5182  *
5183  * This function begins the autoconfiguration process by calling
5184  * device_probe_and_attach() for each child of the @c root0 device.
5185  */
5186 void
root_bus_configure(void)5187 root_bus_configure(void)
5188 {
5189 	PDEBUG(("."));
5190 
5191 	/* Eventually this will be split up, but this is sufficient for now. */
5192 	bus_set_pass(BUS_PASS_DEFAULT);
5193 }
5194 
5195 /**
5196  * @brief Module handler for registering device drivers
5197  *
5198  * This module handler is used to automatically register device
5199  * drivers when modules are loaded. If @p what is MOD_LOAD, it calls
5200  * devclass_add_driver() for the driver described by the
5201  * driver_module_data structure pointed to by @p arg
5202  */
5203 int
driver_module_handler(module_t mod,int what,void * arg)5204 driver_module_handler(module_t mod, int what, void *arg)
5205 {
5206 	struct driver_module_data *dmd;
5207 	devclass_t bus_devclass;
5208 	kobj_class_t driver;
5209 	int error, pass;
5210 
5211 	dmd = (struct driver_module_data *)arg;
5212 	bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL, TRUE);
5213 	error = 0;
5214 
5215 	switch (what) {
5216 	case MOD_LOAD:
5217 		if (dmd->dmd_chainevh)
5218 			error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
5219 
5220 		pass = dmd->dmd_pass;
5221 		driver = dmd->dmd_driver;
5222 		PDEBUG(("Loading module: driver %s on bus %s (pass %d)",
5223 		    DRIVERNAME(driver), dmd->dmd_busname, pass));
5224 		error = devclass_add_driver(bus_devclass, driver, pass,
5225 		    dmd->dmd_devclass);
5226 		break;
5227 
5228 	case MOD_UNLOAD:
5229 		PDEBUG(("Unloading module: driver %s from bus %s",
5230 		    DRIVERNAME(dmd->dmd_driver),
5231 		    dmd->dmd_busname));
5232 		error = devclass_delete_driver(bus_devclass,
5233 		    dmd->dmd_driver);
5234 
5235 		if (!error && dmd->dmd_chainevh)
5236 			error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
5237 		break;
5238 	case MOD_QUIESCE:
5239 		PDEBUG(("Quiesce module: driver %s from bus %s",
5240 		    DRIVERNAME(dmd->dmd_driver),
5241 		    dmd->dmd_busname));
5242 		error = devclass_quiesce_driver(bus_devclass,
5243 		    dmd->dmd_driver);
5244 
5245 		if (!error && dmd->dmd_chainevh)
5246 			error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
5247 		break;
5248 	default:
5249 		error = EOPNOTSUPP;
5250 		break;
5251 	}
5252 
5253 	return (error);
5254 }
5255 
5256 /**
5257  * @brief Enumerate all hinted devices for this bus.
5258  *
5259  * Walks through the hints for this bus and calls the bus_hinted_child
5260  * routine for each one it fines.  It searches first for the specific
5261  * bus that's being probed for hinted children (eg isa0), and then for
5262  * generic children (eg isa).
5263  *
5264  * @param	dev	bus device to enumerate
5265  */
5266 void
bus_enumerate_hinted_children(device_t bus)5267 bus_enumerate_hinted_children(device_t bus)
5268 {
5269 	int i;
5270 	const char *dname, *busname;
5271 	int dunit;
5272 
5273 	/*
5274 	 * enumerate all devices on the specific bus
5275 	 */
5276 	busname = device_get_nameunit(bus);
5277 	i = 0;
5278 	while (resource_find_match(&i, &dname, &dunit, "at", busname) == 0)
5279 		BUS_HINTED_CHILD(bus, dname, dunit);
5280 
5281 	/*
5282 	 * and all the generic ones.
5283 	 */
5284 	busname = device_get_name(bus);
5285 	i = 0;
5286 	while (resource_find_match(&i, &dname, &dunit, "at", busname) == 0)
5287 		BUS_HINTED_CHILD(bus, dname, dunit);
5288 }
5289 
5290 #ifdef BUS_DEBUG
5291 
5292 /* the _short versions avoid iteration by not calling anything that prints
5293  * more than oneliners. I love oneliners.
5294  */
5295 
5296 static void
print_device_short(device_t dev,int indent)5297 print_device_short(device_t dev, int indent)
5298 {
5299 	if (!dev)
5300 		return;
5301 
5302 	indentprintf(("device %d: <%s> %sparent,%schildren,%s%s%s%s%s,%sivars,%ssoftc,busy=%d\n",
5303 	    dev->unit, dev->desc,
5304 	    (dev->parent? "":"no "),
5305 	    (TAILQ_EMPTY(&dev->children)? "no ":""),
5306 	    (dev->flags&DF_ENABLED? "enabled,":"disabled,"),
5307 	    (dev->flags&DF_FIXEDCLASS? "fixed,":""),
5308 	    (dev->flags&DF_WILDCARD? "wildcard,":""),
5309 	    (dev->flags&DF_DESCMALLOCED? "descmalloced,":""),
5310 	    (dev->flags&DF_SUSPENDED? "suspended,":""),
5311 	    (dev->ivars? "":"no "),
5312 	    (dev->softc? "":"no "),
5313 	    dev->busy));
5314 }
5315 
5316 static void
print_device(device_t dev,int indent)5317 print_device(device_t dev, int indent)
5318 {
5319 	if (!dev)
5320 		return;
5321 
5322 	print_device_short(dev, indent);
5323 
5324 	indentprintf(("Parent:\n"));
5325 	print_device_short(dev->parent, indent+1);
5326 	indentprintf(("Driver:\n"));
5327 	print_driver_short(dev->driver, indent+1);
5328 	indentprintf(("Devclass:\n"));
5329 	print_devclass_short(dev->devclass, indent+1);
5330 }
5331 
5332 void
print_device_tree_short(device_t dev,int indent)5333 print_device_tree_short(device_t dev, int indent)
5334 /* print the device and all its children (indented) */
5335 {
5336 	device_t child;
5337 
5338 	if (!dev)
5339 		return;
5340 
5341 	print_device_short(dev, indent);
5342 
5343 	TAILQ_FOREACH(child, &dev->children, link) {
5344 		print_device_tree_short(child, indent+1);
5345 	}
5346 }
5347 
5348 void
print_device_tree(device_t dev,int indent)5349 print_device_tree(device_t dev, int indent)
5350 /* print the device and all its children (indented) */
5351 {
5352 	device_t child;
5353 
5354 	if (!dev)
5355 		return;
5356 
5357 	print_device(dev, indent);
5358 
5359 	TAILQ_FOREACH(child, &dev->children, link) {
5360 		print_device_tree(child, indent+1);
5361 	}
5362 }
5363 
5364 static void
print_driver_short(driver_t * driver,int indent)5365 print_driver_short(driver_t *driver, int indent)
5366 {
5367 	if (!driver)
5368 		return;
5369 
5370 	indentprintf(("driver %s: softc size = %zd\n",
5371 	    driver->name, driver->size));
5372 }
5373 
5374 static void
print_driver(driver_t * driver,int indent)5375 print_driver(driver_t *driver, int indent)
5376 {
5377 	if (!driver)
5378 		return;
5379 
5380 	print_driver_short(driver, indent);
5381 }
5382 
5383 static void
print_driver_list(driver_list_t drivers,int indent)5384 print_driver_list(driver_list_t drivers, int indent)
5385 {
5386 	driverlink_t driver;
5387 
5388 	TAILQ_FOREACH(driver, &drivers, link) {
5389 		print_driver(driver->driver, indent);
5390 	}
5391 }
5392 
5393 static void
print_devclass_short(devclass_t dc,int indent)5394 print_devclass_short(devclass_t dc, int indent)
5395 {
5396 	if ( !dc )
5397 		return;
5398 
5399 	indentprintf(("devclass %s: max units = %d\n", dc->name, dc->maxunit));
5400 }
5401 
5402 static void
print_devclass(devclass_t dc,int indent)5403 print_devclass(devclass_t dc, int indent)
5404 {
5405 	int i;
5406 
5407 	if ( !dc )
5408 		return;
5409 
5410 	print_devclass_short(dc, indent);
5411 	indentprintf(("Drivers:\n"));
5412 	print_driver_list(dc->drivers, indent+1);
5413 
5414 	indentprintf(("Devices:\n"));
5415 	for (i = 0; i < dc->maxunit; i++)
5416 		if (dc->devices[i])
5417 			print_device(dc->devices[i], indent+1);
5418 }
5419 
5420 void
print_devclass_list_short(void)5421 print_devclass_list_short(void)
5422 {
5423 	devclass_t dc;
5424 
5425 	printf("Short listing of devclasses, drivers & devices:\n");
5426 	TAILQ_FOREACH(dc, &devclasses, link) {
5427 		print_devclass_short(dc, 0);
5428 	}
5429 }
5430 
5431 void
print_devclass_list(void)5432 print_devclass_list(void)
5433 {
5434 	devclass_t dc;
5435 
5436 	printf("Full listing of devclasses, drivers & devices:\n");
5437 	TAILQ_FOREACH(dc, &devclasses, link) {
5438 		print_devclass(dc, 0);
5439 	}
5440 }
5441 
5442 #endif
5443 
5444 /*
5445  * User-space access to the device tree.
5446  *
5447  * We implement a small set of nodes:
5448  *
5449  * hw.bus			Single integer read method to obtain the
5450  *				current generation count.
5451  * hw.bus.devices		Reads the entire device tree in flat space.
5452  * hw.bus.rman			Resource manager interface
5453  *
5454  * We might like to add the ability to scan devclasses and/or drivers to
5455  * determine what else is currently loaded/available.
5456  */
5457 
5458 static int
sysctl_bus_info(SYSCTL_HANDLER_ARGS)5459 sysctl_bus_info(SYSCTL_HANDLER_ARGS)
5460 {
5461 	struct u_businfo	ubus;
5462 
5463 	ubus.ub_version = BUS_USER_VERSION;
5464 	ubus.ub_generation = bus_data_generation;
5465 
5466 	return (SYSCTL_OUT(req, &ubus, sizeof(ubus)));
5467 }
5468 SYSCTL_PROC(_hw_bus, OID_AUTO, info, CTLTYPE_STRUCT | CTLFLAG_RD |
5469     CTLFLAG_MPSAFE, NULL, 0, sysctl_bus_info, "S,u_businfo",
5470     "bus-related data");
5471 
5472 static int
sysctl_devices(SYSCTL_HANDLER_ARGS)5473 sysctl_devices(SYSCTL_HANDLER_ARGS)
5474 {
5475 	struct sbuf		sb;
5476 	int			*name = (int *)arg1;
5477 	u_int			namelen = arg2;
5478 	int			index;
5479 	device_t		dev;
5480 	struct u_device		*udev;
5481 	int			error;
5482 
5483 	if (namelen != 2)
5484 		return (EINVAL);
5485 
5486 	if (bus_data_generation_check(name[0]))
5487 		return (EINVAL);
5488 
5489 	index = name[1];
5490 
5491 	/*
5492 	 * Scan the list of devices, looking for the requested index.
5493 	 */
5494 	TAILQ_FOREACH(dev, &bus_data_devices, devlink) {
5495 		if (index-- == 0)
5496 			break;
5497 	}
5498 	if (dev == NULL)
5499 		return (ENOENT);
5500 
5501 	/*
5502 	 * Populate the return item, careful not to overflow the buffer.
5503 	 */
5504 	udev = malloc(sizeof(*udev), M_BUS, M_WAITOK | M_ZERO);
5505 	if (udev == NULL)
5506 		return (ENOMEM);
5507 	udev->dv_handle = (uintptr_t)dev;
5508 	udev->dv_parent = (uintptr_t)dev->parent;
5509 	udev->dv_devflags = dev->devflags;
5510 	udev->dv_flags = dev->flags;
5511 	udev->dv_state = dev->state;
5512 	sbuf_new(&sb, udev->dv_fields, sizeof(udev->dv_fields), SBUF_FIXEDLEN);
5513 	if (dev->nameunit != NULL)
5514 		sbuf_cat(&sb, dev->nameunit);
5515 	sbuf_putc(&sb, '\0');
5516 	if (dev->desc != NULL)
5517 		sbuf_cat(&sb, dev->desc);
5518 	sbuf_putc(&sb, '\0');
5519 	if (dev->driver != NULL)
5520 		sbuf_cat(&sb, dev->driver->name);
5521 	sbuf_putc(&sb, '\0');
5522 	bus_child_pnpinfo_sb(dev, &sb);
5523 	sbuf_putc(&sb, '\0');
5524 	bus_child_location_sb(dev, &sb);
5525 	sbuf_putc(&sb, '\0');
5526 	error = sbuf_finish(&sb);
5527 	if (error == 0)
5528 		error = SYSCTL_OUT(req, udev, sizeof(*udev));
5529 	sbuf_delete(&sb);
5530 	free(udev, M_BUS);
5531 	return (error);
5532 }
5533 
5534 SYSCTL_NODE(_hw_bus, OID_AUTO, devices,
5535     CTLFLAG_RD | CTLFLAG_NEEDGIANT, sysctl_devices,
5536     "system device tree");
5537 
5538 int
bus_data_generation_check(int generation)5539 bus_data_generation_check(int generation)
5540 {
5541 	if (generation != bus_data_generation)
5542 		return (1);
5543 
5544 	/* XXX generate optimised lists here? */
5545 	return (0);
5546 }
5547 
5548 void
bus_data_generation_update(void)5549 bus_data_generation_update(void)
5550 {
5551 	atomic_add_int(&bus_data_generation, 1);
5552 }
5553 
5554 int
bus_free_resource(device_t dev,int type,struct resource * r)5555 bus_free_resource(device_t dev, int type, struct resource *r)
5556 {
5557 	if (r == NULL)
5558 		return (0);
5559 	return (bus_release_resource(dev, type, rman_get_rid(r), r));
5560 }
5561 
5562 device_t
device_lookup_by_name(const char * name)5563 device_lookup_by_name(const char *name)
5564 {
5565 	device_t dev;
5566 
5567 	TAILQ_FOREACH(dev, &bus_data_devices, devlink) {
5568 		if (dev->nameunit != NULL && strcmp(dev->nameunit, name) == 0)
5569 			return (dev);
5570 	}
5571 	return (NULL);
5572 }
5573 
5574 /*
5575  * /dev/devctl2 implementation.  The existing /dev/devctl device has
5576  * implicit semantics on open, so it could not be reused for this.
5577  * Another option would be to call this /dev/bus?
5578  */
5579 static int
find_device(struct devreq * req,device_t * devp)5580 find_device(struct devreq *req, device_t *devp)
5581 {
5582 	device_t dev;
5583 
5584 	/*
5585 	 * First, ensure that the name is nul terminated.
5586 	 */
5587 	if (memchr(req->dr_name, '\0', sizeof(req->dr_name)) == NULL)
5588 		return (EINVAL);
5589 
5590 	/*
5591 	 * Second, try to find an attached device whose name matches
5592 	 * 'name'.
5593 	 */
5594 	dev = device_lookup_by_name(req->dr_name);
5595 	if (dev != NULL) {
5596 		*devp = dev;
5597 		return (0);
5598 	}
5599 
5600 	/* Finally, give device enumerators a chance. */
5601 	dev = NULL;
5602 	EVENTHANDLER_DIRECT_INVOKE(dev_lookup, req->dr_name, &dev);
5603 	if (dev == NULL)
5604 		return (ENOENT);
5605 	*devp = dev;
5606 	return (0);
5607 }
5608 
5609 static bool
driver_exists(device_t bus,const char * driver)5610 driver_exists(device_t bus, const char *driver)
5611 {
5612 	devclass_t dc;
5613 
5614 	for (dc = bus->devclass; dc != NULL; dc = dc->parent) {
5615 		if (devclass_find_driver_internal(dc, driver) != NULL)
5616 			return (true);
5617 	}
5618 	return (false);
5619 }
5620 
5621 static void
device_gen_nomatch(device_t dev)5622 device_gen_nomatch(device_t dev)
5623 {
5624 	device_t child;
5625 
5626 	if (dev->flags & DF_NEEDNOMATCH &&
5627 	    dev->state == DS_NOTPRESENT) {
5628 		BUS_PROBE_NOMATCH(dev->parent, dev);
5629 		devnomatch(dev);
5630 		dev->flags |= DF_DONENOMATCH;
5631 	}
5632 	dev->flags &= ~DF_NEEDNOMATCH;
5633 	TAILQ_FOREACH(child, &dev->children, link) {
5634 		device_gen_nomatch(child);
5635 	}
5636 }
5637 
5638 static void
device_do_deferred_actions(void)5639 device_do_deferred_actions(void)
5640 {
5641 	devclass_t dc;
5642 	driverlink_t dl;
5643 
5644 	/*
5645 	 * Walk through the devclasses to find all the drivers we've tagged as
5646 	 * deferred during the freeze and call the driver added routines. They
5647 	 * have already been added to the lists in the background, so the driver
5648 	 * added routines that trigger a probe will have all the right bidders
5649 	 * for the probe auction.
5650 	 */
5651 	TAILQ_FOREACH(dc, &devclasses, link) {
5652 		TAILQ_FOREACH(dl, &dc->drivers, link) {
5653 			if (dl->flags & DL_DEFERRED_PROBE) {
5654 				devclass_driver_added(dc, dl->driver);
5655 				dl->flags &= ~DL_DEFERRED_PROBE;
5656 			}
5657 		}
5658 	}
5659 
5660 	/*
5661 	 * We also defer no-match events during a freeze. Walk the tree and
5662 	 * generate all the pent-up events that are still relevant.
5663 	 */
5664 	device_gen_nomatch(root_bus);
5665 	bus_data_generation_update();
5666 }
5667 
5668 static int
devctl2_ioctl(struct cdev * cdev,u_long cmd,caddr_t data,int fflag,struct thread * td)5669 devctl2_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int fflag,
5670     struct thread *td)
5671 {
5672 	struct devreq *req;
5673 	device_t dev;
5674 	int error, old;
5675 
5676 	/* Locate the device to control. */
5677 	mtx_lock(&Giant);
5678 	req = (struct devreq *)data;
5679 	switch (cmd) {
5680 	case DEV_ATTACH:
5681 	case DEV_DETACH:
5682 	case DEV_ENABLE:
5683 	case DEV_DISABLE:
5684 	case DEV_SUSPEND:
5685 	case DEV_RESUME:
5686 	case DEV_SET_DRIVER:
5687 	case DEV_CLEAR_DRIVER:
5688 	case DEV_RESCAN:
5689 	case DEV_DELETE:
5690 	case DEV_RESET:
5691 		error = priv_check(td, PRIV_DRIVER);
5692 		if (error == 0)
5693 			error = find_device(req, &dev);
5694 		break;
5695 	case DEV_FREEZE:
5696 	case DEV_THAW:
5697 		error = priv_check(td, PRIV_DRIVER);
5698 		break;
5699 	default:
5700 		error = ENOTTY;
5701 		break;
5702 	}
5703 	if (error) {
5704 		mtx_unlock(&Giant);
5705 		return (error);
5706 	}
5707 
5708 	/* Perform the requested operation. */
5709 	switch (cmd) {
5710 	case DEV_ATTACH:
5711 		if (device_is_attached(dev))
5712 			error = EBUSY;
5713 		else if (!device_is_enabled(dev))
5714 			error = ENXIO;
5715 		else
5716 			error = device_probe_and_attach(dev);
5717 		break;
5718 	case DEV_DETACH:
5719 		if (!device_is_attached(dev)) {
5720 			error = ENXIO;
5721 			break;
5722 		}
5723 		if (!(req->dr_flags & DEVF_FORCE_DETACH)) {
5724 			error = device_quiesce(dev);
5725 			if (error)
5726 				break;
5727 		}
5728 		error = device_detach(dev);
5729 		break;
5730 	case DEV_ENABLE:
5731 		if (device_is_enabled(dev)) {
5732 			error = EBUSY;
5733 			break;
5734 		}
5735 
5736 		/*
5737 		 * If the device has been probed but not attached (e.g.
5738 		 * when it has been disabled by a loader hint), just
5739 		 * attach the device rather than doing a full probe.
5740 		 */
5741 		device_enable(dev);
5742 		if (device_is_alive(dev)) {
5743 			/*
5744 			 * If the device was disabled via a hint, clear
5745 			 * the hint.
5746 			 */
5747 			if (resource_disabled(dev->driver->name, dev->unit))
5748 				resource_unset_value(dev->driver->name,
5749 				    dev->unit, "disabled");
5750 			error = device_attach(dev);
5751 		} else
5752 			error = device_probe_and_attach(dev);
5753 		break;
5754 	case DEV_DISABLE:
5755 		if (!device_is_enabled(dev)) {
5756 			error = ENXIO;
5757 			break;
5758 		}
5759 
5760 		if (!(req->dr_flags & DEVF_FORCE_DETACH)) {
5761 			error = device_quiesce(dev);
5762 			if (error)
5763 				break;
5764 		}
5765 
5766 		/*
5767 		 * Force DF_FIXEDCLASS on around detach to preserve
5768 		 * the existing name.
5769 		 */
5770 		old = dev->flags;
5771 		dev->flags |= DF_FIXEDCLASS;
5772 		error = device_detach(dev);
5773 		if (!(old & DF_FIXEDCLASS))
5774 			dev->flags &= ~DF_FIXEDCLASS;
5775 		if (error == 0)
5776 			device_disable(dev);
5777 		break;
5778 	case DEV_SUSPEND:
5779 		if (device_is_suspended(dev)) {
5780 			error = EBUSY;
5781 			break;
5782 		}
5783 		if (device_get_parent(dev) == NULL) {
5784 			error = EINVAL;
5785 			break;
5786 		}
5787 		error = BUS_SUSPEND_CHILD(device_get_parent(dev), dev);
5788 		break;
5789 	case DEV_RESUME:
5790 		if (!device_is_suspended(dev)) {
5791 			error = EINVAL;
5792 			break;
5793 		}
5794 		if (device_get_parent(dev) == NULL) {
5795 			error = EINVAL;
5796 			break;
5797 		}
5798 		error = BUS_RESUME_CHILD(device_get_parent(dev), dev);
5799 		break;
5800 	case DEV_SET_DRIVER: {
5801 		devclass_t dc;
5802 		char driver[128];
5803 
5804 		error = copyinstr(req->dr_data, driver, sizeof(driver), NULL);
5805 		if (error)
5806 			break;
5807 		if (driver[0] == '\0') {
5808 			error = EINVAL;
5809 			break;
5810 		}
5811 		if (dev->devclass != NULL &&
5812 		    strcmp(driver, dev->devclass->name) == 0)
5813 			/* XXX: Could possibly force DF_FIXEDCLASS on? */
5814 			break;
5815 
5816 		/*
5817 		 * Scan drivers for this device's bus looking for at
5818 		 * least one matching driver.
5819 		 */
5820 		if (dev->parent == NULL) {
5821 			error = EINVAL;
5822 			break;
5823 		}
5824 		if (!driver_exists(dev->parent, driver)) {
5825 			error = ENOENT;
5826 			break;
5827 		}
5828 		dc = devclass_create(driver);
5829 		if (dc == NULL) {
5830 			error = ENOMEM;
5831 			break;
5832 		}
5833 
5834 		/* Detach device if necessary. */
5835 		if (device_is_attached(dev)) {
5836 			if (req->dr_flags & DEVF_SET_DRIVER_DETACH)
5837 				error = device_detach(dev);
5838 			else
5839 				error = EBUSY;
5840 			if (error)
5841 				break;
5842 		}
5843 
5844 		/* Clear any previously-fixed device class and unit. */
5845 		if (dev->flags & DF_FIXEDCLASS)
5846 			devclass_delete_device(dev->devclass, dev);
5847 		dev->flags |= DF_WILDCARD;
5848 		dev->unit = -1;
5849 
5850 		/* Force the new device class. */
5851 		error = devclass_add_device(dc, dev);
5852 		if (error)
5853 			break;
5854 		dev->flags |= DF_FIXEDCLASS;
5855 		error = device_probe_and_attach(dev);
5856 		break;
5857 	}
5858 	case DEV_CLEAR_DRIVER:
5859 		if (!(dev->flags & DF_FIXEDCLASS)) {
5860 			error = 0;
5861 			break;
5862 		}
5863 		if (device_is_attached(dev)) {
5864 			if (req->dr_flags & DEVF_CLEAR_DRIVER_DETACH)
5865 				error = device_detach(dev);
5866 			else
5867 				error = EBUSY;
5868 			if (error)
5869 				break;
5870 		}
5871 
5872 		dev->flags &= ~DF_FIXEDCLASS;
5873 		dev->flags |= DF_WILDCARD;
5874 		devclass_delete_device(dev->devclass, dev);
5875 		error = device_probe_and_attach(dev);
5876 		break;
5877 	case DEV_RESCAN:
5878 		if (!device_is_attached(dev)) {
5879 			error = ENXIO;
5880 			break;
5881 		}
5882 		error = BUS_RESCAN(dev);
5883 		break;
5884 	case DEV_DELETE: {
5885 		device_t parent;
5886 
5887 		parent = device_get_parent(dev);
5888 		if (parent == NULL) {
5889 			error = EINVAL;
5890 			break;
5891 		}
5892 		if (!(req->dr_flags & DEVF_FORCE_DELETE)) {
5893 			if (bus_child_present(dev) != 0) {
5894 				error = EBUSY;
5895 				break;
5896 			}
5897 		}
5898 
5899 		error = device_delete_child(parent, dev);
5900 		break;
5901 	}
5902 	case DEV_FREEZE:
5903 		if (device_frozen)
5904 			error = EBUSY;
5905 		else
5906 			device_frozen = true;
5907 		break;
5908 	case DEV_THAW:
5909 		if (!device_frozen)
5910 			error = EBUSY;
5911 		else {
5912 			device_do_deferred_actions();
5913 			device_frozen = false;
5914 		}
5915 		break;
5916 	case DEV_RESET:
5917 		if ((req->dr_flags & ~(DEVF_RESET_DETACH)) != 0) {
5918 			error = EINVAL;
5919 			break;
5920 		}
5921 		error = BUS_RESET_CHILD(device_get_parent(dev), dev,
5922 		    req->dr_flags);
5923 		break;
5924 	}
5925 	mtx_unlock(&Giant);
5926 	return (error);
5927 }
5928 
5929 static struct cdevsw devctl2_cdevsw = {
5930 	.d_version =	D_VERSION,
5931 	.d_ioctl =	devctl2_ioctl,
5932 	.d_name =	"devctl2",
5933 };
5934 
5935 static void
devctl2_init(void)5936 devctl2_init(void)
5937 {
5938 	make_dev_credf(MAKEDEV_ETERNAL, &devctl2_cdevsw, 0, NULL,
5939 	    UID_ROOT, GID_WHEEL, 0600, "devctl2");
5940 }
5941 
5942 /*
5943  * APIs to manage deprecation and obsolescence.
5944  */
5945 static int obsolete_panic = 0;
5946 SYSCTL_INT(_debug, OID_AUTO, obsolete_panic, CTLFLAG_RWTUN, &obsolete_panic, 0,
5947     "Panic when obsolete features are used (0 = never, 1 = if obsolete, "
5948     "2 = if deprecated)");
5949 
5950 static void
gone_panic(int major,int running,const char * msg)5951 gone_panic(int major, int running, const char *msg)
5952 {
5953 	switch (obsolete_panic)
5954 	{
5955 	case 0:
5956 		return;
5957 	case 1:
5958 		if (running < major)
5959 			return;
5960 		/* FALLTHROUGH */
5961 	default:
5962 		panic("%s", msg);
5963 	}
5964 }
5965 
5966 void
_gone_in(int major,const char * msg)5967 _gone_in(int major, const char *msg)
5968 {
5969 	gone_panic(major, P_OSREL_MAJOR(__FreeBSD_version), msg);
5970 	if (P_OSREL_MAJOR(__FreeBSD_version) >= major)
5971 		printf("Obsolete code will be removed soon: %s\n", msg);
5972 	else
5973 		printf("Deprecated code (to be removed in FreeBSD %d): %s\n",
5974 		    major, msg);
5975 }
5976 
5977 void
_gone_in_dev(device_t dev,int major,const char * msg)5978 _gone_in_dev(device_t dev, int major, const char *msg)
5979 {
5980 	gone_panic(major, P_OSREL_MAJOR(__FreeBSD_version), msg);
5981 	if (P_OSREL_MAJOR(__FreeBSD_version) >= major)
5982 		device_printf(dev,
5983 		    "Obsolete code will be removed soon: %s\n", msg);
5984 	else
5985 		device_printf(dev,
5986 		    "Deprecated code (to be removed in FreeBSD %d): %s\n",
5987 		    major, msg);
5988 }
5989 
5990 #ifdef DDB
DB_SHOW_COMMAND(device,db_show_device)5991 DB_SHOW_COMMAND(device, db_show_device)
5992 {
5993 	device_t dev;
5994 
5995 	if (!have_addr)
5996 		return;
5997 
5998 	dev = (device_t)addr;
5999 
6000 	db_printf("name:    %s\n", device_get_nameunit(dev));
6001 	db_printf("  driver:  %s\n", DRIVERNAME(dev->driver));
6002 	db_printf("  class:   %s\n", DEVCLANAME(dev->devclass));
6003 	db_printf("  addr:    %p\n", dev);
6004 	db_printf("  parent:  %p\n", dev->parent);
6005 	db_printf("  softc:   %p\n", dev->softc);
6006 	db_printf("  ivars:   %p\n", dev->ivars);
6007 }
6008 
DB_SHOW_ALL_COMMAND(devices,db_show_all_devices)6009 DB_SHOW_ALL_COMMAND(devices, db_show_all_devices)
6010 {
6011 	device_t dev;
6012 
6013 	TAILQ_FOREACH(dev, &bus_data_devices, devlink) {
6014 		db_show_device((db_expr_t)dev, true, count, modif);
6015 	}
6016 }
6017 #endif
6018