1 /* $NetBSD: subr_autoconf.c,v 1.167 2008/12/29 13:40:11 ad Exp $ */ 2 3 /* 4 * Copyright (c) 1996, 2000 Christopher G. Demetriou 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 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed for the 18 * NetBSD Project. See http://www.NetBSD.org/ for 19 * information about NetBSD. 20 * 4. The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * 34 * --(license Id: LICENSE.proto,v 1.1 2000/06/13 21:40:26 cgd Exp )-- 35 */ 36 37 /* 38 * Copyright (c) 1992, 1993 39 * The Regents of the University of California. All rights reserved. 40 * 41 * This software was developed by the Computer Systems Engineering group 42 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 43 * contributed to Berkeley. 44 * 45 * All advertising materials mentioning features or use of this software 46 * must display the following acknowledgement: 47 * This product includes software developed by the University of 48 * California, Lawrence Berkeley Laboratories. 49 * 50 * Redistribution and use in source and binary forms, with or without 51 * modification, are permitted provided that the following conditions 52 * are met: 53 * 1. Redistributions of source code must retain the above copyright 54 * notice, this list of conditions and the following disclaimer. 55 * 2. Redistributions in binary form must reproduce the above copyright 56 * notice, this list of conditions and the following disclaimer in the 57 * documentation and/or other materials provided with the distribution. 58 * 3. Neither the name of the University nor the names of its contributors 59 * may be used to endorse or promote products derived from this software 60 * without specific prior written permission. 61 * 62 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 63 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 64 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 65 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 66 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 67 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 68 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 69 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 70 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 71 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 72 * SUCH DAMAGE. 73 * 74 * from: Header: subr_autoconf.c,v 1.12 93/02/01 19:31:48 torek Exp (LBL) 75 * 76 * @(#)subr_autoconf.c 8.3 (Berkeley) 5/17/94 77 */ 78 79 #include <sys/cdefs.h> 80 __KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.167 2008/12/29 13:40:11 ad Exp $"); 81 82 #include "opt_ddb.h" 83 #include "drvctl.h" 84 85 #include <sys/param.h> 86 #include <sys/device.h> 87 #include <sys/disklabel.h> 88 #include <sys/conf.h> 89 #include <sys/kauth.h> 90 #include <sys/malloc.h> 91 #include <sys/kmem.h> 92 #include <sys/systm.h> 93 #include <sys/kernel.h> 94 #include <sys/errno.h> 95 #include <sys/proc.h> 96 #include <sys/reboot.h> 97 #include <sys/kthread.h> 98 #include <sys/buf.h> 99 #include <sys/dirent.h> 100 #include <sys/vnode.h> 101 #include <sys/mount.h> 102 #include <sys/namei.h> 103 #include <sys/unistd.h> 104 #include <sys/fcntl.h> 105 #include <sys/lockf.h> 106 #include <sys/callout.h> 107 #include <sys/mutex.h> 108 #include <sys/condvar.h> 109 #include <sys/devmon.h> 110 #include <sys/cpu.h> 111 112 #include <sys/disk.h> 113 114 #include <machine/limits.h> 115 116 #include "opt_userconf.h" 117 #ifdef USERCONF 118 #include <sys/userconf.h> 119 #endif 120 121 #ifdef __i386__ 122 #include "opt_splash.h" 123 #if defined(SPLASHSCREEN) && defined(SPLASHSCREEN_PROGRESS) 124 #include <dev/splash/splash.h> 125 extern struct splash_progress *splash_progress_state; 126 #endif 127 #endif 128 129 /* 130 * Autoconfiguration subroutines. 131 */ 132 133 typedef struct pmf_private { 134 int pp_nwait; 135 int pp_nlock; 136 lwp_t *pp_holder; 137 kmutex_t pp_mtx; 138 kcondvar_t pp_cv; 139 } pmf_private_t; 140 141 /* 142 * ioconf.c exports exactly two names: cfdata and cfroots. All system 143 * devices and drivers are found via these tables. 144 */ 145 extern struct cfdata cfdata[]; 146 extern const short cfroots[]; 147 148 /* 149 * List of all cfdriver structures. We use this to detect duplicates 150 * when other cfdrivers are loaded. 151 */ 152 struct cfdriverlist allcfdrivers = LIST_HEAD_INITIALIZER(&allcfdrivers); 153 extern struct cfdriver * const cfdriver_list_initial[]; 154 155 /* 156 * Initial list of cfattach's. 157 */ 158 extern const struct cfattachinit cfattachinit[]; 159 160 /* 161 * List of cfdata tables. We always have one such list -- the one 162 * built statically when the kernel was configured. 163 */ 164 struct cftablelist allcftables = TAILQ_HEAD_INITIALIZER(allcftables); 165 static struct cftable initcftable; 166 167 #define ROOT ((device_t)NULL) 168 169 struct matchinfo { 170 cfsubmatch_t fn; 171 struct device *parent; 172 const int *locs; 173 void *aux; 174 struct cfdata *match; 175 int pri; 176 }; 177 178 static char *number(char *, int); 179 static void mapply(struct matchinfo *, cfdata_t); 180 static device_t config_devalloc(const device_t, const cfdata_t, const int *); 181 static void config_devdealloc(device_t); 182 static void config_makeroom(int, struct cfdriver *); 183 static void config_devlink(device_t); 184 static void config_devunlink(device_t); 185 186 static void pmflock_debug(device_t, const char *, int); 187 static void pmflock_debug_with_flags(device_t, const char *, int PMF_FN_PROTO); 188 189 static device_t deviter_next1(deviter_t *); 190 static void deviter_reinit(deviter_t *); 191 192 struct deferred_config { 193 TAILQ_ENTRY(deferred_config) dc_queue; 194 device_t dc_dev; 195 void (*dc_func)(device_t); 196 }; 197 198 TAILQ_HEAD(deferred_config_head, deferred_config); 199 200 struct deferred_config_head deferred_config_queue = 201 TAILQ_HEAD_INITIALIZER(deferred_config_queue); 202 struct deferred_config_head interrupt_config_queue = 203 TAILQ_HEAD_INITIALIZER(interrupt_config_queue); 204 int interrupt_config_threads = 8; 205 206 static void config_process_deferred(struct deferred_config_head *, device_t); 207 208 /* Hooks to finalize configuration once all real devices have been found. */ 209 struct finalize_hook { 210 TAILQ_ENTRY(finalize_hook) f_list; 211 int (*f_func)(device_t); 212 device_t f_dev; 213 }; 214 static TAILQ_HEAD(, finalize_hook) config_finalize_list = 215 TAILQ_HEAD_INITIALIZER(config_finalize_list); 216 static int config_finalize_done; 217 218 /* list of all devices */ 219 struct devicelist alldevs = TAILQ_HEAD_INITIALIZER(alldevs); 220 kcondvar_t alldevs_cv; 221 kmutex_t alldevs_mtx; 222 static int alldevs_nread = 0; 223 static int alldevs_nwrite = 0; 224 static lwp_t *alldevs_writer = NULL; 225 226 static int config_pending; /* semaphore for mountroot */ 227 static kmutex_t config_misc_lock; 228 static kcondvar_t config_misc_cv; 229 230 #define STREQ(s1, s2) \ 231 (*(s1) == *(s2) && strcmp((s1), (s2)) == 0) 232 233 static int config_initialized; /* config_init() has been called. */ 234 235 static int config_do_twiddle; 236 237 struct vnode * 238 opendisk(struct device *dv) 239 { 240 int bmajor, bminor; 241 struct vnode *tmpvn; 242 int error; 243 dev_t dev; 244 245 /* 246 * Lookup major number for disk block device. 247 */ 248 bmajor = devsw_name2blk(device_xname(dv), NULL, 0); 249 if (bmajor == -1) 250 return NULL; 251 252 bminor = minor(device_unit(dv)); 253 /* 254 * Fake a temporary vnode for the disk, open it, and read 255 * and hash the sectors. 256 */ 257 dev = device_is_a(dv, "dk") ? makedev(bmajor, bminor) : 258 MAKEDISKDEV(bmajor, bminor, RAW_PART); 259 if (bdevvp(dev, &tmpvn)) 260 panic("%s: can't alloc vnode for %s", __func__, 261 device_xname(dv)); 262 error = VOP_OPEN(tmpvn, FREAD, NOCRED); 263 if (error) { 264 #ifndef DEBUG 265 /* 266 * Ignore errors caused by missing device, partition, 267 * or medium. 268 */ 269 if (error != ENXIO && error != ENODEV) 270 #endif 271 printf("%s: can't open dev %s (%d)\n", 272 __func__, device_xname(dv), error); 273 vput(tmpvn); 274 return NULL; 275 } 276 277 return tmpvn; 278 } 279 280 int 281 config_handle_wedges(struct device *dv, int par) 282 { 283 struct dkwedge_list wl; 284 struct dkwedge_info *wi; 285 struct vnode *vn; 286 char diskname[16]; 287 int i, error; 288 289 if ((vn = opendisk(dv)) == NULL) 290 return -1; 291 292 wl.dkwl_bufsize = sizeof(*wi) * 16; 293 wl.dkwl_buf = wi = malloc(wl.dkwl_bufsize, M_TEMP, M_WAITOK); 294 295 error = VOP_IOCTL(vn, DIOCLWEDGES, &wl, FREAD, NOCRED); 296 VOP_CLOSE(vn, FREAD, NOCRED); 297 vput(vn); 298 if (error) { 299 #ifdef DEBUG_WEDGE 300 printf("%s: List wedges returned %d\n", 301 device_xname(dv), error); 302 #endif 303 free(wi, M_TEMP); 304 return -1; 305 } 306 307 #ifdef DEBUG_WEDGE 308 printf("%s: Returned %u(%u) wedges\n", device_xname(dv), 309 wl.dkwl_nwedges, wl.dkwl_ncopied); 310 #endif 311 snprintf(diskname, sizeof(diskname), "%s%c", device_xname(dv), 312 par + 'a'); 313 314 for (i = 0; i < wl.dkwl_ncopied; i++) { 315 #ifdef DEBUG_WEDGE 316 printf("%s: Looking for %s in %s\n", 317 device_xname(dv), diskname, wi[i].dkw_wname); 318 #endif 319 if (strcmp(wi[i].dkw_wname, diskname) == 0) 320 break; 321 } 322 323 if (i == wl.dkwl_ncopied) { 324 #ifdef DEBUG_WEDGE 325 printf("%s: Cannot find wedge with parent %s\n", 326 device_xname(dv), diskname); 327 #endif 328 free(wi, M_TEMP); 329 return -1; 330 } 331 332 #ifdef DEBUG_WEDGE 333 printf("%s: Setting boot wedge %s (%s) at %llu %llu\n", 334 device_xname(dv), wi[i].dkw_devname, wi[i].dkw_wname, 335 (unsigned long long)wi[i].dkw_offset, 336 (unsigned long long)wi[i].dkw_size); 337 #endif 338 dkwedge_set_bootwedge(dv, wi[i].dkw_offset, wi[i].dkw_size); 339 free(wi, M_TEMP); 340 return 0; 341 } 342 343 /* 344 * Initialize the autoconfiguration data structures. Normally this 345 * is done by configure(), but some platforms need to do this very 346 * early (to e.g. initialize the console). 347 */ 348 void 349 config_init(void) 350 { 351 const struct cfattachinit *cfai; 352 int i, j; 353 354 if (config_initialized) 355 return; 356 357 mutex_init(&alldevs_mtx, MUTEX_DEFAULT, IPL_NONE); 358 cv_init(&alldevs_cv, "alldevs"); 359 360 mutex_init(&config_misc_lock, MUTEX_DEFAULT, IPL_NONE); 361 cv_init(&config_misc_cv, "cfgmisc"); 362 363 /* allcfdrivers is statically initialized. */ 364 for (i = 0; cfdriver_list_initial[i] != NULL; i++) { 365 if (config_cfdriver_attach(cfdriver_list_initial[i]) != 0) 366 panic("configure: duplicate `%s' drivers", 367 cfdriver_list_initial[i]->cd_name); 368 } 369 370 for (cfai = &cfattachinit[0]; cfai->cfai_name != NULL; cfai++) { 371 for (j = 0; cfai->cfai_list[j] != NULL; j++) { 372 if (config_cfattach_attach(cfai->cfai_name, 373 cfai->cfai_list[j]) != 0) 374 panic("configure: duplicate `%s' attachment " 375 "of `%s' driver", 376 cfai->cfai_list[j]->ca_name, 377 cfai->cfai_name); 378 } 379 } 380 381 initcftable.ct_cfdata = cfdata; 382 TAILQ_INSERT_TAIL(&allcftables, &initcftable, ct_list); 383 384 config_initialized = 1; 385 } 386 387 void 388 config_deferred(device_t dev) 389 { 390 config_process_deferred(&deferred_config_queue, dev); 391 config_process_deferred(&interrupt_config_queue, dev); 392 } 393 394 static void 395 config_interrupts_thread(void *cookie) 396 { 397 struct deferred_config *dc; 398 399 while ((dc = TAILQ_FIRST(&interrupt_config_queue)) != NULL) { 400 TAILQ_REMOVE(&interrupt_config_queue, dc, dc_queue); 401 (*dc->dc_func)(dc->dc_dev); 402 kmem_free(dc, sizeof(*dc)); 403 config_pending_decr(); 404 } 405 kthread_exit(0); 406 } 407 408 /* 409 * Configure the system's hardware. 410 */ 411 void 412 configure(void) 413 { 414 extern void ssp_init(void); 415 CPU_INFO_ITERATOR cii; 416 struct cpu_info *ci; 417 int i, s; 418 419 /* Initialize data structures. */ 420 config_init(); 421 pmf_init(); 422 #if NDRVCTL > 0 423 drvctl_init(); 424 #endif 425 426 #ifdef USERCONF 427 if (boothowto & RB_USERCONF) 428 user_config(); 429 #endif 430 431 if ((boothowto & (AB_SILENT|AB_VERBOSE)) == AB_SILENT) { 432 config_do_twiddle = 1; 433 printf_nolog("Detecting hardware..."); 434 } 435 436 /* 437 * Do the machine-dependent portion of autoconfiguration. This 438 * sets the configuration machinery here in motion by "finding" 439 * the root bus. When this function returns, we expect interrupts 440 * to be enabled. 441 */ 442 cpu_configure(); 443 444 /* Initialize SSP. */ 445 ssp_init(); 446 447 /* 448 * Now that we've found all the hardware, start the real time 449 * and statistics clocks. 450 */ 451 initclocks(); 452 453 cold = 0; /* clocks are running, we're warm now! */ 454 s = splsched(); 455 curcpu()->ci_schedstate.spc_flags |= SPCF_RUNNING; 456 splx(s); 457 458 /* Boot the secondary processors. */ 459 for (CPU_INFO_FOREACH(cii, ci)) { 460 uvm_cpu_attach(ci); 461 } 462 mp_online = true; 463 #if defined(MULTIPROCESSOR) 464 cpu_boot_secondary_processors(); 465 #endif 466 467 /* Setup the runqueues and scheduler. */ 468 runq_init(); 469 sched_init(); 470 471 /* 472 * Create threads to call back and finish configuration for 473 * devices that want interrupts enabled. 474 */ 475 for (i = 0; i < interrupt_config_threads; i++) { 476 (void)kthread_create(PRI_NONE, 0, NULL, 477 config_interrupts_thread, NULL, NULL, "config"); 478 } 479 480 /* Get the threads going and into any sleeps before continuing. */ 481 yield(); 482 } 483 484 /* 485 * Announce device attach/detach to userland listeners. 486 */ 487 static void 488 devmon_report_device(device_t dev, bool isattach) 489 { 490 #if NDRVCTL > 0 491 prop_dictionary_t ev; 492 const char *parent; 493 const char *what; 494 device_t pdev = device_parent(dev); 495 496 ev = prop_dictionary_create(); 497 if (ev == NULL) 498 return; 499 500 what = (isattach ? "device-attach" : "device-detach"); 501 parent = (pdev == NULL ? "root" : device_xname(pdev)); 502 if (!prop_dictionary_set_cstring(ev, "device", device_xname(dev)) || 503 !prop_dictionary_set_cstring(ev, "parent", parent)) { 504 prop_object_release(ev); 505 return; 506 } 507 508 devmon_insert(what, ev); 509 #endif 510 } 511 512 /* 513 * Add a cfdriver to the system. 514 */ 515 int 516 config_cfdriver_attach(struct cfdriver *cd) 517 { 518 struct cfdriver *lcd; 519 520 /* Make sure this driver isn't already in the system. */ 521 LIST_FOREACH(lcd, &allcfdrivers, cd_list) { 522 if (STREQ(lcd->cd_name, cd->cd_name)) 523 return (EEXIST); 524 } 525 526 LIST_INIT(&cd->cd_attach); 527 LIST_INSERT_HEAD(&allcfdrivers, cd, cd_list); 528 529 return (0); 530 } 531 532 /* 533 * Remove a cfdriver from the system. 534 */ 535 int 536 config_cfdriver_detach(struct cfdriver *cd) 537 { 538 int i; 539 540 /* Make sure there are no active instances. */ 541 for (i = 0; i < cd->cd_ndevs; i++) { 542 if (cd->cd_devs[i] != NULL) 543 return (EBUSY); 544 } 545 546 /* ...and no attachments loaded. */ 547 if (LIST_EMPTY(&cd->cd_attach) == 0) 548 return (EBUSY); 549 550 LIST_REMOVE(cd, cd_list); 551 552 KASSERT(cd->cd_devs == NULL); 553 554 return (0); 555 } 556 557 /* 558 * Look up a cfdriver by name. 559 */ 560 struct cfdriver * 561 config_cfdriver_lookup(const char *name) 562 { 563 struct cfdriver *cd; 564 565 LIST_FOREACH(cd, &allcfdrivers, cd_list) { 566 if (STREQ(cd->cd_name, name)) 567 return (cd); 568 } 569 570 return (NULL); 571 } 572 573 /* 574 * Add a cfattach to the specified driver. 575 */ 576 int 577 config_cfattach_attach(const char *driver, struct cfattach *ca) 578 { 579 struct cfattach *lca; 580 struct cfdriver *cd; 581 582 cd = config_cfdriver_lookup(driver); 583 if (cd == NULL) 584 return (ESRCH); 585 586 /* Make sure this attachment isn't already on this driver. */ 587 LIST_FOREACH(lca, &cd->cd_attach, ca_list) { 588 if (STREQ(lca->ca_name, ca->ca_name)) 589 return (EEXIST); 590 } 591 592 LIST_INSERT_HEAD(&cd->cd_attach, ca, ca_list); 593 594 return (0); 595 } 596 597 /* 598 * Remove a cfattach from the specified driver. 599 */ 600 int 601 config_cfattach_detach(const char *driver, struct cfattach *ca) 602 { 603 struct cfdriver *cd; 604 device_t dev; 605 int i; 606 607 cd = config_cfdriver_lookup(driver); 608 if (cd == NULL) 609 return (ESRCH); 610 611 /* Make sure there are no active instances. */ 612 for (i = 0; i < cd->cd_ndevs; i++) { 613 if ((dev = cd->cd_devs[i]) == NULL) 614 continue; 615 if (dev->dv_cfattach == ca) 616 return (EBUSY); 617 } 618 619 LIST_REMOVE(ca, ca_list); 620 621 return (0); 622 } 623 624 /* 625 * Look up a cfattach by name. 626 */ 627 static struct cfattach * 628 config_cfattach_lookup_cd(struct cfdriver *cd, const char *atname) 629 { 630 struct cfattach *ca; 631 632 LIST_FOREACH(ca, &cd->cd_attach, ca_list) { 633 if (STREQ(ca->ca_name, atname)) 634 return (ca); 635 } 636 637 return (NULL); 638 } 639 640 /* 641 * Look up a cfattach by driver/attachment name. 642 */ 643 struct cfattach * 644 config_cfattach_lookup(const char *name, const char *atname) 645 { 646 struct cfdriver *cd; 647 648 cd = config_cfdriver_lookup(name); 649 if (cd == NULL) 650 return (NULL); 651 652 return (config_cfattach_lookup_cd(cd, atname)); 653 } 654 655 /* 656 * Apply the matching function and choose the best. This is used 657 * a few times and we want to keep the code small. 658 */ 659 static void 660 mapply(struct matchinfo *m, cfdata_t cf) 661 { 662 int pri; 663 664 if (m->fn != NULL) { 665 pri = (*m->fn)(m->parent, cf, m->locs, m->aux); 666 } else { 667 pri = config_match(m->parent, cf, m->aux); 668 } 669 if (pri > m->pri) { 670 m->match = cf; 671 m->pri = pri; 672 } 673 } 674 675 int 676 config_stdsubmatch(device_t parent, cfdata_t cf, const int *locs, void *aux) 677 { 678 const struct cfiattrdata *ci; 679 const struct cflocdesc *cl; 680 int nlocs, i; 681 682 ci = cfiattr_lookup(cf->cf_pspec->cfp_iattr, parent->dv_cfdriver); 683 KASSERT(ci); 684 nlocs = ci->ci_loclen; 685 KASSERT(!nlocs || locs); 686 for (i = 0; i < nlocs; i++) { 687 cl = &ci->ci_locdesc[i]; 688 /* !cld_defaultstr means no default value */ 689 if ((!(cl->cld_defaultstr) 690 || (cf->cf_loc[i] != cl->cld_default)) 691 && cf->cf_loc[i] != locs[i]) 692 return (0); 693 } 694 695 return (config_match(parent, cf, aux)); 696 } 697 698 /* 699 * Helper function: check whether the driver supports the interface attribute 700 * and return its descriptor structure. 701 */ 702 static const struct cfiattrdata * 703 cfdriver_get_iattr(const struct cfdriver *cd, const char *ia) 704 { 705 const struct cfiattrdata * const *cpp; 706 707 if (cd->cd_attrs == NULL) 708 return (0); 709 710 for (cpp = cd->cd_attrs; *cpp; cpp++) { 711 if (STREQ((*cpp)->ci_name, ia)) { 712 /* Match. */ 713 return (*cpp); 714 } 715 } 716 return (0); 717 } 718 719 /* 720 * Lookup an interface attribute description by name. 721 * If the driver is given, consider only its supported attributes. 722 */ 723 const struct cfiattrdata * 724 cfiattr_lookup(const char *name, const struct cfdriver *cd) 725 { 726 const struct cfdriver *d; 727 const struct cfiattrdata *ia; 728 729 if (cd) 730 return (cfdriver_get_iattr(cd, name)); 731 732 LIST_FOREACH(d, &allcfdrivers, cd_list) { 733 ia = cfdriver_get_iattr(d, name); 734 if (ia) 735 return (ia); 736 } 737 return (0); 738 } 739 740 /* 741 * Determine if `parent' is a potential parent for a device spec based 742 * on `cfp'. 743 */ 744 static int 745 cfparent_match(const device_t parent, const struct cfparent *cfp) 746 { 747 struct cfdriver *pcd; 748 749 /* We don't match root nodes here. */ 750 if (cfp == NULL) 751 return (0); 752 753 pcd = parent->dv_cfdriver; 754 KASSERT(pcd != NULL); 755 756 /* 757 * First, ensure this parent has the correct interface 758 * attribute. 759 */ 760 if (!cfdriver_get_iattr(pcd, cfp->cfp_iattr)) 761 return (0); 762 763 /* 764 * If no specific parent device instance was specified (i.e. 765 * we're attaching to the attribute only), we're done! 766 */ 767 if (cfp->cfp_parent == NULL) 768 return (1); 769 770 /* 771 * Check the parent device's name. 772 */ 773 if (STREQ(pcd->cd_name, cfp->cfp_parent) == 0) 774 return (0); /* not the same parent */ 775 776 /* 777 * Make sure the unit number matches. 778 */ 779 if (cfp->cfp_unit == DVUNIT_ANY || /* wildcard */ 780 cfp->cfp_unit == parent->dv_unit) 781 return (1); 782 783 /* Unit numbers don't match. */ 784 return (0); 785 } 786 787 /* 788 * Helper for config_cfdata_attach(): check all devices whether it could be 789 * parent any attachment in the config data table passed, and rescan. 790 */ 791 static void 792 rescan_with_cfdata(const struct cfdata *cf) 793 { 794 device_t d; 795 const struct cfdata *cf1; 796 deviter_t di; 797 798 799 /* 800 * "alldevs" is likely longer than a modules's cfdata, so make it 801 * the outer loop. 802 */ 803 for (d = deviter_first(&di, 0); d != NULL; d = deviter_next(&di)) { 804 805 if (!(d->dv_cfattach->ca_rescan)) 806 continue; 807 808 for (cf1 = cf; cf1->cf_name; cf1++) { 809 810 if (!cfparent_match(d, cf1->cf_pspec)) 811 continue; 812 813 (*d->dv_cfattach->ca_rescan)(d, 814 cf1->cf_pspec->cfp_iattr, cf1->cf_loc); 815 } 816 } 817 deviter_release(&di); 818 } 819 820 /* 821 * Attach a supplemental config data table and rescan potential 822 * parent devices if required. 823 */ 824 int 825 config_cfdata_attach(cfdata_t cf, int scannow) 826 { 827 struct cftable *ct; 828 829 ct = kmem_alloc(sizeof(*ct), KM_SLEEP); 830 ct->ct_cfdata = cf; 831 TAILQ_INSERT_TAIL(&allcftables, ct, ct_list); 832 833 if (scannow) 834 rescan_with_cfdata(cf); 835 836 return (0); 837 } 838 839 /* 840 * Helper for config_cfdata_detach: check whether a device is 841 * found through any attachment in the config data table. 842 */ 843 static int 844 dev_in_cfdata(const struct device *d, const struct cfdata *cf) 845 { 846 const struct cfdata *cf1; 847 848 for (cf1 = cf; cf1->cf_name; cf1++) 849 if (d->dv_cfdata == cf1) 850 return (1); 851 852 return (0); 853 } 854 855 /* 856 * Detach a supplemental config data table. Detach all devices found 857 * through that table (and thus keeping references to it) before. 858 */ 859 int 860 config_cfdata_detach(cfdata_t cf) 861 { 862 device_t d; 863 int error = 0; 864 struct cftable *ct; 865 deviter_t di; 866 867 for (d = deviter_first(&di, DEVITER_F_RW); d != NULL; 868 d = deviter_next(&di)) { 869 if (!dev_in_cfdata(d, cf)) 870 continue; 871 if ((error = config_detach(d, 0)) != 0) 872 break; 873 } 874 deviter_release(&di); 875 if (error) { 876 aprint_error_dev(d, "unable to detach instance\n"); 877 return error; 878 } 879 880 TAILQ_FOREACH(ct, &allcftables, ct_list) { 881 if (ct->ct_cfdata == cf) { 882 TAILQ_REMOVE(&allcftables, ct, ct_list); 883 kmem_free(ct, sizeof(*ct)); 884 return (0); 885 } 886 } 887 888 /* not found -- shouldn't happen */ 889 return (EINVAL); 890 } 891 892 /* 893 * Invoke the "match" routine for a cfdata entry on behalf of 894 * an external caller, usually a "submatch" routine. 895 */ 896 int 897 config_match(device_t parent, cfdata_t cf, void *aux) 898 { 899 struct cfattach *ca; 900 901 ca = config_cfattach_lookup(cf->cf_name, cf->cf_atname); 902 if (ca == NULL) { 903 /* No attachment for this entry, oh well. */ 904 return (0); 905 } 906 907 return ((*ca->ca_match)(parent, cf, aux)); 908 } 909 910 /* 911 * Iterate over all potential children of some device, calling the given 912 * function (default being the child's match function) for each one. 913 * Nonzero returns are matches; the highest value returned is considered 914 * the best match. Return the `found child' if we got a match, or NULL 915 * otherwise. The `aux' pointer is simply passed on through. 916 * 917 * Note that this function is designed so that it can be used to apply 918 * an arbitrary function to all potential children (its return value 919 * can be ignored). 920 */ 921 cfdata_t 922 config_search_loc(cfsubmatch_t fn, device_t parent, 923 const char *ifattr, const int *locs, void *aux) 924 { 925 struct cftable *ct; 926 cfdata_t cf; 927 struct matchinfo m; 928 929 KASSERT(config_initialized); 930 KASSERT(!ifattr || cfdriver_get_iattr(parent->dv_cfdriver, ifattr)); 931 932 m.fn = fn; 933 m.parent = parent; 934 m.locs = locs; 935 m.aux = aux; 936 m.match = NULL; 937 m.pri = 0; 938 939 TAILQ_FOREACH(ct, &allcftables, ct_list) { 940 for (cf = ct->ct_cfdata; cf->cf_name; cf++) { 941 942 /* We don't match root nodes here. */ 943 if (!cf->cf_pspec) 944 continue; 945 946 /* 947 * Skip cf if no longer eligible, otherwise scan 948 * through parents for one matching `parent', and 949 * try match function. 950 */ 951 if (cf->cf_fstate == FSTATE_FOUND) 952 continue; 953 if (cf->cf_fstate == FSTATE_DNOTFOUND || 954 cf->cf_fstate == FSTATE_DSTAR) 955 continue; 956 957 /* 958 * If an interface attribute was specified, 959 * consider only children which attach to 960 * that attribute. 961 */ 962 if (ifattr && !STREQ(ifattr, cf->cf_pspec->cfp_iattr)) 963 continue; 964 965 if (cfparent_match(parent, cf->cf_pspec)) 966 mapply(&m, cf); 967 } 968 } 969 return (m.match); 970 } 971 972 cfdata_t 973 config_search_ia(cfsubmatch_t fn, device_t parent, const char *ifattr, 974 void *aux) 975 { 976 977 return (config_search_loc(fn, parent, ifattr, NULL, aux)); 978 } 979 980 /* 981 * Find the given root device. 982 * This is much like config_search, but there is no parent. 983 * Don't bother with multiple cfdata tables; the root node 984 * must always be in the initial table. 985 */ 986 cfdata_t 987 config_rootsearch(cfsubmatch_t fn, const char *rootname, void *aux) 988 { 989 cfdata_t cf; 990 const short *p; 991 struct matchinfo m; 992 993 m.fn = fn; 994 m.parent = ROOT; 995 m.aux = aux; 996 m.match = NULL; 997 m.pri = 0; 998 m.locs = 0; 999 /* 1000 * Look at root entries for matching name. We do not bother 1001 * with found-state here since only one root should ever be 1002 * searched (and it must be done first). 1003 */ 1004 for (p = cfroots; *p >= 0; p++) { 1005 cf = &cfdata[*p]; 1006 if (strcmp(cf->cf_name, rootname) == 0) 1007 mapply(&m, cf); 1008 } 1009 return (m.match); 1010 } 1011 1012 static const char * const msgs[3] = { "", " not configured\n", " unsupported\n" }; 1013 1014 /* 1015 * The given `aux' argument describes a device that has been found 1016 * on the given parent, but not necessarily configured. Locate the 1017 * configuration data for that device (using the submatch function 1018 * provided, or using candidates' cd_match configuration driver 1019 * functions) and attach it, and return true. If the device was 1020 * not configured, call the given `print' function and return 0. 1021 */ 1022 device_t 1023 config_found_sm_loc(device_t parent, 1024 const char *ifattr, const int *locs, void *aux, 1025 cfprint_t print, cfsubmatch_t submatch) 1026 { 1027 cfdata_t cf; 1028 1029 #if defined(SPLASHSCREEN) && defined(SPLASHSCREEN_PROGRESS) 1030 if (splash_progress_state) 1031 splash_progress_update(splash_progress_state); 1032 #endif 1033 1034 if ((cf = config_search_loc(submatch, parent, ifattr, locs, aux))) 1035 return(config_attach_loc(parent, cf, locs, aux, print)); 1036 if (print) { 1037 if (config_do_twiddle) 1038 twiddle(); 1039 aprint_normal("%s", msgs[(*print)(aux, device_xname(parent))]); 1040 } 1041 1042 #if defined(SPLASHSCREEN) && defined(SPLASHSCREEN_PROGRESS) 1043 if (splash_progress_state) 1044 splash_progress_update(splash_progress_state); 1045 #endif 1046 1047 return (NULL); 1048 } 1049 1050 device_t 1051 config_found_ia(device_t parent, const char *ifattr, void *aux, 1052 cfprint_t print) 1053 { 1054 1055 return (config_found_sm_loc(parent, ifattr, NULL, aux, print, NULL)); 1056 } 1057 1058 device_t 1059 config_found(device_t parent, void *aux, cfprint_t print) 1060 { 1061 1062 return (config_found_sm_loc(parent, NULL, NULL, aux, print, NULL)); 1063 } 1064 1065 /* 1066 * As above, but for root devices. 1067 */ 1068 device_t 1069 config_rootfound(const char *rootname, void *aux) 1070 { 1071 cfdata_t cf; 1072 1073 if ((cf = config_rootsearch((cfsubmatch_t)NULL, rootname, aux)) != NULL) 1074 return (config_attach(ROOT, cf, aux, (cfprint_t)NULL)); 1075 aprint_error("root device %s not configured\n", rootname); 1076 return (NULL); 1077 } 1078 1079 /* just like sprintf(buf, "%d") except that it works from the end */ 1080 static char * 1081 number(char *ep, int n) 1082 { 1083 1084 *--ep = 0; 1085 while (n >= 10) { 1086 *--ep = (n % 10) + '0'; 1087 n /= 10; 1088 } 1089 *--ep = n + '0'; 1090 return (ep); 1091 } 1092 1093 /* 1094 * Expand the size of the cd_devs array if necessary. 1095 */ 1096 static void 1097 config_makeroom(int n, struct cfdriver *cd) 1098 { 1099 int old, new; 1100 device_t *nsp; 1101 1102 if (n < cd->cd_ndevs) 1103 return; 1104 1105 /* 1106 * Need to expand the array. 1107 */ 1108 old = cd->cd_ndevs; 1109 if (old == 0) 1110 new = 4; 1111 else 1112 new = old * 2; 1113 while (new <= n) 1114 new *= 2; 1115 cd->cd_ndevs = new; 1116 nsp = kmem_alloc(sizeof(device_t [new]), KM_SLEEP); 1117 if (nsp == NULL) 1118 panic("config_attach: %sing dev array", 1119 old != 0 ? "expand" : "creat"); 1120 memset(nsp + old, 0, sizeof(device_t [new - old])); 1121 if (old != 0) { 1122 memcpy(nsp, cd->cd_devs, sizeof(device_t [old])); 1123 kmem_free(cd->cd_devs, sizeof(device_t [old])); 1124 } 1125 cd->cd_devs = nsp; 1126 } 1127 1128 static void 1129 config_devlink(device_t dev) 1130 { 1131 struct cfdriver *cd = dev->dv_cfdriver; 1132 1133 /* put this device in the devices array */ 1134 config_makeroom(dev->dv_unit, cd); 1135 if (cd->cd_devs[dev->dv_unit]) 1136 panic("config_attach: duplicate %s", device_xname(dev)); 1137 cd->cd_devs[dev->dv_unit] = dev; 1138 1139 /* It is safe to add a device to the tail of the list while 1140 * readers are in the list, but not while a writer is in 1141 * the list. Wait for any writer to complete. 1142 */ 1143 mutex_enter(&alldevs_mtx); 1144 while (alldevs_nwrite != 0 && alldevs_writer != curlwp) 1145 cv_wait(&alldevs_cv, &alldevs_mtx); 1146 TAILQ_INSERT_TAIL(&alldevs, dev, dv_list); /* link up */ 1147 cv_signal(&alldevs_cv); 1148 mutex_exit(&alldevs_mtx); 1149 } 1150 1151 static void 1152 config_devunlink(device_t dev) 1153 { 1154 struct cfdriver *cd = dev->dv_cfdriver; 1155 int i; 1156 1157 /* Unlink from device list. */ 1158 TAILQ_REMOVE(&alldevs, dev, dv_list); 1159 1160 /* Remove from cfdriver's array. */ 1161 cd->cd_devs[dev->dv_unit] = NULL; 1162 1163 /* 1164 * If the device now has no units in use, deallocate its softc array. 1165 */ 1166 for (i = 0; i < cd->cd_ndevs; i++) { 1167 if (cd->cd_devs[i] != NULL) 1168 return; 1169 } 1170 /* nothing found; deallocate */ 1171 kmem_free(cd->cd_devs, sizeof(device_t [cd->cd_ndevs])); 1172 cd->cd_devs = NULL; 1173 cd->cd_ndevs = 0; 1174 } 1175 1176 static device_t 1177 config_devalloc(const device_t parent, const cfdata_t cf, const int *locs) 1178 { 1179 struct cfdriver *cd; 1180 struct cfattach *ca; 1181 size_t lname, lunit; 1182 const char *xunit; 1183 int myunit; 1184 char num[10]; 1185 device_t dev; 1186 void *dev_private; 1187 const struct cfiattrdata *ia; 1188 1189 cd = config_cfdriver_lookup(cf->cf_name); 1190 if (cd == NULL) 1191 return (NULL); 1192 1193 ca = config_cfattach_lookup_cd(cd, cf->cf_atname); 1194 if (ca == NULL) 1195 return (NULL); 1196 1197 if ((ca->ca_flags & DVF_PRIV_ALLOC) == 0 && 1198 ca->ca_devsize < sizeof(struct device)) 1199 panic("config_devalloc: %s", cf->cf_atname); 1200 1201 #ifndef __BROKEN_CONFIG_UNIT_USAGE 1202 if (cf->cf_fstate == FSTATE_STAR) { 1203 for (myunit = cf->cf_unit; myunit < cd->cd_ndevs; myunit++) 1204 if (cd->cd_devs[myunit] == NULL) 1205 break; 1206 /* 1207 * myunit is now the unit of the first NULL device pointer, 1208 * or max(cd->cd_ndevs,cf->cf_unit). 1209 */ 1210 } else { 1211 myunit = cf->cf_unit; 1212 if (myunit < cd->cd_ndevs && cd->cd_devs[myunit] != NULL) 1213 return (NULL); 1214 } 1215 #else 1216 myunit = cf->cf_unit; 1217 #endif /* ! __BROKEN_CONFIG_UNIT_USAGE */ 1218 1219 /* compute length of name and decimal expansion of unit number */ 1220 lname = strlen(cd->cd_name); 1221 xunit = number(&num[sizeof(num)], myunit); 1222 lunit = &num[sizeof(num)] - xunit; 1223 if (lname + lunit > sizeof(dev->dv_xname)) 1224 panic("config_devalloc: device name too long"); 1225 1226 /* get memory for all device vars */ 1227 KASSERT((ca->ca_flags & DVF_PRIV_ALLOC) || ca->ca_devsize >= sizeof(struct device)); 1228 if (ca->ca_devsize > 0) { 1229 dev_private = kmem_zalloc(ca->ca_devsize, KM_SLEEP); 1230 if (dev_private == NULL) 1231 panic("config_devalloc: memory allocation for device softc failed"); 1232 } else { 1233 KASSERT(ca->ca_flags & DVF_PRIV_ALLOC); 1234 dev_private = NULL; 1235 } 1236 1237 if ((ca->ca_flags & DVF_PRIV_ALLOC) != 0) { 1238 dev = kmem_zalloc(sizeof(*dev), KM_SLEEP); 1239 } else { 1240 dev = dev_private; 1241 } 1242 if (dev == NULL) 1243 panic("config_devalloc: memory allocation for device_t failed"); 1244 1245 dev->dv_class = cd->cd_class; 1246 dev->dv_cfdata = cf; 1247 dev->dv_cfdriver = cd; 1248 dev->dv_cfattach = ca; 1249 dev->dv_unit = myunit; 1250 dev->dv_activity_count = 0; 1251 dev->dv_activity_handlers = NULL; 1252 dev->dv_private = dev_private; 1253 memcpy(dev->dv_xname, cd->cd_name, lname); 1254 memcpy(dev->dv_xname + lname, xunit, lunit); 1255 dev->dv_parent = parent; 1256 if (parent != NULL) 1257 dev->dv_depth = parent->dv_depth + 1; 1258 else 1259 dev->dv_depth = 0; 1260 dev->dv_flags = DVF_ACTIVE; /* always initially active */ 1261 dev->dv_flags |= ca->ca_flags; /* inherit flags from class */ 1262 if (locs) { 1263 KASSERT(parent); /* no locators at root */ 1264 ia = cfiattr_lookup(cf->cf_pspec->cfp_iattr, 1265 parent->dv_cfdriver); 1266 dev->dv_locators = 1267 kmem_alloc(sizeof(int [ia->ci_loclen + 1]), KM_SLEEP); 1268 *dev->dv_locators++ = sizeof(int [ia->ci_loclen + 1]); 1269 memcpy(dev->dv_locators, locs, sizeof(int [ia->ci_loclen])); 1270 } 1271 dev->dv_properties = prop_dictionary_create(); 1272 KASSERT(dev->dv_properties != NULL); 1273 1274 prop_dictionary_set_cstring_nocopy(dev->dv_properties, 1275 "device-driver", dev->dv_cfdriver->cd_name); 1276 prop_dictionary_set_uint16(dev->dv_properties, 1277 "device-unit", dev->dv_unit); 1278 1279 return (dev); 1280 } 1281 1282 static void 1283 config_devdealloc(device_t dev) 1284 { 1285 int priv = (dev->dv_flags & DVF_PRIV_ALLOC); 1286 1287 KASSERT(dev->dv_properties != NULL); 1288 prop_object_release(dev->dv_properties); 1289 1290 if (dev->dv_activity_handlers) 1291 panic("config_devdealloc with registered handlers"); 1292 1293 if (dev->dv_locators) { 1294 size_t amount = *--dev->dv_locators; 1295 kmem_free(dev->dv_locators, amount); 1296 } 1297 1298 if (dev->dv_cfattach->ca_devsize > 0) 1299 kmem_free(dev->dv_private, dev->dv_cfattach->ca_devsize); 1300 if (priv) 1301 kmem_free(dev, sizeof(*dev)); 1302 } 1303 1304 /* 1305 * Attach a found device. 1306 */ 1307 device_t 1308 config_attach_loc(device_t parent, cfdata_t cf, 1309 const int *locs, void *aux, cfprint_t print) 1310 { 1311 device_t dev; 1312 struct cftable *ct; 1313 const char *drvname; 1314 1315 #if defined(SPLASHSCREEN) && defined(SPLASHSCREEN_PROGRESS) 1316 if (splash_progress_state) 1317 splash_progress_update(splash_progress_state); 1318 #endif 1319 1320 dev = config_devalloc(parent, cf, locs); 1321 if (!dev) 1322 panic("config_attach: allocation of device softc failed"); 1323 1324 /* XXX redundant - see below? */ 1325 if (cf->cf_fstate != FSTATE_STAR) { 1326 KASSERT(cf->cf_fstate == FSTATE_NOTFOUND); 1327 cf->cf_fstate = FSTATE_FOUND; 1328 } 1329 #ifdef __BROKEN_CONFIG_UNIT_USAGE 1330 else 1331 cf->cf_unit++; 1332 #endif 1333 1334 config_devlink(dev); 1335 1336 if (config_do_twiddle) 1337 twiddle(); 1338 else 1339 aprint_naive("Found "); 1340 /* 1341 * We want the next two printfs for normal, verbose, and quiet, 1342 * but not silent (in which case, we're twiddling, instead). 1343 */ 1344 if (parent == ROOT) { 1345 aprint_naive("%s (root)", device_xname(dev)); 1346 aprint_normal("%s (root)", device_xname(dev)); 1347 } else { 1348 aprint_naive("%s at %s", device_xname(dev), device_xname(parent)); 1349 aprint_normal("%s at %s", device_xname(dev), device_xname(parent)); 1350 if (print) 1351 (void) (*print)(aux, NULL); 1352 } 1353 1354 /* 1355 * Before attaching, clobber any unfound devices that are 1356 * otherwise identical. 1357 * XXX code above is redundant? 1358 */ 1359 drvname = dev->dv_cfdriver->cd_name; 1360 TAILQ_FOREACH(ct, &allcftables, ct_list) { 1361 for (cf = ct->ct_cfdata; cf->cf_name; cf++) { 1362 if (STREQ(cf->cf_name, drvname) && 1363 cf->cf_unit == dev->dv_unit) { 1364 if (cf->cf_fstate == FSTATE_NOTFOUND) 1365 cf->cf_fstate = FSTATE_FOUND; 1366 #ifdef __BROKEN_CONFIG_UNIT_USAGE 1367 /* 1368 * Bump the unit number on all starred cfdata 1369 * entries for this device. 1370 */ 1371 if (cf->cf_fstate == FSTATE_STAR) 1372 cf->cf_unit++; 1373 #endif /* __BROKEN_CONFIG_UNIT_USAGE */ 1374 } 1375 } 1376 } 1377 #ifdef __HAVE_DEVICE_REGISTER 1378 device_register(dev, aux); 1379 #endif 1380 1381 /* Let userland know */ 1382 devmon_report_device(dev, true); 1383 1384 #if defined(SPLASHSCREEN) && defined(SPLASHSCREEN_PROGRESS) 1385 if (splash_progress_state) 1386 splash_progress_update(splash_progress_state); 1387 #endif 1388 (*dev->dv_cfattach->ca_attach)(parent, dev, aux); 1389 #if defined(SPLASHSCREEN) && defined(SPLASHSCREEN_PROGRESS) 1390 if (splash_progress_state) 1391 splash_progress_update(splash_progress_state); 1392 #endif 1393 1394 if (!device_pmf_is_registered(dev)) 1395 aprint_debug_dev(dev, "WARNING: power management not supported\n"); 1396 1397 config_process_deferred(&deferred_config_queue, dev); 1398 return (dev); 1399 } 1400 1401 device_t 1402 config_attach(device_t parent, cfdata_t cf, void *aux, cfprint_t print) 1403 { 1404 1405 return (config_attach_loc(parent, cf, NULL, aux, print)); 1406 } 1407 1408 /* 1409 * As above, but for pseudo-devices. Pseudo-devices attached in this 1410 * way are silently inserted into the device tree, and their children 1411 * attached. 1412 * 1413 * Note that because pseudo-devices are attached silently, any information 1414 * the attach routine wishes to print should be prefixed with the device 1415 * name by the attach routine. 1416 */ 1417 device_t 1418 config_attach_pseudo(cfdata_t cf) 1419 { 1420 device_t dev; 1421 1422 dev = config_devalloc(ROOT, cf, NULL); 1423 if (!dev) 1424 return (NULL); 1425 1426 /* XXX mark busy in cfdata */ 1427 1428 config_devlink(dev); 1429 1430 #if 0 /* XXXJRT not yet */ 1431 #ifdef __HAVE_DEVICE_REGISTER 1432 device_register(dev, NULL); /* like a root node */ 1433 #endif 1434 #endif 1435 (*dev->dv_cfattach->ca_attach)(ROOT, dev, NULL); 1436 config_process_deferred(&deferred_config_queue, dev); 1437 return (dev); 1438 } 1439 1440 /* 1441 * Detach a device. Optionally forced (e.g. because of hardware 1442 * removal) and quiet. Returns zero if successful, non-zero 1443 * (an error code) otherwise. 1444 * 1445 * Note that this code wants to be run from a process context, so 1446 * that the detach can sleep to allow processes which have a device 1447 * open to run and unwind their stacks. 1448 */ 1449 int 1450 config_detach(device_t dev, int flags) 1451 { 1452 struct cftable *ct; 1453 cfdata_t cf; 1454 const struct cfattach *ca; 1455 struct cfdriver *cd; 1456 #ifdef DIAGNOSTIC 1457 device_t d; 1458 #endif 1459 int rv = 0; 1460 1461 #ifdef DIAGNOSTIC 1462 cf = dev->dv_cfdata; 1463 if (cf != NULL && cf->cf_fstate != FSTATE_FOUND && 1464 cf->cf_fstate != FSTATE_STAR) 1465 panic("config_detach: %s: bad device fstate %d", 1466 device_xname(dev), cf ? cf->cf_fstate : -1); 1467 #endif 1468 cd = dev->dv_cfdriver; 1469 KASSERT(cd != NULL); 1470 1471 ca = dev->dv_cfattach; 1472 KASSERT(ca != NULL); 1473 1474 KASSERT(curlwp != NULL); 1475 mutex_enter(&alldevs_mtx); 1476 if (alldevs_nwrite > 0 && alldevs_writer == NULL) 1477 ; 1478 else while (alldevs_nread != 0 || 1479 (alldevs_nwrite != 0 && alldevs_writer != curlwp)) 1480 cv_wait(&alldevs_cv, &alldevs_mtx); 1481 if (alldevs_nwrite++ == 0) 1482 alldevs_writer = curlwp; 1483 mutex_exit(&alldevs_mtx); 1484 1485 /* 1486 * Ensure the device is deactivated. If the device doesn't 1487 * have an activation entry point, we allow DVF_ACTIVE to 1488 * remain set. Otherwise, if DVF_ACTIVE is still set, the 1489 * device is busy, and the detach fails. 1490 */ 1491 if (ca->ca_activate != NULL) 1492 rv = config_deactivate(dev); 1493 1494 /* 1495 * Try to detach the device. If that's not possible, then 1496 * we either panic() (for the forced but failed case), or 1497 * return an error. 1498 */ 1499 if (rv == 0) { 1500 if (ca->ca_detach != NULL) 1501 rv = (*ca->ca_detach)(dev, flags); 1502 else 1503 rv = EOPNOTSUPP; 1504 } 1505 if (rv != 0) { 1506 if ((flags & DETACH_FORCE) == 0) 1507 goto out; 1508 else 1509 panic("config_detach: forced detach of %s failed (%d)", 1510 device_xname(dev), rv); 1511 } 1512 1513 /* 1514 * The device has now been successfully detached. 1515 */ 1516 1517 /* Let userland know */ 1518 devmon_report_device(dev, false); 1519 1520 #ifdef DIAGNOSTIC 1521 /* 1522 * Sanity: If you're successfully detached, you should have no 1523 * children. (Note that because children must be attached 1524 * after parents, we only need to search the latter part of 1525 * the list.) 1526 */ 1527 for (d = TAILQ_NEXT(dev, dv_list); d != NULL; 1528 d = TAILQ_NEXT(d, dv_list)) { 1529 if (d->dv_parent == dev) { 1530 printf("config_detach: detached device %s" 1531 " has children %s\n", device_xname(dev), device_xname(d)); 1532 panic("config_detach"); 1533 } 1534 } 1535 #endif 1536 1537 /* notify the parent that the child is gone */ 1538 if (dev->dv_parent) { 1539 device_t p = dev->dv_parent; 1540 if (p->dv_cfattach->ca_childdetached) 1541 (*p->dv_cfattach->ca_childdetached)(p, dev); 1542 } 1543 1544 /* 1545 * Mark cfdata to show that the unit can be reused, if possible. 1546 */ 1547 TAILQ_FOREACH(ct, &allcftables, ct_list) { 1548 for (cf = ct->ct_cfdata; cf->cf_name; cf++) { 1549 if (STREQ(cf->cf_name, cd->cd_name)) { 1550 if (cf->cf_fstate == FSTATE_FOUND && 1551 cf->cf_unit == dev->dv_unit) 1552 cf->cf_fstate = FSTATE_NOTFOUND; 1553 #ifdef __BROKEN_CONFIG_UNIT_USAGE 1554 /* 1555 * Note that we can only re-use a starred 1556 * unit number if the unit being detached 1557 * had the last assigned unit number. 1558 */ 1559 if (cf->cf_fstate == FSTATE_STAR && 1560 cf->cf_unit == dev->dv_unit + 1) 1561 cf->cf_unit--; 1562 #endif /* __BROKEN_CONFIG_UNIT_USAGE */ 1563 } 1564 } 1565 } 1566 1567 config_devunlink(dev); 1568 1569 if (dev->dv_cfdata != NULL && (flags & DETACH_QUIET) == 0) 1570 aprint_normal_dev(dev, "detached\n"); 1571 1572 config_devdealloc(dev); 1573 1574 out: 1575 mutex_enter(&alldevs_mtx); 1576 if (--alldevs_nwrite == 0) 1577 alldevs_writer = NULL; 1578 cv_signal(&alldevs_cv); 1579 mutex_exit(&alldevs_mtx); 1580 return rv; 1581 } 1582 1583 int 1584 config_detach_children(device_t parent, int flags) 1585 { 1586 device_t dv; 1587 deviter_t di; 1588 int error = 0; 1589 1590 for (dv = deviter_first(&di, DEVITER_F_RW); dv != NULL; 1591 dv = deviter_next(&di)) { 1592 if (device_parent(dv) != parent) 1593 continue; 1594 if ((error = config_detach(dv, flags)) != 0) 1595 break; 1596 } 1597 deviter_release(&di); 1598 return error; 1599 } 1600 1601 int 1602 config_activate(device_t dev) 1603 { 1604 const struct cfattach *ca = dev->dv_cfattach; 1605 int rv = 0, oflags = dev->dv_flags; 1606 1607 if (ca->ca_activate == NULL) 1608 return (EOPNOTSUPP); 1609 1610 if ((dev->dv_flags & DVF_ACTIVE) == 0) { 1611 dev->dv_flags |= DVF_ACTIVE; 1612 rv = (*ca->ca_activate)(dev, DVACT_ACTIVATE); 1613 if (rv) 1614 dev->dv_flags = oflags; 1615 } 1616 return (rv); 1617 } 1618 1619 int 1620 config_deactivate(device_t dev) 1621 { 1622 const struct cfattach *ca = dev->dv_cfattach; 1623 int rv = 0, oflags = dev->dv_flags; 1624 1625 if (ca->ca_activate == NULL) 1626 return (EOPNOTSUPP); 1627 1628 if (dev->dv_flags & DVF_ACTIVE) { 1629 dev->dv_flags &= ~DVF_ACTIVE; 1630 rv = (*ca->ca_activate)(dev, DVACT_DEACTIVATE); 1631 if (rv) 1632 dev->dv_flags = oflags; 1633 } 1634 return (rv); 1635 } 1636 1637 /* 1638 * Defer the configuration of the specified device until all 1639 * of its parent's devices have been attached. 1640 */ 1641 void 1642 config_defer(device_t dev, void (*func)(device_t)) 1643 { 1644 struct deferred_config *dc; 1645 1646 if (dev->dv_parent == NULL) 1647 panic("config_defer: can't defer config of a root device"); 1648 1649 #ifdef DIAGNOSTIC 1650 for (dc = TAILQ_FIRST(&deferred_config_queue); dc != NULL; 1651 dc = TAILQ_NEXT(dc, dc_queue)) { 1652 if (dc->dc_dev == dev) 1653 panic("config_defer: deferred twice"); 1654 } 1655 #endif 1656 1657 dc = kmem_alloc(sizeof(*dc), KM_SLEEP); 1658 if (dc == NULL) 1659 panic("config_defer: unable to allocate callback"); 1660 1661 dc->dc_dev = dev; 1662 dc->dc_func = func; 1663 TAILQ_INSERT_TAIL(&deferred_config_queue, dc, dc_queue); 1664 config_pending_incr(); 1665 } 1666 1667 /* 1668 * Defer some autoconfiguration for a device until after interrupts 1669 * are enabled. 1670 */ 1671 void 1672 config_interrupts(device_t dev, void (*func)(device_t)) 1673 { 1674 struct deferred_config *dc; 1675 1676 /* 1677 * If interrupts are enabled, callback now. 1678 */ 1679 if (cold == 0) { 1680 (*func)(dev); 1681 return; 1682 } 1683 1684 #ifdef DIAGNOSTIC 1685 for (dc = TAILQ_FIRST(&interrupt_config_queue); dc != NULL; 1686 dc = TAILQ_NEXT(dc, dc_queue)) { 1687 if (dc->dc_dev == dev) 1688 panic("config_interrupts: deferred twice"); 1689 } 1690 #endif 1691 1692 dc = kmem_alloc(sizeof(*dc), KM_SLEEP); 1693 if (dc == NULL) 1694 panic("config_interrupts: unable to allocate callback"); 1695 1696 dc->dc_dev = dev; 1697 dc->dc_func = func; 1698 TAILQ_INSERT_TAIL(&interrupt_config_queue, dc, dc_queue); 1699 config_pending_incr(); 1700 } 1701 1702 /* 1703 * Process a deferred configuration queue. 1704 */ 1705 static void 1706 config_process_deferred(struct deferred_config_head *queue, 1707 device_t parent) 1708 { 1709 struct deferred_config *dc, *ndc; 1710 1711 for (dc = TAILQ_FIRST(queue); dc != NULL; dc = ndc) { 1712 ndc = TAILQ_NEXT(dc, dc_queue); 1713 if (parent == NULL || dc->dc_dev->dv_parent == parent) { 1714 TAILQ_REMOVE(queue, dc, dc_queue); 1715 (*dc->dc_func)(dc->dc_dev); 1716 kmem_free(dc, sizeof(*dc)); 1717 config_pending_decr(); 1718 } 1719 } 1720 } 1721 1722 /* 1723 * Manipulate the config_pending semaphore. 1724 */ 1725 void 1726 config_pending_incr(void) 1727 { 1728 1729 mutex_enter(&config_misc_lock); 1730 config_pending++; 1731 mutex_exit(&config_misc_lock); 1732 } 1733 1734 void 1735 config_pending_decr(void) 1736 { 1737 1738 #ifdef DIAGNOSTIC 1739 if (config_pending == 0) 1740 panic("config_pending_decr: config_pending == 0"); 1741 #endif 1742 mutex_enter(&config_misc_lock); 1743 config_pending--; 1744 if (config_pending == 0) 1745 cv_broadcast(&config_misc_cv); 1746 mutex_exit(&config_misc_lock); 1747 } 1748 1749 /* 1750 * Register a "finalization" routine. Finalization routines are 1751 * called iteratively once all real devices have been found during 1752 * autoconfiguration, for as long as any one finalizer has done 1753 * any work. 1754 */ 1755 int 1756 config_finalize_register(device_t dev, int (*fn)(device_t)) 1757 { 1758 struct finalize_hook *f; 1759 1760 /* 1761 * If finalization has already been done, invoke the 1762 * callback function now. 1763 */ 1764 if (config_finalize_done) { 1765 while ((*fn)(dev) != 0) 1766 /* loop */ ; 1767 } 1768 1769 /* Ensure this isn't already on the list. */ 1770 TAILQ_FOREACH(f, &config_finalize_list, f_list) { 1771 if (f->f_func == fn && f->f_dev == dev) 1772 return (EEXIST); 1773 } 1774 1775 f = kmem_alloc(sizeof(*f), KM_SLEEP); 1776 f->f_func = fn; 1777 f->f_dev = dev; 1778 TAILQ_INSERT_TAIL(&config_finalize_list, f, f_list); 1779 1780 return (0); 1781 } 1782 1783 void 1784 config_finalize(void) 1785 { 1786 struct finalize_hook *f; 1787 struct pdevinit *pdev; 1788 extern struct pdevinit pdevinit[]; 1789 int errcnt, rv; 1790 1791 /* 1792 * Now that device driver threads have been created, wait for 1793 * them to finish any deferred autoconfiguration. 1794 */ 1795 mutex_enter(&config_misc_lock); 1796 while (config_pending != 0) 1797 cv_wait(&config_misc_cv, &config_misc_lock); 1798 mutex_exit(&config_misc_lock); 1799 1800 KERNEL_LOCK(1, NULL); 1801 1802 /* Attach pseudo-devices. */ 1803 for (pdev = pdevinit; pdev->pdev_attach != NULL; pdev++) 1804 (*pdev->pdev_attach)(pdev->pdev_count); 1805 1806 /* Run the hooks until none of them does any work. */ 1807 do { 1808 rv = 0; 1809 TAILQ_FOREACH(f, &config_finalize_list, f_list) 1810 rv |= (*f->f_func)(f->f_dev); 1811 } while (rv != 0); 1812 1813 config_finalize_done = 1; 1814 1815 /* Now free all the hooks. */ 1816 while ((f = TAILQ_FIRST(&config_finalize_list)) != NULL) { 1817 TAILQ_REMOVE(&config_finalize_list, f, f_list); 1818 kmem_free(f, sizeof(*f)); 1819 } 1820 1821 KERNEL_UNLOCK_ONE(NULL); 1822 1823 errcnt = aprint_get_error_count(); 1824 if ((boothowto & (AB_QUIET|AB_SILENT)) != 0 && 1825 (boothowto & AB_VERBOSE) == 0) { 1826 if (config_do_twiddle) { 1827 config_do_twiddle = 0; 1828 printf_nolog("done.\n"); 1829 } 1830 if (errcnt != 0) { 1831 printf("WARNING: %d error%s while detecting hardware; " 1832 "check system log.\n", errcnt, 1833 errcnt == 1 ? "" : "s"); 1834 } 1835 } 1836 } 1837 1838 /* 1839 * device_lookup: 1840 * 1841 * Look up a device instance for a given driver. 1842 */ 1843 device_t 1844 device_lookup(cfdriver_t cd, int unit) 1845 { 1846 1847 if (unit < 0 || unit >= cd->cd_ndevs) 1848 return (NULL); 1849 1850 return (cd->cd_devs[unit]); 1851 } 1852 1853 /* 1854 * device_lookup: 1855 * 1856 * Look up a device instance for a given driver. 1857 */ 1858 void * 1859 device_lookup_private(cfdriver_t cd, int unit) 1860 { 1861 device_t dv; 1862 1863 if (unit < 0 || unit >= cd->cd_ndevs) 1864 return NULL; 1865 1866 if ((dv = cd->cd_devs[unit]) == NULL) 1867 return NULL; 1868 1869 return dv->dv_private; 1870 } 1871 1872 /* 1873 * Accessor functions for the device_t type. 1874 */ 1875 devclass_t 1876 device_class(device_t dev) 1877 { 1878 1879 return (dev->dv_class); 1880 } 1881 1882 cfdata_t 1883 device_cfdata(device_t dev) 1884 { 1885 1886 return (dev->dv_cfdata); 1887 } 1888 1889 cfdriver_t 1890 device_cfdriver(device_t dev) 1891 { 1892 1893 return (dev->dv_cfdriver); 1894 } 1895 1896 cfattach_t 1897 device_cfattach(device_t dev) 1898 { 1899 1900 return (dev->dv_cfattach); 1901 } 1902 1903 int 1904 device_unit(device_t dev) 1905 { 1906 1907 return (dev->dv_unit); 1908 } 1909 1910 const char * 1911 device_xname(device_t dev) 1912 { 1913 1914 return (dev->dv_xname); 1915 } 1916 1917 device_t 1918 device_parent(device_t dev) 1919 { 1920 1921 return (dev->dv_parent); 1922 } 1923 1924 bool 1925 device_is_active(device_t dev) 1926 { 1927 int active_flags; 1928 1929 active_flags = DVF_ACTIVE; 1930 active_flags |= DVF_CLASS_SUSPENDED; 1931 active_flags |= DVF_DRIVER_SUSPENDED; 1932 active_flags |= DVF_BUS_SUSPENDED; 1933 1934 return ((dev->dv_flags & active_flags) == DVF_ACTIVE); 1935 } 1936 1937 bool 1938 device_is_enabled(device_t dev) 1939 { 1940 return (dev->dv_flags & DVF_ACTIVE) == DVF_ACTIVE; 1941 } 1942 1943 bool 1944 device_has_power(device_t dev) 1945 { 1946 int active_flags; 1947 1948 active_flags = DVF_ACTIVE | DVF_BUS_SUSPENDED; 1949 1950 return ((dev->dv_flags & active_flags) == DVF_ACTIVE); 1951 } 1952 1953 int 1954 device_locator(device_t dev, u_int locnum) 1955 { 1956 1957 KASSERT(dev->dv_locators != NULL); 1958 return (dev->dv_locators[locnum]); 1959 } 1960 1961 void * 1962 device_private(device_t dev) 1963 { 1964 1965 /* 1966 * The reason why device_private(NULL) is allowed is to simplify the 1967 * work of a lot of userspace request handlers (i.e., c/bdev 1968 * handlers) which grab cfdriver_t->cd_units[n]. 1969 * It avoids having them test for it to be NULL and only then calling 1970 * device_private. 1971 */ 1972 return dev == NULL ? NULL : dev->dv_private; 1973 } 1974 1975 prop_dictionary_t 1976 device_properties(device_t dev) 1977 { 1978 1979 return (dev->dv_properties); 1980 } 1981 1982 /* 1983 * device_is_a: 1984 * 1985 * Returns true if the device is an instance of the specified 1986 * driver. 1987 */ 1988 bool 1989 device_is_a(device_t dev, const char *dname) 1990 { 1991 1992 return (strcmp(dev->dv_cfdriver->cd_name, dname) == 0); 1993 } 1994 1995 /* 1996 * device_find_by_xname: 1997 * 1998 * Returns the device of the given name or NULL if it doesn't exist. 1999 */ 2000 device_t 2001 device_find_by_xname(const char *name) 2002 { 2003 device_t dv; 2004 deviter_t di; 2005 2006 for (dv = deviter_first(&di, 0); dv != NULL; dv = deviter_next(&di)) { 2007 if (strcmp(device_xname(dv), name) == 0) 2008 break; 2009 } 2010 deviter_release(&di); 2011 2012 return dv; 2013 } 2014 2015 /* 2016 * device_find_by_driver_unit: 2017 * 2018 * Returns the device of the given driver name and unit or 2019 * NULL if it doesn't exist. 2020 */ 2021 device_t 2022 device_find_by_driver_unit(const char *name, int unit) 2023 { 2024 struct cfdriver *cd; 2025 2026 if ((cd = config_cfdriver_lookup(name)) == NULL) 2027 return NULL; 2028 return device_lookup(cd, unit); 2029 } 2030 2031 /* 2032 * Power management related functions. 2033 */ 2034 2035 bool 2036 device_pmf_is_registered(device_t dev) 2037 { 2038 return (dev->dv_flags & DVF_POWER_HANDLERS) != 0; 2039 } 2040 2041 bool 2042 device_pmf_driver_suspend(device_t dev PMF_FN_ARGS) 2043 { 2044 if ((dev->dv_flags & DVF_DRIVER_SUSPENDED) != 0) 2045 return true; 2046 if ((dev->dv_flags & DVF_CLASS_SUSPENDED) == 0) 2047 return false; 2048 if (*dev->dv_driver_suspend != NULL && 2049 !(*dev->dv_driver_suspend)(dev PMF_FN_CALL)) 2050 return false; 2051 2052 dev->dv_flags |= DVF_DRIVER_SUSPENDED; 2053 return true; 2054 } 2055 2056 bool 2057 device_pmf_driver_resume(device_t dev PMF_FN_ARGS) 2058 { 2059 if ((dev->dv_flags & DVF_DRIVER_SUSPENDED) == 0) 2060 return true; 2061 if ((dev->dv_flags & DVF_BUS_SUSPENDED) != 0) 2062 return false; 2063 if ((flags & PMF_F_SELF) != 0 && !device_is_self_suspended(dev)) 2064 return false; 2065 if (*dev->dv_driver_resume != NULL && 2066 !(*dev->dv_driver_resume)(dev PMF_FN_CALL)) 2067 return false; 2068 2069 dev->dv_flags &= ~DVF_DRIVER_SUSPENDED; 2070 return true; 2071 } 2072 2073 bool 2074 device_pmf_driver_shutdown(device_t dev, int how) 2075 { 2076 2077 if (*dev->dv_driver_shutdown != NULL && 2078 !(*dev->dv_driver_shutdown)(dev, how)) 2079 return false; 2080 return true; 2081 } 2082 2083 bool 2084 device_pmf_driver_register(device_t dev, 2085 bool (*suspend)(device_t PMF_FN_PROTO), 2086 bool (*resume)(device_t PMF_FN_PROTO), 2087 bool (*shutdown)(device_t, int)) 2088 { 2089 pmf_private_t *pp; 2090 2091 if ((pp = kmem_zalloc(sizeof(*pp), KM_SLEEP)) == NULL) 2092 return false; 2093 mutex_init(&pp->pp_mtx, MUTEX_DEFAULT, IPL_NONE); 2094 cv_init(&pp->pp_cv, "pmfsusp"); 2095 dev->dv_pmf_private = pp; 2096 2097 dev->dv_driver_suspend = suspend; 2098 dev->dv_driver_resume = resume; 2099 dev->dv_driver_shutdown = shutdown; 2100 dev->dv_flags |= DVF_POWER_HANDLERS; 2101 return true; 2102 } 2103 2104 static const char * 2105 curlwp_name(void) 2106 { 2107 if (curlwp->l_name != NULL) 2108 return curlwp->l_name; 2109 else 2110 return curlwp->l_proc->p_comm; 2111 } 2112 2113 void 2114 device_pmf_driver_deregister(device_t dev) 2115 { 2116 pmf_private_t *pp = dev->dv_pmf_private; 2117 2118 /* XXX avoid crash in case we are not initialized */ 2119 if (!pp) 2120 return; 2121 2122 dev->dv_driver_suspend = NULL; 2123 dev->dv_driver_resume = NULL; 2124 2125 mutex_enter(&pp->pp_mtx); 2126 dev->dv_flags &= ~DVF_POWER_HANDLERS; 2127 while (pp->pp_nlock > 0 || pp->pp_nwait > 0) { 2128 /* Wake a thread that waits for the lock. That 2129 * thread will fail to acquire the lock, and then 2130 * it will wake the next thread that waits for the 2131 * lock, or else it will wake us. 2132 */ 2133 cv_signal(&pp->pp_cv); 2134 pmflock_debug(dev, __func__, __LINE__); 2135 cv_wait(&pp->pp_cv, &pp->pp_mtx); 2136 pmflock_debug(dev, __func__, __LINE__); 2137 } 2138 dev->dv_pmf_private = NULL; 2139 mutex_exit(&pp->pp_mtx); 2140 2141 cv_destroy(&pp->pp_cv); 2142 mutex_destroy(&pp->pp_mtx); 2143 kmem_free(pp, sizeof(*pp)); 2144 } 2145 2146 bool 2147 device_pmf_driver_child_register(device_t dev) 2148 { 2149 device_t parent = device_parent(dev); 2150 2151 if (parent == NULL || parent->dv_driver_child_register == NULL) 2152 return true; 2153 return (*parent->dv_driver_child_register)(dev); 2154 } 2155 2156 void 2157 device_pmf_driver_set_child_register(device_t dev, 2158 bool (*child_register)(device_t)) 2159 { 2160 dev->dv_driver_child_register = child_register; 2161 } 2162 2163 void 2164 device_pmf_self_resume(device_t dev PMF_FN_ARGS) 2165 { 2166 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2167 if ((dev->dv_flags & DVF_SELF_SUSPENDED) != 0) 2168 dev->dv_flags &= ~DVF_SELF_SUSPENDED; 2169 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2170 } 2171 2172 bool 2173 device_is_self_suspended(device_t dev) 2174 { 2175 return (dev->dv_flags & DVF_SELF_SUSPENDED) != 0; 2176 } 2177 2178 void 2179 device_pmf_self_suspend(device_t dev PMF_FN_ARGS) 2180 { 2181 bool self = (flags & PMF_F_SELF) != 0; 2182 2183 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2184 2185 if (!self) 2186 dev->dv_flags &= ~DVF_SELF_SUSPENDED; 2187 else if (device_is_active(dev)) 2188 dev->dv_flags |= DVF_SELF_SUSPENDED; 2189 2190 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2191 } 2192 2193 static void 2194 pmflock_debug(device_t dev, const char *func, int line) 2195 { 2196 pmf_private_t *pp = device_pmf_private(dev); 2197 2198 aprint_debug_dev(dev, "%s.%d, %s pp_nlock %d pp_nwait %d dv_flags %x\n", 2199 func, line, curlwp_name(), pp->pp_nlock, pp->pp_nwait, 2200 dev->dv_flags); 2201 } 2202 2203 static void 2204 pmflock_debug_with_flags(device_t dev, const char *func, int line PMF_FN_ARGS) 2205 { 2206 pmf_private_t *pp = device_pmf_private(dev); 2207 2208 aprint_debug_dev(dev, "%s.%d, %s pp_nlock %d pp_nwait %d dv_flags %x " 2209 "flags " PMF_FLAGS_FMT "\n", func, line, curlwp_name(), 2210 pp->pp_nlock, pp->pp_nwait, dev->dv_flags PMF_FN_CALL); 2211 } 2212 2213 static bool 2214 device_pmf_lock1(device_t dev PMF_FN_ARGS) 2215 { 2216 pmf_private_t *pp = device_pmf_private(dev); 2217 2218 while (device_pmf_is_registered(dev) && 2219 pp->pp_nlock > 0 && pp->pp_holder != curlwp) { 2220 pp->pp_nwait++; 2221 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2222 cv_wait(&pp->pp_cv, &pp->pp_mtx); 2223 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2224 pp->pp_nwait--; 2225 } 2226 if (!device_pmf_is_registered(dev)) { 2227 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2228 /* We could not acquire the lock, but some other thread may 2229 * wait for it, also. Wake that thread. 2230 */ 2231 cv_signal(&pp->pp_cv); 2232 return false; 2233 } 2234 pp->pp_nlock++; 2235 pp->pp_holder = curlwp; 2236 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2237 return true; 2238 } 2239 2240 bool 2241 device_pmf_lock(device_t dev PMF_FN_ARGS) 2242 { 2243 bool rc; 2244 pmf_private_t *pp = device_pmf_private(dev); 2245 2246 mutex_enter(&pp->pp_mtx); 2247 rc = device_pmf_lock1(dev PMF_FN_CALL); 2248 mutex_exit(&pp->pp_mtx); 2249 2250 return rc; 2251 } 2252 2253 void 2254 device_pmf_unlock(device_t dev PMF_FN_ARGS) 2255 { 2256 pmf_private_t *pp = device_pmf_private(dev); 2257 2258 KASSERT(pp->pp_nlock > 0); 2259 mutex_enter(&pp->pp_mtx); 2260 if (--pp->pp_nlock == 0) 2261 pp->pp_holder = NULL; 2262 cv_signal(&pp->pp_cv); 2263 pmflock_debug_with_flags(dev, __func__, __LINE__ PMF_FN_CALL); 2264 mutex_exit(&pp->pp_mtx); 2265 } 2266 2267 void * 2268 device_pmf_private(device_t dev) 2269 { 2270 return dev->dv_pmf_private; 2271 } 2272 2273 void * 2274 device_pmf_bus_private(device_t dev) 2275 { 2276 return dev->dv_bus_private; 2277 } 2278 2279 bool 2280 device_pmf_bus_suspend(device_t dev PMF_FN_ARGS) 2281 { 2282 if ((dev->dv_flags & DVF_BUS_SUSPENDED) != 0) 2283 return true; 2284 if ((dev->dv_flags & DVF_CLASS_SUSPENDED) == 0 || 2285 (dev->dv_flags & DVF_DRIVER_SUSPENDED) == 0) 2286 return false; 2287 if (*dev->dv_bus_suspend != NULL && 2288 !(*dev->dv_bus_suspend)(dev PMF_FN_CALL)) 2289 return false; 2290 2291 dev->dv_flags |= DVF_BUS_SUSPENDED; 2292 return true; 2293 } 2294 2295 bool 2296 device_pmf_bus_resume(device_t dev PMF_FN_ARGS) 2297 { 2298 if ((dev->dv_flags & DVF_BUS_SUSPENDED) == 0) 2299 return true; 2300 if ((flags & PMF_F_SELF) != 0 && !device_is_self_suspended(dev)) 2301 return false; 2302 if (*dev->dv_bus_resume != NULL && 2303 !(*dev->dv_bus_resume)(dev PMF_FN_CALL)) 2304 return false; 2305 2306 dev->dv_flags &= ~DVF_BUS_SUSPENDED; 2307 return true; 2308 } 2309 2310 bool 2311 device_pmf_bus_shutdown(device_t dev, int how) 2312 { 2313 2314 if (*dev->dv_bus_shutdown != NULL && 2315 !(*dev->dv_bus_shutdown)(dev, how)) 2316 return false; 2317 return true; 2318 } 2319 2320 void 2321 device_pmf_bus_register(device_t dev, void *priv, 2322 bool (*suspend)(device_t PMF_FN_PROTO), 2323 bool (*resume)(device_t PMF_FN_PROTO), 2324 bool (*shutdown)(device_t, int), void (*deregister)(device_t)) 2325 { 2326 dev->dv_bus_private = priv; 2327 dev->dv_bus_resume = resume; 2328 dev->dv_bus_suspend = suspend; 2329 dev->dv_bus_shutdown = shutdown; 2330 dev->dv_bus_deregister = deregister; 2331 } 2332 2333 void 2334 device_pmf_bus_deregister(device_t dev) 2335 { 2336 if (dev->dv_bus_deregister == NULL) 2337 return; 2338 (*dev->dv_bus_deregister)(dev); 2339 dev->dv_bus_private = NULL; 2340 dev->dv_bus_suspend = NULL; 2341 dev->dv_bus_resume = NULL; 2342 dev->dv_bus_deregister = NULL; 2343 } 2344 2345 void * 2346 device_pmf_class_private(device_t dev) 2347 { 2348 return dev->dv_class_private; 2349 } 2350 2351 bool 2352 device_pmf_class_suspend(device_t dev PMF_FN_ARGS) 2353 { 2354 if ((dev->dv_flags & DVF_CLASS_SUSPENDED) != 0) 2355 return true; 2356 if (*dev->dv_class_suspend != NULL && 2357 !(*dev->dv_class_suspend)(dev PMF_FN_CALL)) 2358 return false; 2359 2360 dev->dv_flags |= DVF_CLASS_SUSPENDED; 2361 return true; 2362 } 2363 2364 bool 2365 device_pmf_class_resume(device_t dev PMF_FN_ARGS) 2366 { 2367 if ((dev->dv_flags & DVF_CLASS_SUSPENDED) == 0) 2368 return true; 2369 if ((dev->dv_flags & DVF_BUS_SUSPENDED) != 0 || 2370 (dev->dv_flags & DVF_DRIVER_SUSPENDED) != 0) 2371 return false; 2372 if (*dev->dv_class_resume != NULL && 2373 !(*dev->dv_class_resume)(dev PMF_FN_CALL)) 2374 return false; 2375 2376 dev->dv_flags &= ~DVF_CLASS_SUSPENDED; 2377 return true; 2378 } 2379 2380 void 2381 device_pmf_class_register(device_t dev, void *priv, 2382 bool (*suspend)(device_t PMF_FN_PROTO), 2383 bool (*resume)(device_t PMF_FN_PROTO), 2384 void (*deregister)(device_t)) 2385 { 2386 dev->dv_class_private = priv; 2387 dev->dv_class_suspend = suspend; 2388 dev->dv_class_resume = resume; 2389 dev->dv_class_deregister = deregister; 2390 } 2391 2392 void 2393 device_pmf_class_deregister(device_t dev) 2394 { 2395 if (dev->dv_class_deregister == NULL) 2396 return; 2397 (*dev->dv_class_deregister)(dev); 2398 dev->dv_class_private = NULL; 2399 dev->dv_class_suspend = NULL; 2400 dev->dv_class_resume = NULL; 2401 dev->dv_class_deregister = NULL; 2402 } 2403 2404 bool 2405 device_active(device_t dev, devactive_t type) 2406 { 2407 size_t i; 2408 2409 if (dev->dv_activity_count == 0) 2410 return false; 2411 2412 for (i = 0; i < dev->dv_activity_count; ++i) { 2413 if (dev->dv_activity_handlers[i] == NULL) 2414 break; 2415 (*dev->dv_activity_handlers[i])(dev, type); 2416 } 2417 2418 return true; 2419 } 2420 2421 bool 2422 device_active_register(device_t dev, void (*handler)(device_t, devactive_t)) 2423 { 2424 void (**new_handlers)(device_t, devactive_t); 2425 void (**old_handlers)(device_t, devactive_t); 2426 size_t i, old_size, new_size; 2427 int s; 2428 2429 old_handlers = dev->dv_activity_handlers; 2430 old_size = dev->dv_activity_count; 2431 2432 for (i = 0; i < old_size; ++i) { 2433 KASSERT(old_handlers[i] != handler); 2434 if (old_handlers[i] == NULL) { 2435 old_handlers[i] = handler; 2436 return true; 2437 } 2438 } 2439 2440 new_size = old_size + 4; 2441 new_handlers = kmem_alloc(sizeof(void *[new_size]), KM_SLEEP); 2442 2443 memcpy(new_handlers, old_handlers, sizeof(void *[old_size])); 2444 new_handlers[old_size] = handler; 2445 memset(new_handlers + old_size + 1, 0, 2446 sizeof(int [new_size - (old_size+1)])); 2447 2448 s = splhigh(); 2449 dev->dv_activity_count = new_size; 2450 dev->dv_activity_handlers = new_handlers; 2451 splx(s); 2452 2453 if (old_handlers != NULL) 2454 kmem_free(old_handlers, sizeof(void * [old_size])); 2455 2456 return true; 2457 } 2458 2459 void 2460 device_active_deregister(device_t dev, void (*handler)(device_t, devactive_t)) 2461 { 2462 void (**old_handlers)(device_t, devactive_t); 2463 size_t i, old_size; 2464 int s; 2465 2466 old_handlers = dev->dv_activity_handlers; 2467 old_size = dev->dv_activity_count; 2468 2469 for (i = 0; i < old_size; ++i) { 2470 if (old_handlers[i] == handler) 2471 break; 2472 if (old_handlers[i] == NULL) 2473 return; /* XXX panic? */ 2474 } 2475 2476 if (i == old_size) 2477 return; /* XXX panic? */ 2478 2479 for (; i < old_size - 1; ++i) { 2480 if ((old_handlers[i] = old_handlers[i + 1]) != NULL) 2481 continue; 2482 2483 if (i == 0) { 2484 s = splhigh(); 2485 dev->dv_activity_count = 0; 2486 dev->dv_activity_handlers = NULL; 2487 splx(s); 2488 kmem_free(old_handlers, sizeof(void *[old_size])); 2489 } 2490 return; 2491 } 2492 old_handlers[i] = NULL; 2493 } 2494 2495 /* 2496 * Device Iteration 2497 * 2498 * deviter_t: a device iterator. Holds state for a "walk" visiting 2499 * each device_t's in the device tree. 2500 * 2501 * deviter_init(di, flags): initialize the device iterator `di' 2502 * to "walk" the device tree. deviter_next(di) will return 2503 * the first device_t in the device tree, or NULL if there are 2504 * no devices. 2505 * 2506 * `flags' is one or more of DEVITER_F_RW, indicating that the 2507 * caller intends to modify the device tree by calling 2508 * config_detach(9) on devices in the order that the iterator 2509 * returns them; DEVITER_F_ROOT_FIRST, asking for the devices 2510 * nearest the "root" of the device tree to be returned, first; 2511 * DEVITER_F_LEAVES_FIRST, asking for the devices furthest from 2512 * the root of the device tree, first; and DEVITER_F_SHUTDOWN, 2513 * indicating both that deviter_init() should not respect any 2514 * locks on the device tree, and that deviter_next(di) may run 2515 * in more than one LWP before the walk has finished. 2516 * 2517 * Only one DEVITER_F_RW iterator may be in the device tree at 2518 * once. 2519 * 2520 * DEVITER_F_SHUTDOWN implies DEVITER_F_RW. 2521 * 2522 * Results are undefined if the flags DEVITER_F_ROOT_FIRST and 2523 * DEVITER_F_LEAVES_FIRST are used in combination. 2524 * 2525 * deviter_first(di, flags): initialize the device iterator `di' 2526 * and return the first device_t in the device tree, or NULL 2527 * if there are no devices. The statement 2528 * 2529 * dv = deviter_first(di); 2530 * 2531 * is shorthand for 2532 * 2533 * deviter_init(di); 2534 * dv = deviter_next(di); 2535 * 2536 * deviter_next(di): return the next device_t in the device tree, 2537 * or NULL if there are no more devices. deviter_next(di) 2538 * is undefined if `di' was not initialized with deviter_init() or 2539 * deviter_first(). 2540 * 2541 * deviter_release(di): stops iteration (subsequent calls to 2542 * deviter_next() will return NULL), releases any locks and 2543 * resources held by the device iterator. 2544 * 2545 * Device iteration does not return device_t's in any particular 2546 * order. An iterator will never return the same device_t twice. 2547 * Device iteration is guaranteed to complete---i.e., if deviter_next(di) 2548 * is called repeatedly on the same `di', it will eventually return 2549 * NULL. It is ok to attach/detach devices during device iteration. 2550 */ 2551 void 2552 deviter_init(deviter_t *di, deviter_flags_t flags) 2553 { 2554 device_t dv; 2555 bool rw; 2556 2557 mutex_enter(&alldevs_mtx); 2558 if ((flags & DEVITER_F_SHUTDOWN) != 0) { 2559 flags |= DEVITER_F_RW; 2560 alldevs_nwrite++; 2561 alldevs_writer = NULL; 2562 alldevs_nread = 0; 2563 } else { 2564 rw = (flags & DEVITER_F_RW) != 0; 2565 2566 if (alldevs_nwrite > 0 && alldevs_writer == NULL) 2567 ; 2568 else while ((alldevs_nwrite != 0 && alldevs_writer != curlwp) || 2569 (rw && alldevs_nread != 0)) 2570 cv_wait(&alldevs_cv, &alldevs_mtx); 2571 2572 if (rw) { 2573 if (alldevs_nwrite++ == 0) 2574 alldevs_writer = curlwp; 2575 } else 2576 alldevs_nread++; 2577 } 2578 mutex_exit(&alldevs_mtx); 2579 2580 memset(di, 0, sizeof(*di)); 2581 2582 di->di_flags = flags; 2583 2584 switch (di->di_flags & (DEVITER_F_LEAVES_FIRST|DEVITER_F_ROOT_FIRST)) { 2585 case DEVITER_F_LEAVES_FIRST: 2586 TAILQ_FOREACH(dv, &alldevs, dv_list) 2587 di->di_curdepth = MAX(di->di_curdepth, dv->dv_depth); 2588 break; 2589 case DEVITER_F_ROOT_FIRST: 2590 TAILQ_FOREACH(dv, &alldevs, dv_list) 2591 di->di_maxdepth = MAX(di->di_maxdepth, dv->dv_depth); 2592 break; 2593 default: 2594 break; 2595 } 2596 2597 deviter_reinit(di); 2598 } 2599 2600 static void 2601 deviter_reinit(deviter_t *di) 2602 { 2603 if ((di->di_flags & DEVITER_F_RW) != 0) 2604 di->di_prev = TAILQ_LAST(&alldevs, devicelist); 2605 else 2606 di->di_prev = TAILQ_FIRST(&alldevs); 2607 } 2608 2609 device_t 2610 deviter_first(deviter_t *di, deviter_flags_t flags) 2611 { 2612 deviter_init(di, flags); 2613 return deviter_next(di); 2614 } 2615 2616 static device_t 2617 deviter_next1(deviter_t *di) 2618 { 2619 device_t dv; 2620 2621 dv = di->di_prev; 2622 2623 if (dv == NULL) 2624 ; 2625 else if ((di->di_flags & DEVITER_F_RW) != 0) 2626 di->di_prev = TAILQ_PREV(dv, devicelist, dv_list); 2627 else 2628 di->di_prev = TAILQ_NEXT(dv, dv_list); 2629 2630 return dv; 2631 } 2632 2633 device_t 2634 deviter_next(deviter_t *di) 2635 { 2636 device_t dv = NULL; 2637 2638 switch (di->di_flags & (DEVITER_F_LEAVES_FIRST|DEVITER_F_ROOT_FIRST)) { 2639 case 0: 2640 return deviter_next1(di); 2641 case DEVITER_F_LEAVES_FIRST: 2642 while (di->di_curdepth >= 0) { 2643 if ((dv = deviter_next1(di)) == NULL) { 2644 di->di_curdepth--; 2645 deviter_reinit(di); 2646 } else if (dv->dv_depth == di->di_curdepth) 2647 break; 2648 } 2649 return dv; 2650 case DEVITER_F_ROOT_FIRST: 2651 while (di->di_curdepth <= di->di_maxdepth) { 2652 if ((dv = deviter_next1(di)) == NULL) { 2653 di->di_curdepth++; 2654 deviter_reinit(di); 2655 } else if (dv->dv_depth == di->di_curdepth) 2656 break; 2657 } 2658 return dv; 2659 default: 2660 return NULL; 2661 } 2662 } 2663 2664 void 2665 deviter_release(deviter_t *di) 2666 { 2667 bool rw = (di->di_flags & DEVITER_F_RW) != 0; 2668 2669 mutex_enter(&alldevs_mtx); 2670 if (alldevs_nwrite > 0 && alldevs_writer == NULL) 2671 --alldevs_nwrite; 2672 else { 2673 2674 if (rw) { 2675 if (--alldevs_nwrite == 0) 2676 alldevs_writer = NULL; 2677 } else 2678 --alldevs_nread; 2679 2680 cv_signal(&alldevs_cv); 2681 } 2682 mutex_exit(&alldevs_mtx); 2683 } 2684