1 /* 2 * Copyright (c) 1997, Stefan Esser <se@freebsd.org> 3 * Copyright (c) 2000, Michael Smith <msmith@freebsd.org> 4 * Copyright (c) 2000, BSDi 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 unmodified, this list of conditions, and the following 12 * disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * $FreeBSD$ 29 * 30 */ 31 32 #include "opt_bus.h" 33 34 #include <sys/param.h> 35 #include <sys/systm.h> 36 #include <sys/malloc.h> 37 #include <sys/module.h> 38 #include <sys/linker.h> 39 #include <sys/fcntl.h> 40 #include <sys/conf.h> 41 #include <sys/kernel.h> 42 #include <sys/queue.h> 43 #include <sys/sysctl.h> 44 #include <sys/types.h> 45 46 #include <vm/vm.h> 47 #include <vm/pmap.h> 48 #include <vm/vm_extern.h> 49 50 #include <sys/bus.h> 51 #include <machine/bus.h> 52 #include <sys/rman.h> 53 #include <machine/resource.h> 54 55 #include <sys/pciio.h> 56 #include <dev/pci/pcireg.h> 57 #include <dev/pci/pcivar.h> 58 #include <dev/pci/pci_private.h> 59 60 #include "pcib_if.h" 61 #include "pci_if.h" 62 63 static u_int32_t pci_mapbase(unsigned mapreg); 64 static int pci_maptype(unsigned mapreg); 65 static int pci_mapsize(unsigned testval); 66 static int pci_maprange(unsigned mapreg); 67 static void pci_fixancient(pcicfgregs *cfg); 68 69 static int pci_porten(device_t pcib, int b, int s, int f); 70 static int pci_memen(device_t pcib, int b, int s, int f); 71 static int pci_add_map(device_t pcib, int b, int s, int f, int reg, 72 struct resource_list *rl); 73 static void pci_add_resources(device_t pcib, device_t dev); 74 static int pci_probe(device_t dev); 75 static int pci_attach(device_t dev); 76 static void pci_load_vendor_data(void); 77 static int pci_describe_parse_line(char **ptr, int *vendor, 78 int *device, char **desc); 79 static char *pci_describe_device(device_t dev); 80 static int pci_modevent(module_t mod, int what, void *arg); 81 static void pci_hdrtypedata(device_t pcib, int b, int s, int f, 82 pcicfgregs *cfg); 83 static void pci_read_extcap(device_t pcib, pcicfgregs *cfg); 84 85 static device_method_t pci_methods[] = { 86 /* Device interface */ 87 DEVMETHOD(device_probe, pci_probe), 88 DEVMETHOD(device_attach, pci_attach), 89 DEVMETHOD(device_shutdown, bus_generic_shutdown), 90 DEVMETHOD(device_suspend, bus_generic_suspend), 91 DEVMETHOD(device_resume, bus_generic_resume), 92 93 /* Bus interface */ 94 DEVMETHOD(bus_print_child, pci_print_child), 95 DEVMETHOD(bus_probe_nomatch, pci_probe_nomatch), 96 DEVMETHOD(bus_read_ivar, pci_read_ivar), 97 DEVMETHOD(bus_write_ivar, pci_write_ivar), 98 DEVMETHOD(bus_driver_added, bus_generic_driver_added), 99 DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), 100 DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), 101 102 DEVMETHOD(bus_get_resource_list,pci_get_resource_list), 103 DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), 104 DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), 105 DEVMETHOD(bus_delete_resource, pci_delete_resource), 106 DEVMETHOD(bus_alloc_resource, pci_alloc_resource), 107 DEVMETHOD(bus_release_resource, bus_generic_rl_release_resource), 108 DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), 109 DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), 110 DEVMETHOD(bus_child_pnpinfo_str, pci_child_pnpinfo_str_method), 111 DEVMETHOD(bus_child_location_str, pci_child_location_str_method), 112 113 /* PCI interface */ 114 DEVMETHOD(pci_read_config, pci_read_config_method), 115 DEVMETHOD(pci_write_config, pci_write_config_method), 116 DEVMETHOD(pci_enable_busmaster, pci_enable_busmaster_method), 117 DEVMETHOD(pci_disable_busmaster, pci_disable_busmaster_method), 118 DEVMETHOD(pci_enable_io, pci_enable_io_method), 119 DEVMETHOD(pci_disable_io, pci_disable_io_method), 120 DEVMETHOD(pci_get_powerstate, pci_get_powerstate_method), 121 DEVMETHOD(pci_set_powerstate, pci_set_powerstate_method), 122 123 { 0, 0 } 124 }; 125 126 static driver_t pci_driver = { 127 "pci", 128 pci_methods, 129 0, /* no softc */ 130 }; 131 132 devclass_t pci_devclass; 133 DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, 0); 134 MODULE_VERSION(pci, 1); 135 136 static char *pci_vendordata; 137 static size_t pci_vendordata_size; 138 139 140 struct pci_quirk { 141 u_int32_t devid; /* Vendor/device of the card */ 142 int type; 143 #define PCI_QUIRK_MAP_REG 1 /* PCI map register in weird place */ 144 int arg1; 145 int arg2; 146 }; 147 148 struct pci_quirk pci_quirks[] = { 149 /* The Intel 82371AB and 82443MX has a map register at offset 0x90. */ 150 { 0x71138086, PCI_QUIRK_MAP_REG, 0x90, 0 }, 151 { 0x719b8086, PCI_QUIRK_MAP_REG, 0x90, 0 }, 152 /* As does the Serverworks OSB4 (the SMBus mapping register) */ 153 { 0x02001166, PCI_QUIRK_MAP_REG, 0x90, 0 }, 154 155 { 0 } 156 }; 157 158 /* map register information */ 159 #define PCI_MAPMEM 0x01 /* memory map */ 160 #define PCI_MAPMEMP 0x02 /* prefetchable memory map */ 161 #define PCI_MAPPORT 0x04 /* port map */ 162 163 struct devlist pci_devq; 164 u_int32_t pci_generation; 165 u_int32_t pci_numdevs = 0; 166 167 /* sysctl vars */ 168 SYSCTL_NODE(_hw, OID_AUTO, pci, CTLFLAG_RD, 0, "PCI bus tuning parameters"); 169 170 static int pci_enable_io_modes = 1; 171 TUNABLE_INT("hw.pci.enable_io_modes", (int *)&pci_enable_io_modes); 172 SYSCTL_INT(_hw_pci, OID_AUTO, enable_io_modes, CTLFLAG_RW, 173 &pci_enable_io_modes, 1, 174 "Enable I/O and memory bits in the config register. Some BIOSes do not\n\ 175 enable these bits correctly. We'd like to do this all the time, but there\n\ 176 are some peripherals that this causes problems with."); 177 178 /* Find a device_t by bus/slot/function */ 179 180 device_t 181 pci_find_bsf(u_int8_t bus, u_int8_t slot, u_int8_t func) 182 { 183 struct pci_devinfo *dinfo; 184 185 STAILQ_FOREACH(dinfo, &pci_devq, pci_links) { 186 if ((dinfo->cfg.bus == bus) && 187 (dinfo->cfg.slot == slot) && 188 (dinfo->cfg.func == func)) { 189 return (dinfo->cfg.dev); 190 } 191 } 192 193 return (NULL); 194 } 195 196 /* Find a device_t by vendor/device ID */ 197 198 device_t 199 pci_find_device(u_int16_t vendor, u_int16_t device) 200 { 201 struct pci_devinfo *dinfo; 202 203 STAILQ_FOREACH(dinfo, &pci_devq, pci_links) { 204 if ((dinfo->cfg.vendor == vendor) && 205 (dinfo->cfg.device == device)) { 206 return (dinfo->cfg.dev); 207 } 208 } 209 210 return (NULL); 211 } 212 213 /* return base address of memory or port map */ 214 215 static u_int32_t 216 pci_mapbase(unsigned mapreg) 217 { 218 int mask = 0x03; 219 if ((mapreg & 0x01) == 0) 220 mask = 0x0f; 221 return (mapreg & ~mask); 222 } 223 224 /* return map type of memory or port map */ 225 226 static int 227 pci_maptype(unsigned mapreg) 228 { 229 static u_int8_t maptype[0x10] = { 230 PCI_MAPMEM, PCI_MAPPORT, 231 PCI_MAPMEM, 0, 232 PCI_MAPMEM, PCI_MAPPORT, 233 0, 0, 234 PCI_MAPMEM|PCI_MAPMEMP, PCI_MAPPORT, 235 PCI_MAPMEM|PCI_MAPMEMP, 0, 236 PCI_MAPMEM|PCI_MAPMEMP, PCI_MAPPORT, 237 0, 0, 238 }; 239 240 return maptype[mapreg & 0x0f]; 241 } 242 243 /* return log2 of map size decoded for memory or port map */ 244 245 static int 246 pci_mapsize(unsigned testval) 247 { 248 int ln2size; 249 250 testval = pci_mapbase(testval); 251 ln2size = 0; 252 if (testval != 0) { 253 while ((testval & 1) == 0) 254 { 255 ln2size++; 256 testval >>= 1; 257 } 258 } 259 return (ln2size); 260 } 261 262 /* return log2 of address range supported by map register */ 263 264 static int 265 pci_maprange(unsigned mapreg) 266 { 267 int ln2range = 0; 268 switch (mapreg & 0x07) { 269 case 0x00: 270 case 0x01: 271 case 0x05: 272 ln2range = 32; 273 break; 274 case 0x02: 275 ln2range = 20; 276 break; 277 case 0x04: 278 ln2range = 64; 279 break; 280 } 281 return (ln2range); 282 } 283 284 /* adjust some values from PCI 1.0 devices to match 2.0 standards ... */ 285 286 static void 287 pci_fixancient(pcicfgregs *cfg) 288 { 289 if (cfg->hdrtype != 0) 290 return; 291 292 /* PCI to PCI bridges use header type 1 */ 293 if (cfg->baseclass == PCIC_BRIDGE && cfg->subclass == PCIS_BRIDGE_PCI) 294 cfg->hdrtype = 1; 295 } 296 297 /* extract header type specific config data */ 298 299 static void 300 pci_hdrtypedata(device_t pcib, int b, int s, int f, pcicfgregs *cfg) 301 { 302 #define REG(n, w) PCIB_READ_CONFIG(pcib, b, s, f, n, w) 303 switch (cfg->hdrtype) { 304 case 0: 305 cfg->subvendor = REG(PCIR_SUBVEND_0, 2); 306 cfg->subdevice = REG(PCIR_SUBDEV_0, 2); 307 cfg->nummaps = PCI_MAXMAPS_0; 308 break; 309 case 1: 310 cfg->subvendor = REG(PCIR_SUBVEND_1, 2); 311 cfg->subdevice = REG(PCIR_SUBDEV_1, 2); 312 cfg->nummaps = PCI_MAXMAPS_1; 313 break; 314 case 2: 315 cfg->subvendor = REG(PCIR_SUBVEND_2, 2); 316 cfg->subdevice = REG(PCIR_SUBDEV_2, 2); 317 cfg->nummaps = PCI_MAXMAPS_2; 318 break; 319 } 320 #undef REG 321 } 322 323 /* read configuration header into pcicfgregs structure */ 324 325 struct pci_devinfo * 326 pci_read_device(device_t pcib, int b, int s, int f, size_t size) 327 { 328 #define REG(n, w) PCIB_READ_CONFIG(pcib, b, s, f, n, w) 329 pcicfgregs *cfg = NULL; 330 struct pci_devinfo *devlist_entry; 331 struct devlist *devlist_head; 332 333 devlist_head = &pci_devq; 334 335 devlist_entry = NULL; 336 337 if (PCIB_READ_CONFIG(pcib, b, s, f, PCIR_DEVVENDOR, 4) != -1) { 338 devlist_entry = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO); 339 if (devlist_entry == NULL) 340 return (NULL); 341 342 cfg = &devlist_entry->cfg; 343 344 cfg->bus = b; 345 cfg->slot = s; 346 cfg->func = f; 347 cfg->vendor = REG(PCIR_VENDOR, 2); 348 cfg->device = REG(PCIR_DEVICE, 2); 349 cfg->cmdreg = REG(PCIR_COMMAND, 2); 350 cfg->statreg = REG(PCIR_STATUS, 2); 351 cfg->baseclass = REG(PCIR_CLASS, 1); 352 cfg->subclass = REG(PCIR_SUBCLASS, 1); 353 cfg->progif = REG(PCIR_PROGIF, 1); 354 cfg->revid = REG(PCIR_REVID, 1); 355 cfg->hdrtype = REG(PCIR_HEADERTYPE, 1); 356 cfg->cachelnsz = REG(PCIR_CACHELNSZ, 1); 357 cfg->lattimer = REG(PCIR_LATTIMER, 1); 358 cfg->intpin = REG(PCIR_INTPIN, 1); 359 cfg->intline = REG(PCIR_INTLINE, 1); 360 361 cfg->mingnt = REG(PCIR_MINGNT, 1); 362 cfg->maxlat = REG(PCIR_MAXLAT, 1); 363 364 cfg->mfdev = (cfg->hdrtype & PCIM_MFDEV) != 0; 365 cfg->hdrtype &= ~PCIM_MFDEV; 366 367 pci_fixancient(cfg); 368 pci_hdrtypedata(pcib, b, s, f, cfg); 369 370 if (REG(PCIR_STATUS, 2) & PCIM_STATUS_CAPPRESENT) 371 pci_read_extcap(pcib, cfg); 372 373 STAILQ_INSERT_TAIL(devlist_head, devlist_entry, pci_links); 374 375 devlist_entry->conf.pc_sel.pc_bus = cfg->bus; 376 devlist_entry->conf.pc_sel.pc_dev = cfg->slot; 377 devlist_entry->conf.pc_sel.pc_func = cfg->func; 378 devlist_entry->conf.pc_hdr = cfg->hdrtype; 379 380 devlist_entry->conf.pc_subvendor = cfg->subvendor; 381 devlist_entry->conf.pc_subdevice = cfg->subdevice; 382 devlist_entry->conf.pc_vendor = cfg->vendor; 383 devlist_entry->conf.pc_device = cfg->device; 384 385 devlist_entry->conf.pc_class = cfg->baseclass; 386 devlist_entry->conf.pc_subclass = cfg->subclass; 387 devlist_entry->conf.pc_progif = cfg->progif; 388 devlist_entry->conf.pc_revid = cfg->revid; 389 390 pci_numdevs++; 391 pci_generation++; 392 } 393 return (devlist_entry); 394 #undef REG 395 } 396 397 static void 398 pci_read_extcap(device_t pcib, pcicfgregs *cfg) 399 { 400 #define REG(n, w) PCIB_READ_CONFIG(pcib, cfg->bus, cfg->slot, cfg->func, n, w) 401 int ptr, nextptr, ptrptr; 402 403 switch (cfg->hdrtype) { 404 case 0: 405 ptrptr = 0x34; 406 break; 407 case 2: 408 ptrptr = 0x14; 409 break; 410 default: 411 return; /* no extended capabilities support */ 412 } 413 nextptr = REG(ptrptr, 1); /* sanity check? */ 414 415 /* 416 * Read capability entries. 417 */ 418 while (nextptr != 0) { 419 /* Sanity check */ 420 if (nextptr > 255) { 421 printf("illegal PCI extended capability offset %d\n", 422 nextptr); 423 return; 424 } 425 /* Find the next entry */ 426 ptr = nextptr; 427 nextptr = REG(ptr + 1, 1); 428 429 /* Process this entry */ 430 switch (REG(ptr, 1)) { 431 case 0x01: /* PCI power management */ 432 if (cfg->pp_cap == 0) { 433 cfg->pp_cap = REG(ptr + PCIR_POWER_CAP, 2); 434 cfg->pp_status = ptr + PCIR_POWER_STATUS; 435 cfg->pp_pmcsr = ptr + PCIR_POWER_PMCSR; 436 if ((nextptr - ptr) > PCIR_POWER_DATA) 437 cfg->pp_data = ptr + PCIR_POWER_DATA; 438 } 439 break; 440 default: 441 break; 442 } 443 } 444 #undef REG 445 } 446 447 /* free pcicfgregs structure and all depending data structures */ 448 449 int 450 pci_freecfg(struct pci_devinfo *dinfo) 451 { 452 struct devlist *devlist_head; 453 454 devlist_head = &pci_devq; 455 456 STAILQ_REMOVE(devlist_head, dinfo, pci_devinfo, pci_links); 457 free(dinfo, M_DEVBUF); 458 459 /* increment the generation count */ 460 pci_generation++; 461 462 /* we're losing one device */ 463 pci_numdevs--; 464 return (0); 465 } 466 467 /* 468 * PCI power manangement 469 */ 470 int 471 pci_set_powerstate_method(device_t dev, device_t child, int state) 472 { 473 struct pci_devinfo *dinfo = device_get_ivars(child); 474 pcicfgregs *cfg = &dinfo->cfg; 475 u_int16_t status; 476 int result; 477 478 if (cfg->pp_cap != 0) { 479 status = PCI_READ_CONFIG(dev, child, cfg->pp_status, 2) & ~PCIM_PSTAT_DMASK; 480 result = 0; 481 switch (state) { 482 case PCI_POWERSTATE_D0: 483 status |= PCIM_PSTAT_D0; 484 break; 485 case PCI_POWERSTATE_D1: 486 if (cfg->pp_cap & PCIM_PCAP_D1SUPP) { 487 status |= PCIM_PSTAT_D1; 488 } else { 489 result = EOPNOTSUPP; 490 } 491 break; 492 case PCI_POWERSTATE_D2: 493 if (cfg->pp_cap & PCIM_PCAP_D2SUPP) { 494 status |= PCIM_PSTAT_D2; 495 } else { 496 result = EOPNOTSUPP; 497 } 498 break; 499 case PCI_POWERSTATE_D3: 500 status |= PCIM_PSTAT_D3; 501 break; 502 default: 503 result = EINVAL; 504 } 505 if (result == 0) 506 PCI_WRITE_CONFIG(dev, child, cfg->pp_status, status, 2); 507 } else { 508 result = ENXIO; 509 } 510 return(result); 511 } 512 513 int 514 pci_get_powerstate_method(device_t dev, device_t child) 515 { 516 struct pci_devinfo *dinfo = device_get_ivars(child); 517 pcicfgregs *cfg = &dinfo->cfg; 518 u_int16_t status; 519 int result; 520 521 if (cfg->pp_cap != 0) { 522 status = PCI_READ_CONFIG(dev, child, cfg->pp_status, 2); 523 switch (status & PCIM_PSTAT_DMASK) { 524 case PCIM_PSTAT_D0: 525 result = PCI_POWERSTATE_D0; 526 break; 527 case PCIM_PSTAT_D1: 528 result = PCI_POWERSTATE_D1; 529 break; 530 case PCIM_PSTAT_D2: 531 result = PCI_POWERSTATE_D2; 532 break; 533 case PCIM_PSTAT_D3: 534 result = PCI_POWERSTATE_D3; 535 break; 536 default: 537 result = PCI_POWERSTATE_UNKNOWN; 538 break; 539 } 540 } else { 541 /* No support, device is always at D0 */ 542 result = PCI_POWERSTATE_D0; 543 } 544 return(result); 545 } 546 547 /* 548 * Some convenience functions for PCI device drivers. 549 */ 550 551 static __inline void 552 pci_set_command_bit(device_t dev, device_t child, u_int16_t bit) 553 { 554 u_int16_t command; 555 556 command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2); 557 command |= bit; 558 PCI_WRITE_CONFIG(dev, child, PCIR_COMMAND, command, 2); 559 } 560 561 static __inline void 562 pci_clear_command_bit(device_t dev, device_t child, u_int16_t bit) 563 { 564 u_int16_t command; 565 566 command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2); 567 command &= ~bit; 568 PCI_WRITE_CONFIG(dev, child, PCIR_COMMAND, command, 2); 569 } 570 571 void 572 pci_enable_busmaster_method(device_t dev, device_t child) 573 { 574 pci_set_command_bit(dev, child, PCIM_CMD_BUSMASTEREN); 575 } 576 577 void 578 pci_disable_busmaster_method(device_t dev, device_t child) 579 { 580 pci_clear_command_bit(dev, child, PCIM_CMD_BUSMASTEREN); 581 } 582 583 void 584 pci_enable_io_method(device_t dev, device_t child, int space) 585 { 586 switch(space) { 587 case SYS_RES_IOPORT: 588 pci_set_command_bit(dev, child, PCIM_CMD_PORTEN); 589 break; 590 case SYS_RES_MEMORY: 591 pci_set_command_bit(dev, child, PCIM_CMD_MEMEN); 592 break; 593 } 594 } 595 596 void 597 pci_disable_io_method(device_t dev, device_t child, int space) 598 { 599 switch(space) { 600 case SYS_RES_IOPORT: 601 pci_clear_command_bit(dev, child, PCIM_CMD_PORTEN); 602 break; 603 case SYS_RES_MEMORY: 604 pci_clear_command_bit(dev, child, PCIM_CMD_MEMEN); 605 break; 606 } 607 } 608 609 /* 610 * New style pci driver. Parent device is either a pci-host-bridge or a 611 * pci-pci-bridge. Both kinds are represented by instances of pcib. 612 */ 613 614 void 615 pci_print_verbose(struct pci_devinfo *dinfo) 616 { 617 if (bootverbose) { 618 pcicfgregs *cfg = &dinfo->cfg; 619 620 printf("found->\tvendor=0x%04x, dev=0x%04x, revid=0x%02x\n", 621 cfg->vendor, cfg->device, cfg->revid); 622 printf("\tbus=%d, slot=%d, func=%d\n", 623 cfg->bus, cfg->slot, cfg->func); 624 printf("\tclass=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n", 625 cfg->baseclass, cfg->subclass, cfg->progif, cfg->hdrtype, 626 cfg->mfdev); 627 printf("\tcmdreg=0x%04x, statreg=0x%04x, cachelnsz=%d (dwords)\n", 628 cfg->cmdreg, cfg->statreg, cfg->cachelnsz); 629 printf("\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), maxlat=0x%02x (%d ns)\n", 630 cfg->lattimer, cfg->lattimer * 30, cfg->mingnt, 631 cfg->mingnt * 250, cfg->maxlat, cfg->maxlat * 250); 632 if (cfg->intpin > 0) 633 printf("\tintpin=%c, irq=%d\n", 634 cfg->intpin +'a' -1, cfg->intline); 635 if (cfg->pp_cap) { 636 u_int16_t status; 637 638 status = pci_read_config(cfg->dev, cfg->pp_status, 2); 639 printf("\tpowerspec %d supports D0%s%s D3 current D%d\n", 640 cfg->pp_cap & PCIM_PCAP_SPEC, 641 cfg->pp_cap & PCIM_PCAP_D1SUPP ? " D1" : "", 642 cfg->pp_cap & PCIM_PCAP_D2SUPP ? " D2" : "", 643 status & PCIM_PSTAT_DMASK); 644 } 645 } 646 } 647 648 static int 649 pci_porten(device_t pcib, int b, int s, int f) 650 { 651 return (PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2) 652 & PCIM_CMD_PORTEN) != 0; 653 } 654 655 static int 656 pci_memen(device_t pcib, int b, int s, int f) 657 { 658 return (PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2) 659 & PCIM_CMD_MEMEN) != 0; 660 } 661 662 /* 663 * Add a resource based on a pci map register. Return 1 if the map 664 * register is a 32bit map register or 2 if it is a 64bit register. 665 */ 666 static int 667 pci_add_map(device_t pcib, int b, int s, int f, int reg, 668 struct resource_list *rl) 669 { 670 u_int32_t map; 671 u_int64_t base; 672 u_int8_t ln2size; 673 u_int8_t ln2range; 674 u_int32_t testval; 675 u_int16_t cmd; 676 int type; 677 678 map = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4); 679 680 if (map == 0 || map == 0xffffffff) 681 return (1); /* skip invalid entry */ 682 683 PCIB_WRITE_CONFIG(pcib, b, s, f, reg, 0xffffffff, 4); 684 testval = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4); 685 PCIB_WRITE_CONFIG(pcib, b, s, f, reg, map, 4); 686 687 base = pci_mapbase(map); 688 if (pci_maptype(map) & PCI_MAPMEM) 689 type = SYS_RES_MEMORY; 690 else 691 type = SYS_RES_IOPORT; 692 ln2size = pci_mapsize(testval); 693 ln2range = pci_maprange(testval); 694 if (ln2range == 64) { 695 /* Read the other half of a 64bit map register */ 696 base |= (u_int64_t) PCIB_READ_CONFIG(pcib, b, s, f, reg + 4, 4) << 32; 697 } 698 699 if (bootverbose) { 700 printf("\tmap[%02x]: type %x, range %2d, base %08x, size %2d", 701 reg, pci_maptype(map), ln2range, 702 (unsigned int) base, ln2size); 703 if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f)) 704 printf(", port disabled\n"); 705 else if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f)) 706 printf(", memory disabled\n"); 707 else 708 printf(", enabled\n"); 709 } 710 711 /* 712 * This code theoretically does the right thing, but has 713 * undesirable side effects in some cases where 714 * peripherals respond oddly to having these bits 715 * enabled. Leave them alone by default. 716 */ 717 if (pci_enable_io_modes) { 718 /* Turn on resources that have been left off by a lazy BIOS */ 719 if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f)) { 720 cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2); 721 cmd |= PCIM_CMD_PORTEN; 722 PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2); 723 } 724 if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f)) { 725 cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2); 726 cmd |= PCIM_CMD_MEMEN; 727 PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2); 728 } 729 } else { 730 if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f)) 731 return (1); 732 if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f)) 733 return (1); 734 } 735 resource_list_add(rl, type, reg, base, base + (1 << ln2size) - 1, 736 (1 << ln2size)); 737 738 return ((ln2range == 64) ? 2 : 1); 739 } 740 741 static void 742 pci_add_resources(device_t pcib, device_t dev) 743 { 744 struct pci_devinfo *dinfo = device_get_ivars(dev); 745 pcicfgregs *cfg = &dinfo->cfg; 746 struct resource_list *rl = &dinfo->resources; 747 struct pci_quirk *q; 748 int b, i, f, s; 749 750 b = cfg->bus; 751 s = cfg->slot; 752 f = cfg->func; 753 for (i = 0; i < cfg->nummaps;) { 754 i += pci_add_map(pcib, b, s, f, PCIR_MAPS + i*4, rl); 755 } 756 757 for (q = &pci_quirks[0]; q->devid; q++) { 758 if (q->devid == ((cfg->device << 16) | cfg->vendor) 759 && q->type == PCI_QUIRK_MAP_REG) 760 pci_add_map(pcib, b, s, f, q->arg1, rl); 761 } 762 763 if (cfg->intpin > 0 && PCI_INTERRUPT_VALID(cfg->intline)) { 764 #ifdef __ia64__ 765 /* 766 * Re-route interrupts on ia64 so that we can get the 767 * I/O SAPIC interrupt numbers (the BIOS leaves legacy 768 * PIC interrupt numbers in the intline registers). 769 */ 770 cfg->intline = PCIB_ROUTE_INTERRUPT(pcib, dev, cfg->intpin); 771 #endif 772 resource_list_add(rl, SYS_RES_IRQ, 0, cfg->intline, 773 cfg->intline, 1); 774 } 775 } 776 777 void 778 pci_add_children(device_t dev, int busno, size_t dinfo_size) 779 { 780 device_t pcib = device_get_parent(dev); 781 struct pci_devinfo *dinfo; 782 int maxslots; 783 int s, f, pcifunchigh; 784 785 KASSERT(dinfo_size >= sizeof(struct pci_devinfo), 786 ("dinfo_size too small")); 787 maxslots = PCIB_MAXSLOTS(pcib); 788 for (s = 0; s <= maxslots; s++) { 789 pcifunchigh = 0; 790 for (f = 0; f <= pcifunchigh; f++) { 791 dinfo = pci_read_device(pcib, busno, s, f, dinfo_size); 792 if (dinfo != NULL) { 793 if (dinfo->cfg.mfdev) 794 pcifunchigh = PCI_FUNCMAX; 795 pci_add_child(dev, dinfo); 796 } 797 } 798 } 799 } 800 801 void 802 pci_add_child(device_t bus, struct pci_devinfo *dinfo) 803 { 804 device_t pcib; 805 806 pcib = device_get_parent(bus); 807 dinfo->cfg.dev = device_add_child(bus, NULL, -1); 808 device_set_ivars(dinfo->cfg.dev, dinfo); 809 pci_add_resources(pcib, dinfo->cfg.dev); 810 pci_print_verbose(dinfo); 811 } 812 813 static int 814 pci_probe(device_t dev) 815 { 816 817 device_set_desc(dev, "PCI bus"); 818 819 /* Allow other subclasses to override this driver. */ 820 return (-1000); 821 } 822 823 static int 824 pci_attach(device_t dev) 825 { 826 int busno; 827 828 /* 829 * Since there can be multiple independantly numbered PCI 830 * busses on some large alpha systems, we can't use the unit 831 * number to decide what bus we are probing. We ask the parent 832 * pcib what our bus number is. 833 */ 834 busno = pcib_get_bus(dev); 835 if (bootverbose) 836 device_printf(dev, "physical bus=%d\n", busno); 837 838 pci_add_children(dev, busno, sizeof(struct pci_devinfo)); 839 840 return (bus_generic_attach(dev)); 841 } 842 843 static void 844 pci_load_vendor_data(void) 845 { 846 caddr_t vendordata, info; 847 848 if ((vendordata = preload_search_by_type("pci_vendor_data")) != NULL) { 849 info = preload_search_info(vendordata, MODINFO_ADDR); 850 pci_vendordata = *(char **)info; 851 info = preload_search_info(vendordata, MODINFO_SIZE); 852 pci_vendordata_size = *(size_t *)info; 853 /* terminate the database */ 854 pci_vendordata[pci_vendordata_size] = '\n'; 855 } 856 } 857 858 int 859 pci_print_child(device_t dev, device_t child) 860 { 861 struct pci_devinfo *dinfo; 862 struct resource_list *rl; 863 pcicfgregs *cfg; 864 int retval = 0; 865 866 dinfo = device_get_ivars(child); 867 cfg = &dinfo->cfg; 868 rl = &dinfo->resources; 869 870 retval += bus_print_child_header(dev, child); 871 872 retval += resource_list_print_type(rl, "port", SYS_RES_IOPORT, "%#lx"); 873 retval += resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx"); 874 retval += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld"); 875 if (device_get_flags(dev)) 876 retval += printf(" flags %#x", device_get_flags(dev)); 877 878 retval += printf(" at device %d.%d", pci_get_slot(child), 879 pci_get_function(child)); 880 881 retval += bus_print_child_footer(dev, child); 882 883 return (retval); 884 } 885 886 static struct 887 { 888 int class; 889 int subclass; 890 char *desc; 891 } pci_nomatch_tab[] = { 892 {PCIC_OLD, -1, "old"}, 893 {PCIC_OLD, PCIS_OLD_NONVGA, "non-VGA display device"}, 894 {PCIC_OLD, PCIS_OLD_VGA, "VGA-compatible display device"}, 895 {PCIC_STORAGE, -1, "mass storage"}, 896 {PCIC_STORAGE, PCIS_STORAGE_SCSI, "SCSI"}, 897 {PCIC_STORAGE, PCIS_STORAGE_IDE, "ATA"}, 898 {PCIC_STORAGE, PCIS_STORAGE_FLOPPY, "floppy disk"}, 899 {PCIC_STORAGE, PCIS_STORAGE_IPI, "IPI"}, 900 {PCIC_STORAGE, PCIS_STORAGE_RAID, "RAID"}, 901 {PCIC_NETWORK, -1, "network"}, 902 {PCIC_NETWORK, PCIS_NETWORK_ETHERNET, "ethernet"}, 903 {PCIC_NETWORK, PCIS_NETWORK_TOKENRING, "token ring"}, 904 {PCIC_NETWORK, PCIS_NETWORK_FDDI, "fddi"}, 905 {PCIC_NETWORK, PCIS_NETWORK_ATM, "ATM"}, 906 {PCIC_DISPLAY, -1, "display"}, 907 {PCIC_DISPLAY, PCIS_DISPLAY_VGA, "VGA"}, 908 {PCIC_DISPLAY, PCIS_DISPLAY_XGA, "XGA"}, 909 {PCIC_MULTIMEDIA, -1, "multimedia"}, 910 {PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_VIDEO, "video"}, 911 {PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_AUDIO, "audio"}, 912 {PCIC_MEMORY, -1, "memory"}, 913 {PCIC_MEMORY, PCIS_MEMORY_RAM, "RAM"}, 914 {PCIC_MEMORY, PCIS_MEMORY_FLASH, "flash"}, 915 {PCIC_BRIDGE, -1, "bridge"}, 916 {PCIC_BRIDGE, PCIS_BRIDGE_HOST, "HOST-PCI"}, 917 {PCIC_BRIDGE, PCIS_BRIDGE_ISA, "PCI-ISA"}, 918 {PCIC_BRIDGE, PCIS_BRIDGE_EISA, "PCI-EISA"}, 919 {PCIC_BRIDGE, PCIS_BRIDGE_MCA, "PCI-MCA"}, 920 {PCIC_BRIDGE, PCIS_BRIDGE_PCI, "PCI-PCI"}, 921 {PCIC_BRIDGE, PCIS_BRIDGE_PCMCIA, "PCI-PCMCIA"}, 922 {PCIC_BRIDGE, PCIS_BRIDGE_NUBUS, "PCI-NuBus"}, 923 {PCIC_BRIDGE, PCIS_BRIDGE_CARDBUS, "PCI-CardBus"}, 924 {PCIC_BRIDGE, PCIS_BRIDGE_OTHER, "PCI-unknown"}, 925 {PCIC_SIMPLECOMM, -1, "simple comms"}, 926 {PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_UART, "UART"}, /* could detect 16550 */ 927 {PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_PAR, "parallel port"}, 928 {PCIC_BASEPERIPH, -1, "base peripheral"}, 929 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_PIC, "interrupt controller"}, 930 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_DMA, "DMA controller"}, 931 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_TIMER, "timer"}, 932 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_RTC, "realtime clock"}, 933 {PCIC_INPUTDEV, -1, "input device"}, 934 {PCIC_INPUTDEV, PCIS_INPUTDEV_KEYBOARD, "keyboard"}, 935 {PCIC_INPUTDEV, PCIS_INPUTDEV_DIGITIZER,"digitizer"}, 936 {PCIC_INPUTDEV, PCIS_INPUTDEV_MOUSE, "mouse"}, 937 {PCIC_DOCKING, -1, "docking station"}, 938 {PCIC_PROCESSOR, -1, "processor"}, 939 {PCIC_SERIALBUS, -1, "serial bus"}, 940 {PCIC_SERIALBUS, PCIS_SERIALBUS_FW, "FireWire"}, 941 {PCIC_SERIALBUS, PCIS_SERIALBUS_ACCESS, "AccessBus"}, 942 {PCIC_SERIALBUS, PCIS_SERIALBUS_SSA, "SSA"}, 943 {PCIC_SERIALBUS, PCIS_SERIALBUS_USB, "USB"}, 944 {PCIC_SERIALBUS, PCIS_SERIALBUS_FC, "Fibre Channel"}, 945 {PCIC_SERIALBUS, PCIS_SERIALBUS_SMBUS, "SMBus"}, 946 {0, 0, NULL} 947 }; 948 949 void 950 pci_probe_nomatch(device_t dev, device_t child) 951 { 952 int i; 953 char *cp, *scp, *device; 954 955 /* 956 * Look for a listing for this device in a loaded device database. 957 */ 958 if ((device = pci_describe_device(child)) != NULL) { 959 device_printf(dev, "<%s>", device); 960 free(device, M_DEVBUF); 961 } else { 962 /* 963 * Scan the class/subclass descriptions for a general 964 * description. 965 */ 966 cp = "unknown"; 967 scp = NULL; 968 for (i = 0; pci_nomatch_tab[i].desc != NULL; i++) { 969 if (pci_nomatch_tab[i].class == pci_get_class(child)) { 970 if (pci_nomatch_tab[i].subclass == -1) { 971 cp = pci_nomatch_tab[i].desc; 972 } else if (pci_nomatch_tab[i].subclass == 973 pci_get_subclass(child)) { 974 scp = pci_nomatch_tab[i].desc; 975 } 976 } 977 } 978 device_printf(dev, "<%s%s%s>", 979 cp ? cp : "", 980 ((cp != NULL) && (scp != NULL)) ? ", " : "", 981 scp ? scp : ""); 982 } 983 printf(" at device %d.%d (no driver attached)\n", 984 pci_get_slot(child), pci_get_function(child)); 985 return; 986 } 987 988 /* 989 * Parse the PCI device database, if loaded, and return a pointer to a 990 * description of the device. 991 * 992 * The database is flat text formatted as follows: 993 * 994 * Any line not in a valid format is ignored. 995 * Lines are terminated with newline '\n' characters. 996 * 997 * A VENDOR line consists of the 4 digit (hex) vendor code, a TAB, then 998 * the vendor name. 999 * 1000 * A DEVICE line is entered immediately below the corresponding VENDOR ID. 1001 * - devices cannot be listed without a corresponding VENDOR line. 1002 * A DEVICE line consists of a TAB, the 4 digit (hex) device code, 1003 * another TAB, then the device name. 1004 */ 1005 1006 /* 1007 * Assuming (ptr) points to the beginning of a line in the database, 1008 * return the vendor or device and description of the next entry. 1009 * The value of (vendor) or (device) inappropriate for the entry type 1010 * is set to -1. Returns nonzero at the end of the database. 1011 * 1012 * Note that this is slightly unrobust in the face of corrupt data; 1013 * we attempt to safeguard against this by spamming the end of the 1014 * database with a newline when we initialise. 1015 */ 1016 static int 1017 pci_describe_parse_line(char **ptr, int *vendor, int *device, char **desc) 1018 { 1019 char *cp = *ptr; 1020 int left; 1021 1022 *device = -1; 1023 *vendor = -1; 1024 **desc = '\0'; 1025 for (;;) { 1026 left = pci_vendordata_size - (cp - pci_vendordata); 1027 if (left <= 0) { 1028 *ptr = cp; 1029 return(1); 1030 } 1031 1032 /* vendor entry? */ 1033 if (*cp != '\t' && 1034 sscanf(cp, "%x\t%80[^\n]", vendor, *desc) == 2) 1035 break; 1036 /* device entry? */ 1037 if (*cp == '\t' && 1038 sscanf(cp, "%x\t%80[^\n]", device, *desc) == 2) 1039 break; 1040 1041 /* skip to next line */ 1042 while (*cp != '\n' && left > 0) { 1043 cp++; 1044 left--; 1045 } 1046 if (*cp == '\n') { 1047 cp++; 1048 left--; 1049 } 1050 } 1051 /* skip to next line */ 1052 while (*cp != '\n' && left > 0) { 1053 cp++; 1054 left--; 1055 } 1056 if (*cp == '\n' && left > 0) 1057 cp++; 1058 *ptr = cp; 1059 return(0); 1060 } 1061 1062 static char * 1063 pci_describe_device(device_t dev) 1064 { 1065 int vendor, device; 1066 char *desc, *vp, *dp, *line; 1067 1068 desc = vp = dp = NULL; 1069 1070 /* 1071 * If we have no vendor data, we can't do anything. 1072 */ 1073 if (pci_vendordata == NULL) 1074 goto out; 1075 1076 /* 1077 * Scan the vendor data looking for this device 1078 */ 1079 line = pci_vendordata; 1080 if ((vp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL) 1081 goto out; 1082 for (;;) { 1083 if (pci_describe_parse_line(&line, &vendor, &device, &vp)) 1084 goto out; 1085 if (vendor == pci_get_vendor(dev)) 1086 break; 1087 } 1088 if ((dp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL) 1089 goto out; 1090 for (;;) { 1091 if (pci_describe_parse_line(&line, &vendor, &device, &dp)) { 1092 *dp = 0; 1093 break; 1094 } 1095 if (vendor != -1) { 1096 *dp = 0; 1097 break; 1098 } 1099 if (device == pci_get_device(dev)) 1100 break; 1101 } 1102 if (dp[0] == '\0') 1103 snprintf(dp, 80, "0x%x", pci_get_device(dev)); 1104 if ((desc = malloc(strlen(vp) + strlen(dp) + 3, M_DEVBUF, M_NOWAIT)) != 1105 NULL) 1106 sprintf(desc, "%s, %s", vp, dp); 1107 out: 1108 if (vp != NULL) 1109 free(vp, M_DEVBUF); 1110 if (dp != NULL) 1111 free(dp, M_DEVBUF); 1112 return(desc); 1113 } 1114 1115 int 1116 pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) 1117 { 1118 struct pci_devinfo *dinfo; 1119 pcicfgregs *cfg; 1120 1121 dinfo = device_get_ivars(child); 1122 cfg = &dinfo->cfg; 1123 1124 switch (which) { 1125 case PCI_IVAR_ETHADDR: 1126 /* 1127 * The generic accessor doesn't deal with failure, so 1128 * we set the return value, then return an error. 1129 */ 1130 *((u_int8_t **) result) = NULL; 1131 return (EINVAL); 1132 case PCI_IVAR_SUBVENDOR: 1133 *result = cfg->subvendor; 1134 break; 1135 case PCI_IVAR_SUBDEVICE: 1136 *result = cfg->subdevice; 1137 break; 1138 case PCI_IVAR_VENDOR: 1139 *result = cfg->vendor; 1140 break; 1141 case PCI_IVAR_DEVICE: 1142 *result = cfg->device; 1143 break; 1144 case PCI_IVAR_DEVID: 1145 *result = (cfg->device << 16) | cfg->vendor; 1146 break; 1147 case PCI_IVAR_CLASS: 1148 *result = cfg->baseclass; 1149 break; 1150 case PCI_IVAR_SUBCLASS: 1151 *result = cfg->subclass; 1152 break; 1153 case PCI_IVAR_PROGIF: 1154 *result = cfg->progif; 1155 break; 1156 case PCI_IVAR_REVID: 1157 *result = cfg->revid; 1158 break; 1159 case PCI_IVAR_INTPIN: 1160 *result = cfg->intpin; 1161 break; 1162 case PCI_IVAR_IRQ: 1163 *result = cfg->intline; 1164 break; 1165 case PCI_IVAR_BUS: 1166 *result = cfg->bus; 1167 break; 1168 case PCI_IVAR_SLOT: 1169 *result = cfg->slot; 1170 break; 1171 case PCI_IVAR_FUNCTION: 1172 *result = cfg->func; 1173 break; 1174 default: 1175 return (ENOENT); 1176 } 1177 return (0); 1178 } 1179 1180 int 1181 pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value) 1182 { 1183 struct pci_devinfo *dinfo; 1184 pcicfgregs *cfg; 1185 1186 dinfo = device_get_ivars(child); 1187 cfg = &dinfo->cfg; 1188 1189 switch (which) { 1190 case PCI_IVAR_ETHADDR: 1191 case PCI_IVAR_SUBVENDOR: 1192 case PCI_IVAR_SUBDEVICE: 1193 case PCI_IVAR_VENDOR: 1194 case PCI_IVAR_DEVICE: 1195 case PCI_IVAR_DEVID: 1196 case PCI_IVAR_CLASS: 1197 case PCI_IVAR_SUBCLASS: 1198 case PCI_IVAR_PROGIF: 1199 case PCI_IVAR_REVID: 1200 case PCI_IVAR_INTPIN: 1201 case PCI_IVAR_IRQ: 1202 case PCI_IVAR_BUS: 1203 case PCI_IVAR_SLOT: 1204 case PCI_IVAR_FUNCTION: 1205 return (EINVAL); /* disallow for now */ 1206 1207 default: 1208 return (ENOENT); 1209 } 1210 return (0); 1211 } 1212 1213 1214 #include "opt_ddb.h" 1215 #ifdef DDB 1216 #include <ddb/ddb.h> 1217 #include <sys/cons.h> 1218 1219 /* 1220 * List resources based on pci map registers, used for within ddb 1221 */ 1222 1223 DB_SHOW_COMMAND(pciregs, db_pci_dump) 1224 { 1225 struct pci_devinfo *dinfo; 1226 struct devlist *devlist_head; 1227 struct pci_conf *p; 1228 const char *name; 1229 int i, error, none_count, nl; 1230 1231 none_count = 0; 1232 nl = 0; 1233 /* get the head of the device queue */ 1234 devlist_head = &pci_devq; 1235 1236 /* 1237 * Go through the list of devices and print out devices 1238 */ 1239 for (error = 0, i = 0, 1240 dinfo = STAILQ_FIRST(devlist_head); 1241 (dinfo != NULL) && (error == 0) && (i < pci_numdevs); 1242 dinfo = STAILQ_NEXT(dinfo, pci_links), i++) { 1243 1244 /* Populate pd_name and pd_unit */ 1245 name = NULL; 1246 if (dinfo->cfg.dev) 1247 name = device_get_name(dinfo->cfg.dev); 1248 1249 p = &dinfo->conf; 1250 /* 1251 * XXX just take 20 for now... 1252 */ 1253 if (nl++ == 20) { 1254 int c; 1255 1256 db_printf("--More--"); 1257 c = cngetc(); 1258 db_printf("\r"); 1259 /* 1260 * A whole screenfull or just one line? 1261 */ 1262 switch (c) { 1263 case '\n': /* just one line */ 1264 nl = 20; 1265 break; 1266 case ' ': 1267 nl = 0; /* another screenfull */ 1268 break; 1269 default: /* exit */ 1270 db_printf("\n"); 1271 return; 1272 } 1273 } 1274 1275 db_printf("%s%d@pci%d:%d:%d:\tclass=0x%06x card=0x%08x " 1276 "chip=0x%08x rev=0x%02x hdr=0x%02x\n", 1277 (name && *name) ? name : "none", 1278 (name && *name) ? (int)device_get_unit(dinfo->cfg.dev) : 1279 none_count++, 1280 p->pc_sel.pc_bus, p->pc_sel.pc_dev, 1281 p->pc_sel.pc_func, (p->pc_class << 16) | 1282 (p->pc_subclass << 8) | p->pc_progif, 1283 (p->pc_subdevice << 16) | p->pc_subvendor, 1284 (p->pc_device << 16) | p->pc_vendor, 1285 p->pc_revid, p->pc_hdr); 1286 } 1287 } 1288 #endif /* DDB */ 1289 1290 struct resource * 1291 pci_alloc_resource(device_t dev, device_t child, int type, int *rid, 1292 u_long start, u_long end, u_long count, u_int flags) 1293 { 1294 struct pci_devinfo *dinfo = device_get_ivars(child); 1295 struct resource_list *rl = &dinfo->resources; 1296 pcicfgregs *cfg = &dinfo->cfg; 1297 1298 /* 1299 * Perform lazy resource allocation 1300 * 1301 * XXX add support here for SYS_RES_IOPORT and SYS_RES_MEMORY 1302 */ 1303 if (device_get_parent(child) == dev) { 1304 /* 1305 * If the child device doesn't have an interrupt routed 1306 * and is deserving of an interrupt, try to assign it one. 1307 */ 1308 if ((type == SYS_RES_IRQ) && 1309 !PCI_INTERRUPT_VALID(cfg->intline) && 1310 (cfg->intpin != 0)) { 1311 cfg->intline = PCIB_ROUTE_INTERRUPT( 1312 device_get_parent(dev), child, cfg->intpin); 1313 if (PCI_INTERRUPT_VALID(cfg->intline)) { 1314 pci_write_config(child, PCIR_INTLINE, 1315 cfg->intline, 1); 1316 resource_list_add(rl, SYS_RES_IRQ, 0, 1317 cfg->intline, cfg->intline, 1); 1318 } 1319 } 1320 } 1321 1322 return (resource_list_alloc(rl, dev, child, type, rid, 1323 start, end, count, flags)); 1324 } 1325 1326 void 1327 pci_delete_resource(device_t dev, device_t child, int type, int rid) 1328 { 1329 struct pci_devinfo *dinfo; 1330 struct resource_list *rl; 1331 struct resource_list_entry *rle; 1332 1333 if (device_get_parent(child) != dev) 1334 return; 1335 1336 dinfo = device_get_ivars(child); 1337 rl = &dinfo->resources; 1338 rle = resource_list_find(rl, type, rid); 1339 if (rle) { 1340 if (rle->res) { 1341 if (rman_get_device(rle->res) != dev || 1342 rman_get_flags(rle->res) & RF_ACTIVE) { 1343 device_printf(dev, "delete_resource: " 1344 "Resource still owned by child, oops. " 1345 "(type=%d, rid=%d, addr=%lx)\n", 1346 rle->type, rle->rid, 1347 rman_get_start(rle->res)); 1348 return; 1349 } 1350 bus_release_resource(dev, type, rid, rle->res); 1351 } 1352 resource_list_delete(rl, type, rid); 1353 } 1354 /* 1355 * Why do we turn off the PCI configuration BAR when we delete a 1356 * resource? -- imp 1357 */ 1358 pci_write_config(child, rid, 0, 4); 1359 BUS_DELETE_RESOURCE(device_get_parent(dev), child, type, rid); 1360 } 1361 1362 struct resource_list * 1363 pci_get_resource_list (device_t dev, device_t child) 1364 { 1365 struct pci_devinfo * dinfo = device_get_ivars(child); 1366 struct resource_list * rl = &dinfo->resources; 1367 1368 if (!rl) 1369 return (NULL); 1370 1371 return (rl); 1372 } 1373 1374 u_int32_t 1375 pci_read_config_method(device_t dev, device_t child, int reg, int width) 1376 { 1377 struct pci_devinfo *dinfo = device_get_ivars(child); 1378 pcicfgregs *cfg = &dinfo->cfg; 1379 1380 return (PCIB_READ_CONFIG(device_get_parent(dev), 1381 cfg->bus, cfg->slot, cfg->func, reg, width)); 1382 } 1383 1384 void 1385 pci_write_config_method(device_t dev, device_t child, int reg, 1386 u_int32_t val, int width) 1387 { 1388 struct pci_devinfo *dinfo = device_get_ivars(child); 1389 pcicfgregs *cfg = &dinfo->cfg; 1390 1391 PCIB_WRITE_CONFIG(device_get_parent(dev), 1392 cfg->bus, cfg->slot, cfg->func, reg, val, width); 1393 } 1394 1395 int 1396 pci_child_location_str_method(device_t cbdev, device_t child, char *buf, 1397 size_t buflen) 1398 { 1399 struct pci_devinfo *dinfo; 1400 pcicfgregs *cfg; 1401 1402 dinfo = device_get_ivars(child); 1403 cfg = &dinfo->cfg; 1404 snprintf(buf, buflen, "slot=%d function=%d", pci_get_slot(child), 1405 pci_get_function(child)); 1406 return (0); 1407 } 1408 1409 int 1410 pci_child_pnpinfo_str_method(device_t cbdev, device_t child, char *buf, 1411 size_t buflen) 1412 { 1413 struct pci_devinfo *dinfo; 1414 pcicfgregs *cfg; 1415 1416 dinfo = device_get_ivars(child); 1417 cfg = &dinfo->cfg; 1418 snprintf(buf, buflen, "vendor=0x%04x device=0x%04x subvendor=0x%04x " 1419 "subdevice=0x%04x class=0x%02x%02x%02x", cfg->vendor, cfg->device, 1420 cfg->subvendor, cfg->subdevice, cfg->baseclass, cfg->subclass, 1421 cfg->progif); 1422 return (0); 1423 } 1424 1425 static int 1426 pci_modevent(module_t mod, int what, void *arg) 1427 { 1428 static dev_t pci_cdev; 1429 1430 switch (what) { 1431 case MOD_LOAD: 1432 STAILQ_INIT(&pci_devq); 1433 pci_generation = 0; 1434 pci_cdev = make_dev(&pcicdev, 0, UID_ROOT, GID_WHEEL, 0644, 1435 "pci"); 1436 pci_load_vendor_data(); 1437 break; 1438 1439 case MOD_UNLOAD: 1440 destroy_dev(pci_cdev); 1441 break; 1442 } 1443 1444 return (0); 1445 } 1446