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