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 29 #include <sys/cdefs.h> 30 __FBSDID("$FreeBSD$"); 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/endian.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 #include <machine/stdarg.h> 55 56 #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) 57 #include <machine/intr_machdep.h> 58 #endif 59 60 #include <sys/pciio.h> 61 #include <dev/pci/pcireg.h> 62 #include <dev/pci/pcivar.h> 63 #include <dev/pci/pci_private.h> 64 65 #include <dev/usb/controller/xhcireg.h> 66 #include <dev/usb/controller/ehcireg.h> 67 #include <dev/usb/controller/ohcireg.h> 68 #include <dev/usb/controller/uhcireg.h> 69 70 #include "pcib_if.h" 71 #include "pci_if.h" 72 73 #define PCIR_IS_BIOS(cfg, reg) \ 74 (((cfg)->hdrtype == PCIM_HDRTYPE_NORMAL && reg == PCIR_BIOS) || \ 75 ((cfg)->hdrtype == PCIM_HDRTYPE_BRIDGE && reg == PCIR_BIOS_1)) 76 77 static int pci_has_quirk(uint32_t devid, int quirk); 78 static pci_addr_t pci_mapbase(uint64_t mapreg); 79 static const char *pci_maptype(uint64_t mapreg); 80 static int pci_mapsize(uint64_t testval); 81 static int pci_maprange(uint64_t mapreg); 82 static pci_addr_t pci_rombase(uint64_t mapreg); 83 static int pci_romsize(uint64_t testval); 84 static void pci_fixancient(pcicfgregs *cfg); 85 static int pci_printf(pcicfgregs *cfg, const char *fmt, ...); 86 87 static int pci_porten(device_t dev); 88 static int pci_memen(device_t dev); 89 static void pci_assign_interrupt(device_t bus, device_t dev, 90 int force_route); 91 static int pci_add_map(device_t bus, device_t dev, int reg, 92 struct resource_list *rl, int force, int prefetch); 93 static int pci_probe(device_t dev); 94 static int pci_attach(device_t dev); 95 static void pci_load_vendor_data(void); 96 static int pci_describe_parse_line(char **ptr, int *vendor, 97 int *device, char **desc); 98 static char *pci_describe_device(device_t dev); 99 static int pci_modevent(module_t mod, int what, void *arg); 100 static void pci_hdrtypedata(device_t pcib, int b, int s, int f, 101 pcicfgregs *cfg); 102 static void pci_read_cap(device_t pcib, pcicfgregs *cfg); 103 static int pci_read_vpd_reg(device_t pcib, pcicfgregs *cfg, 104 int reg, uint32_t *data); 105 #if 0 106 static int pci_write_vpd_reg(device_t pcib, pcicfgregs *cfg, 107 int reg, uint32_t data); 108 #endif 109 static void pci_read_vpd(device_t pcib, pcicfgregs *cfg); 110 static void pci_disable_msi(device_t dev); 111 static void pci_enable_msi(device_t dev, uint64_t address, 112 uint16_t data); 113 static void pci_enable_msix(device_t dev, u_int index, 114 uint64_t address, uint32_t data); 115 static void pci_mask_msix(device_t dev, u_int index); 116 static void pci_unmask_msix(device_t dev, u_int index); 117 static int pci_msi_blacklisted(void); 118 static int pci_msix_blacklisted(void); 119 static void pci_resume_msi(device_t dev); 120 static void pci_resume_msix(device_t dev); 121 static int pci_remap_intr_method(device_t bus, device_t dev, 122 u_int irq); 123 124 static device_method_t pci_methods[] = { 125 /* Device interface */ 126 DEVMETHOD(device_probe, pci_probe), 127 DEVMETHOD(device_attach, pci_attach), 128 DEVMETHOD(device_detach, bus_generic_detach), 129 DEVMETHOD(device_shutdown, bus_generic_shutdown), 130 DEVMETHOD(device_suspend, pci_suspend), 131 DEVMETHOD(device_resume, pci_resume), 132 133 /* Bus interface */ 134 DEVMETHOD(bus_print_child, pci_print_child), 135 DEVMETHOD(bus_probe_nomatch, pci_probe_nomatch), 136 DEVMETHOD(bus_read_ivar, pci_read_ivar), 137 DEVMETHOD(bus_write_ivar, pci_write_ivar), 138 DEVMETHOD(bus_driver_added, pci_driver_added), 139 DEVMETHOD(bus_setup_intr, pci_setup_intr), 140 DEVMETHOD(bus_teardown_intr, pci_teardown_intr), 141 142 DEVMETHOD(bus_get_dma_tag, pci_get_dma_tag), 143 DEVMETHOD(bus_get_resource_list,pci_get_resource_list), 144 DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), 145 DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), 146 DEVMETHOD(bus_delete_resource, pci_delete_resource), 147 DEVMETHOD(bus_alloc_resource, pci_alloc_resource), 148 DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource), 149 DEVMETHOD(bus_release_resource, pci_release_resource), 150 DEVMETHOD(bus_activate_resource, pci_activate_resource), 151 DEVMETHOD(bus_deactivate_resource, pci_deactivate_resource), 152 DEVMETHOD(bus_child_detached, pci_child_detached), 153 DEVMETHOD(bus_child_pnpinfo_str, pci_child_pnpinfo_str_method), 154 DEVMETHOD(bus_child_location_str, pci_child_location_str_method), 155 DEVMETHOD(bus_remap_intr, pci_remap_intr_method), 156 157 /* PCI interface */ 158 DEVMETHOD(pci_read_config, pci_read_config_method), 159 DEVMETHOD(pci_write_config, pci_write_config_method), 160 DEVMETHOD(pci_enable_busmaster, pci_enable_busmaster_method), 161 DEVMETHOD(pci_disable_busmaster, pci_disable_busmaster_method), 162 DEVMETHOD(pci_enable_io, pci_enable_io_method), 163 DEVMETHOD(pci_disable_io, pci_disable_io_method), 164 DEVMETHOD(pci_get_vpd_ident, pci_get_vpd_ident_method), 165 DEVMETHOD(pci_get_vpd_readonly, pci_get_vpd_readonly_method), 166 DEVMETHOD(pci_get_powerstate, pci_get_powerstate_method), 167 DEVMETHOD(pci_set_powerstate, pci_set_powerstate_method), 168 DEVMETHOD(pci_assign_interrupt, pci_assign_interrupt_method), 169 DEVMETHOD(pci_find_cap, pci_find_cap_method), 170 DEVMETHOD(pci_find_extcap, pci_find_extcap_method), 171 DEVMETHOD(pci_find_htcap, pci_find_htcap_method), 172 DEVMETHOD(pci_alloc_msi, pci_alloc_msi_method), 173 DEVMETHOD(pci_alloc_msix, pci_alloc_msix_method), 174 DEVMETHOD(pci_remap_msix, pci_remap_msix_method), 175 DEVMETHOD(pci_release_msi, pci_release_msi_method), 176 DEVMETHOD(pci_msi_count, pci_msi_count_method), 177 DEVMETHOD(pci_msix_count, pci_msix_count_method), 178 179 DEVMETHOD_END 180 }; 181 182 DEFINE_CLASS_0(pci, pci_driver, pci_methods, sizeof(struct pci_softc)); 183 184 static devclass_t pci_devclass; 185 DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, NULL); 186 MODULE_VERSION(pci, 1); 187 188 static char *pci_vendordata; 189 static size_t pci_vendordata_size; 190 191 struct pci_quirk { 192 uint32_t devid; /* Vendor/device of the card */ 193 int type; 194 #define PCI_QUIRK_MAP_REG 1 /* PCI map register in weird place */ 195 #define PCI_QUIRK_DISABLE_MSI 2 /* Neither MSI nor MSI-X work */ 196 #define PCI_QUIRK_ENABLE_MSI_VM 3 /* Older chipset in VM where MSI works */ 197 #define PCI_QUIRK_UNMAP_REG 4 /* Ignore PCI map register */ 198 #define PCI_QUIRK_DISABLE_MSIX 5 /* MSI-X doesn't work */ 199 int arg1; 200 int arg2; 201 }; 202 203 static const struct pci_quirk pci_quirks[] = { 204 /* The Intel 82371AB and 82443MX have a map register at offset 0x90. */ 205 { 0x71138086, PCI_QUIRK_MAP_REG, 0x90, 0 }, 206 { 0x719b8086, PCI_QUIRK_MAP_REG, 0x90, 0 }, 207 /* As does the Serverworks OSB4 (the SMBus mapping register) */ 208 { 0x02001166, PCI_QUIRK_MAP_REG, 0x90, 0 }, 209 210 /* 211 * MSI doesn't work with the ServerWorks CNB20-HE Host Bridge 212 * or the CMIC-SL (AKA ServerWorks GC_LE). 213 */ 214 { 0x00141166, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 215 { 0x00171166, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 216 217 /* 218 * MSI doesn't work on earlier Intel chipsets including 219 * E7500, E7501, E7505, 845, 865, 875/E7210, and 855. 220 */ 221 { 0x25408086, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 222 { 0x254c8086, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 223 { 0x25508086, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 224 { 0x25608086, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 225 { 0x25708086, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 226 { 0x25788086, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 227 { 0x35808086, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 228 229 /* 230 * MSI doesn't work with devices behind the AMD 8131 HT-PCIX 231 * bridge. 232 */ 233 { 0x74501022, PCI_QUIRK_DISABLE_MSI, 0, 0 }, 234 235 /* 236 * MSI-X allocation doesn't work properly for devices passed through 237 * by VMware up to at least ESXi 5.1. 238 */ 239 { 0x079015ad, PCI_QUIRK_DISABLE_MSIX, 0, 0 }, /* PCI/PCI-X */ 240 { 0x07a015ad, PCI_QUIRK_DISABLE_MSIX, 0, 0 }, /* PCIe */ 241 242 /* 243 * Some virtualization environments emulate an older chipset 244 * but support MSI just fine. QEMU uses the Intel 82440. 245 */ 246 { 0x12378086, PCI_QUIRK_ENABLE_MSI_VM, 0, 0 }, 247 248 /* 249 * HPET MMIO base address may appear in Bar1 for AMD SB600 SMBus 250 * controller depending on SoftPciRst register (PM_IO 0x55 [7]). 251 * It prevents us from attaching hpet(4) when the bit is unset. 252 * Note this quirk only affects SB600 revision A13 and earlier. 253 * For SB600 A21 and later, firmware must set the bit to hide it. 254 * For SB700 and later, it is unused and hardcoded to zero. 255 */ 256 { 0x43851002, PCI_QUIRK_UNMAP_REG, 0x14, 0 }, 257 258 { 0 } 259 }; 260 261 /* map register information */ 262 #define PCI_MAPMEM 0x01 /* memory map */ 263 #define PCI_MAPMEMP 0x02 /* prefetchable memory map */ 264 #define PCI_MAPPORT 0x04 /* port map */ 265 266 struct devlist pci_devq; 267 uint32_t pci_generation; 268 uint32_t pci_numdevs = 0; 269 static int pcie_chipset, pcix_chipset; 270 271 /* sysctl vars */ 272 SYSCTL_NODE(_hw, OID_AUTO, pci, CTLFLAG_RD, 0, "PCI bus tuning parameters"); 273 274 static int pci_enable_io_modes = 1; 275 TUNABLE_INT("hw.pci.enable_io_modes", &pci_enable_io_modes); 276 SYSCTL_INT(_hw_pci, OID_AUTO, enable_io_modes, CTLFLAG_RW, 277 &pci_enable_io_modes, 1, 278 "Enable I/O and memory bits in the config register. Some BIOSes do not\n\ 279 enable these bits correctly. We'd like to do this all the time, but there\n\ 280 are some peripherals that this causes problems with."); 281 282 static int pci_do_realloc_bars = 0; 283 TUNABLE_INT("hw.pci.realloc_bars", &pci_do_realloc_bars); 284 SYSCTL_INT(_hw_pci, OID_AUTO, realloc_bars, CTLFLAG_RW, 285 &pci_do_realloc_bars, 0, 286 "Attempt to allocate a new range for any BARs whose original firmware-assigned ranges fail to allocate during the initial device scan."); 287 288 static int pci_do_power_nodriver = 0; 289 TUNABLE_INT("hw.pci.do_power_nodriver", &pci_do_power_nodriver); 290 SYSCTL_INT(_hw_pci, OID_AUTO, do_power_nodriver, CTLFLAG_RW, 291 &pci_do_power_nodriver, 0, 292 "Place a function into D3 state when no driver attaches to it. 0 means\n\ 293 disable. 1 means conservatively place devices into D3 state. 2 means\n\ 294 agressively place devices into D3 state. 3 means put absolutely everything\n\ 295 in D3 state."); 296 297 int pci_do_power_resume = 1; 298 TUNABLE_INT("hw.pci.do_power_resume", &pci_do_power_resume); 299 SYSCTL_INT(_hw_pci, OID_AUTO, do_power_resume, CTLFLAG_RW, 300 &pci_do_power_resume, 1, 301 "Transition from D3 -> D0 on resume."); 302 303 int pci_do_power_suspend = 1; 304 TUNABLE_INT("hw.pci.do_power_suspend", &pci_do_power_suspend); 305 SYSCTL_INT(_hw_pci, OID_AUTO, do_power_suspend, CTLFLAG_RW, 306 &pci_do_power_suspend, 1, 307 "Transition from D0 -> D3 on suspend."); 308 309 static int pci_do_msi = 1; 310 TUNABLE_INT("hw.pci.enable_msi", &pci_do_msi); 311 SYSCTL_INT(_hw_pci, OID_AUTO, enable_msi, CTLFLAG_RW, &pci_do_msi, 1, 312 "Enable support for MSI interrupts"); 313 314 static int pci_do_msix = 1; 315 TUNABLE_INT("hw.pci.enable_msix", &pci_do_msix); 316 SYSCTL_INT(_hw_pci, OID_AUTO, enable_msix, CTLFLAG_RW, &pci_do_msix, 1, 317 "Enable support for MSI-X interrupts"); 318 319 static int pci_honor_msi_blacklist = 1; 320 TUNABLE_INT("hw.pci.honor_msi_blacklist", &pci_honor_msi_blacklist); 321 SYSCTL_INT(_hw_pci, OID_AUTO, honor_msi_blacklist, CTLFLAG_RD, 322 &pci_honor_msi_blacklist, 1, "Honor chipset blacklist for MSI/MSI-X"); 323 324 #if defined(__i386__) || defined(__amd64__) 325 static int pci_usb_takeover = 1; 326 #else 327 static int pci_usb_takeover = 0; 328 #endif 329 TUNABLE_INT("hw.pci.usb_early_takeover", &pci_usb_takeover); 330 SYSCTL_INT(_hw_pci, OID_AUTO, usb_early_takeover, CTLFLAG_RDTUN, 331 &pci_usb_takeover, 1, "Enable early takeover of USB controllers.\n\ 332 Disable this if you depend on BIOS emulation of USB devices, that is\n\ 333 you use USB devices (like keyboard or mouse) but do not load USB drivers"); 334 335 static int 336 pci_has_quirk(uint32_t devid, int quirk) 337 { 338 const struct pci_quirk *q; 339 340 for (q = &pci_quirks[0]; q->devid; q++) { 341 if (q->devid == devid && q->type == quirk) 342 return (1); 343 } 344 return (0); 345 } 346 347 /* Find a device_t by bus/slot/function in domain 0 */ 348 349 device_t 350 pci_find_bsf(uint8_t bus, uint8_t slot, uint8_t func) 351 { 352 353 return (pci_find_dbsf(0, bus, slot, func)); 354 } 355 356 /* Find a device_t by domain/bus/slot/function */ 357 358 device_t 359 pci_find_dbsf(uint32_t domain, uint8_t bus, uint8_t slot, uint8_t func) 360 { 361 struct pci_devinfo *dinfo; 362 363 STAILQ_FOREACH(dinfo, &pci_devq, pci_links) { 364 if ((dinfo->cfg.domain == domain) && 365 (dinfo->cfg.bus == bus) && 366 (dinfo->cfg.slot == slot) && 367 (dinfo->cfg.func == func)) { 368 return (dinfo->cfg.dev); 369 } 370 } 371 372 return (NULL); 373 } 374 375 /* Find a device_t by vendor/device ID */ 376 377 device_t 378 pci_find_device(uint16_t vendor, uint16_t device) 379 { 380 struct pci_devinfo *dinfo; 381 382 STAILQ_FOREACH(dinfo, &pci_devq, pci_links) { 383 if ((dinfo->cfg.vendor == vendor) && 384 (dinfo->cfg.device == device)) { 385 return (dinfo->cfg.dev); 386 } 387 } 388 389 return (NULL); 390 } 391 392 device_t 393 pci_find_class(uint8_t class, uint8_t subclass) 394 { 395 struct pci_devinfo *dinfo; 396 397 STAILQ_FOREACH(dinfo, &pci_devq, pci_links) { 398 if (dinfo->cfg.baseclass == class && 399 dinfo->cfg.subclass == subclass) { 400 return (dinfo->cfg.dev); 401 } 402 } 403 404 return (NULL); 405 } 406 407 static int 408 pci_printf(pcicfgregs *cfg, const char *fmt, ...) 409 { 410 va_list ap; 411 int retval; 412 413 retval = printf("pci%d:%d:%d:%d: ", cfg->domain, cfg->bus, cfg->slot, 414 cfg->func); 415 va_start(ap, fmt); 416 retval += vprintf(fmt, ap); 417 va_end(ap); 418 return (retval); 419 } 420 421 /* return base address of memory or port map */ 422 423 static pci_addr_t 424 pci_mapbase(uint64_t mapreg) 425 { 426 427 if (PCI_BAR_MEM(mapreg)) 428 return (mapreg & PCIM_BAR_MEM_BASE); 429 else 430 return (mapreg & PCIM_BAR_IO_BASE); 431 } 432 433 /* return map type of memory or port map */ 434 435 static const char * 436 pci_maptype(uint64_t mapreg) 437 { 438 439 if (PCI_BAR_IO(mapreg)) 440 return ("I/O Port"); 441 if (mapreg & PCIM_BAR_MEM_PREFETCH) 442 return ("Prefetchable Memory"); 443 return ("Memory"); 444 } 445 446 /* return log2 of map size decoded for memory or port map */ 447 448 static int 449 pci_mapsize(uint64_t testval) 450 { 451 int ln2size; 452 453 testval = pci_mapbase(testval); 454 ln2size = 0; 455 if (testval != 0) { 456 while ((testval & 1) == 0) 457 { 458 ln2size++; 459 testval >>= 1; 460 } 461 } 462 return (ln2size); 463 } 464 465 /* return base address of device ROM */ 466 467 static pci_addr_t 468 pci_rombase(uint64_t mapreg) 469 { 470 471 return (mapreg & PCIM_BIOS_ADDR_MASK); 472 } 473 474 /* return log2 of map size decided for device ROM */ 475 476 static int 477 pci_romsize(uint64_t testval) 478 { 479 int ln2size; 480 481 testval = pci_rombase(testval); 482 ln2size = 0; 483 if (testval != 0) { 484 while ((testval & 1) == 0) 485 { 486 ln2size++; 487 testval >>= 1; 488 } 489 } 490 return (ln2size); 491 } 492 493 /* return log2 of address range supported by map register */ 494 495 static int 496 pci_maprange(uint64_t mapreg) 497 { 498 int ln2range = 0; 499 500 if (PCI_BAR_IO(mapreg)) 501 ln2range = 32; 502 else 503 switch (mapreg & PCIM_BAR_MEM_TYPE) { 504 case PCIM_BAR_MEM_32: 505 ln2range = 32; 506 break; 507 case PCIM_BAR_MEM_1MB: 508 ln2range = 20; 509 break; 510 case PCIM_BAR_MEM_64: 511 ln2range = 64; 512 break; 513 } 514 return (ln2range); 515 } 516 517 /* adjust some values from PCI 1.0 devices to match 2.0 standards ... */ 518 519 static void 520 pci_fixancient(pcicfgregs *cfg) 521 { 522 if ((cfg->hdrtype & PCIM_HDRTYPE) != PCIM_HDRTYPE_NORMAL) 523 return; 524 525 /* PCI to PCI bridges use header type 1 */ 526 if (cfg->baseclass == PCIC_BRIDGE && cfg->subclass == PCIS_BRIDGE_PCI) 527 cfg->hdrtype = PCIM_HDRTYPE_BRIDGE; 528 } 529 530 /* extract header type specific config data */ 531 532 static void 533 pci_hdrtypedata(device_t pcib, int b, int s, int f, pcicfgregs *cfg) 534 { 535 #define REG(n, w) PCIB_READ_CONFIG(pcib, b, s, f, n, w) 536 switch (cfg->hdrtype & PCIM_HDRTYPE) { 537 case PCIM_HDRTYPE_NORMAL: 538 cfg->subvendor = REG(PCIR_SUBVEND_0, 2); 539 cfg->subdevice = REG(PCIR_SUBDEV_0, 2); 540 cfg->nummaps = PCI_MAXMAPS_0; 541 break; 542 case PCIM_HDRTYPE_BRIDGE: 543 cfg->nummaps = PCI_MAXMAPS_1; 544 break; 545 case PCIM_HDRTYPE_CARDBUS: 546 cfg->subvendor = REG(PCIR_SUBVEND_2, 2); 547 cfg->subdevice = REG(PCIR_SUBDEV_2, 2); 548 cfg->nummaps = PCI_MAXMAPS_2; 549 break; 550 } 551 #undef REG 552 } 553 554 /* read configuration header into pcicfgregs structure */ 555 struct pci_devinfo * 556 pci_read_device(device_t pcib, int d, int b, int s, int f, size_t size) 557 { 558 #define REG(n, w) PCIB_READ_CONFIG(pcib, b, s, f, n, w) 559 pcicfgregs *cfg = NULL; 560 struct pci_devinfo *devlist_entry; 561 struct devlist *devlist_head; 562 563 devlist_head = &pci_devq; 564 565 devlist_entry = NULL; 566 567 if (REG(PCIR_DEVVENDOR, 4) != 0xfffffffful) { 568 devlist_entry = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO); 569 if (devlist_entry == NULL) 570 return (NULL); 571 572 cfg = &devlist_entry->cfg; 573 574 cfg->domain = d; 575 cfg->bus = b; 576 cfg->slot = s; 577 cfg->func = f; 578 cfg->vendor = REG(PCIR_VENDOR, 2); 579 cfg->device = REG(PCIR_DEVICE, 2); 580 cfg->cmdreg = REG(PCIR_COMMAND, 2); 581 cfg->statreg = REG(PCIR_STATUS, 2); 582 cfg->baseclass = REG(PCIR_CLASS, 1); 583 cfg->subclass = REG(PCIR_SUBCLASS, 1); 584 cfg->progif = REG(PCIR_PROGIF, 1); 585 cfg->revid = REG(PCIR_REVID, 1); 586 cfg->hdrtype = REG(PCIR_HDRTYPE, 1); 587 cfg->cachelnsz = REG(PCIR_CACHELNSZ, 1); 588 cfg->lattimer = REG(PCIR_LATTIMER, 1); 589 cfg->intpin = REG(PCIR_INTPIN, 1); 590 cfg->intline = REG(PCIR_INTLINE, 1); 591 592 cfg->mingnt = REG(PCIR_MINGNT, 1); 593 cfg->maxlat = REG(PCIR_MAXLAT, 1); 594 595 cfg->mfdev = (cfg->hdrtype & PCIM_MFDEV) != 0; 596 cfg->hdrtype &= ~PCIM_MFDEV; 597 STAILQ_INIT(&cfg->maps); 598 599 pci_fixancient(cfg); 600 pci_hdrtypedata(pcib, b, s, f, cfg); 601 602 if (REG(PCIR_STATUS, 2) & PCIM_STATUS_CAPPRESENT) 603 pci_read_cap(pcib, cfg); 604 605 STAILQ_INSERT_TAIL(devlist_head, devlist_entry, pci_links); 606 607 devlist_entry->conf.pc_sel.pc_domain = cfg->domain; 608 devlist_entry->conf.pc_sel.pc_bus = cfg->bus; 609 devlist_entry->conf.pc_sel.pc_dev = cfg->slot; 610 devlist_entry->conf.pc_sel.pc_func = cfg->func; 611 devlist_entry->conf.pc_hdr = cfg->hdrtype; 612 613 devlist_entry->conf.pc_subvendor = cfg->subvendor; 614 devlist_entry->conf.pc_subdevice = cfg->subdevice; 615 devlist_entry->conf.pc_vendor = cfg->vendor; 616 devlist_entry->conf.pc_device = cfg->device; 617 618 devlist_entry->conf.pc_class = cfg->baseclass; 619 devlist_entry->conf.pc_subclass = cfg->subclass; 620 devlist_entry->conf.pc_progif = cfg->progif; 621 devlist_entry->conf.pc_revid = cfg->revid; 622 623 pci_numdevs++; 624 pci_generation++; 625 } 626 return (devlist_entry); 627 #undef REG 628 } 629 630 static void 631 pci_read_cap(device_t pcib, pcicfgregs *cfg) 632 { 633 #define REG(n, w) PCIB_READ_CONFIG(pcib, cfg->bus, cfg->slot, cfg->func, n, w) 634 #define WREG(n, v, w) PCIB_WRITE_CONFIG(pcib, cfg->bus, cfg->slot, cfg->func, n, v, w) 635 #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) 636 uint64_t addr; 637 #endif 638 uint32_t val; 639 int ptr, nextptr, ptrptr; 640 641 switch (cfg->hdrtype & PCIM_HDRTYPE) { 642 case PCIM_HDRTYPE_NORMAL: 643 case PCIM_HDRTYPE_BRIDGE: 644 ptrptr = PCIR_CAP_PTR; 645 break; 646 case PCIM_HDRTYPE_CARDBUS: 647 ptrptr = PCIR_CAP_PTR_2; /* cardbus capabilities ptr */ 648 break; 649 default: 650 return; /* no extended capabilities support */ 651 } 652 nextptr = REG(ptrptr, 1); /* sanity check? */ 653 654 /* 655 * Read capability entries. 656 */ 657 while (nextptr != 0) { 658 /* Sanity check */ 659 if (nextptr > 255) { 660 printf("illegal PCI extended capability offset %d\n", 661 nextptr); 662 return; 663 } 664 /* Find the next entry */ 665 ptr = nextptr; 666 nextptr = REG(ptr + PCICAP_NEXTPTR, 1); 667 668 /* Process this entry */ 669 switch (REG(ptr + PCICAP_ID, 1)) { 670 case PCIY_PMG: /* PCI power management */ 671 if (cfg->pp.pp_cap == 0) { 672 cfg->pp.pp_cap = REG(ptr + PCIR_POWER_CAP, 2); 673 cfg->pp.pp_status = ptr + PCIR_POWER_STATUS; 674 cfg->pp.pp_bse = ptr + PCIR_POWER_BSE; 675 if ((nextptr - ptr) > PCIR_POWER_DATA) 676 cfg->pp.pp_data = ptr + PCIR_POWER_DATA; 677 } 678 break; 679 case PCIY_HT: /* HyperTransport */ 680 /* Determine HT-specific capability type. */ 681 val = REG(ptr + PCIR_HT_COMMAND, 2); 682 683 if ((val & 0xe000) == PCIM_HTCAP_SLAVE) 684 cfg->ht.ht_slave = ptr; 685 686 #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) 687 switch (val & PCIM_HTCMD_CAP_MASK) { 688 case PCIM_HTCAP_MSI_MAPPING: 689 if (!(val & PCIM_HTCMD_MSI_FIXED)) { 690 /* Sanity check the mapping window. */ 691 addr = REG(ptr + PCIR_HTMSI_ADDRESS_HI, 692 4); 693 addr <<= 32; 694 addr |= REG(ptr + PCIR_HTMSI_ADDRESS_LO, 695 4); 696 if (addr != MSI_INTEL_ADDR_BASE) 697 device_printf(pcib, 698 "HT device at pci%d:%d:%d:%d has non-default MSI window 0x%llx\n", 699 cfg->domain, cfg->bus, 700 cfg->slot, cfg->func, 701 (long long)addr); 702 } else 703 addr = MSI_INTEL_ADDR_BASE; 704 705 cfg->ht.ht_msimap = ptr; 706 cfg->ht.ht_msictrl = val; 707 cfg->ht.ht_msiaddr = addr; 708 break; 709 } 710 #endif 711 break; 712 case PCIY_MSI: /* PCI MSI */ 713 cfg->msi.msi_location = ptr; 714 cfg->msi.msi_ctrl = REG(ptr + PCIR_MSI_CTRL, 2); 715 cfg->msi.msi_msgnum = 1 << ((cfg->msi.msi_ctrl & 716 PCIM_MSICTRL_MMC_MASK)>>1); 717 break; 718 case PCIY_MSIX: /* PCI MSI-X */ 719 cfg->msix.msix_location = ptr; 720 cfg->msix.msix_ctrl = REG(ptr + PCIR_MSIX_CTRL, 2); 721 cfg->msix.msix_msgnum = (cfg->msix.msix_ctrl & 722 PCIM_MSIXCTRL_TABLE_SIZE) + 1; 723 val = REG(ptr + PCIR_MSIX_TABLE, 4); 724 cfg->msix.msix_table_bar = PCIR_BAR(val & 725 PCIM_MSIX_BIR_MASK); 726 cfg->msix.msix_table_offset = val & ~PCIM_MSIX_BIR_MASK; 727 val = REG(ptr + PCIR_MSIX_PBA, 4); 728 cfg->msix.msix_pba_bar = PCIR_BAR(val & 729 PCIM_MSIX_BIR_MASK); 730 cfg->msix.msix_pba_offset = val & ~PCIM_MSIX_BIR_MASK; 731 break; 732 case PCIY_VPD: /* PCI Vital Product Data */ 733 cfg->vpd.vpd_reg = ptr; 734 break; 735 case PCIY_SUBVENDOR: 736 /* Should always be true. */ 737 if ((cfg->hdrtype & PCIM_HDRTYPE) == 738 PCIM_HDRTYPE_BRIDGE) { 739 val = REG(ptr + PCIR_SUBVENDCAP_ID, 4); 740 cfg->subvendor = val & 0xffff; 741 cfg->subdevice = val >> 16; 742 } 743 break; 744 case PCIY_PCIX: /* PCI-X */ 745 /* 746 * Assume we have a PCI-X chipset if we have 747 * at least one PCI-PCI bridge with a PCI-X 748 * capability. Note that some systems with 749 * PCI-express or HT chipsets might match on 750 * this check as well. 751 */ 752 if ((cfg->hdrtype & PCIM_HDRTYPE) == 753 PCIM_HDRTYPE_BRIDGE) 754 pcix_chipset = 1; 755 cfg->pcix.pcix_location = ptr; 756 break; 757 case PCIY_EXPRESS: /* PCI-express */ 758 /* 759 * Assume we have a PCI-express chipset if we have 760 * at least one PCI-express device. 761 */ 762 pcie_chipset = 1; 763 cfg->pcie.pcie_location = ptr; 764 val = REG(ptr + PCIER_FLAGS, 2); 765 cfg->pcie.pcie_type = val & PCIEM_FLAGS_TYPE; 766 break; 767 default: 768 break; 769 } 770 } 771 772 #if defined(__powerpc__) 773 /* 774 * Enable the MSI mapping window for all HyperTransport 775 * slaves. PCI-PCI bridges have their windows enabled via 776 * PCIB_MAP_MSI(). 777 */ 778 if (cfg->ht.ht_slave != 0 && cfg->ht.ht_msimap != 0 && 779 !(cfg->ht.ht_msictrl & PCIM_HTCMD_MSI_ENABLE)) { 780 device_printf(pcib, 781 "Enabling MSI window for HyperTransport slave at pci%d:%d:%d:%d\n", 782 cfg->domain, cfg->bus, cfg->slot, cfg->func); 783 cfg->ht.ht_msictrl |= PCIM_HTCMD_MSI_ENABLE; 784 WREG(cfg->ht.ht_msimap + PCIR_HT_COMMAND, cfg->ht.ht_msictrl, 785 2); 786 } 787 #endif 788 /* REG and WREG use carry through to next functions */ 789 } 790 791 /* 792 * PCI Vital Product Data 793 */ 794 795 #define PCI_VPD_TIMEOUT 1000000 796 797 static int 798 pci_read_vpd_reg(device_t pcib, pcicfgregs *cfg, int reg, uint32_t *data) 799 { 800 int count = PCI_VPD_TIMEOUT; 801 802 KASSERT((reg & 3) == 0, ("VPD register must by 4 byte aligned")); 803 804 WREG(cfg->vpd.vpd_reg + PCIR_VPD_ADDR, reg, 2); 805 806 while ((REG(cfg->vpd.vpd_reg + PCIR_VPD_ADDR, 2) & 0x8000) != 0x8000) { 807 if (--count < 0) 808 return (ENXIO); 809 DELAY(1); /* limit looping */ 810 } 811 *data = (REG(cfg->vpd.vpd_reg + PCIR_VPD_DATA, 4)); 812 813 return (0); 814 } 815 816 #if 0 817 static int 818 pci_write_vpd_reg(device_t pcib, pcicfgregs *cfg, int reg, uint32_t data) 819 { 820 int count = PCI_VPD_TIMEOUT; 821 822 KASSERT((reg & 3) == 0, ("VPD register must by 4 byte aligned")); 823 824 WREG(cfg->vpd.vpd_reg + PCIR_VPD_DATA, data, 4); 825 WREG(cfg->vpd.vpd_reg + PCIR_VPD_ADDR, reg | 0x8000, 2); 826 while ((REG(cfg->vpd.vpd_reg + PCIR_VPD_ADDR, 2) & 0x8000) == 0x8000) { 827 if (--count < 0) 828 return (ENXIO); 829 DELAY(1); /* limit looping */ 830 } 831 832 return (0); 833 } 834 #endif 835 836 #undef PCI_VPD_TIMEOUT 837 838 struct vpd_readstate { 839 device_t pcib; 840 pcicfgregs *cfg; 841 uint32_t val; 842 int bytesinval; 843 int off; 844 uint8_t cksum; 845 }; 846 847 static int 848 vpd_nextbyte(struct vpd_readstate *vrs, uint8_t *data) 849 { 850 uint32_t reg; 851 uint8_t byte; 852 853 if (vrs->bytesinval == 0) { 854 if (pci_read_vpd_reg(vrs->pcib, vrs->cfg, vrs->off, ®)) 855 return (ENXIO); 856 vrs->val = le32toh(reg); 857 vrs->off += 4; 858 byte = vrs->val & 0xff; 859 vrs->bytesinval = 3; 860 } else { 861 vrs->val = vrs->val >> 8; 862 byte = vrs->val & 0xff; 863 vrs->bytesinval--; 864 } 865 866 vrs->cksum += byte; 867 *data = byte; 868 return (0); 869 } 870 871 static void 872 pci_read_vpd(device_t pcib, pcicfgregs *cfg) 873 { 874 struct vpd_readstate vrs; 875 int state; 876 int name; 877 int remain; 878 int i; 879 int alloc, off; /* alloc/off for RO/W arrays */ 880 int cksumvalid; 881 int dflen; 882 uint8_t byte; 883 uint8_t byte2; 884 885 /* init vpd reader */ 886 vrs.bytesinval = 0; 887 vrs.off = 0; 888 vrs.pcib = pcib; 889 vrs.cfg = cfg; 890 vrs.cksum = 0; 891 892 state = 0; 893 name = remain = i = 0; /* shut up stupid gcc */ 894 alloc = off = 0; /* shut up stupid gcc */ 895 dflen = 0; /* shut up stupid gcc */ 896 cksumvalid = -1; 897 while (state >= 0) { 898 if (vpd_nextbyte(&vrs, &byte)) { 899 state = -2; 900 break; 901 } 902 #if 0 903 printf("vpd: val: %#x, off: %d, bytesinval: %d, byte: %#hhx, " \ 904 "state: %d, remain: %d, name: %#x, i: %d\n", vrs.val, 905 vrs.off, vrs.bytesinval, byte, state, remain, name, i); 906 #endif 907 switch (state) { 908 case 0: /* item name */ 909 if (byte & 0x80) { 910 if (vpd_nextbyte(&vrs, &byte2)) { 911 state = -2; 912 break; 913 } 914 remain = byte2; 915 if (vpd_nextbyte(&vrs, &byte2)) { 916 state = -2; 917 break; 918 } 919 remain |= byte2 << 8; 920 if (remain > (0x7f*4 - vrs.off)) { 921 state = -1; 922 pci_printf(cfg, 923 "invalid VPD data, remain %#x\n", 924 remain); 925 } 926 name = byte & 0x7f; 927 } else { 928 remain = byte & 0x7; 929 name = (byte >> 3) & 0xf; 930 } 931 switch (name) { 932 case 0x2: /* String */ 933 cfg->vpd.vpd_ident = malloc(remain + 1, 934 M_DEVBUF, M_WAITOK); 935 i = 0; 936 state = 1; 937 break; 938 case 0xf: /* End */ 939 state = -1; 940 break; 941 case 0x10: /* VPD-R */ 942 alloc = 8; 943 off = 0; 944 cfg->vpd.vpd_ros = malloc(alloc * 945 sizeof(*cfg->vpd.vpd_ros), M_DEVBUF, 946 M_WAITOK | M_ZERO); 947 state = 2; 948 break; 949 case 0x11: /* VPD-W */ 950 alloc = 8; 951 off = 0; 952 cfg->vpd.vpd_w = malloc(alloc * 953 sizeof(*cfg->vpd.vpd_w), M_DEVBUF, 954 M_WAITOK | M_ZERO); 955 state = 5; 956 break; 957 default: /* Invalid data, abort */ 958 state = -1; 959 break; 960 } 961 break; 962 963 case 1: /* Identifier String */ 964 cfg->vpd.vpd_ident[i++] = byte; 965 remain--; 966 if (remain == 0) { 967 cfg->vpd.vpd_ident[i] = '\0'; 968 state = 0; 969 } 970 break; 971 972 case 2: /* VPD-R Keyword Header */ 973 if (off == alloc) { 974 cfg->vpd.vpd_ros = reallocf(cfg->vpd.vpd_ros, 975 (alloc *= 2) * sizeof(*cfg->vpd.vpd_ros), 976 M_DEVBUF, M_WAITOK | M_ZERO); 977 } 978 cfg->vpd.vpd_ros[off].keyword[0] = byte; 979 if (vpd_nextbyte(&vrs, &byte2)) { 980 state = -2; 981 break; 982 } 983 cfg->vpd.vpd_ros[off].keyword[1] = byte2; 984 if (vpd_nextbyte(&vrs, &byte2)) { 985 state = -2; 986 break; 987 } 988 dflen = byte2; 989 if (dflen == 0 && 990 strncmp(cfg->vpd.vpd_ros[off].keyword, "RV", 991 2) == 0) { 992 /* 993 * if this happens, we can't trust the rest 994 * of the VPD. 995 */ 996 pci_printf(cfg, "bad keyword length: %d\n", 997 dflen); 998 cksumvalid = 0; 999 state = -1; 1000 break; 1001 } else if (dflen == 0) { 1002 cfg->vpd.vpd_ros[off].value = malloc(1 * 1003 sizeof(*cfg->vpd.vpd_ros[off].value), 1004 M_DEVBUF, M_WAITOK); 1005 cfg->vpd.vpd_ros[off].value[0] = '\x00'; 1006 } else 1007 cfg->vpd.vpd_ros[off].value = malloc( 1008 (dflen + 1) * 1009 sizeof(*cfg->vpd.vpd_ros[off].value), 1010 M_DEVBUF, M_WAITOK); 1011 remain -= 3; 1012 i = 0; 1013 /* keep in sync w/ state 3's transistions */ 1014 if (dflen == 0 && remain == 0) 1015 state = 0; 1016 else if (dflen == 0) 1017 state = 2; 1018 else 1019 state = 3; 1020 break; 1021 1022 case 3: /* VPD-R Keyword Value */ 1023 cfg->vpd.vpd_ros[off].value[i++] = byte; 1024 if (strncmp(cfg->vpd.vpd_ros[off].keyword, 1025 "RV", 2) == 0 && cksumvalid == -1) { 1026 if (vrs.cksum == 0) 1027 cksumvalid = 1; 1028 else { 1029 if (bootverbose) 1030 pci_printf(cfg, 1031 "bad VPD cksum, remain %hhu\n", 1032 vrs.cksum); 1033 cksumvalid = 0; 1034 state = -1; 1035 break; 1036 } 1037 } 1038 dflen--; 1039 remain--; 1040 /* keep in sync w/ state 2's transistions */ 1041 if (dflen == 0) 1042 cfg->vpd.vpd_ros[off++].value[i++] = '\0'; 1043 if (dflen == 0 && remain == 0) { 1044 cfg->vpd.vpd_rocnt = off; 1045 cfg->vpd.vpd_ros = reallocf(cfg->vpd.vpd_ros, 1046 off * sizeof(*cfg->vpd.vpd_ros), 1047 M_DEVBUF, M_WAITOK | M_ZERO); 1048 state = 0; 1049 } else if (dflen == 0) 1050 state = 2; 1051 break; 1052 1053 case 4: 1054 remain--; 1055 if (remain == 0) 1056 state = 0; 1057 break; 1058 1059 case 5: /* VPD-W Keyword Header */ 1060 if (off == alloc) { 1061 cfg->vpd.vpd_w = reallocf(cfg->vpd.vpd_w, 1062 (alloc *= 2) * sizeof(*cfg->vpd.vpd_w), 1063 M_DEVBUF, M_WAITOK | M_ZERO); 1064 } 1065 cfg->vpd.vpd_w[off].keyword[0] = byte; 1066 if (vpd_nextbyte(&vrs, &byte2)) { 1067 state = -2; 1068 break; 1069 } 1070 cfg->vpd.vpd_w[off].keyword[1] = byte2; 1071 if (vpd_nextbyte(&vrs, &byte2)) { 1072 state = -2; 1073 break; 1074 } 1075 cfg->vpd.vpd_w[off].len = dflen = byte2; 1076 cfg->vpd.vpd_w[off].start = vrs.off - vrs.bytesinval; 1077 cfg->vpd.vpd_w[off].value = malloc((dflen + 1) * 1078 sizeof(*cfg->vpd.vpd_w[off].value), 1079 M_DEVBUF, M_WAITOK); 1080 remain -= 3; 1081 i = 0; 1082 /* keep in sync w/ state 6's transistions */ 1083 if (dflen == 0 && remain == 0) 1084 state = 0; 1085 else if (dflen == 0) 1086 state = 5; 1087 else 1088 state = 6; 1089 break; 1090 1091 case 6: /* VPD-W Keyword Value */ 1092 cfg->vpd.vpd_w[off].value[i++] = byte; 1093 dflen--; 1094 remain--; 1095 /* keep in sync w/ state 5's transistions */ 1096 if (dflen == 0) 1097 cfg->vpd.vpd_w[off++].value[i++] = '\0'; 1098 if (dflen == 0 && remain == 0) { 1099 cfg->vpd.vpd_wcnt = off; 1100 cfg->vpd.vpd_w = reallocf(cfg->vpd.vpd_w, 1101 off * sizeof(*cfg->vpd.vpd_w), 1102 M_DEVBUF, M_WAITOK | M_ZERO); 1103 state = 0; 1104 } else if (dflen == 0) 1105 state = 5; 1106 break; 1107 1108 default: 1109 pci_printf(cfg, "invalid state: %d\n", state); 1110 state = -1; 1111 break; 1112 } 1113 } 1114 1115 if (cksumvalid == 0 || state < -1) { 1116 /* read-only data bad, clean up */ 1117 if (cfg->vpd.vpd_ros != NULL) { 1118 for (off = 0; cfg->vpd.vpd_ros[off].value; off++) 1119 free(cfg->vpd.vpd_ros[off].value, M_DEVBUF); 1120 free(cfg->vpd.vpd_ros, M_DEVBUF); 1121 cfg->vpd.vpd_ros = NULL; 1122 } 1123 } 1124 if (state < -1) { 1125 /* I/O error, clean up */ 1126 pci_printf(cfg, "failed to read VPD data.\n"); 1127 if (cfg->vpd.vpd_ident != NULL) { 1128 free(cfg->vpd.vpd_ident, M_DEVBUF); 1129 cfg->vpd.vpd_ident = NULL; 1130 } 1131 if (cfg->vpd.vpd_w != NULL) { 1132 for (off = 0; cfg->vpd.vpd_w[off].value; off++) 1133 free(cfg->vpd.vpd_w[off].value, M_DEVBUF); 1134 free(cfg->vpd.vpd_w, M_DEVBUF); 1135 cfg->vpd.vpd_w = NULL; 1136 } 1137 } 1138 cfg->vpd.vpd_cached = 1; 1139 #undef REG 1140 #undef WREG 1141 } 1142 1143 int 1144 pci_get_vpd_ident_method(device_t dev, device_t child, const char **identptr) 1145 { 1146 struct pci_devinfo *dinfo = device_get_ivars(child); 1147 pcicfgregs *cfg = &dinfo->cfg; 1148 1149 if (!cfg->vpd.vpd_cached && cfg->vpd.vpd_reg != 0) 1150 pci_read_vpd(device_get_parent(dev), cfg); 1151 1152 *identptr = cfg->vpd.vpd_ident; 1153 1154 if (*identptr == NULL) 1155 return (ENXIO); 1156 1157 return (0); 1158 } 1159 1160 int 1161 pci_get_vpd_readonly_method(device_t dev, device_t child, const char *kw, 1162 const char **vptr) 1163 { 1164 struct pci_devinfo *dinfo = device_get_ivars(child); 1165 pcicfgregs *cfg = &dinfo->cfg; 1166 int i; 1167 1168 if (!cfg->vpd.vpd_cached && cfg->vpd.vpd_reg != 0) 1169 pci_read_vpd(device_get_parent(dev), cfg); 1170 1171 for (i = 0; i < cfg->vpd.vpd_rocnt; i++) 1172 if (memcmp(kw, cfg->vpd.vpd_ros[i].keyword, 1173 sizeof(cfg->vpd.vpd_ros[i].keyword)) == 0) { 1174 *vptr = cfg->vpd.vpd_ros[i].value; 1175 return (0); 1176 } 1177 1178 *vptr = NULL; 1179 return (ENXIO); 1180 } 1181 1182 /* 1183 * Find the requested HyperTransport capability and return the offset 1184 * in configuration space via the pointer provided. The function 1185 * returns 0 on success and an error code otherwise. 1186 */ 1187 int 1188 pci_find_htcap_method(device_t dev, device_t child, int capability, int *capreg) 1189 { 1190 int ptr, error; 1191 uint16_t val; 1192 1193 error = pci_find_cap(child, PCIY_HT, &ptr); 1194 if (error) 1195 return (error); 1196 1197 /* 1198 * Traverse the capabilities list checking each HT capability 1199 * to see if it matches the requested HT capability. 1200 */ 1201 while (ptr != 0) { 1202 val = pci_read_config(child, ptr + PCIR_HT_COMMAND, 2); 1203 if (capability == PCIM_HTCAP_SLAVE || 1204 capability == PCIM_HTCAP_HOST) 1205 val &= 0xe000; 1206 else 1207 val &= PCIM_HTCMD_CAP_MASK; 1208 if (val == capability) { 1209 if (capreg != NULL) 1210 *capreg = ptr; 1211 return (0); 1212 } 1213 1214 /* Skip to the next HT capability. */ 1215 while (ptr != 0) { 1216 ptr = pci_read_config(child, ptr + PCICAP_NEXTPTR, 1); 1217 if (pci_read_config(child, ptr + PCICAP_ID, 1) == 1218 PCIY_HT) 1219 break; 1220 } 1221 } 1222 return (ENOENT); 1223 } 1224 1225 /* 1226 * Find the requested capability and return the offset in 1227 * configuration space via the pointer provided. The function returns 1228 * 0 on success and an error code otherwise. 1229 */ 1230 int 1231 pci_find_cap_method(device_t dev, device_t child, int capability, 1232 int *capreg) 1233 { 1234 struct pci_devinfo *dinfo = device_get_ivars(child); 1235 pcicfgregs *cfg = &dinfo->cfg; 1236 u_int32_t status; 1237 u_int8_t ptr; 1238 1239 /* 1240 * Check the CAP_LIST bit of the PCI status register first. 1241 */ 1242 status = pci_read_config(child, PCIR_STATUS, 2); 1243 if (!(status & PCIM_STATUS_CAPPRESENT)) 1244 return (ENXIO); 1245 1246 /* 1247 * Determine the start pointer of the capabilities list. 1248 */ 1249 switch (cfg->hdrtype & PCIM_HDRTYPE) { 1250 case PCIM_HDRTYPE_NORMAL: 1251 case PCIM_HDRTYPE_BRIDGE: 1252 ptr = PCIR_CAP_PTR; 1253 break; 1254 case PCIM_HDRTYPE_CARDBUS: 1255 ptr = PCIR_CAP_PTR_2; 1256 break; 1257 default: 1258 /* XXX: panic? */ 1259 return (ENXIO); /* no extended capabilities support */ 1260 } 1261 ptr = pci_read_config(child, ptr, 1); 1262 1263 /* 1264 * Traverse the capabilities list. 1265 */ 1266 while (ptr != 0) { 1267 if (pci_read_config(child, ptr + PCICAP_ID, 1) == capability) { 1268 if (capreg != NULL) 1269 *capreg = ptr; 1270 return (0); 1271 } 1272 ptr = pci_read_config(child, ptr + PCICAP_NEXTPTR, 1); 1273 } 1274 1275 return (ENOENT); 1276 } 1277 1278 /* 1279 * Find the requested extended capability and return the offset in 1280 * configuration space via the pointer provided. The function returns 1281 * 0 on success and an error code otherwise. 1282 */ 1283 int 1284 pci_find_extcap_method(device_t dev, device_t child, int capability, 1285 int *capreg) 1286 { 1287 struct pci_devinfo *dinfo = device_get_ivars(child); 1288 pcicfgregs *cfg = &dinfo->cfg; 1289 uint32_t ecap; 1290 uint16_t ptr; 1291 1292 /* Only supported for PCI-express devices. */ 1293 if (cfg->pcie.pcie_location == 0) 1294 return (ENXIO); 1295 1296 ptr = PCIR_EXTCAP; 1297 ecap = pci_read_config(child, ptr, 4); 1298 if (ecap == 0xffffffff || ecap == 0) 1299 return (ENOENT); 1300 for (;;) { 1301 if (PCI_EXTCAP_ID(ecap) == capability) { 1302 if (capreg != NULL) 1303 *capreg = ptr; 1304 return (0); 1305 } 1306 ptr = PCI_EXTCAP_NEXTPTR(ecap); 1307 if (ptr == 0) 1308 break; 1309 ecap = pci_read_config(child, ptr, 4); 1310 } 1311 1312 return (ENOENT); 1313 } 1314 1315 /* 1316 * Support for MSI-X message interrupts. 1317 */ 1318 void 1319 pci_enable_msix(device_t dev, u_int index, uint64_t address, uint32_t data) 1320 { 1321 struct pci_devinfo *dinfo = device_get_ivars(dev); 1322 struct pcicfg_msix *msix = &dinfo->cfg.msix; 1323 uint32_t offset; 1324 1325 KASSERT(msix->msix_table_len > index, ("bogus index")); 1326 offset = msix->msix_table_offset + index * 16; 1327 bus_write_4(msix->msix_table_res, offset, address & 0xffffffff); 1328 bus_write_4(msix->msix_table_res, offset + 4, address >> 32); 1329 bus_write_4(msix->msix_table_res, offset + 8, data); 1330 1331 /* Enable MSI -> HT mapping. */ 1332 pci_ht_map_msi(dev, address); 1333 } 1334 1335 void 1336 pci_mask_msix(device_t dev, u_int index) 1337 { 1338 struct pci_devinfo *dinfo = device_get_ivars(dev); 1339 struct pcicfg_msix *msix = &dinfo->cfg.msix; 1340 uint32_t offset, val; 1341 1342 KASSERT(msix->msix_msgnum > index, ("bogus index")); 1343 offset = msix->msix_table_offset + index * 16 + 12; 1344 val = bus_read_4(msix->msix_table_res, offset); 1345 if (!(val & PCIM_MSIX_VCTRL_MASK)) { 1346 val |= PCIM_MSIX_VCTRL_MASK; 1347 bus_write_4(msix->msix_table_res, offset, val); 1348 } 1349 } 1350 1351 void 1352 pci_unmask_msix(device_t dev, u_int index) 1353 { 1354 struct pci_devinfo *dinfo = device_get_ivars(dev); 1355 struct pcicfg_msix *msix = &dinfo->cfg.msix; 1356 uint32_t offset, val; 1357 1358 KASSERT(msix->msix_table_len > index, ("bogus index")); 1359 offset = msix->msix_table_offset + index * 16 + 12; 1360 val = bus_read_4(msix->msix_table_res, offset); 1361 if (val & PCIM_MSIX_VCTRL_MASK) { 1362 val &= ~PCIM_MSIX_VCTRL_MASK; 1363 bus_write_4(msix->msix_table_res, offset, val); 1364 } 1365 } 1366 1367 int 1368 pci_pending_msix(device_t dev, u_int index) 1369 { 1370 struct pci_devinfo *dinfo = device_get_ivars(dev); 1371 struct pcicfg_msix *msix = &dinfo->cfg.msix; 1372 uint32_t offset, bit; 1373 1374 KASSERT(msix->msix_table_len > index, ("bogus index")); 1375 offset = msix->msix_pba_offset + (index / 32) * 4; 1376 bit = 1 << index % 32; 1377 return (bus_read_4(msix->msix_pba_res, offset) & bit); 1378 } 1379 1380 /* 1381 * Restore MSI-X registers and table during resume. If MSI-X is 1382 * enabled then walk the virtual table to restore the actual MSI-X 1383 * table. 1384 */ 1385 static void 1386 pci_resume_msix(device_t dev) 1387 { 1388 struct pci_devinfo *dinfo = device_get_ivars(dev); 1389 struct pcicfg_msix *msix = &dinfo->cfg.msix; 1390 struct msix_table_entry *mte; 1391 struct msix_vector *mv; 1392 int i; 1393 1394 if (msix->msix_alloc > 0) { 1395 /* First, mask all vectors. */ 1396 for (i = 0; i < msix->msix_msgnum; i++) 1397 pci_mask_msix(dev, i); 1398 1399 /* Second, program any messages with at least one handler. */ 1400 for (i = 0; i < msix->msix_table_len; i++) { 1401 mte = &msix->msix_table[i]; 1402 if (mte->mte_vector == 0 || mte->mte_handlers == 0) 1403 continue; 1404 mv = &msix->msix_vectors[mte->mte_vector - 1]; 1405 pci_enable_msix(dev, i, mv->mv_address, mv->mv_data); 1406 pci_unmask_msix(dev, i); 1407 } 1408 } 1409 pci_write_config(dev, msix->msix_location + PCIR_MSIX_CTRL, 1410 msix->msix_ctrl, 2); 1411 } 1412 1413 /* 1414 * Attempt to allocate *count MSI-X messages. The actual number allocated is 1415 * returned in *count. After this function returns, each message will be 1416 * available to the driver as SYS_RES_IRQ resources starting at rid 1. 1417 */ 1418 int 1419 pci_alloc_msix_method(device_t dev, device_t child, int *count) 1420 { 1421 struct pci_devinfo *dinfo = device_get_ivars(child); 1422 pcicfgregs *cfg = &dinfo->cfg; 1423 struct resource_list_entry *rle; 1424 int actual, error, i, irq, max; 1425 1426 /* Don't let count == 0 get us into trouble. */ 1427 if (*count == 0) 1428 return (EINVAL); 1429 1430 /* If rid 0 is allocated, then fail. */ 1431 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, 0); 1432 if (rle != NULL && rle->res != NULL) 1433 return (ENXIO); 1434 1435 /* Already have allocated messages? */ 1436 if (cfg->msi.msi_alloc != 0 || cfg->msix.msix_alloc != 0) 1437 return (ENXIO); 1438 1439 /* If MSI-X is blacklisted for this system, fail. */ 1440 if (pci_msix_blacklisted()) 1441 return (ENXIO); 1442 1443 /* MSI-X capability present? */ 1444 if (cfg->msix.msix_location == 0 || !pci_do_msix) 1445 return (ENODEV); 1446 1447 /* Make sure the appropriate BARs are mapped. */ 1448 rle = resource_list_find(&dinfo->resources, SYS_RES_MEMORY, 1449 cfg->msix.msix_table_bar); 1450 if (rle == NULL || rle->res == NULL || 1451 !(rman_get_flags(rle->res) & RF_ACTIVE)) 1452 return (ENXIO); 1453 cfg->msix.msix_table_res = rle->res; 1454 if (cfg->msix.msix_pba_bar != cfg->msix.msix_table_bar) { 1455 rle = resource_list_find(&dinfo->resources, SYS_RES_MEMORY, 1456 cfg->msix.msix_pba_bar); 1457 if (rle == NULL || rle->res == NULL || 1458 !(rman_get_flags(rle->res) & RF_ACTIVE)) 1459 return (ENXIO); 1460 } 1461 cfg->msix.msix_pba_res = rle->res; 1462 1463 if (bootverbose) 1464 device_printf(child, 1465 "attempting to allocate %d MSI-X vectors (%d supported)\n", 1466 *count, cfg->msix.msix_msgnum); 1467 max = min(*count, cfg->msix.msix_msgnum); 1468 for (i = 0; i < max; i++) { 1469 /* Allocate a message. */ 1470 error = PCIB_ALLOC_MSIX(device_get_parent(dev), child, &irq); 1471 if (error) { 1472 if (i == 0) 1473 return (error); 1474 break; 1475 } 1476 resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1, irq, 1477 irq, 1); 1478 } 1479 actual = i; 1480 1481 if (bootverbose) { 1482 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, 1); 1483 if (actual == 1) 1484 device_printf(child, "using IRQ %lu for MSI-X\n", 1485 rle->start); 1486 else { 1487 int run; 1488 1489 /* 1490 * Be fancy and try to print contiguous runs of 1491 * IRQ values as ranges. 'irq' is the previous IRQ. 1492 * 'run' is true if we are in a range. 1493 */ 1494 device_printf(child, "using IRQs %lu", rle->start); 1495 irq = rle->start; 1496 run = 0; 1497 for (i = 1; i < actual; i++) { 1498 rle = resource_list_find(&dinfo->resources, 1499 SYS_RES_IRQ, i + 1); 1500 1501 /* Still in a run? */ 1502 if (rle->start == irq + 1) { 1503 run = 1; 1504 irq++; 1505 continue; 1506 } 1507 1508 /* Finish previous range. */ 1509 if (run) { 1510 printf("-%d", irq); 1511 run = 0; 1512 } 1513 1514 /* Start new range. */ 1515 printf(",%lu", rle->start); 1516 irq = rle->start; 1517 } 1518 1519 /* Unfinished range? */ 1520 if (run) 1521 printf("-%d", irq); 1522 printf(" for MSI-X\n"); 1523 } 1524 } 1525 1526 /* Mask all vectors. */ 1527 for (i = 0; i < cfg->msix.msix_msgnum; i++) 1528 pci_mask_msix(child, i); 1529 1530 /* Allocate and initialize vector data and virtual table. */ 1531 cfg->msix.msix_vectors = malloc(sizeof(struct msix_vector) * actual, 1532 M_DEVBUF, M_WAITOK | M_ZERO); 1533 cfg->msix.msix_table = malloc(sizeof(struct msix_table_entry) * actual, 1534 M_DEVBUF, M_WAITOK | M_ZERO); 1535 for (i = 0; i < actual; i++) { 1536 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, i + 1); 1537 cfg->msix.msix_vectors[i].mv_irq = rle->start; 1538 cfg->msix.msix_table[i].mte_vector = i + 1; 1539 } 1540 1541 /* Update control register to enable MSI-X. */ 1542 cfg->msix.msix_ctrl |= PCIM_MSIXCTRL_MSIX_ENABLE; 1543 pci_write_config(child, cfg->msix.msix_location + PCIR_MSIX_CTRL, 1544 cfg->msix.msix_ctrl, 2); 1545 1546 /* Update counts of alloc'd messages. */ 1547 cfg->msix.msix_alloc = actual; 1548 cfg->msix.msix_table_len = actual; 1549 *count = actual; 1550 return (0); 1551 } 1552 1553 /* 1554 * By default, pci_alloc_msix() will assign the allocated IRQ 1555 * resources consecutively to the first N messages in the MSI-X table. 1556 * However, device drivers may want to use different layouts if they 1557 * either receive fewer messages than they asked for, or they wish to 1558 * populate the MSI-X table sparsely. This method allows the driver 1559 * to specify what layout it wants. It must be called after a 1560 * successful pci_alloc_msix() but before any of the associated 1561 * SYS_RES_IRQ resources are allocated via bus_alloc_resource(). 1562 * 1563 * The 'vectors' array contains 'count' message vectors. The array 1564 * maps directly to the MSI-X table in that index 0 in the array 1565 * specifies the vector for the first message in the MSI-X table, etc. 1566 * The vector value in each array index can either be 0 to indicate 1567 * that no vector should be assigned to a message slot, or it can be a 1568 * number from 1 to N (where N is the count returned from a 1569 * succcessful call to pci_alloc_msix()) to indicate which message 1570 * vector (IRQ) to be used for the corresponding message. 1571 * 1572 * On successful return, each message with a non-zero vector will have 1573 * an associated SYS_RES_IRQ whose rid is equal to the array index + 1574 * 1. Additionally, if any of the IRQs allocated via the previous 1575 * call to pci_alloc_msix() are not used in the mapping, those IRQs 1576 * will be freed back to the system automatically. 1577 * 1578 * For example, suppose a driver has a MSI-X table with 6 messages and 1579 * asks for 6 messages, but pci_alloc_msix() only returns a count of 1580 * 3. Call the three vectors allocated by pci_alloc_msix() A, B, and 1581 * C. After the call to pci_alloc_msix(), the device will be setup to 1582 * have an MSI-X table of ABC--- (where - means no vector assigned). 1583 * If the driver then passes a vector array of { 1, 0, 1, 2, 0, 2 }, 1584 * then the MSI-X table will look like A-AB-B, and the 'C' vector will 1585 * be freed back to the system. This device will also have valid 1586 * SYS_RES_IRQ rids of 1, 3, 4, and 6. 1587 * 1588 * In any case, the SYS_RES_IRQ rid X will always map to the message 1589 * at MSI-X table index X - 1 and will only be valid if a vector is 1590 * assigned to that table entry. 1591 */ 1592 int 1593 pci_remap_msix_method(device_t dev, device_t child, int count, 1594 const u_int *vectors) 1595 { 1596 struct pci_devinfo *dinfo = device_get_ivars(child); 1597 struct pcicfg_msix *msix = &dinfo->cfg.msix; 1598 struct resource_list_entry *rle; 1599 int i, irq, j, *used; 1600 1601 /* 1602 * Have to have at least one message in the table but the 1603 * table can't be bigger than the actual MSI-X table in the 1604 * device. 1605 */ 1606 if (count == 0 || count > msix->msix_msgnum) 1607 return (EINVAL); 1608 1609 /* Sanity check the vectors. */ 1610 for (i = 0; i < count; i++) 1611 if (vectors[i] > msix->msix_alloc) 1612 return (EINVAL); 1613 1614 /* 1615 * Make sure there aren't any holes in the vectors to be used. 1616 * It's a big pain to support it, and it doesn't really make 1617 * sense anyway. Also, at least one vector must be used. 1618 */ 1619 used = malloc(sizeof(int) * msix->msix_alloc, M_DEVBUF, M_WAITOK | 1620 M_ZERO); 1621 for (i = 0; i < count; i++) 1622 if (vectors[i] != 0) 1623 used[vectors[i] - 1] = 1; 1624 for (i = 0; i < msix->msix_alloc - 1; i++) 1625 if (used[i] == 0 && used[i + 1] == 1) { 1626 free(used, M_DEVBUF); 1627 return (EINVAL); 1628 } 1629 if (used[0] != 1) { 1630 free(used, M_DEVBUF); 1631 return (EINVAL); 1632 } 1633 1634 /* Make sure none of the resources are allocated. */ 1635 for (i = 0; i < msix->msix_table_len; i++) { 1636 if (msix->msix_table[i].mte_vector == 0) 1637 continue; 1638 if (msix->msix_table[i].mte_handlers > 0) 1639 return (EBUSY); 1640 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, i + 1); 1641 KASSERT(rle != NULL, ("missing resource")); 1642 if (rle->res != NULL) 1643 return (EBUSY); 1644 } 1645 1646 /* Free the existing resource list entries. */ 1647 for (i = 0; i < msix->msix_table_len; i++) { 1648 if (msix->msix_table[i].mte_vector == 0) 1649 continue; 1650 resource_list_delete(&dinfo->resources, SYS_RES_IRQ, i + 1); 1651 } 1652 1653 /* 1654 * Build the new virtual table keeping track of which vectors are 1655 * used. 1656 */ 1657 free(msix->msix_table, M_DEVBUF); 1658 msix->msix_table = malloc(sizeof(struct msix_table_entry) * count, 1659 M_DEVBUF, M_WAITOK | M_ZERO); 1660 for (i = 0; i < count; i++) 1661 msix->msix_table[i].mte_vector = vectors[i]; 1662 msix->msix_table_len = count; 1663 1664 /* Free any unused IRQs and resize the vectors array if necessary. */ 1665 j = msix->msix_alloc - 1; 1666 if (used[j] == 0) { 1667 struct msix_vector *vec; 1668 1669 while (used[j] == 0) { 1670 PCIB_RELEASE_MSIX(device_get_parent(dev), child, 1671 msix->msix_vectors[j].mv_irq); 1672 j--; 1673 } 1674 vec = malloc(sizeof(struct msix_vector) * (j + 1), M_DEVBUF, 1675 M_WAITOK); 1676 bcopy(msix->msix_vectors, vec, sizeof(struct msix_vector) * 1677 (j + 1)); 1678 free(msix->msix_vectors, M_DEVBUF); 1679 msix->msix_vectors = vec; 1680 msix->msix_alloc = j + 1; 1681 } 1682 free(used, M_DEVBUF); 1683 1684 /* Map the IRQs onto the rids. */ 1685 for (i = 0; i < count; i++) { 1686 if (vectors[i] == 0) 1687 continue; 1688 irq = msix->msix_vectors[vectors[i]].mv_irq; 1689 resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1, irq, 1690 irq, 1); 1691 } 1692 1693 if (bootverbose) { 1694 device_printf(child, "Remapped MSI-X IRQs as: "); 1695 for (i = 0; i < count; i++) { 1696 if (i != 0) 1697 printf(", "); 1698 if (vectors[i] == 0) 1699 printf("---"); 1700 else 1701 printf("%d", 1702 msix->msix_vectors[vectors[i]].mv_irq); 1703 } 1704 printf("\n"); 1705 } 1706 1707 return (0); 1708 } 1709 1710 static int 1711 pci_release_msix(device_t dev, device_t child) 1712 { 1713 struct pci_devinfo *dinfo = device_get_ivars(child); 1714 struct pcicfg_msix *msix = &dinfo->cfg.msix; 1715 struct resource_list_entry *rle; 1716 int i; 1717 1718 /* Do we have any messages to release? */ 1719 if (msix->msix_alloc == 0) 1720 return (ENODEV); 1721 1722 /* Make sure none of the resources are allocated. */ 1723 for (i = 0; i < msix->msix_table_len; i++) { 1724 if (msix->msix_table[i].mte_vector == 0) 1725 continue; 1726 if (msix->msix_table[i].mte_handlers > 0) 1727 return (EBUSY); 1728 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, i + 1); 1729 KASSERT(rle != NULL, ("missing resource")); 1730 if (rle->res != NULL) 1731 return (EBUSY); 1732 } 1733 1734 /* Update control register to disable MSI-X. */ 1735 msix->msix_ctrl &= ~PCIM_MSIXCTRL_MSIX_ENABLE; 1736 pci_write_config(child, msix->msix_location + PCIR_MSIX_CTRL, 1737 msix->msix_ctrl, 2); 1738 1739 /* Free the resource list entries. */ 1740 for (i = 0; i < msix->msix_table_len; i++) { 1741 if (msix->msix_table[i].mte_vector == 0) 1742 continue; 1743 resource_list_delete(&dinfo->resources, SYS_RES_IRQ, i + 1); 1744 } 1745 free(msix->msix_table, M_DEVBUF); 1746 msix->msix_table_len = 0; 1747 1748 /* Release the IRQs. */ 1749 for (i = 0; i < msix->msix_alloc; i++) 1750 PCIB_RELEASE_MSIX(device_get_parent(dev), child, 1751 msix->msix_vectors[i].mv_irq); 1752 free(msix->msix_vectors, M_DEVBUF); 1753 msix->msix_alloc = 0; 1754 return (0); 1755 } 1756 1757 /* 1758 * Return the max supported MSI-X messages this device supports. 1759 * Basically, assuming the MD code can alloc messages, this function 1760 * should return the maximum value that pci_alloc_msix() can return. 1761 * Thus, it is subject to the tunables, etc. 1762 */ 1763 int 1764 pci_msix_count_method(device_t dev, device_t child) 1765 { 1766 struct pci_devinfo *dinfo = device_get_ivars(child); 1767 struct pcicfg_msix *msix = &dinfo->cfg.msix; 1768 1769 if (pci_do_msix && msix->msix_location != 0) 1770 return (msix->msix_msgnum); 1771 return (0); 1772 } 1773 1774 /* 1775 * HyperTransport MSI mapping control 1776 */ 1777 void 1778 pci_ht_map_msi(device_t dev, uint64_t addr) 1779 { 1780 struct pci_devinfo *dinfo = device_get_ivars(dev); 1781 struct pcicfg_ht *ht = &dinfo->cfg.ht; 1782 1783 if (!ht->ht_msimap) 1784 return; 1785 1786 if (addr && !(ht->ht_msictrl & PCIM_HTCMD_MSI_ENABLE) && 1787 ht->ht_msiaddr >> 20 == addr >> 20) { 1788 /* Enable MSI -> HT mapping. */ 1789 ht->ht_msictrl |= PCIM_HTCMD_MSI_ENABLE; 1790 pci_write_config(dev, ht->ht_msimap + PCIR_HT_COMMAND, 1791 ht->ht_msictrl, 2); 1792 } 1793 1794 if (!addr && ht->ht_msictrl & PCIM_HTCMD_MSI_ENABLE) { 1795 /* Disable MSI -> HT mapping. */ 1796 ht->ht_msictrl &= ~PCIM_HTCMD_MSI_ENABLE; 1797 pci_write_config(dev, ht->ht_msimap + PCIR_HT_COMMAND, 1798 ht->ht_msictrl, 2); 1799 } 1800 } 1801 1802 int 1803 pci_get_max_read_req(device_t dev) 1804 { 1805 struct pci_devinfo *dinfo = device_get_ivars(dev); 1806 int cap; 1807 uint16_t val; 1808 1809 cap = dinfo->cfg.pcie.pcie_location; 1810 if (cap == 0) 1811 return (0); 1812 val = pci_read_config(dev, cap + PCIER_DEVICE_CTL, 2); 1813 val &= PCIEM_CTL_MAX_READ_REQUEST; 1814 val >>= 12; 1815 return (1 << (val + 7)); 1816 } 1817 1818 int 1819 pci_set_max_read_req(device_t dev, int size) 1820 { 1821 struct pci_devinfo *dinfo = device_get_ivars(dev); 1822 int cap; 1823 uint16_t val; 1824 1825 cap = dinfo->cfg.pcie.pcie_location; 1826 if (cap == 0) 1827 return (0); 1828 if (size < 128) 1829 size = 128; 1830 if (size > 4096) 1831 size = 4096; 1832 size = (1 << (fls(size) - 1)); 1833 val = pci_read_config(dev, cap + PCIER_DEVICE_CTL, 2); 1834 val &= ~PCIEM_CTL_MAX_READ_REQUEST; 1835 val |= (fls(size) - 8) << 12; 1836 pci_write_config(dev, cap + PCIER_DEVICE_CTL, val, 2); 1837 return (size); 1838 } 1839 1840 /* 1841 * Support for MSI message signalled interrupts. 1842 */ 1843 void 1844 pci_enable_msi(device_t dev, uint64_t address, uint16_t data) 1845 { 1846 struct pci_devinfo *dinfo = device_get_ivars(dev); 1847 struct pcicfg_msi *msi = &dinfo->cfg.msi; 1848 1849 /* Write data and address values. */ 1850 pci_write_config(dev, msi->msi_location + PCIR_MSI_ADDR, 1851 address & 0xffffffff, 4); 1852 if (msi->msi_ctrl & PCIM_MSICTRL_64BIT) { 1853 pci_write_config(dev, msi->msi_location + PCIR_MSI_ADDR_HIGH, 1854 address >> 32, 4); 1855 pci_write_config(dev, msi->msi_location + PCIR_MSI_DATA_64BIT, 1856 data, 2); 1857 } else 1858 pci_write_config(dev, msi->msi_location + PCIR_MSI_DATA, data, 1859 2); 1860 1861 /* Enable MSI in the control register. */ 1862 msi->msi_ctrl |= PCIM_MSICTRL_MSI_ENABLE; 1863 pci_write_config(dev, msi->msi_location + PCIR_MSI_CTRL, msi->msi_ctrl, 1864 2); 1865 1866 /* Enable MSI -> HT mapping. */ 1867 pci_ht_map_msi(dev, address); 1868 } 1869 1870 void 1871 pci_disable_msi(device_t dev) 1872 { 1873 struct pci_devinfo *dinfo = device_get_ivars(dev); 1874 struct pcicfg_msi *msi = &dinfo->cfg.msi; 1875 1876 /* Disable MSI -> HT mapping. */ 1877 pci_ht_map_msi(dev, 0); 1878 1879 /* Disable MSI in the control register. */ 1880 msi->msi_ctrl &= ~PCIM_MSICTRL_MSI_ENABLE; 1881 pci_write_config(dev, msi->msi_location + PCIR_MSI_CTRL, msi->msi_ctrl, 1882 2); 1883 } 1884 1885 /* 1886 * Restore MSI registers during resume. If MSI is enabled then 1887 * restore the data and address registers in addition to the control 1888 * register. 1889 */ 1890 static void 1891 pci_resume_msi(device_t dev) 1892 { 1893 struct pci_devinfo *dinfo = device_get_ivars(dev); 1894 struct pcicfg_msi *msi = &dinfo->cfg.msi; 1895 uint64_t address; 1896 uint16_t data; 1897 1898 if (msi->msi_ctrl & PCIM_MSICTRL_MSI_ENABLE) { 1899 address = msi->msi_addr; 1900 data = msi->msi_data; 1901 pci_write_config(dev, msi->msi_location + PCIR_MSI_ADDR, 1902 address & 0xffffffff, 4); 1903 if (msi->msi_ctrl & PCIM_MSICTRL_64BIT) { 1904 pci_write_config(dev, msi->msi_location + 1905 PCIR_MSI_ADDR_HIGH, address >> 32, 4); 1906 pci_write_config(dev, msi->msi_location + 1907 PCIR_MSI_DATA_64BIT, data, 2); 1908 } else 1909 pci_write_config(dev, msi->msi_location + PCIR_MSI_DATA, 1910 data, 2); 1911 } 1912 pci_write_config(dev, msi->msi_location + PCIR_MSI_CTRL, msi->msi_ctrl, 1913 2); 1914 } 1915 1916 static int 1917 pci_remap_intr_method(device_t bus, device_t dev, u_int irq) 1918 { 1919 struct pci_devinfo *dinfo = device_get_ivars(dev); 1920 pcicfgregs *cfg = &dinfo->cfg; 1921 struct resource_list_entry *rle; 1922 struct msix_table_entry *mte; 1923 struct msix_vector *mv; 1924 uint64_t addr; 1925 uint32_t data; 1926 int error, i, j; 1927 1928 /* 1929 * Handle MSI first. We try to find this IRQ among our list 1930 * of MSI IRQs. If we find it, we request updated address and 1931 * data registers and apply the results. 1932 */ 1933 if (cfg->msi.msi_alloc > 0) { 1934 1935 /* If we don't have any active handlers, nothing to do. */ 1936 if (cfg->msi.msi_handlers == 0) 1937 return (0); 1938 for (i = 0; i < cfg->msi.msi_alloc; i++) { 1939 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, 1940 i + 1); 1941 if (rle->start == irq) { 1942 error = PCIB_MAP_MSI(device_get_parent(bus), 1943 dev, irq, &addr, &data); 1944 if (error) 1945 return (error); 1946 pci_disable_msi(dev); 1947 dinfo->cfg.msi.msi_addr = addr; 1948 dinfo->cfg.msi.msi_data = data; 1949 pci_enable_msi(dev, addr, data); 1950 return (0); 1951 } 1952 } 1953 return (ENOENT); 1954 } 1955 1956 /* 1957 * For MSI-X, we check to see if we have this IRQ. If we do, 1958 * we request the updated mapping info. If that works, we go 1959 * through all the slots that use this IRQ and update them. 1960 */ 1961 if (cfg->msix.msix_alloc > 0) { 1962 for (i = 0; i < cfg->msix.msix_alloc; i++) { 1963 mv = &cfg->msix.msix_vectors[i]; 1964 if (mv->mv_irq == irq) { 1965 error = PCIB_MAP_MSI(device_get_parent(bus), 1966 dev, irq, &addr, &data); 1967 if (error) 1968 return (error); 1969 mv->mv_address = addr; 1970 mv->mv_data = data; 1971 for (j = 0; j < cfg->msix.msix_table_len; j++) { 1972 mte = &cfg->msix.msix_table[j]; 1973 if (mte->mte_vector != i + 1) 1974 continue; 1975 if (mte->mte_handlers == 0) 1976 continue; 1977 pci_mask_msix(dev, j); 1978 pci_enable_msix(dev, j, addr, data); 1979 pci_unmask_msix(dev, j); 1980 } 1981 } 1982 } 1983 return (ENOENT); 1984 } 1985 1986 return (ENOENT); 1987 } 1988 1989 /* 1990 * Returns true if the specified device is blacklisted because MSI 1991 * doesn't work. 1992 */ 1993 int 1994 pci_msi_device_blacklisted(device_t dev) 1995 { 1996 1997 if (!pci_honor_msi_blacklist) 1998 return (0); 1999 2000 return (pci_has_quirk(pci_get_devid(dev), PCI_QUIRK_DISABLE_MSI)); 2001 } 2002 2003 /* 2004 * Determine if MSI is blacklisted globally on this system. Currently, 2005 * we just check for blacklisted chipsets as represented by the 2006 * host-PCI bridge at device 0:0:0. In the future, it may become 2007 * necessary to check other system attributes, such as the kenv values 2008 * that give the motherboard manufacturer and model number. 2009 */ 2010 static int 2011 pci_msi_blacklisted(void) 2012 { 2013 device_t dev; 2014 2015 if (!pci_honor_msi_blacklist) 2016 return (0); 2017 2018 /* Blacklist all non-PCI-express and non-PCI-X chipsets. */ 2019 if (!(pcie_chipset || pcix_chipset)) { 2020 if (vm_guest != VM_GUEST_NO) { 2021 /* 2022 * Whitelist older chipsets in virtual 2023 * machines known to support MSI. 2024 */ 2025 dev = pci_find_bsf(0, 0, 0); 2026 if (dev != NULL) 2027 return (!pci_has_quirk(pci_get_devid(dev), 2028 PCI_QUIRK_ENABLE_MSI_VM)); 2029 } 2030 return (1); 2031 } 2032 2033 dev = pci_find_bsf(0, 0, 0); 2034 if (dev != NULL) 2035 return (pci_msi_device_blacklisted(dev)); 2036 return (0); 2037 } 2038 2039 /* 2040 * Returns true if the specified device is blacklisted because MSI-X 2041 * doesn't work. Note that this assumes that if MSI doesn't work, 2042 * MSI-X doesn't either. 2043 */ 2044 int 2045 pci_msix_device_blacklisted(device_t dev) 2046 { 2047 2048 if (!pci_honor_msi_blacklist) 2049 return (0); 2050 2051 if (pci_has_quirk(pci_get_devid(dev), PCI_QUIRK_DISABLE_MSIX)) 2052 return (1); 2053 2054 return (pci_msi_device_blacklisted(dev)); 2055 } 2056 2057 /* 2058 * Determine if MSI-X is blacklisted globally on this system. If MSI 2059 * is blacklisted, assume that MSI-X is as well. Check for additional 2060 * chipsets where MSI works but MSI-X does not. 2061 */ 2062 static int 2063 pci_msix_blacklisted(void) 2064 { 2065 device_t dev; 2066 2067 if (!pci_honor_msi_blacklist) 2068 return (0); 2069 2070 dev = pci_find_bsf(0, 0, 0); 2071 if (dev != NULL && pci_has_quirk(pci_get_devid(dev), 2072 PCI_QUIRK_DISABLE_MSIX)) 2073 return (1); 2074 2075 return (pci_msi_blacklisted()); 2076 } 2077 2078 /* 2079 * Attempt to allocate *count MSI messages. The actual number allocated is 2080 * returned in *count. After this function returns, each message will be 2081 * available to the driver as SYS_RES_IRQ resources starting at a rid 1. 2082 */ 2083 int 2084 pci_alloc_msi_method(device_t dev, device_t child, int *count) 2085 { 2086 struct pci_devinfo *dinfo = device_get_ivars(child); 2087 pcicfgregs *cfg = &dinfo->cfg; 2088 struct resource_list_entry *rle; 2089 int actual, error, i, irqs[32]; 2090 uint16_t ctrl; 2091 2092 /* Don't let count == 0 get us into trouble. */ 2093 if (*count == 0) 2094 return (EINVAL); 2095 2096 /* If rid 0 is allocated, then fail. */ 2097 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, 0); 2098 if (rle != NULL && rle->res != NULL) 2099 return (ENXIO); 2100 2101 /* Already have allocated messages? */ 2102 if (cfg->msi.msi_alloc != 0 || cfg->msix.msix_alloc != 0) 2103 return (ENXIO); 2104 2105 /* If MSI is blacklisted for this system, fail. */ 2106 if (pci_msi_blacklisted()) 2107 return (ENXIO); 2108 2109 /* MSI capability present? */ 2110 if (cfg->msi.msi_location == 0 || !pci_do_msi) 2111 return (ENODEV); 2112 2113 if (bootverbose) 2114 device_printf(child, 2115 "attempting to allocate %d MSI vectors (%d supported)\n", 2116 *count, cfg->msi.msi_msgnum); 2117 2118 /* Don't ask for more than the device supports. */ 2119 actual = min(*count, cfg->msi.msi_msgnum); 2120 2121 /* Don't ask for more than 32 messages. */ 2122 actual = min(actual, 32); 2123 2124 /* MSI requires power of 2 number of messages. */ 2125 if (!powerof2(actual)) 2126 return (EINVAL); 2127 2128 for (;;) { 2129 /* Try to allocate N messages. */ 2130 error = PCIB_ALLOC_MSI(device_get_parent(dev), child, actual, 2131 actual, irqs); 2132 if (error == 0) 2133 break; 2134 if (actual == 1) 2135 return (error); 2136 2137 /* Try N / 2. */ 2138 actual >>= 1; 2139 } 2140 2141 /* 2142 * We now have N actual messages mapped onto SYS_RES_IRQ 2143 * resources in the irqs[] array, so add new resources 2144 * starting at rid 1. 2145 */ 2146 for (i = 0; i < actual; i++) 2147 resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1, 2148 irqs[i], irqs[i], 1); 2149 2150 if (bootverbose) { 2151 if (actual == 1) 2152 device_printf(child, "using IRQ %d for MSI\n", irqs[0]); 2153 else { 2154 int run; 2155 2156 /* 2157 * Be fancy and try to print contiguous runs 2158 * of IRQ values as ranges. 'run' is true if 2159 * we are in a range. 2160 */ 2161 device_printf(child, "using IRQs %d", irqs[0]); 2162 run = 0; 2163 for (i = 1; i < actual; i++) { 2164 2165 /* Still in a run? */ 2166 if (irqs[i] == irqs[i - 1] + 1) { 2167 run = 1; 2168 continue; 2169 } 2170 2171 /* Finish previous range. */ 2172 if (run) { 2173 printf("-%d", irqs[i - 1]); 2174 run = 0; 2175 } 2176 2177 /* Start new range. */ 2178 printf(",%d", irqs[i]); 2179 } 2180 2181 /* Unfinished range? */ 2182 if (run) 2183 printf("-%d", irqs[actual - 1]); 2184 printf(" for MSI\n"); 2185 } 2186 } 2187 2188 /* Update control register with actual count. */ 2189 ctrl = cfg->msi.msi_ctrl; 2190 ctrl &= ~PCIM_MSICTRL_MME_MASK; 2191 ctrl |= (ffs(actual) - 1) << 4; 2192 cfg->msi.msi_ctrl = ctrl; 2193 pci_write_config(child, cfg->msi.msi_location + PCIR_MSI_CTRL, ctrl, 2); 2194 2195 /* Update counts of alloc'd messages. */ 2196 cfg->msi.msi_alloc = actual; 2197 cfg->msi.msi_handlers = 0; 2198 *count = actual; 2199 return (0); 2200 } 2201 2202 /* Release the MSI messages associated with this device. */ 2203 int 2204 pci_release_msi_method(device_t dev, device_t child) 2205 { 2206 struct pci_devinfo *dinfo = device_get_ivars(child); 2207 struct pcicfg_msi *msi = &dinfo->cfg.msi; 2208 struct resource_list_entry *rle; 2209 int error, i, irqs[32]; 2210 2211 /* Try MSI-X first. */ 2212 error = pci_release_msix(dev, child); 2213 if (error != ENODEV) 2214 return (error); 2215 2216 /* Do we have any messages to release? */ 2217 if (msi->msi_alloc == 0) 2218 return (ENODEV); 2219 KASSERT(msi->msi_alloc <= 32, ("more than 32 alloc'd messages")); 2220 2221 /* Make sure none of the resources are allocated. */ 2222 if (msi->msi_handlers > 0) 2223 return (EBUSY); 2224 for (i = 0; i < msi->msi_alloc; i++) { 2225 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, i + 1); 2226 KASSERT(rle != NULL, ("missing MSI resource")); 2227 if (rle->res != NULL) 2228 return (EBUSY); 2229 irqs[i] = rle->start; 2230 } 2231 2232 /* Update control register with 0 count. */ 2233 KASSERT(!(msi->msi_ctrl & PCIM_MSICTRL_MSI_ENABLE), 2234 ("%s: MSI still enabled", __func__)); 2235 msi->msi_ctrl &= ~PCIM_MSICTRL_MME_MASK; 2236 pci_write_config(child, msi->msi_location + PCIR_MSI_CTRL, 2237 msi->msi_ctrl, 2); 2238 2239 /* Release the messages. */ 2240 PCIB_RELEASE_MSI(device_get_parent(dev), child, msi->msi_alloc, irqs); 2241 for (i = 0; i < msi->msi_alloc; i++) 2242 resource_list_delete(&dinfo->resources, SYS_RES_IRQ, i + 1); 2243 2244 /* Update alloc count. */ 2245 msi->msi_alloc = 0; 2246 msi->msi_addr = 0; 2247 msi->msi_data = 0; 2248 return (0); 2249 } 2250 2251 /* 2252 * Return the max supported MSI messages this device supports. 2253 * Basically, assuming the MD code can alloc messages, this function 2254 * should return the maximum value that pci_alloc_msi() can return. 2255 * Thus, it is subject to the tunables, etc. 2256 */ 2257 int 2258 pci_msi_count_method(device_t dev, device_t child) 2259 { 2260 struct pci_devinfo *dinfo = device_get_ivars(child); 2261 struct pcicfg_msi *msi = &dinfo->cfg.msi; 2262 2263 if (pci_do_msi && msi->msi_location != 0) 2264 return (msi->msi_msgnum); 2265 return (0); 2266 } 2267 2268 /* free pcicfgregs structure and all depending data structures */ 2269 2270 int 2271 pci_freecfg(struct pci_devinfo *dinfo) 2272 { 2273 struct devlist *devlist_head; 2274 struct pci_map *pm, *next; 2275 int i; 2276 2277 devlist_head = &pci_devq; 2278 2279 if (dinfo->cfg.vpd.vpd_reg) { 2280 free(dinfo->cfg.vpd.vpd_ident, M_DEVBUF); 2281 for (i = 0; i < dinfo->cfg.vpd.vpd_rocnt; i++) 2282 free(dinfo->cfg.vpd.vpd_ros[i].value, M_DEVBUF); 2283 free(dinfo->cfg.vpd.vpd_ros, M_DEVBUF); 2284 for (i = 0; i < dinfo->cfg.vpd.vpd_wcnt; i++) 2285 free(dinfo->cfg.vpd.vpd_w[i].value, M_DEVBUF); 2286 free(dinfo->cfg.vpd.vpd_w, M_DEVBUF); 2287 } 2288 STAILQ_FOREACH_SAFE(pm, &dinfo->cfg.maps, pm_link, next) { 2289 free(pm, M_DEVBUF); 2290 } 2291 STAILQ_REMOVE(devlist_head, dinfo, pci_devinfo, pci_links); 2292 free(dinfo, M_DEVBUF); 2293 2294 /* increment the generation count */ 2295 pci_generation++; 2296 2297 /* we're losing one device */ 2298 pci_numdevs--; 2299 return (0); 2300 } 2301 2302 /* 2303 * PCI power manangement 2304 */ 2305 int 2306 pci_set_powerstate_method(device_t dev, device_t child, int state) 2307 { 2308 struct pci_devinfo *dinfo = device_get_ivars(child); 2309 pcicfgregs *cfg = &dinfo->cfg; 2310 uint16_t status; 2311 int result, oldstate, highest, delay; 2312 2313 if (cfg->pp.pp_cap == 0) 2314 return (EOPNOTSUPP); 2315 2316 /* 2317 * Optimize a no state change request away. While it would be OK to 2318 * write to the hardware in theory, some devices have shown odd 2319 * behavior when going from D3 -> D3. 2320 */ 2321 oldstate = pci_get_powerstate(child); 2322 if (oldstate == state) 2323 return (0); 2324 2325 /* 2326 * The PCI power management specification states that after a state 2327 * transition between PCI power states, system software must 2328 * guarantee a minimal delay before the function accesses the device. 2329 * Compute the worst case delay that we need to guarantee before we 2330 * access the device. Many devices will be responsive much more 2331 * quickly than this delay, but there are some that don't respond 2332 * instantly to state changes. Transitions to/from D3 state require 2333 * 10ms, while D2 requires 200us, and D0/1 require none. The delay 2334 * is done below with DELAY rather than a sleeper function because 2335 * this function can be called from contexts where we cannot sleep. 2336 */ 2337 highest = (oldstate > state) ? oldstate : state; 2338 if (highest == PCI_POWERSTATE_D3) 2339 delay = 10000; 2340 else if (highest == PCI_POWERSTATE_D2) 2341 delay = 200; 2342 else 2343 delay = 0; 2344 status = PCI_READ_CONFIG(dev, child, cfg->pp.pp_status, 2) 2345 & ~PCIM_PSTAT_DMASK; 2346 result = 0; 2347 switch (state) { 2348 case PCI_POWERSTATE_D0: 2349 status |= PCIM_PSTAT_D0; 2350 break; 2351 case PCI_POWERSTATE_D1: 2352 if ((cfg->pp.pp_cap & PCIM_PCAP_D1SUPP) == 0) 2353 return (EOPNOTSUPP); 2354 status |= PCIM_PSTAT_D1; 2355 break; 2356 case PCI_POWERSTATE_D2: 2357 if ((cfg->pp.pp_cap & PCIM_PCAP_D2SUPP) == 0) 2358 return (EOPNOTSUPP); 2359 status |= PCIM_PSTAT_D2; 2360 break; 2361 case PCI_POWERSTATE_D3: 2362 status |= PCIM_PSTAT_D3; 2363 break; 2364 default: 2365 return (EINVAL); 2366 } 2367 2368 if (bootverbose) 2369 pci_printf(cfg, "Transition from D%d to D%d\n", oldstate, 2370 state); 2371 2372 PCI_WRITE_CONFIG(dev, child, cfg->pp.pp_status, status, 2); 2373 if (delay) 2374 DELAY(delay); 2375 return (0); 2376 } 2377 2378 int 2379 pci_get_powerstate_method(device_t dev, device_t child) 2380 { 2381 struct pci_devinfo *dinfo = device_get_ivars(child); 2382 pcicfgregs *cfg = &dinfo->cfg; 2383 uint16_t status; 2384 int result; 2385 2386 if (cfg->pp.pp_cap != 0) { 2387 status = PCI_READ_CONFIG(dev, child, cfg->pp.pp_status, 2); 2388 switch (status & PCIM_PSTAT_DMASK) { 2389 case PCIM_PSTAT_D0: 2390 result = PCI_POWERSTATE_D0; 2391 break; 2392 case PCIM_PSTAT_D1: 2393 result = PCI_POWERSTATE_D1; 2394 break; 2395 case PCIM_PSTAT_D2: 2396 result = PCI_POWERSTATE_D2; 2397 break; 2398 case PCIM_PSTAT_D3: 2399 result = PCI_POWERSTATE_D3; 2400 break; 2401 default: 2402 result = PCI_POWERSTATE_UNKNOWN; 2403 break; 2404 } 2405 } else { 2406 /* No support, device is always at D0 */ 2407 result = PCI_POWERSTATE_D0; 2408 } 2409 return (result); 2410 } 2411 2412 /* 2413 * Some convenience functions for PCI device drivers. 2414 */ 2415 2416 static __inline void 2417 pci_set_command_bit(device_t dev, device_t child, uint16_t bit) 2418 { 2419 uint16_t command; 2420 2421 command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2); 2422 command |= bit; 2423 PCI_WRITE_CONFIG(dev, child, PCIR_COMMAND, command, 2); 2424 } 2425 2426 static __inline void 2427 pci_clear_command_bit(device_t dev, device_t child, uint16_t bit) 2428 { 2429 uint16_t command; 2430 2431 command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2); 2432 command &= ~bit; 2433 PCI_WRITE_CONFIG(dev, child, PCIR_COMMAND, command, 2); 2434 } 2435 2436 int 2437 pci_enable_busmaster_method(device_t dev, device_t child) 2438 { 2439 pci_set_command_bit(dev, child, PCIM_CMD_BUSMASTEREN); 2440 return (0); 2441 } 2442 2443 int 2444 pci_disable_busmaster_method(device_t dev, device_t child) 2445 { 2446 pci_clear_command_bit(dev, child, PCIM_CMD_BUSMASTEREN); 2447 return (0); 2448 } 2449 2450 int 2451 pci_enable_io_method(device_t dev, device_t child, int space) 2452 { 2453 uint16_t bit; 2454 2455 switch(space) { 2456 case SYS_RES_IOPORT: 2457 bit = PCIM_CMD_PORTEN; 2458 break; 2459 case SYS_RES_MEMORY: 2460 bit = PCIM_CMD_MEMEN; 2461 break; 2462 default: 2463 return (EINVAL); 2464 } 2465 pci_set_command_bit(dev, child, bit); 2466 return (0); 2467 } 2468 2469 int 2470 pci_disable_io_method(device_t dev, device_t child, int space) 2471 { 2472 uint16_t bit; 2473 2474 switch(space) { 2475 case SYS_RES_IOPORT: 2476 bit = PCIM_CMD_PORTEN; 2477 break; 2478 case SYS_RES_MEMORY: 2479 bit = PCIM_CMD_MEMEN; 2480 break; 2481 default: 2482 return (EINVAL); 2483 } 2484 pci_clear_command_bit(dev, child, bit); 2485 return (0); 2486 } 2487 2488 /* 2489 * New style pci driver. Parent device is either a pci-host-bridge or a 2490 * pci-pci-bridge. Both kinds are represented by instances of pcib. 2491 */ 2492 2493 void 2494 pci_print_verbose(struct pci_devinfo *dinfo) 2495 { 2496 2497 if (bootverbose) { 2498 pcicfgregs *cfg = &dinfo->cfg; 2499 2500 printf("found->\tvendor=0x%04x, dev=0x%04x, revid=0x%02x\n", 2501 cfg->vendor, cfg->device, cfg->revid); 2502 printf("\tdomain=%d, bus=%d, slot=%d, func=%d\n", 2503 cfg->domain, cfg->bus, cfg->slot, cfg->func); 2504 printf("\tclass=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n", 2505 cfg->baseclass, cfg->subclass, cfg->progif, cfg->hdrtype, 2506 cfg->mfdev); 2507 printf("\tcmdreg=0x%04x, statreg=0x%04x, cachelnsz=%d (dwords)\n", 2508 cfg->cmdreg, cfg->statreg, cfg->cachelnsz); 2509 printf("\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), maxlat=0x%02x (%d ns)\n", 2510 cfg->lattimer, cfg->lattimer * 30, cfg->mingnt, 2511 cfg->mingnt * 250, cfg->maxlat, cfg->maxlat * 250); 2512 if (cfg->intpin > 0) 2513 printf("\tintpin=%c, irq=%d\n", 2514 cfg->intpin +'a' -1, cfg->intline); 2515 if (cfg->pp.pp_cap) { 2516 uint16_t status; 2517 2518 status = pci_read_config(cfg->dev, cfg->pp.pp_status, 2); 2519 printf("\tpowerspec %d supports D0%s%s D3 current D%d\n", 2520 cfg->pp.pp_cap & PCIM_PCAP_SPEC, 2521 cfg->pp.pp_cap & PCIM_PCAP_D1SUPP ? " D1" : "", 2522 cfg->pp.pp_cap & PCIM_PCAP_D2SUPP ? " D2" : "", 2523 status & PCIM_PSTAT_DMASK); 2524 } 2525 if (cfg->msi.msi_location) { 2526 int ctrl; 2527 2528 ctrl = cfg->msi.msi_ctrl; 2529 printf("\tMSI supports %d message%s%s%s\n", 2530 cfg->msi.msi_msgnum, 2531 (cfg->msi.msi_msgnum == 1) ? "" : "s", 2532 (ctrl & PCIM_MSICTRL_64BIT) ? ", 64 bit" : "", 2533 (ctrl & PCIM_MSICTRL_VECTOR) ? ", vector masks":""); 2534 } 2535 if (cfg->msix.msix_location) { 2536 printf("\tMSI-X supports %d message%s ", 2537 cfg->msix.msix_msgnum, 2538 (cfg->msix.msix_msgnum == 1) ? "" : "s"); 2539 if (cfg->msix.msix_table_bar == cfg->msix.msix_pba_bar) 2540 printf("in map 0x%x\n", 2541 cfg->msix.msix_table_bar); 2542 else 2543 printf("in maps 0x%x and 0x%x\n", 2544 cfg->msix.msix_table_bar, 2545 cfg->msix.msix_pba_bar); 2546 } 2547 } 2548 } 2549 2550 static int 2551 pci_porten(device_t dev) 2552 { 2553 return (pci_read_config(dev, PCIR_COMMAND, 2) & PCIM_CMD_PORTEN) != 0; 2554 } 2555 2556 static int 2557 pci_memen(device_t dev) 2558 { 2559 return (pci_read_config(dev, PCIR_COMMAND, 2) & PCIM_CMD_MEMEN) != 0; 2560 } 2561 2562 static void 2563 pci_read_bar(device_t dev, int reg, pci_addr_t *mapp, pci_addr_t *testvalp) 2564 { 2565 struct pci_devinfo *dinfo; 2566 pci_addr_t map, testval; 2567 int ln2range; 2568 uint16_t cmd; 2569 2570 /* 2571 * The device ROM BAR is special. It is always a 32-bit 2572 * memory BAR. Bit 0 is special and should not be set when 2573 * sizing the BAR. 2574 */ 2575 dinfo = device_get_ivars(dev); 2576 if (PCIR_IS_BIOS(&dinfo->cfg, reg)) { 2577 map = pci_read_config(dev, reg, 4); 2578 pci_write_config(dev, reg, 0xfffffffe, 4); 2579 testval = pci_read_config(dev, reg, 4); 2580 pci_write_config(dev, reg, map, 4); 2581 *mapp = map; 2582 *testvalp = testval; 2583 return; 2584 } 2585 2586 map = pci_read_config(dev, reg, 4); 2587 ln2range = pci_maprange(map); 2588 if (ln2range == 64) 2589 map |= (pci_addr_t)pci_read_config(dev, reg + 4, 4) << 32; 2590 2591 /* 2592 * Disable decoding via the command register before 2593 * determining the BAR's length since we will be placing it in 2594 * a weird state. 2595 */ 2596 cmd = pci_read_config(dev, PCIR_COMMAND, 2); 2597 pci_write_config(dev, PCIR_COMMAND, 2598 cmd & ~(PCI_BAR_MEM(map) ? PCIM_CMD_MEMEN : PCIM_CMD_PORTEN), 2); 2599 2600 /* 2601 * Determine the BAR's length by writing all 1's. The bottom 2602 * log_2(size) bits of the BAR will stick as 0 when we read 2603 * the value back. 2604 */ 2605 pci_write_config(dev, reg, 0xffffffff, 4); 2606 testval = pci_read_config(dev, reg, 4); 2607 if (ln2range == 64) { 2608 pci_write_config(dev, reg + 4, 0xffffffff, 4); 2609 testval |= (pci_addr_t)pci_read_config(dev, reg + 4, 4) << 32; 2610 } 2611 2612 /* 2613 * Restore the original value of the BAR. We may have reprogrammed 2614 * the BAR of the low-level console device and when booting verbose, 2615 * we need the console device addressable. 2616 */ 2617 pci_write_config(dev, reg, map, 4); 2618 if (ln2range == 64) 2619 pci_write_config(dev, reg + 4, map >> 32, 4); 2620 pci_write_config(dev, PCIR_COMMAND, cmd, 2); 2621 2622 *mapp = map; 2623 *testvalp = testval; 2624 } 2625 2626 static void 2627 pci_write_bar(device_t dev, struct pci_map *pm, pci_addr_t base) 2628 { 2629 struct pci_devinfo *dinfo; 2630 int ln2range; 2631 2632 /* The device ROM BAR is always a 32-bit memory BAR. */ 2633 dinfo = device_get_ivars(dev); 2634 if (PCIR_IS_BIOS(&dinfo->cfg, pm->pm_reg)) 2635 ln2range = 32; 2636 else 2637 ln2range = pci_maprange(pm->pm_value); 2638 pci_write_config(dev, pm->pm_reg, base, 4); 2639 if (ln2range == 64) 2640 pci_write_config(dev, pm->pm_reg + 4, base >> 32, 4); 2641 pm->pm_value = pci_read_config(dev, pm->pm_reg, 4); 2642 if (ln2range == 64) 2643 pm->pm_value |= (pci_addr_t)pci_read_config(dev, 2644 pm->pm_reg + 4, 4) << 32; 2645 } 2646 2647 struct pci_map * 2648 pci_find_bar(device_t dev, int reg) 2649 { 2650 struct pci_devinfo *dinfo; 2651 struct pci_map *pm; 2652 2653 dinfo = device_get_ivars(dev); 2654 STAILQ_FOREACH(pm, &dinfo->cfg.maps, pm_link) { 2655 if (pm->pm_reg == reg) 2656 return (pm); 2657 } 2658 return (NULL); 2659 } 2660 2661 int 2662 pci_bar_enabled(device_t dev, struct pci_map *pm) 2663 { 2664 struct pci_devinfo *dinfo; 2665 uint16_t cmd; 2666 2667 dinfo = device_get_ivars(dev); 2668 if (PCIR_IS_BIOS(&dinfo->cfg, pm->pm_reg) && 2669 !(pm->pm_value & PCIM_BIOS_ENABLE)) 2670 return (0); 2671 cmd = pci_read_config(dev, PCIR_COMMAND, 2); 2672 if (PCIR_IS_BIOS(&dinfo->cfg, pm->pm_reg) || PCI_BAR_MEM(pm->pm_value)) 2673 return ((cmd & PCIM_CMD_MEMEN) != 0); 2674 else 2675 return ((cmd & PCIM_CMD_PORTEN) != 0); 2676 } 2677 2678 static struct pci_map * 2679 pci_add_bar(device_t dev, int reg, pci_addr_t value, pci_addr_t size) 2680 { 2681 struct pci_devinfo *dinfo; 2682 struct pci_map *pm, *prev; 2683 2684 dinfo = device_get_ivars(dev); 2685 pm = malloc(sizeof(*pm), M_DEVBUF, M_WAITOK | M_ZERO); 2686 pm->pm_reg = reg; 2687 pm->pm_value = value; 2688 pm->pm_size = size; 2689 STAILQ_FOREACH(prev, &dinfo->cfg.maps, pm_link) { 2690 KASSERT(prev->pm_reg != pm->pm_reg, ("duplicate map %02x", 2691 reg)); 2692 if (STAILQ_NEXT(prev, pm_link) == NULL || 2693 STAILQ_NEXT(prev, pm_link)->pm_reg > pm->pm_reg) 2694 break; 2695 } 2696 if (prev != NULL) 2697 STAILQ_INSERT_AFTER(&dinfo->cfg.maps, prev, pm, pm_link); 2698 else 2699 STAILQ_INSERT_TAIL(&dinfo->cfg.maps, pm, pm_link); 2700 return (pm); 2701 } 2702 2703 static void 2704 pci_restore_bars(device_t dev) 2705 { 2706 struct pci_devinfo *dinfo; 2707 struct pci_map *pm; 2708 int ln2range; 2709 2710 dinfo = device_get_ivars(dev); 2711 STAILQ_FOREACH(pm, &dinfo->cfg.maps, pm_link) { 2712 if (PCIR_IS_BIOS(&dinfo->cfg, pm->pm_reg)) 2713 ln2range = 32; 2714 else 2715 ln2range = pci_maprange(pm->pm_value); 2716 pci_write_config(dev, pm->pm_reg, pm->pm_value, 4); 2717 if (ln2range == 64) 2718 pci_write_config(dev, pm->pm_reg + 4, 2719 pm->pm_value >> 32, 4); 2720 } 2721 } 2722 2723 /* 2724 * Add a resource based on a pci map register. Return 1 if the map 2725 * register is a 32bit map register or 2 if it is a 64bit register. 2726 */ 2727 static int 2728 pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl, 2729 int force, int prefetch) 2730 { 2731 struct pci_map *pm; 2732 pci_addr_t base, map, testval; 2733 pci_addr_t start, end, count; 2734 int barlen, basezero, maprange, mapsize, type; 2735 uint16_t cmd; 2736 struct resource *res; 2737 2738 /* 2739 * The BAR may already exist if the device is a CardBus card 2740 * whose CIS is stored in this BAR. 2741 */ 2742 pm = pci_find_bar(dev, reg); 2743 if (pm != NULL) { 2744 maprange = pci_maprange(pm->pm_value); 2745 barlen = maprange == 64 ? 2 : 1; 2746 return (barlen); 2747 } 2748 2749 pci_read_bar(dev, reg, &map, &testval); 2750 if (PCI_BAR_MEM(map)) { 2751 type = SYS_RES_MEMORY; 2752 if (map & PCIM_BAR_MEM_PREFETCH) 2753 prefetch = 1; 2754 } else 2755 type = SYS_RES_IOPORT; 2756 mapsize = pci_mapsize(testval); 2757 base = pci_mapbase(map); 2758 #ifdef __PCI_BAR_ZERO_VALID 2759 basezero = 0; 2760 #else 2761 basezero = base == 0; 2762 #endif 2763 maprange = pci_maprange(map); 2764 barlen = maprange == 64 ? 2 : 1; 2765 2766 /* 2767 * For I/O registers, if bottom bit is set, and the next bit up 2768 * isn't clear, we know we have a BAR that doesn't conform to the 2769 * spec, so ignore it. Also, sanity check the size of the data 2770 * areas to the type of memory involved. Memory must be at least 2771 * 16 bytes in size, while I/O ranges must be at least 4. 2772 */ 2773 if (PCI_BAR_IO(testval) && (testval & PCIM_BAR_IO_RESERVED) != 0) 2774 return (barlen); 2775 if ((type == SYS_RES_MEMORY && mapsize < 4) || 2776 (type == SYS_RES_IOPORT && mapsize < 2)) 2777 return (barlen); 2778 2779 /* Save a record of this BAR. */ 2780 pm = pci_add_bar(dev, reg, map, mapsize); 2781 if (bootverbose) { 2782 printf("\tmap[%02x]: type %s, range %2d, base %#jx, size %2d", 2783 reg, pci_maptype(map), maprange, (uintmax_t)base, mapsize); 2784 if (type == SYS_RES_IOPORT && !pci_porten(dev)) 2785 printf(", port disabled\n"); 2786 else if (type == SYS_RES_MEMORY && !pci_memen(dev)) 2787 printf(", memory disabled\n"); 2788 else 2789 printf(", enabled\n"); 2790 } 2791 2792 /* 2793 * If base is 0, then we have problems if this architecture does 2794 * not allow that. It is best to ignore such entries for the 2795 * moment. These will be allocated later if the driver specifically 2796 * requests them. However, some removable busses look better when 2797 * all resources are allocated, so allow '0' to be overriden. 2798 * 2799 * Similarly treat maps whose values is the same as the test value 2800 * read back. These maps have had all f's written to them by the 2801 * BIOS in an attempt to disable the resources. 2802 */ 2803 if (!force && (basezero || map == testval)) 2804 return (barlen); 2805 if ((u_long)base != base) { 2806 device_printf(bus, 2807 "pci%d:%d:%d:%d bar %#x too many address bits", 2808 pci_get_domain(dev), pci_get_bus(dev), pci_get_slot(dev), 2809 pci_get_function(dev), reg); 2810 return (barlen); 2811 } 2812 2813 /* 2814 * This code theoretically does the right thing, but has 2815 * undesirable side effects in some cases where peripherals 2816 * respond oddly to having these bits enabled. Let the user 2817 * be able to turn them off (since pci_enable_io_modes is 1 by 2818 * default). 2819 */ 2820 if (pci_enable_io_modes) { 2821 /* Turn on resources that have been left off by a lazy BIOS */ 2822 if (type == SYS_RES_IOPORT && !pci_porten(dev)) { 2823 cmd = pci_read_config(dev, PCIR_COMMAND, 2); 2824 cmd |= PCIM_CMD_PORTEN; 2825 pci_write_config(dev, PCIR_COMMAND, cmd, 2); 2826 } 2827 if (type == SYS_RES_MEMORY && !pci_memen(dev)) { 2828 cmd = pci_read_config(dev, PCIR_COMMAND, 2); 2829 cmd |= PCIM_CMD_MEMEN; 2830 pci_write_config(dev, PCIR_COMMAND, cmd, 2); 2831 } 2832 } else { 2833 if (type == SYS_RES_IOPORT && !pci_porten(dev)) 2834 return (barlen); 2835 if (type == SYS_RES_MEMORY && !pci_memen(dev)) 2836 return (barlen); 2837 } 2838 2839 count = (pci_addr_t)1 << mapsize; 2840 if (basezero || base == pci_mapbase(testval)) { 2841 start = 0; /* Let the parent decide. */ 2842 end = ~0ul; 2843 } else { 2844 start = base; 2845 end = base + count - 1; 2846 } 2847 resource_list_add(rl, type, reg, start, end, count); 2848 2849 /* 2850 * Try to allocate the resource for this BAR from our parent 2851 * so that this resource range is already reserved. The 2852 * driver for this device will later inherit this resource in 2853 * pci_alloc_resource(). 2854 */ 2855 res = resource_list_reserve(rl, bus, dev, type, ®, start, end, count, 2856 prefetch ? RF_PREFETCHABLE : 0); 2857 if (pci_do_realloc_bars && res == NULL && (start != 0 || end != ~0ul)) { 2858 /* 2859 * If the allocation fails, try to allocate a resource for 2860 * this BAR using any available range. The firmware felt 2861 * it was important enough to assign a resource, so don't 2862 * disable decoding if we can help it. 2863 */ 2864 resource_list_delete(rl, type, reg); 2865 resource_list_add(rl, type, reg, 0, ~0ul, count); 2866 res = resource_list_reserve(rl, bus, dev, type, ®, 0, ~0ul, 2867 count, prefetch ? RF_PREFETCHABLE : 0); 2868 } 2869 if (res == NULL) { 2870 /* 2871 * If the allocation fails, delete the resource list entry 2872 * and disable decoding for this device. 2873 * 2874 * If the driver requests this resource in the future, 2875 * pci_reserve_map() will try to allocate a fresh 2876 * resource range. 2877 */ 2878 resource_list_delete(rl, type, reg); 2879 pci_disable_io(dev, type); 2880 if (bootverbose) 2881 device_printf(bus, 2882 "pci%d:%d:%d:%d bar %#x failed to allocate\n", 2883 pci_get_domain(dev), pci_get_bus(dev), 2884 pci_get_slot(dev), pci_get_function(dev), reg); 2885 } else { 2886 start = rman_get_start(res); 2887 pci_write_bar(dev, pm, start); 2888 } 2889 return (barlen); 2890 } 2891 2892 /* 2893 * For ATA devices we need to decide early what addressing mode to use. 2894 * Legacy demands that the primary and secondary ATA ports sits on the 2895 * same addresses that old ISA hardware did. This dictates that we use 2896 * those addresses and ignore the BAR's if we cannot set PCI native 2897 * addressing mode. 2898 */ 2899 static void 2900 pci_ata_maps(device_t bus, device_t dev, struct resource_list *rl, int force, 2901 uint32_t prefetchmask) 2902 { 2903 struct resource *r; 2904 int rid, type, progif; 2905 #if 0 2906 /* if this device supports PCI native addressing use it */ 2907 progif = pci_read_config(dev, PCIR_PROGIF, 1); 2908 if ((progif & 0x8a) == 0x8a) { 2909 if (pci_mapbase(pci_read_config(dev, PCIR_BAR(0), 4)) && 2910 pci_mapbase(pci_read_config(dev, PCIR_BAR(2), 4))) { 2911 printf("Trying ATA native PCI addressing mode\n"); 2912 pci_write_config(dev, PCIR_PROGIF, progif | 0x05, 1); 2913 } 2914 } 2915 #endif 2916 progif = pci_read_config(dev, PCIR_PROGIF, 1); 2917 type = SYS_RES_IOPORT; 2918 if (progif & PCIP_STORAGE_IDE_MODEPRIM) { 2919 pci_add_map(bus, dev, PCIR_BAR(0), rl, force, 2920 prefetchmask & (1 << 0)); 2921 pci_add_map(bus, dev, PCIR_BAR(1), rl, force, 2922 prefetchmask & (1 << 1)); 2923 } else { 2924 rid = PCIR_BAR(0); 2925 resource_list_add(rl, type, rid, 0x1f0, 0x1f7, 8); 2926 r = resource_list_reserve(rl, bus, dev, type, &rid, 0x1f0, 2927 0x1f7, 8, 0); 2928 rid = PCIR_BAR(1); 2929 resource_list_add(rl, type, rid, 0x3f6, 0x3f6, 1); 2930 r = resource_list_reserve(rl, bus, dev, type, &rid, 0x3f6, 2931 0x3f6, 1, 0); 2932 } 2933 if (progif & PCIP_STORAGE_IDE_MODESEC) { 2934 pci_add_map(bus, dev, PCIR_BAR(2), rl, force, 2935 prefetchmask & (1 << 2)); 2936 pci_add_map(bus, dev, PCIR_BAR(3), rl, force, 2937 prefetchmask & (1 << 3)); 2938 } else { 2939 rid = PCIR_BAR(2); 2940 resource_list_add(rl, type, rid, 0x170, 0x177, 8); 2941 r = resource_list_reserve(rl, bus, dev, type, &rid, 0x170, 2942 0x177, 8, 0); 2943 rid = PCIR_BAR(3); 2944 resource_list_add(rl, type, rid, 0x376, 0x376, 1); 2945 r = resource_list_reserve(rl, bus, dev, type, &rid, 0x376, 2946 0x376, 1, 0); 2947 } 2948 pci_add_map(bus, dev, PCIR_BAR(4), rl, force, 2949 prefetchmask & (1 << 4)); 2950 pci_add_map(bus, dev, PCIR_BAR(5), rl, force, 2951 prefetchmask & (1 << 5)); 2952 } 2953 2954 static void 2955 pci_assign_interrupt(device_t bus, device_t dev, int force_route) 2956 { 2957 struct pci_devinfo *dinfo = device_get_ivars(dev); 2958 pcicfgregs *cfg = &dinfo->cfg; 2959 char tunable_name[64]; 2960 int irq; 2961 2962 /* Has to have an intpin to have an interrupt. */ 2963 if (cfg->intpin == 0) 2964 return; 2965 2966 /* Let the user override the IRQ with a tunable. */ 2967 irq = PCI_INVALID_IRQ; 2968 snprintf(tunable_name, sizeof(tunable_name), 2969 "hw.pci%d.%d.%d.INT%c.irq", 2970 cfg->domain, cfg->bus, cfg->slot, cfg->intpin + 'A' - 1); 2971 if (TUNABLE_INT_FETCH(tunable_name, &irq) && (irq >= 255 || irq <= 0)) 2972 irq = PCI_INVALID_IRQ; 2973 2974 /* 2975 * If we didn't get an IRQ via the tunable, then we either use the 2976 * IRQ value in the intline register or we ask the bus to route an 2977 * interrupt for us. If force_route is true, then we only use the 2978 * value in the intline register if the bus was unable to assign an 2979 * IRQ. 2980 */ 2981 if (!PCI_INTERRUPT_VALID(irq)) { 2982 if (!PCI_INTERRUPT_VALID(cfg->intline) || force_route) 2983 irq = PCI_ASSIGN_INTERRUPT(bus, dev); 2984 if (!PCI_INTERRUPT_VALID(irq)) 2985 irq = cfg->intline; 2986 } 2987 2988 /* If after all that we don't have an IRQ, just bail. */ 2989 if (!PCI_INTERRUPT_VALID(irq)) 2990 return; 2991 2992 /* Update the config register if it changed. */ 2993 if (irq != cfg->intline) { 2994 cfg->intline = irq; 2995 pci_write_config(dev, PCIR_INTLINE, irq, 1); 2996 } 2997 2998 /* Add this IRQ as rid 0 interrupt resource. */ 2999 resource_list_add(&dinfo->resources, SYS_RES_IRQ, 0, irq, irq, 1); 3000 } 3001 3002 /* Perform early OHCI takeover from SMM. */ 3003 static void 3004 ohci_early_takeover(device_t self) 3005 { 3006 struct resource *res; 3007 uint32_t ctl; 3008 int rid; 3009 int i; 3010 3011 rid = PCIR_BAR(0); 3012 res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE); 3013 if (res == NULL) 3014 return; 3015 3016 ctl = bus_read_4(res, OHCI_CONTROL); 3017 if (ctl & OHCI_IR) { 3018 if (bootverbose) 3019 printf("ohci early: " 3020 "SMM active, request owner change\n"); 3021 bus_write_4(res, OHCI_COMMAND_STATUS, OHCI_OCR); 3022 for (i = 0; (i < 100) && (ctl & OHCI_IR); i++) { 3023 DELAY(1000); 3024 ctl = bus_read_4(res, OHCI_CONTROL); 3025 } 3026 if (ctl & OHCI_IR) { 3027 if (bootverbose) 3028 printf("ohci early: " 3029 "SMM does not respond, resetting\n"); 3030 bus_write_4(res, OHCI_CONTROL, OHCI_HCFS_RESET); 3031 } 3032 /* Disable interrupts */ 3033 bus_write_4(res, OHCI_INTERRUPT_DISABLE, OHCI_ALL_INTRS); 3034 } 3035 3036 bus_release_resource(self, SYS_RES_MEMORY, rid, res); 3037 } 3038 3039 /* Perform early UHCI takeover from SMM. */ 3040 static void 3041 uhci_early_takeover(device_t self) 3042 { 3043 struct resource *res; 3044 int rid; 3045 3046 /* 3047 * Set the PIRQD enable bit and switch off all the others. We don't 3048 * want legacy support to interfere with us XXX Does this also mean 3049 * that the BIOS won't touch the keyboard anymore if it is connected 3050 * to the ports of the root hub? 3051 */ 3052 pci_write_config(self, PCI_LEGSUP, PCI_LEGSUP_USBPIRQDEN, 2); 3053 3054 /* Disable interrupts */ 3055 rid = PCI_UHCI_BASE_REG; 3056 res = bus_alloc_resource_any(self, SYS_RES_IOPORT, &rid, RF_ACTIVE); 3057 if (res != NULL) { 3058 bus_write_2(res, UHCI_INTR, 0); 3059 bus_release_resource(self, SYS_RES_IOPORT, rid, res); 3060 } 3061 } 3062 3063 /* Perform early EHCI takeover from SMM. */ 3064 static void 3065 ehci_early_takeover(device_t self) 3066 { 3067 struct resource *res; 3068 uint32_t cparams; 3069 uint32_t eec; 3070 uint8_t eecp; 3071 uint8_t bios_sem; 3072 uint8_t offs; 3073 int rid; 3074 int i; 3075 3076 rid = PCIR_BAR(0); 3077 res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE); 3078 if (res == NULL) 3079 return; 3080 3081 cparams = bus_read_4(res, EHCI_HCCPARAMS); 3082 3083 /* Synchronise with the BIOS if it owns the controller. */ 3084 for (eecp = EHCI_HCC_EECP(cparams); eecp != 0; 3085 eecp = EHCI_EECP_NEXT(eec)) { 3086 eec = pci_read_config(self, eecp, 4); 3087 if (EHCI_EECP_ID(eec) != EHCI_EC_LEGSUP) { 3088 continue; 3089 } 3090 bios_sem = pci_read_config(self, eecp + 3091 EHCI_LEGSUP_BIOS_SEM, 1); 3092 if (bios_sem == 0) { 3093 continue; 3094 } 3095 if (bootverbose) 3096 printf("ehci early: " 3097 "SMM active, request owner change\n"); 3098 3099 pci_write_config(self, eecp + EHCI_LEGSUP_OS_SEM, 1, 1); 3100 3101 for (i = 0; (i < 100) && (bios_sem != 0); i++) { 3102 DELAY(1000); 3103 bios_sem = pci_read_config(self, eecp + 3104 EHCI_LEGSUP_BIOS_SEM, 1); 3105 } 3106 3107 if (bios_sem != 0) { 3108 if (bootverbose) 3109 printf("ehci early: " 3110 "SMM does not respond\n"); 3111 } 3112 /* Disable interrupts */ 3113 offs = EHCI_CAPLENGTH(bus_read_4(res, EHCI_CAPLEN_HCIVERSION)); 3114 bus_write_4(res, offs + EHCI_USBINTR, 0); 3115 } 3116 bus_release_resource(self, SYS_RES_MEMORY, rid, res); 3117 } 3118 3119 /* Perform early XHCI takeover from SMM. */ 3120 static void 3121 xhci_early_takeover(device_t self) 3122 { 3123 struct resource *res; 3124 uint32_t cparams; 3125 uint32_t eec; 3126 uint8_t eecp; 3127 uint8_t bios_sem; 3128 uint8_t offs; 3129 int rid; 3130 int i; 3131 3132 rid = PCIR_BAR(0); 3133 res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE); 3134 if (res == NULL) 3135 return; 3136 3137 cparams = bus_read_4(res, XHCI_HCSPARAMS0); 3138 3139 eec = -1; 3140 3141 /* Synchronise with the BIOS if it owns the controller. */ 3142 for (eecp = XHCI_HCS0_XECP(cparams) << 2; eecp != 0 && XHCI_XECP_NEXT(eec); 3143 eecp += XHCI_XECP_NEXT(eec) << 2) { 3144 eec = bus_read_4(res, eecp); 3145 3146 if (XHCI_XECP_ID(eec) != XHCI_ID_USB_LEGACY) 3147 continue; 3148 3149 bios_sem = bus_read_1(res, eecp + XHCI_XECP_BIOS_SEM); 3150 if (bios_sem == 0) 3151 continue; 3152 3153 if (bootverbose) 3154 printf("xhci early: " 3155 "SMM active, request owner change\n"); 3156 3157 bus_write_1(res, eecp + XHCI_XECP_OS_SEM, 1); 3158 3159 /* wait a maximum of 5 second */ 3160 3161 for (i = 0; (i < 5000) && (bios_sem != 0); i++) { 3162 DELAY(1000); 3163 bios_sem = bus_read_1(res, eecp + 3164 XHCI_XECP_BIOS_SEM); 3165 } 3166 3167 if (bios_sem != 0) { 3168 if (bootverbose) 3169 printf("xhci early: " 3170 "SMM does not respond\n"); 3171 } 3172 3173 /* Disable interrupts */ 3174 offs = bus_read_1(res, XHCI_CAPLENGTH); 3175 bus_write_4(res, offs + XHCI_USBCMD, 0); 3176 bus_read_4(res, offs + XHCI_USBSTS); 3177 } 3178 bus_release_resource(self, SYS_RES_MEMORY, rid, res); 3179 } 3180 3181 void 3182 pci_add_resources(device_t bus, device_t dev, int force, uint32_t prefetchmask) 3183 { 3184 struct pci_devinfo *dinfo; 3185 pcicfgregs *cfg; 3186 struct resource_list *rl; 3187 const struct pci_quirk *q; 3188 uint32_t devid; 3189 int i; 3190 3191 dinfo = device_get_ivars(dev); 3192 cfg = &dinfo->cfg; 3193 rl = &dinfo->resources; 3194 devid = (cfg->device << 16) | cfg->vendor; 3195 3196 /* ATA devices needs special map treatment */ 3197 if ((pci_get_class(dev) == PCIC_STORAGE) && 3198 (pci_get_subclass(dev) == PCIS_STORAGE_IDE) && 3199 ((pci_get_progif(dev) & PCIP_STORAGE_IDE_MASTERDEV) || 3200 (!pci_read_config(dev, PCIR_BAR(0), 4) && 3201 !pci_read_config(dev, PCIR_BAR(2), 4))) ) 3202 pci_ata_maps(bus, dev, rl, force, prefetchmask); 3203 else 3204 for (i = 0; i < cfg->nummaps;) { 3205 /* 3206 * Skip quirked resources. 3207 */ 3208 for (q = &pci_quirks[0]; q->devid != 0; q++) 3209 if (q->devid == devid && 3210 q->type == PCI_QUIRK_UNMAP_REG && 3211 q->arg1 == PCIR_BAR(i)) 3212 break; 3213 if (q->devid != 0) { 3214 i++; 3215 continue; 3216 } 3217 i += pci_add_map(bus, dev, PCIR_BAR(i), rl, force, 3218 prefetchmask & (1 << i)); 3219 } 3220 3221 /* 3222 * Add additional, quirked resources. 3223 */ 3224 for (q = &pci_quirks[0]; q->devid != 0; q++) 3225 if (q->devid == devid && q->type == PCI_QUIRK_MAP_REG) 3226 pci_add_map(bus, dev, q->arg1, rl, force, 0); 3227 3228 if (cfg->intpin > 0 && PCI_INTERRUPT_VALID(cfg->intline)) { 3229 #ifdef __PCI_REROUTE_INTERRUPT 3230 /* 3231 * Try to re-route interrupts. Sometimes the BIOS or 3232 * firmware may leave bogus values in these registers. 3233 * If the re-route fails, then just stick with what we 3234 * have. 3235 */ 3236 pci_assign_interrupt(bus, dev, 1); 3237 #else 3238 pci_assign_interrupt(bus, dev, 0); 3239 #endif 3240 } 3241 3242 if (pci_usb_takeover && pci_get_class(dev) == PCIC_SERIALBUS && 3243 pci_get_subclass(dev) == PCIS_SERIALBUS_USB) { 3244 if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_XHCI) 3245 xhci_early_takeover(dev); 3246 else if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_EHCI) 3247 ehci_early_takeover(dev); 3248 else if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_OHCI) 3249 ohci_early_takeover(dev); 3250 else if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_UHCI) 3251 uhci_early_takeover(dev); 3252 } 3253 } 3254 3255 void 3256 pci_add_children(device_t dev, int domain, int busno, size_t dinfo_size) 3257 { 3258 #define REG(n, w) PCIB_READ_CONFIG(pcib, busno, s, f, n, w) 3259 device_t pcib = device_get_parent(dev); 3260 struct pci_devinfo *dinfo; 3261 int maxslots; 3262 int s, f, pcifunchigh; 3263 uint8_t hdrtype; 3264 3265 KASSERT(dinfo_size >= sizeof(struct pci_devinfo), 3266 ("dinfo_size too small")); 3267 maxslots = PCIB_MAXSLOTS(pcib); 3268 for (s = 0; s <= maxslots; s++) { 3269 pcifunchigh = 0; 3270 f = 0; 3271 DELAY(1); 3272 hdrtype = REG(PCIR_HDRTYPE, 1); 3273 if ((hdrtype & PCIM_HDRTYPE) > PCI_MAXHDRTYPE) 3274 continue; 3275 if (hdrtype & PCIM_MFDEV) 3276 pcifunchigh = PCI_FUNCMAX; 3277 for (f = 0; f <= pcifunchigh; f++) { 3278 dinfo = pci_read_device(pcib, domain, busno, s, f, 3279 dinfo_size); 3280 if (dinfo != NULL) { 3281 pci_add_child(dev, dinfo); 3282 } 3283 } 3284 } 3285 #undef REG 3286 } 3287 3288 void 3289 pci_add_child(device_t bus, struct pci_devinfo *dinfo) 3290 { 3291 dinfo->cfg.dev = device_add_child(bus, NULL, -1); 3292 device_set_ivars(dinfo->cfg.dev, dinfo); 3293 resource_list_init(&dinfo->resources); 3294 pci_cfg_save(dinfo->cfg.dev, dinfo, 0); 3295 pci_cfg_restore(dinfo->cfg.dev, dinfo); 3296 pci_print_verbose(dinfo); 3297 pci_add_resources(bus, dinfo->cfg.dev, 0, 0); 3298 } 3299 3300 static int 3301 pci_probe(device_t dev) 3302 { 3303 3304 device_set_desc(dev, "PCI bus"); 3305 3306 /* Allow other subclasses to override this driver. */ 3307 return (BUS_PROBE_GENERIC); 3308 } 3309 3310 int 3311 pci_attach_common(device_t dev) 3312 { 3313 struct pci_softc *sc; 3314 int busno, domain; 3315 #ifdef PCI_DMA_BOUNDARY 3316 int error, tag_valid; 3317 #endif 3318 3319 sc = device_get_softc(dev); 3320 domain = pcib_get_domain(dev); 3321 busno = pcib_get_bus(dev); 3322 if (bootverbose) 3323 device_printf(dev, "domain=%d, physical bus=%d\n", 3324 domain, busno); 3325 #ifdef PCI_DMA_BOUNDARY 3326 tag_valid = 0; 3327 if (device_get_devclass(device_get_parent(device_get_parent(dev))) != 3328 devclass_find("pci")) { 3329 error = bus_dma_tag_create(bus_get_dma_tag(dev), 1, 3330 PCI_DMA_BOUNDARY, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, 3331 NULL, NULL, BUS_SPACE_MAXSIZE, BUS_SPACE_UNRESTRICTED, 3332 BUS_SPACE_MAXSIZE, 0, NULL, NULL, &sc->sc_dma_tag); 3333 if (error) 3334 device_printf(dev, "Failed to create DMA tag: %d\n", 3335 error); 3336 else 3337 tag_valid = 1; 3338 } 3339 if (!tag_valid) 3340 #endif 3341 sc->sc_dma_tag = bus_get_dma_tag(dev); 3342 return (0); 3343 } 3344 3345 static int 3346 pci_attach(device_t dev) 3347 { 3348 int busno, domain, error; 3349 3350 error = pci_attach_common(dev); 3351 if (error) 3352 return (error); 3353 3354 /* 3355 * Since there can be multiple independantly numbered PCI 3356 * busses on systems with multiple PCI domains, we can't use 3357 * the unit number to decide which bus we are probing. We ask 3358 * the parent pcib what our domain and bus numbers are. 3359 */ 3360 domain = pcib_get_domain(dev); 3361 busno = pcib_get_bus(dev); 3362 pci_add_children(dev, domain, busno, sizeof(struct pci_devinfo)); 3363 return (bus_generic_attach(dev)); 3364 } 3365 3366 static void 3367 pci_set_power_children(device_t dev, device_t *devlist, int numdevs, 3368 int state) 3369 { 3370 device_t child, pcib; 3371 struct pci_devinfo *dinfo; 3372 int dstate, i; 3373 3374 /* 3375 * Set the device to the given state. If the firmware suggests 3376 * a different power state, use it instead. If power management 3377 * is not present, the firmware is responsible for managing 3378 * device power. Skip children who aren't attached since they 3379 * are handled separately. 3380 */ 3381 pcib = device_get_parent(dev); 3382 for (i = 0; i < numdevs; i++) { 3383 child = devlist[i]; 3384 dinfo = device_get_ivars(child); 3385 dstate = state; 3386 if (device_is_attached(child) && 3387 PCIB_POWER_FOR_SLEEP(pcib, dev, &dstate) == 0) 3388 pci_set_powerstate(child, dstate); 3389 } 3390 } 3391 3392 int 3393 pci_suspend(device_t dev) 3394 { 3395 device_t child, *devlist; 3396 struct pci_devinfo *dinfo; 3397 int error, i, numdevs; 3398 3399 /* 3400 * Save the PCI configuration space for each child and set the 3401 * device in the appropriate power state for this sleep state. 3402 */ 3403 if ((error = device_get_children(dev, &devlist, &numdevs)) != 0) 3404 return (error); 3405 for (i = 0; i < numdevs; i++) { 3406 child = devlist[i]; 3407 dinfo = device_get_ivars(child); 3408 pci_cfg_save(child, dinfo, 0); 3409 } 3410 3411 /* Suspend devices before potentially powering them down. */ 3412 error = bus_generic_suspend(dev); 3413 if (error) { 3414 free(devlist, M_TEMP); 3415 return (error); 3416 } 3417 if (pci_do_power_suspend) 3418 pci_set_power_children(dev, devlist, numdevs, 3419 PCI_POWERSTATE_D3); 3420 free(devlist, M_TEMP); 3421 return (0); 3422 } 3423 3424 int 3425 pci_resume(device_t dev) 3426 { 3427 device_t child, *devlist; 3428 struct pci_devinfo *dinfo; 3429 int error, i, numdevs; 3430 3431 /* 3432 * Set each child to D0 and restore its PCI configuration space. 3433 */ 3434 if ((error = device_get_children(dev, &devlist, &numdevs)) != 0) 3435 return (error); 3436 if (pci_do_power_resume) 3437 pci_set_power_children(dev, devlist, numdevs, 3438 PCI_POWERSTATE_D0); 3439 3440 /* Now the device is powered up, restore its config space. */ 3441 for (i = 0; i < numdevs; i++) { 3442 child = devlist[i]; 3443 dinfo = device_get_ivars(child); 3444 3445 pci_cfg_restore(child, dinfo); 3446 if (!device_is_attached(child)) 3447 pci_cfg_save(child, dinfo, 1); 3448 } 3449 3450 /* 3451 * Resume critical devices first, then everything else later. 3452 */ 3453 for (i = 0; i < numdevs; i++) { 3454 child = devlist[i]; 3455 switch (pci_get_class(child)) { 3456 case PCIC_DISPLAY: 3457 case PCIC_MEMORY: 3458 case PCIC_BRIDGE: 3459 case PCIC_BASEPERIPH: 3460 DEVICE_RESUME(child); 3461 break; 3462 } 3463 } 3464 for (i = 0; i < numdevs; i++) { 3465 child = devlist[i]; 3466 switch (pci_get_class(child)) { 3467 case PCIC_DISPLAY: 3468 case PCIC_MEMORY: 3469 case PCIC_BRIDGE: 3470 case PCIC_BASEPERIPH: 3471 break; 3472 default: 3473 DEVICE_RESUME(child); 3474 } 3475 } 3476 free(devlist, M_TEMP); 3477 return (0); 3478 } 3479 3480 static void 3481 pci_load_vendor_data(void) 3482 { 3483 caddr_t data; 3484 void *ptr; 3485 size_t sz; 3486 3487 data = preload_search_by_type("pci_vendor_data"); 3488 if (data != NULL) { 3489 ptr = preload_fetch_addr(data); 3490 sz = preload_fetch_size(data); 3491 if (ptr != NULL && sz != 0) { 3492 pci_vendordata = ptr; 3493 pci_vendordata_size = sz; 3494 /* terminate the database */ 3495 pci_vendordata[pci_vendordata_size] = '\n'; 3496 } 3497 } 3498 } 3499 3500 void 3501 pci_driver_added(device_t dev, driver_t *driver) 3502 { 3503 int numdevs; 3504 device_t *devlist; 3505 device_t child; 3506 struct pci_devinfo *dinfo; 3507 int i; 3508 3509 if (bootverbose) 3510 device_printf(dev, "driver added\n"); 3511 DEVICE_IDENTIFY(driver, dev); 3512 if (device_get_children(dev, &devlist, &numdevs) != 0) 3513 return; 3514 for (i = 0; i < numdevs; i++) { 3515 child = devlist[i]; 3516 if (device_get_state(child) != DS_NOTPRESENT) 3517 continue; 3518 dinfo = device_get_ivars(child); 3519 pci_print_verbose(dinfo); 3520 if (bootverbose) 3521 pci_printf(&dinfo->cfg, "reprobing on driver added\n"); 3522 pci_cfg_restore(child, dinfo); 3523 if (device_probe_and_attach(child) != 0) 3524 pci_child_detached(dev, child); 3525 } 3526 free(devlist, M_TEMP); 3527 } 3528 3529 int 3530 pci_setup_intr(device_t dev, device_t child, struct resource *irq, int flags, 3531 driver_filter_t *filter, driver_intr_t *intr, void *arg, void **cookiep) 3532 { 3533 struct pci_devinfo *dinfo; 3534 struct msix_table_entry *mte; 3535 struct msix_vector *mv; 3536 uint64_t addr; 3537 uint32_t data; 3538 void *cookie; 3539 int error, rid; 3540 3541 error = bus_generic_setup_intr(dev, child, irq, flags, filter, intr, 3542 arg, &cookie); 3543 if (error) 3544 return (error); 3545 3546 /* If this is not a direct child, just bail out. */ 3547 if (device_get_parent(child) != dev) { 3548 *cookiep = cookie; 3549 return(0); 3550 } 3551 3552 rid = rman_get_rid(irq); 3553 if (rid == 0) { 3554 /* Make sure that INTx is enabled */ 3555 pci_clear_command_bit(dev, child, PCIM_CMD_INTxDIS); 3556 } else { 3557 /* 3558 * Check to see if the interrupt is MSI or MSI-X. 3559 * Ask our parent to map the MSI and give 3560 * us the address and data register values. 3561 * If we fail for some reason, teardown the 3562 * interrupt handler. 3563 */ 3564 dinfo = device_get_ivars(child); 3565 if (dinfo->cfg.msi.msi_alloc > 0) { 3566 if (dinfo->cfg.msi.msi_addr == 0) { 3567 KASSERT(dinfo->cfg.msi.msi_handlers == 0, 3568 ("MSI has handlers, but vectors not mapped")); 3569 error = PCIB_MAP_MSI(device_get_parent(dev), 3570 child, rman_get_start(irq), &addr, &data); 3571 if (error) 3572 goto bad; 3573 dinfo->cfg.msi.msi_addr = addr; 3574 dinfo->cfg.msi.msi_data = data; 3575 } 3576 if (dinfo->cfg.msi.msi_handlers == 0) 3577 pci_enable_msi(child, dinfo->cfg.msi.msi_addr, 3578 dinfo->cfg.msi.msi_data); 3579 dinfo->cfg.msi.msi_handlers++; 3580 } else { 3581 KASSERT(dinfo->cfg.msix.msix_alloc > 0, 3582 ("No MSI or MSI-X interrupts allocated")); 3583 KASSERT(rid <= dinfo->cfg.msix.msix_table_len, 3584 ("MSI-X index too high")); 3585 mte = &dinfo->cfg.msix.msix_table[rid - 1]; 3586 KASSERT(mte->mte_vector != 0, ("no message vector")); 3587 mv = &dinfo->cfg.msix.msix_vectors[mte->mte_vector - 1]; 3588 KASSERT(mv->mv_irq == rman_get_start(irq), 3589 ("IRQ mismatch")); 3590 if (mv->mv_address == 0) { 3591 KASSERT(mte->mte_handlers == 0, 3592 ("MSI-X table entry has handlers, but vector not mapped")); 3593 error = PCIB_MAP_MSI(device_get_parent(dev), 3594 child, rman_get_start(irq), &addr, &data); 3595 if (error) 3596 goto bad; 3597 mv->mv_address = addr; 3598 mv->mv_data = data; 3599 } 3600 if (mte->mte_handlers == 0) { 3601 pci_enable_msix(child, rid - 1, mv->mv_address, 3602 mv->mv_data); 3603 pci_unmask_msix(child, rid - 1); 3604 } 3605 mte->mte_handlers++; 3606 } 3607 3608 /* Make sure that INTx is disabled if we are using MSI/MSIX */ 3609 pci_set_command_bit(dev, child, PCIM_CMD_INTxDIS); 3610 bad: 3611 if (error) { 3612 (void)bus_generic_teardown_intr(dev, child, irq, 3613 cookie); 3614 return (error); 3615 } 3616 } 3617 *cookiep = cookie; 3618 return (0); 3619 } 3620 3621 int 3622 pci_teardown_intr(device_t dev, device_t child, struct resource *irq, 3623 void *cookie) 3624 { 3625 struct msix_table_entry *mte; 3626 struct resource_list_entry *rle; 3627 struct pci_devinfo *dinfo; 3628 int error, rid; 3629 3630 if (irq == NULL || !(rman_get_flags(irq) & RF_ACTIVE)) 3631 return (EINVAL); 3632 3633 /* If this isn't a direct child, just bail out */ 3634 if (device_get_parent(child) != dev) 3635 return(bus_generic_teardown_intr(dev, child, irq, cookie)); 3636 3637 rid = rman_get_rid(irq); 3638 if (rid == 0) { 3639 /* Mask INTx */ 3640 pci_set_command_bit(dev, child, PCIM_CMD_INTxDIS); 3641 } else { 3642 /* 3643 * Check to see if the interrupt is MSI or MSI-X. If so, 3644 * decrement the appropriate handlers count and mask the 3645 * MSI-X message, or disable MSI messages if the count 3646 * drops to 0. 3647 */ 3648 dinfo = device_get_ivars(child); 3649 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, rid); 3650 if (rle->res != irq) 3651 return (EINVAL); 3652 if (dinfo->cfg.msi.msi_alloc > 0) { 3653 KASSERT(rid <= dinfo->cfg.msi.msi_alloc, 3654 ("MSI-X index too high")); 3655 if (dinfo->cfg.msi.msi_handlers == 0) 3656 return (EINVAL); 3657 dinfo->cfg.msi.msi_handlers--; 3658 if (dinfo->cfg.msi.msi_handlers == 0) 3659 pci_disable_msi(child); 3660 } else { 3661 KASSERT(dinfo->cfg.msix.msix_alloc > 0, 3662 ("No MSI or MSI-X interrupts allocated")); 3663 KASSERT(rid <= dinfo->cfg.msix.msix_table_len, 3664 ("MSI-X index too high")); 3665 mte = &dinfo->cfg.msix.msix_table[rid - 1]; 3666 if (mte->mte_handlers == 0) 3667 return (EINVAL); 3668 mte->mte_handlers--; 3669 if (mte->mte_handlers == 0) 3670 pci_mask_msix(child, rid - 1); 3671 } 3672 } 3673 error = bus_generic_teardown_intr(dev, child, irq, cookie); 3674 if (rid > 0) 3675 KASSERT(error == 0, 3676 ("%s: generic teardown failed for MSI/MSI-X", __func__)); 3677 return (error); 3678 } 3679 3680 int 3681 pci_print_child(device_t dev, device_t child) 3682 { 3683 struct pci_devinfo *dinfo; 3684 struct resource_list *rl; 3685 int retval = 0; 3686 3687 dinfo = device_get_ivars(child); 3688 rl = &dinfo->resources; 3689 3690 retval += bus_print_child_header(dev, child); 3691 3692 retval += resource_list_print_type(rl, "port", SYS_RES_IOPORT, "%#lx"); 3693 retval += resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx"); 3694 retval += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld"); 3695 if (device_get_flags(dev)) 3696 retval += printf(" flags %#x", device_get_flags(dev)); 3697 3698 retval += printf(" at device %d.%d", pci_get_slot(child), 3699 pci_get_function(child)); 3700 3701 retval += bus_print_child_footer(dev, child); 3702 3703 return (retval); 3704 } 3705 3706 static const struct 3707 { 3708 int class; 3709 int subclass; 3710 const char *desc; 3711 } pci_nomatch_tab[] = { 3712 {PCIC_OLD, -1, "old"}, 3713 {PCIC_OLD, PCIS_OLD_NONVGA, "non-VGA display device"}, 3714 {PCIC_OLD, PCIS_OLD_VGA, "VGA-compatible display device"}, 3715 {PCIC_STORAGE, -1, "mass storage"}, 3716 {PCIC_STORAGE, PCIS_STORAGE_SCSI, "SCSI"}, 3717 {PCIC_STORAGE, PCIS_STORAGE_IDE, "ATA"}, 3718 {PCIC_STORAGE, PCIS_STORAGE_FLOPPY, "floppy disk"}, 3719 {PCIC_STORAGE, PCIS_STORAGE_IPI, "IPI"}, 3720 {PCIC_STORAGE, PCIS_STORAGE_RAID, "RAID"}, 3721 {PCIC_STORAGE, PCIS_STORAGE_ATA_ADMA, "ATA (ADMA)"}, 3722 {PCIC_STORAGE, PCIS_STORAGE_SATA, "SATA"}, 3723 {PCIC_STORAGE, PCIS_STORAGE_SAS, "SAS"}, 3724 {PCIC_STORAGE, PCIS_STORAGE_NVM, "NVM"}, 3725 {PCIC_NETWORK, -1, "network"}, 3726 {PCIC_NETWORK, PCIS_NETWORK_ETHERNET, "ethernet"}, 3727 {PCIC_NETWORK, PCIS_NETWORK_TOKENRING, "token ring"}, 3728 {PCIC_NETWORK, PCIS_NETWORK_FDDI, "fddi"}, 3729 {PCIC_NETWORK, PCIS_NETWORK_ATM, "ATM"}, 3730 {PCIC_NETWORK, PCIS_NETWORK_ISDN, "ISDN"}, 3731 {PCIC_DISPLAY, -1, "display"}, 3732 {PCIC_DISPLAY, PCIS_DISPLAY_VGA, "VGA"}, 3733 {PCIC_DISPLAY, PCIS_DISPLAY_XGA, "XGA"}, 3734 {PCIC_DISPLAY, PCIS_DISPLAY_3D, "3D"}, 3735 {PCIC_MULTIMEDIA, -1, "multimedia"}, 3736 {PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_VIDEO, "video"}, 3737 {PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_AUDIO, "audio"}, 3738 {PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_TELE, "telephony"}, 3739 {PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_HDA, "HDA"}, 3740 {PCIC_MEMORY, -1, "memory"}, 3741 {PCIC_MEMORY, PCIS_MEMORY_RAM, "RAM"}, 3742 {PCIC_MEMORY, PCIS_MEMORY_FLASH, "flash"}, 3743 {PCIC_BRIDGE, -1, "bridge"}, 3744 {PCIC_BRIDGE, PCIS_BRIDGE_HOST, "HOST-PCI"}, 3745 {PCIC_BRIDGE, PCIS_BRIDGE_ISA, "PCI-ISA"}, 3746 {PCIC_BRIDGE, PCIS_BRIDGE_EISA, "PCI-EISA"}, 3747 {PCIC_BRIDGE, PCIS_BRIDGE_MCA, "PCI-MCA"}, 3748 {PCIC_BRIDGE, PCIS_BRIDGE_PCI, "PCI-PCI"}, 3749 {PCIC_BRIDGE, PCIS_BRIDGE_PCMCIA, "PCI-PCMCIA"}, 3750 {PCIC_BRIDGE, PCIS_BRIDGE_NUBUS, "PCI-NuBus"}, 3751 {PCIC_BRIDGE, PCIS_BRIDGE_CARDBUS, "PCI-CardBus"}, 3752 {PCIC_BRIDGE, PCIS_BRIDGE_RACEWAY, "PCI-RACEway"}, 3753 {PCIC_SIMPLECOMM, -1, "simple comms"}, 3754 {PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_UART, "UART"}, /* could detect 16550 */ 3755 {PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_PAR, "parallel port"}, 3756 {PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_MULSER, "multiport serial"}, 3757 {PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_MODEM, "generic modem"}, 3758 {PCIC_BASEPERIPH, -1, "base peripheral"}, 3759 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_PIC, "interrupt controller"}, 3760 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_DMA, "DMA controller"}, 3761 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_TIMER, "timer"}, 3762 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_RTC, "realtime clock"}, 3763 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_PCIHOT, "PCI hot-plug controller"}, 3764 {PCIC_BASEPERIPH, PCIS_BASEPERIPH_SDHC, "SD host controller"}, 3765 {PCIC_INPUTDEV, -1, "input device"}, 3766 {PCIC_INPUTDEV, PCIS_INPUTDEV_KEYBOARD, "keyboard"}, 3767 {PCIC_INPUTDEV, PCIS_INPUTDEV_DIGITIZER,"digitizer"}, 3768 {PCIC_INPUTDEV, PCIS_INPUTDEV_MOUSE, "mouse"}, 3769 {PCIC_INPUTDEV, PCIS_INPUTDEV_SCANNER, "scanner"}, 3770 {PCIC_INPUTDEV, PCIS_INPUTDEV_GAMEPORT, "gameport"}, 3771 {PCIC_DOCKING, -1, "docking station"}, 3772 {PCIC_PROCESSOR, -1, "processor"}, 3773 {PCIC_SERIALBUS, -1, "serial bus"}, 3774 {PCIC_SERIALBUS, PCIS_SERIALBUS_FW, "FireWire"}, 3775 {PCIC_SERIALBUS, PCIS_SERIALBUS_ACCESS, "AccessBus"}, 3776 {PCIC_SERIALBUS, PCIS_SERIALBUS_SSA, "SSA"}, 3777 {PCIC_SERIALBUS, PCIS_SERIALBUS_USB, "USB"}, 3778 {PCIC_SERIALBUS, PCIS_SERIALBUS_FC, "Fibre Channel"}, 3779 {PCIC_SERIALBUS, PCIS_SERIALBUS_SMBUS, "SMBus"}, 3780 {PCIC_WIRELESS, -1, "wireless controller"}, 3781 {PCIC_WIRELESS, PCIS_WIRELESS_IRDA, "iRDA"}, 3782 {PCIC_WIRELESS, PCIS_WIRELESS_IR, "IR"}, 3783 {PCIC_WIRELESS, PCIS_WIRELESS_RF, "RF"}, 3784 {PCIC_INTELLIIO, -1, "intelligent I/O controller"}, 3785 {PCIC_INTELLIIO, PCIS_INTELLIIO_I2O, "I2O"}, 3786 {PCIC_SATCOM, -1, "satellite communication"}, 3787 {PCIC_SATCOM, PCIS_SATCOM_TV, "sat TV"}, 3788 {PCIC_SATCOM, PCIS_SATCOM_AUDIO, "sat audio"}, 3789 {PCIC_SATCOM, PCIS_SATCOM_VOICE, "sat voice"}, 3790 {PCIC_SATCOM, PCIS_SATCOM_DATA, "sat data"}, 3791 {PCIC_CRYPTO, -1, "encrypt/decrypt"}, 3792 {PCIC_CRYPTO, PCIS_CRYPTO_NETCOMP, "network/computer crypto"}, 3793 {PCIC_CRYPTO, PCIS_CRYPTO_ENTERTAIN, "entertainment crypto"}, 3794 {PCIC_DASP, -1, "dasp"}, 3795 {PCIC_DASP, PCIS_DASP_DPIO, "DPIO module"}, 3796 {0, 0, NULL} 3797 }; 3798 3799 void 3800 pci_probe_nomatch(device_t dev, device_t child) 3801 { 3802 int i; 3803 const char *cp, *scp; 3804 char *device; 3805 3806 /* 3807 * Look for a listing for this device in a loaded device database. 3808 */ 3809 if ((device = pci_describe_device(child)) != NULL) { 3810 device_printf(dev, "<%s>", device); 3811 free(device, M_DEVBUF); 3812 } else { 3813 /* 3814 * Scan the class/subclass descriptions for a general 3815 * description. 3816 */ 3817 cp = "unknown"; 3818 scp = NULL; 3819 for (i = 0; pci_nomatch_tab[i].desc != NULL; i++) { 3820 if (pci_nomatch_tab[i].class == pci_get_class(child)) { 3821 if (pci_nomatch_tab[i].subclass == -1) { 3822 cp = pci_nomatch_tab[i].desc; 3823 } else if (pci_nomatch_tab[i].subclass == 3824 pci_get_subclass(child)) { 3825 scp = pci_nomatch_tab[i].desc; 3826 } 3827 } 3828 } 3829 device_printf(dev, "<%s%s%s>", 3830 cp ? cp : "", 3831 ((cp != NULL) && (scp != NULL)) ? ", " : "", 3832 scp ? scp : ""); 3833 } 3834 printf(" at device %d.%d (no driver attached)\n", 3835 pci_get_slot(child), pci_get_function(child)); 3836 pci_cfg_save(child, device_get_ivars(child), 1); 3837 } 3838 3839 void 3840 pci_child_detached(device_t dev, device_t child) 3841 { 3842 struct pci_devinfo *dinfo; 3843 struct resource_list *rl; 3844 3845 dinfo = device_get_ivars(child); 3846 rl = &dinfo->resources; 3847 3848 /* 3849 * Have to deallocate IRQs before releasing any MSI messages and 3850 * have to release MSI messages before deallocating any memory 3851 * BARs. 3852 */ 3853 if (resource_list_release_active(rl, dev, child, SYS_RES_IRQ) != 0) 3854 pci_printf(&dinfo->cfg, "Device leaked IRQ resources\n"); 3855 if (dinfo->cfg.msi.msi_alloc != 0 || dinfo->cfg.msix.msix_alloc != 0) { 3856 pci_printf(&dinfo->cfg, "Device leaked MSI vectors\n"); 3857 (void)pci_release_msi(child); 3858 } 3859 if (resource_list_release_active(rl, dev, child, SYS_RES_MEMORY) != 0) 3860 pci_printf(&dinfo->cfg, "Device leaked memory resources\n"); 3861 if (resource_list_release_active(rl, dev, child, SYS_RES_IOPORT) != 0) 3862 pci_printf(&dinfo->cfg, "Device leaked I/O resources\n"); 3863 3864 pci_cfg_save(child, dinfo, 1); 3865 } 3866 3867 /* 3868 * Parse the PCI device database, if loaded, and return a pointer to a 3869 * description of the device. 3870 * 3871 * The database is flat text formatted as follows: 3872 * 3873 * Any line not in a valid format is ignored. 3874 * Lines are terminated with newline '\n' characters. 3875 * 3876 * A VENDOR line consists of the 4 digit (hex) vendor code, a TAB, then 3877 * the vendor name. 3878 * 3879 * A DEVICE line is entered immediately below the corresponding VENDOR ID. 3880 * - devices cannot be listed without a corresponding VENDOR line. 3881 * A DEVICE line consists of a TAB, the 4 digit (hex) device code, 3882 * another TAB, then the device name. 3883 */ 3884 3885 /* 3886 * Assuming (ptr) points to the beginning of a line in the database, 3887 * return the vendor or device and description of the next entry. 3888 * The value of (vendor) or (device) inappropriate for the entry type 3889 * is set to -1. Returns nonzero at the end of the database. 3890 * 3891 * Note that this is slightly unrobust in the face of corrupt data; 3892 * we attempt to safeguard against this by spamming the end of the 3893 * database with a newline when we initialise. 3894 */ 3895 static int 3896 pci_describe_parse_line(char **ptr, int *vendor, int *device, char **desc) 3897 { 3898 char *cp = *ptr; 3899 int left; 3900 3901 *device = -1; 3902 *vendor = -1; 3903 **desc = '\0'; 3904 for (;;) { 3905 left = pci_vendordata_size - (cp - pci_vendordata); 3906 if (left <= 0) { 3907 *ptr = cp; 3908 return(1); 3909 } 3910 3911 /* vendor entry? */ 3912 if (*cp != '\t' && 3913 sscanf(cp, "%x\t%80[^\n]", vendor, *desc) == 2) 3914 break; 3915 /* device entry? */ 3916 if (*cp == '\t' && 3917 sscanf(cp, "%x\t%80[^\n]", device, *desc) == 2) 3918 break; 3919 3920 /* skip to next line */ 3921 while (*cp != '\n' && left > 0) { 3922 cp++; 3923 left--; 3924 } 3925 if (*cp == '\n') { 3926 cp++; 3927 left--; 3928 } 3929 } 3930 /* skip to next line */ 3931 while (*cp != '\n' && left > 0) { 3932 cp++; 3933 left--; 3934 } 3935 if (*cp == '\n' && left > 0) 3936 cp++; 3937 *ptr = cp; 3938 return(0); 3939 } 3940 3941 static char * 3942 pci_describe_device(device_t dev) 3943 { 3944 int vendor, device; 3945 char *desc, *vp, *dp, *line; 3946 3947 desc = vp = dp = NULL; 3948 3949 /* 3950 * If we have no vendor data, we can't do anything. 3951 */ 3952 if (pci_vendordata == NULL) 3953 goto out; 3954 3955 /* 3956 * Scan the vendor data looking for this device 3957 */ 3958 line = pci_vendordata; 3959 if ((vp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL) 3960 goto out; 3961 for (;;) { 3962 if (pci_describe_parse_line(&line, &vendor, &device, &vp)) 3963 goto out; 3964 if (vendor == pci_get_vendor(dev)) 3965 break; 3966 } 3967 if ((dp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL) 3968 goto out; 3969 for (;;) { 3970 if (pci_describe_parse_line(&line, &vendor, &device, &dp)) { 3971 *dp = 0; 3972 break; 3973 } 3974 if (vendor != -1) { 3975 *dp = 0; 3976 break; 3977 } 3978 if (device == pci_get_device(dev)) 3979 break; 3980 } 3981 if (dp[0] == '\0') 3982 snprintf(dp, 80, "0x%x", pci_get_device(dev)); 3983 if ((desc = malloc(strlen(vp) + strlen(dp) + 3, M_DEVBUF, M_NOWAIT)) != 3984 NULL) 3985 sprintf(desc, "%s, %s", vp, dp); 3986 out: 3987 if (vp != NULL) 3988 free(vp, M_DEVBUF); 3989 if (dp != NULL) 3990 free(dp, M_DEVBUF); 3991 return(desc); 3992 } 3993 3994 int 3995 pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) 3996 { 3997 struct pci_devinfo *dinfo; 3998 pcicfgregs *cfg; 3999 4000 dinfo = device_get_ivars(child); 4001 cfg = &dinfo->cfg; 4002 4003 switch (which) { 4004 case PCI_IVAR_ETHADDR: 4005 /* 4006 * The generic accessor doesn't deal with failure, so 4007 * we set the return value, then return an error. 4008 */ 4009 *((uint8_t **) result) = NULL; 4010 return (EINVAL); 4011 case PCI_IVAR_SUBVENDOR: 4012 *result = cfg->subvendor; 4013 break; 4014 case PCI_IVAR_SUBDEVICE: 4015 *result = cfg->subdevice; 4016 break; 4017 case PCI_IVAR_VENDOR: 4018 *result = cfg->vendor; 4019 break; 4020 case PCI_IVAR_DEVICE: 4021 *result = cfg->device; 4022 break; 4023 case PCI_IVAR_DEVID: 4024 *result = (cfg->device << 16) | cfg->vendor; 4025 break; 4026 case PCI_IVAR_CLASS: 4027 *result = cfg->baseclass; 4028 break; 4029 case PCI_IVAR_SUBCLASS: 4030 *result = cfg->subclass; 4031 break; 4032 case PCI_IVAR_PROGIF: 4033 *result = cfg->progif; 4034 break; 4035 case PCI_IVAR_REVID: 4036 *result = cfg->revid; 4037 break; 4038 case PCI_IVAR_INTPIN: 4039 *result = cfg->intpin; 4040 break; 4041 case PCI_IVAR_IRQ: 4042 *result = cfg->intline; 4043 break; 4044 case PCI_IVAR_DOMAIN: 4045 *result = cfg->domain; 4046 break; 4047 case PCI_IVAR_BUS: 4048 *result = cfg->bus; 4049 break; 4050 case PCI_IVAR_SLOT: 4051 *result = cfg->slot; 4052 break; 4053 case PCI_IVAR_FUNCTION: 4054 *result = cfg->func; 4055 break; 4056 case PCI_IVAR_CMDREG: 4057 *result = cfg->cmdreg; 4058 break; 4059 case PCI_IVAR_CACHELNSZ: 4060 *result = cfg->cachelnsz; 4061 break; 4062 case PCI_IVAR_MINGNT: 4063 *result = cfg->mingnt; 4064 break; 4065 case PCI_IVAR_MAXLAT: 4066 *result = cfg->maxlat; 4067 break; 4068 case PCI_IVAR_LATTIMER: 4069 *result = cfg->lattimer; 4070 break; 4071 default: 4072 return (ENOENT); 4073 } 4074 return (0); 4075 } 4076 4077 int 4078 pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value) 4079 { 4080 struct pci_devinfo *dinfo; 4081 4082 dinfo = device_get_ivars(child); 4083 4084 switch (which) { 4085 case PCI_IVAR_INTPIN: 4086 dinfo->cfg.intpin = value; 4087 return (0); 4088 case PCI_IVAR_ETHADDR: 4089 case PCI_IVAR_SUBVENDOR: 4090 case PCI_IVAR_SUBDEVICE: 4091 case PCI_IVAR_VENDOR: 4092 case PCI_IVAR_DEVICE: 4093 case PCI_IVAR_DEVID: 4094 case PCI_IVAR_CLASS: 4095 case PCI_IVAR_SUBCLASS: 4096 case PCI_IVAR_PROGIF: 4097 case PCI_IVAR_REVID: 4098 case PCI_IVAR_IRQ: 4099 case PCI_IVAR_DOMAIN: 4100 case PCI_IVAR_BUS: 4101 case PCI_IVAR_SLOT: 4102 case PCI_IVAR_FUNCTION: 4103 return (EINVAL); /* disallow for now */ 4104 4105 default: 4106 return (ENOENT); 4107 } 4108 } 4109 4110 #include "opt_ddb.h" 4111 #ifdef DDB 4112 #include <ddb/ddb.h> 4113 #include <sys/cons.h> 4114 4115 /* 4116 * List resources based on pci map registers, used for within ddb 4117 */ 4118 4119 DB_SHOW_COMMAND(pciregs, db_pci_dump) 4120 { 4121 struct pci_devinfo *dinfo; 4122 struct devlist *devlist_head; 4123 struct pci_conf *p; 4124 const char *name; 4125 int i, error, none_count; 4126 4127 none_count = 0; 4128 /* get the head of the device queue */ 4129 devlist_head = &pci_devq; 4130 4131 /* 4132 * Go through the list of devices and print out devices 4133 */ 4134 for (error = 0, i = 0, 4135 dinfo = STAILQ_FIRST(devlist_head); 4136 (dinfo != NULL) && (error == 0) && (i < pci_numdevs) && !db_pager_quit; 4137 dinfo = STAILQ_NEXT(dinfo, pci_links), i++) { 4138 4139 /* Populate pd_name and pd_unit */ 4140 name = NULL; 4141 if (dinfo->cfg.dev) 4142 name = device_get_name(dinfo->cfg.dev); 4143 4144 p = &dinfo->conf; 4145 db_printf("%s%d@pci%d:%d:%d:%d:\tclass=0x%06x card=0x%08x " 4146 "chip=0x%08x rev=0x%02x hdr=0x%02x\n", 4147 (name && *name) ? name : "none", 4148 (name && *name) ? (int)device_get_unit(dinfo->cfg.dev) : 4149 none_count++, 4150 p->pc_sel.pc_domain, p->pc_sel.pc_bus, p->pc_sel.pc_dev, 4151 p->pc_sel.pc_func, (p->pc_class << 16) | 4152 (p->pc_subclass << 8) | p->pc_progif, 4153 (p->pc_subdevice << 16) | p->pc_subvendor, 4154 (p->pc_device << 16) | p->pc_vendor, 4155 p->pc_revid, p->pc_hdr); 4156 } 4157 } 4158 #endif /* DDB */ 4159 4160 static struct resource * 4161 pci_reserve_map(device_t dev, device_t child, int type, int *rid, 4162 u_long start, u_long end, u_long count, u_int flags) 4163 { 4164 struct pci_devinfo *dinfo = device_get_ivars(child); 4165 struct resource_list *rl = &dinfo->resources; 4166 struct resource_list_entry *rle; 4167 struct resource *res; 4168 struct pci_map *pm; 4169 pci_addr_t map, testval; 4170 int mapsize; 4171 4172 res = NULL; 4173 pm = pci_find_bar(child, *rid); 4174 if (pm != NULL) { 4175 /* This is a BAR that we failed to allocate earlier. */ 4176 mapsize = pm->pm_size; 4177 map = pm->pm_value; 4178 } else { 4179 /* 4180 * Weed out the bogons, and figure out how large the 4181 * BAR/map is. BARs that read back 0 here are bogus 4182 * and unimplemented. Note: atapci in legacy mode are 4183 * special and handled elsewhere in the code. If you 4184 * have a atapci device in legacy mode and it fails 4185 * here, that other code is broken. 4186 */ 4187 pci_read_bar(child, *rid, &map, &testval); 4188 4189 /* 4190 * Determine the size of the BAR and ignore BARs with a size 4191 * of 0. Device ROM BARs use a different mask value. 4192 */ 4193 if (PCIR_IS_BIOS(&dinfo->cfg, *rid)) 4194 mapsize = pci_romsize(testval); 4195 else 4196 mapsize = pci_mapsize(testval); 4197 if (mapsize == 0) 4198 goto out; 4199 pm = pci_add_bar(child, *rid, map, mapsize); 4200 } 4201 4202 if (PCI_BAR_MEM(map) || PCIR_IS_BIOS(&dinfo->cfg, *rid)) { 4203 if (type != SYS_RES_MEMORY) { 4204 if (bootverbose) 4205 device_printf(dev, 4206 "child %s requested type %d for rid %#x," 4207 " but the BAR says it is an memio\n", 4208 device_get_nameunit(child), type, *rid); 4209 goto out; 4210 } 4211 } else { 4212 if (type != SYS_RES_IOPORT) { 4213 if (bootverbose) 4214 device_printf(dev, 4215 "child %s requested type %d for rid %#x," 4216 " but the BAR says it is an ioport\n", 4217 device_get_nameunit(child), type, *rid); 4218 goto out; 4219 } 4220 } 4221 4222 /* 4223 * For real BARs, we need to override the size that 4224 * the driver requests, because that's what the BAR 4225 * actually uses and we would otherwise have a 4226 * situation where we might allocate the excess to 4227 * another driver, which won't work. 4228 */ 4229 count = (pci_addr_t)1 << mapsize; 4230 if (RF_ALIGNMENT(flags) < mapsize) 4231 flags = (flags & ~RF_ALIGNMENT_MASK) | RF_ALIGNMENT_LOG2(mapsize); 4232 if (PCI_BAR_MEM(map) && (map & PCIM_BAR_MEM_PREFETCH)) 4233 flags |= RF_PREFETCHABLE; 4234 4235 /* 4236 * Allocate enough resource, and then write back the 4237 * appropriate BAR for that resource. 4238 */ 4239 res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child, type, rid, 4240 start, end, count, flags & ~RF_ACTIVE); 4241 if (res == NULL) { 4242 device_printf(child, 4243 "%#lx bytes of rid %#x res %d failed (%#lx, %#lx).\n", 4244 count, *rid, type, start, end); 4245 goto out; 4246 } 4247 resource_list_add(rl, type, *rid, start, end, count); 4248 rle = resource_list_find(rl, type, *rid); 4249 if (rle == NULL) 4250 panic("pci_reserve_map: unexpectedly can't find resource."); 4251 rle->res = res; 4252 rle->start = rman_get_start(res); 4253 rle->end = rman_get_end(res); 4254 rle->count = count; 4255 rle->flags = RLE_RESERVED; 4256 if (bootverbose) 4257 device_printf(child, 4258 "Lazy allocation of %#lx bytes rid %#x type %d at %#lx\n", 4259 count, *rid, type, rman_get_start(res)); 4260 map = rman_get_start(res); 4261 pci_write_bar(child, pm, map); 4262 out: 4263 return (res); 4264 } 4265 4266 struct resource * 4267 pci_alloc_resource(device_t dev, device_t child, int type, int *rid, 4268 u_long start, u_long end, u_long count, u_int flags) 4269 { 4270 struct pci_devinfo *dinfo; 4271 struct resource_list *rl; 4272 struct resource_list_entry *rle; 4273 struct resource *res; 4274 pcicfgregs *cfg; 4275 4276 if (device_get_parent(child) != dev) 4277 return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child, 4278 type, rid, start, end, count, flags)); 4279 4280 /* 4281 * Perform lazy resource allocation 4282 */ 4283 dinfo = device_get_ivars(child); 4284 rl = &dinfo->resources; 4285 cfg = &dinfo->cfg; 4286 switch (type) { 4287 case SYS_RES_IRQ: 4288 /* 4289 * Can't alloc legacy interrupt once MSI messages have 4290 * been allocated. 4291 */ 4292 if (*rid == 0 && (cfg->msi.msi_alloc > 0 || 4293 cfg->msix.msix_alloc > 0)) 4294 return (NULL); 4295 4296 /* 4297 * If the child device doesn't have an interrupt 4298 * routed and is deserving of an interrupt, try to 4299 * assign it one. 4300 */ 4301 if (*rid == 0 && !PCI_INTERRUPT_VALID(cfg->intline) && 4302 (cfg->intpin != 0)) 4303 pci_assign_interrupt(dev, child, 0); 4304 break; 4305 case SYS_RES_IOPORT: 4306 case SYS_RES_MEMORY: 4307 #ifdef NEW_PCIB 4308 /* 4309 * PCI-PCI bridge I/O window resources are not BARs. 4310 * For those allocations just pass the request up the 4311 * tree. 4312 */ 4313 if (cfg->hdrtype == PCIM_HDRTYPE_BRIDGE) { 4314 switch (*rid) { 4315 case PCIR_IOBASEL_1: 4316 case PCIR_MEMBASE_1: 4317 case PCIR_PMBASEL_1: 4318 /* 4319 * XXX: Should we bother creating a resource 4320 * list entry? 4321 */ 4322 return (bus_generic_alloc_resource(dev, child, 4323 type, rid, start, end, count, flags)); 4324 } 4325 } 4326 #endif 4327 /* Reserve resources for this BAR if needed. */ 4328 rle = resource_list_find(rl, type, *rid); 4329 if (rle == NULL) { 4330 res = pci_reserve_map(dev, child, type, rid, start, end, 4331 count, flags); 4332 if (res == NULL) 4333 return (NULL); 4334 } 4335 } 4336 return (resource_list_alloc(rl, dev, child, type, rid, 4337 start, end, count, flags)); 4338 } 4339 4340 int 4341 pci_release_resource(device_t dev, device_t child, int type, int rid, 4342 struct resource *r) 4343 { 4344 struct pci_devinfo *dinfo; 4345 struct resource_list *rl; 4346 pcicfgregs *cfg; 4347 4348 if (device_get_parent(child) != dev) 4349 return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child, 4350 type, rid, r)); 4351 4352 dinfo = device_get_ivars(child); 4353 cfg = &dinfo->cfg; 4354 #ifdef NEW_PCIB 4355 /* 4356 * PCI-PCI bridge I/O window resources are not BARs. For 4357 * those allocations just pass the request up the tree. 4358 */ 4359 if (cfg->hdrtype == PCIM_HDRTYPE_BRIDGE && 4360 (type == SYS_RES_IOPORT || type == SYS_RES_MEMORY)) { 4361 switch (rid) { 4362 case PCIR_IOBASEL_1: 4363 case PCIR_MEMBASE_1: 4364 case PCIR_PMBASEL_1: 4365 return (bus_generic_release_resource(dev, child, type, 4366 rid, r)); 4367 } 4368 } 4369 #endif 4370 4371 rl = &dinfo->resources; 4372 return (resource_list_release(rl, dev, child, type, rid, r)); 4373 } 4374 4375 int 4376 pci_activate_resource(device_t dev, device_t child, int type, int rid, 4377 struct resource *r) 4378 { 4379 struct pci_devinfo *dinfo; 4380 int error; 4381 4382 error = bus_generic_activate_resource(dev, child, type, rid, r); 4383 if (error) 4384 return (error); 4385 4386 /* Enable decoding in the command register when activating BARs. */ 4387 if (device_get_parent(child) == dev) { 4388 /* Device ROMs need their decoding explicitly enabled. */ 4389 dinfo = device_get_ivars(child); 4390 if (type == SYS_RES_MEMORY && PCIR_IS_BIOS(&dinfo->cfg, rid)) 4391 pci_write_bar(child, pci_find_bar(child, rid), 4392 rman_get_start(r) | PCIM_BIOS_ENABLE); 4393 switch (type) { 4394 case SYS_RES_IOPORT: 4395 case SYS_RES_MEMORY: 4396 error = PCI_ENABLE_IO(dev, child, type); 4397 break; 4398 } 4399 } 4400 return (error); 4401 } 4402 4403 int 4404 pci_deactivate_resource(device_t dev, device_t child, int type, 4405 int rid, struct resource *r) 4406 { 4407 struct pci_devinfo *dinfo; 4408 int error; 4409 4410 error = bus_generic_deactivate_resource(dev, child, type, rid, r); 4411 if (error) 4412 return (error); 4413 4414 /* Disable decoding for device ROMs. */ 4415 if (device_get_parent(child) == dev) { 4416 dinfo = device_get_ivars(child); 4417 if (type == SYS_RES_MEMORY && PCIR_IS_BIOS(&dinfo->cfg, rid)) 4418 pci_write_bar(child, pci_find_bar(child, rid), 4419 rman_get_start(r)); 4420 } 4421 return (0); 4422 } 4423 4424 void 4425 pci_delete_child(device_t dev, device_t child) 4426 { 4427 struct resource_list_entry *rle; 4428 struct resource_list *rl; 4429 struct pci_devinfo *dinfo; 4430 4431 dinfo = device_get_ivars(child); 4432 rl = &dinfo->resources; 4433 4434 if (device_is_attached(child)) 4435 device_detach(child); 4436 4437 /* Turn off access to resources we're about to free */ 4438 pci_write_config(child, PCIR_COMMAND, pci_read_config(child, 4439 PCIR_COMMAND, 2) & ~(PCIM_CMD_MEMEN | PCIM_CMD_PORTEN), 2); 4440 4441 /* Free all allocated resources */ 4442 STAILQ_FOREACH(rle, rl, link) { 4443 if (rle->res) { 4444 if (rman_get_flags(rle->res) & RF_ACTIVE || 4445 resource_list_busy(rl, rle->type, rle->rid)) { 4446 pci_printf(&dinfo->cfg, 4447 "Resource still owned, oops. " 4448 "(type=%d, rid=%d, addr=%lx)\n", 4449 rle->type, rle->rid, 4450 rman_get_start(rle->res)); 4451 bus_release_resource(child, rle->type, rle->rid, 4452 rle->res); 4453 } 4454 resource_list_unreserve(rl, dev, child, rle->type, 4455 rle->rid); 4456 } 4457 } 4458 resource_list_free(rl); 4459 4460 device_delete_child(dev, child); 4461 pci_freecfg(dinfo); 4462 } 4463 4464 void 4465 pci_delete_resource(device_t dev, device_t child, int type, int rid) 4466 { 4467 struct pci_devinfo *dinfo; 4468 struct resource_list *rl; 4469 struct resource_list_entry *rle; 4470 4471 if (device_get_parent(child) != dev) 4472 return; 4473 4474 dinfo = device_get_ivars(child); 4475 rl = &dinfo->resources; 4476 rle = resource_list_find(rl, type, rid); 4477 if (rle == NULL) 4478 return; 4479 4480 if (rle->res) { 4481 if (rman_get_flags(rle->res) & RF_ACTIVE || 4482 resource_list_busy(rl, type, rid)) { 4483 device_printf(dev, "delete_resource: " 4484 "Resource still owned by child, oops. " 4485 "(type=%d, rid=%d, addr=%lx)\n", 4486 type, rid, rman_get_start(rle->res)); 4487 return; 4488 } 4489 resource_list_unreserve(rl, dev, child, type, rid); 4490 } 4491 resource_list_delete(rl, type, rid); 4492 } 4493 4494 struct resource_list * 4495 pci_get_resource_list (device_t dev, device_t child) 4496 { 4497 struct pci_devinfo *dinfo = device_get_ivars(child); 4498 4499 return (&dinfo->resources); 4500 } 4501 4502 bus_dma_tag_t 4503 pci_get_dma_tag(device_t bus, device_t dev) 4504 { 4505 struct pci_softc *sc = device_get_softc(bus); 4506 4507 return (sc->sc_dma_tag); 4508 } 4509 4510 uint32_t 4511 pci_read_config_method(device_t dev, device_t child, int reg, int width) 4512 { 4513 struct pci_devinfo *dinfo = device_get_ivars(child); 4514 pcicfgregs *cfg = &dinfo->cfg; 4515 4516 return (PCIB_READ_CONFIG(device_get_parent(dev), 4517 cfg->bus, cfg->slot, cfg->func, reg, width)); 4518 } 4519 4520 void 4521 pci_write_config_method(device_t dev, device_t child, int reg, 4522 uint32_t val, int width) 4523 { 4524 struct pci_devinfo *dinfo = device_get_ivars(child); 4525 pcicfgregs *cfg = &dinfo->cfg; 4526 4527 PCIB_WRITE_CONFIG(device_get_parent(dev), 4528 cfg->bus, cfg->slot, cfg->func, reg, val, width); 4529 } 4530 4531 int 4532 pci_child_location_str_method(device_t dev, device_t child, char *buf, 4533 size_t buflen) 4534 { 4535 4536 snprintf(buf, buflen, "slot=%d function=%d", pci_get_slot(child), 4537 pci_get_function(child)); 4538 return (0); 4539 } 4540 4541 int 4542 pci_child_pnpinfo_str_method(device_t dev, device_t child, char *buf, 4543 size_t buflen) 4544 { 4545 struct pci_devinfo *dinfo; 4546 pcicfgregs *cfg; 4547 4548 dinfo = device_get_ivars(child); 4549 cfg = &dinfo->cfg; 4550 snprintf(buf, buflen, "vendor=0x%04x device=0x%04x subvendor=0x%04x " 4551 "subdevice=0x%04x class=0x%02x%02x%02x", cfg->vendor, cfg->device, 4552 cfg->subvendor, cfg->subdevice, cfg->baseclass, cfg->subclass, 4553 cfg->progif); 4554 return (0); 4555 } 4556 4557 int 4558 pci_assign_interrupt_method(device_t dev, device_t child) 4559 { 4560 struct pci_devinfo *dinfo = device_get_ivars(child); 4561 pcicfgregs *cfg = &dinfo->cfg; 4562 4563 return (PCIB_ROUTE_INTERRUPT(device_get_parent(dev), child, 4564 cfg->intpin)); 4565 } 4566 4567 static int 4568 pci_modevent(module_t mod, int what, void *arg) 4569 { 4570 static struct cdev *pci_cdev; 4571 4572 switch (what) { 4573 case MOD_LOAD: 4574 STAILQ_INIT(&pci_devq); 4575 pci_generation = 0; 4576 pci_cdev = make_dev(&pcicdev, 0, UID_ROOT, GID_WHEEL, 0644, 4577 "pci"); 4578 pci_load_vendor_data(); 4579 break; 4580 4581 case MOD_UNLOAD: 4582 destroy_dev(pci_cdev); 4583 break; 4584 } 4585 4586 return (0); 4587 } 4588 4589 static void 4590 pci_cfg_restore_pcie(device_t dev, struct pci_devinfo *dinfo) 4591 { 4592 #define WREG(n, v) pci_write_config(dev, pos + (n), (v), 2) 4593 struct pcicfg_pcie *cfg; 4594 int version, pos; 4595 4596 cfg = &dinfo->cfg.pcie; 4597 pos = cfg->pcie_location; 4598 4599 version = cfg->pcie_flags & PCIEM_FLAGS_VERSION; 4600 4601 WREG(PCIER_DEVICE_CTL, cfg->pcie_device_ctl); 4602 4603 if (version > 1 || cfg->pcie_type == PCIEM_TYPE_ROOT_PORT || 4604 cfg->pcie_type == PCIEM_TYPE_ENDPOINT || 4605 cfg->pcie_type == PCIEM_TYPE_LEGACY_ENDPOINT) 4606 WREG(PCIER_LINK_CTL, cfg->pcie_link_ctl); 4607 4608 if (version > 1 || (cfg->pcie_type == PCIEM_TYPE_ROOT_PORT || 4609 (cfg->pcie_type == PCIEM_TYPE_DOWNSTREAM_PORT && 4610 (cfg->pcie_flags & PCIEM_FLAGS_SLOT)))) 4611 WREG(PCIER_SLOT_CTL, cfg->pcie_slot_ctl); 4612 4613 if (version > 1 || cfg->pcie_type == PCIEM_TYPE_ROOT_PORT || 4614 cfg->pcie_type == PCIEM_TYPE_ROOT_EC) 4615 WREG(PCIER_ROOT_CTL, cfg->pcie_root_ctl); 4616 4617 if (version > 1) { 4618 WREG(PCIER_DEVICE_CTL2, cfg->pcie_device_ctl2); 4619 WREG(PCIER_LINK_CTL2, cfg->pcie_link_ctl2); 4620 WREG(PCIER_SLOT_CTL2, cfg->pcie_slot_ctl2); 4621 } 4622 #undef WREG 4623 } 4624 4625 static void 4626 pci_cfg_restore_pcix(device_t dev, struct pci_devinfo *dinfo) 4627 { 4628 pci_write_config(dev, dinfo->cfg.pcix.pcix_location + PCIXR_COMMAND, 4629 dinfo->cfg.pcix.pcix_command, 2); 4630 } 4631 4632 void 4633 pci_cfg_restore(device_t dev, struct pci_devinfo *dinfo) 4634 { 4635 4636 /* 4637 * Only do header type 0 devices. Type 1 devices are bridges, 4638 * which we know need special treatment. Type 2 devices are 4639 * cardbus bridges which also require special treatment. 4640 * Other types are unknown, and we err on the side of safety 4641 * by ignoring them. 4642 */ 4643 if ((dinfo->cfg.hdrtype & PCIM_HDRTYPE) != PCIM_HDRTYPE_NORMAL) 4644 return; 4645 4646 /* 4647 * Restore the device to full power mode. We must do this 4648 * before we restore the registers because moving from D3 to 4649 * D0 will cause the chip's BARs and some other registers to 4650 * be reset to some unknown power on reset values. Cut down 4651 * the noise on boot by doing nothing if we are already in 4652 * state D0. 4653 */ 4654 if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) 4655 pci_set_powerstate(dev, PCI_POWERSTATE_D0); 4656 pci_restore_bars(dev); 4657 pci_write_config(dev, PCIR_COMMAND, dinfo->cfg.cmdreg, 2); 4658 pci_write_config(dev, PCIR_INTLINE, dinfo->cfg.intline, 1); 4659 pci_write_config(dev, PCIR_INTPIN, dinfo->cfg.intpin, 1); 4660 pci_write_config(dev, PCIR_MINGNT, dinfo->cfg.mingnt, 1); 4661 pci_write_config(dev, PCIR_MAXLAT, dinfo->cfg.maxlat, 1); 4662 pci_write_config(dev, PCIR_CACHELNSZ, dinfo->cfg.cachelnsz, 1); 4663 pci_write_config(dev, PCIR_LATTIMER, dinfo->cfg.lattimer, 1); 4664 pci_write_config(dev, PCIR_PROGIF, dinfo->cfg.progif, 1); 4665 pci_write_config(dev, PCIR_REVID, dinfo->cfg.revid, 1); 4666 4667 /* 4668 * Restore extended capabilities for PCI-Express and PCI-X 4669 */ 4670 if (dinfo->cfg.pcie.pcie_location != 0) 4671 pci_cfg_restore_pcie(dev, dinfo); 4672 if (dinfo->cfg.pcix.pcix_location != 0) 4673 pci_cfg_restore_pcix(dev, dinfo); 4674 4675 /* Restore MSI and MSI-X configurations if they are present. */ 4676 if (dinfo->cfg.msi.msi_location != 0) 4677 pci_resume_msi(dev); 4678 if (dinfo->cfg.msix.msix_location != 0) 4679 pci_resume_msix(dev); 4680 } 4681 4682 static void 4683 pci_cfg_save_pcie(device_t dev, struct pci_devinfo *dinfo) 4684 { 4685 #define RREG(n) pci_read_config(dev, pos + (n), 2) 4686 struct pcicfg_pcie *cfg; 4687 int version, pos; 4688 4689 cfg = &dinfo->cfg.pcie; 4690 pos = cfg->pcie_location; 4691 4692 cfg->pcie_flags = RREG(PCIER_FLAGS); 4693 4694 version = cfg->pcie_flags & PCIEM_FLAGS_VERSION; 4695 4696 cfg->pcie_device_ctl = RREG(PCIER_DEVICE_CTL); 4697 4698 if (version > 1 || cfg->pcie_type == PCIEM_TYPE_ROOT_PORT || 4699 cfg->pcie_type == PCIEM_TYPE_ENDPOINT || 4700 cfg->pcie_type == PCIEM_TYPE_LEGACY_ENDPOINT) 4701 cfg->pcie_link_ctl = RREG(PCIER_LINK_CTL); 4702 4703 if (version > 1 || (cfg->pcie_type == PCIEM_TYPE_ROOT_PORT || 4704 (cfg->pcie_type == PCIEM_TYPE_DOWNSTREAM_PORT && 4705 (cfg->pcie_flags & PCIEM_FLAGS_SLOT)))) 4706 cfg->pcie_slot_ctl = RREG(PCIER_SLOT_CTL); 4707 4708 if (version > 1 || cfg->pcie_type == PCIEM_TYPE_ROOT_PORT || 4709 cfg->pcie_type == PCIEM_TYPE_ROOT_EC) 4710 cfg->pcie_root_ctl = RREG(PCIER_ROOT_CTL); 4711 4712 if (version > 1) { 4713 cfg->pcie_device_ctl2 = RREG(PCIER_DEVICE_CTL2); 4714 cfg->pcie_link_ctl2 = RREG(PCIER_LINK_CTL2); 4715 cfg->pcie_slot_ctl2 = RREG(PCIER_SLOT_CTL2); 4716 } 4717 #undef RREG 4718 } 4719 4720 static void 4721 pci_cfg_save_pcix(device_t dev, struct pci_devinfo *dinfo) 4722 { 4723 dinfo->cfg.pcix.pcix_command = pci_read_config(dev, 4724 dinfo->cfg.pcix.pcix_location + PCIXR_COMMAND, 2); 4725 } 4726 4727 void 4728 pci_cfg_save(device_t dev, struct pci_devinfo *dinfo, int setstate) 4729 { 4730 uint32_t cls; 4731 int ps; 4732 4733 /* 4734 * Only do header type 0 devices. Type 1 devices are bridges, which 4735 * we know need special treatment. Type 2 devices are cardbus bridges 4736 * which also require special treatment. Other types are unknown, and 4737 * we err on the side of safety by ignoring them. Powering down 4738 * bridges should not be undertaken lightly. 4739 */ 4740 if ((dinfo->cfg.hdrtype & PCIM_HDRTYPE) != PCIM_HDRTYPE_NORMAL) 4741 return; 4742 4743 /* 4744 * Some drivers apparently write to these registers w/o updating our 4745 * cached copy. No harm happens if we update the copy, so do so here 4746 * so we can restore them. The COMMAND register is modified by the 4747 * bus w/o updating the cache. This should represent the normally 4748 * writable portion of the 'defined' part of type 0 headers. In 4749 * theory we also need to save/restore the PCI capability structures 4750 * we know about, but apart from power we don't know any that are 4751 * writable. 4752 */ 4753 dinfo->cfg.subvendor = pci_read_config(dev, PCIR_SUBVEND_0, 2); 4754 dinfo->cfg.subdevice = pci_read_config(dev, PCIR_SUBDEV_0, 2); 4755 dinfo->cfg.vendor = pci_read_config(dev, PCIR_VENDOR, 2); 4756 dinfo->cfg.device = pci_read_config(dev, PCIR_DEVICE, 2); 4757 dinfo->cfg.cmdreg = pci_read_config(dev, PCIR_COMMAND, 2); 4758 dinfo->cfg.intline = pci_read_config(dev, PCIR_INTLINE, 1); 4759 dinfo->cfg.intpin = pci_read_config(dev, PCIR_INTPIN, 1); 4760 dinfo->cfg.mingnt = pci_read_config(dev, PCIR_MINGNT, 1); 4761 dinfo->cfg.maxlat = pci_read_config(dev, PCIR_MAXLAT, 1); 4762 dinfo->cfg.cachelnsz = pci_read_config(dev, PCIR_CACHELNSZ, 1); 4763 dinfo->cfg.lattimer = pci_read_config(dev, PCIR_LATTIMER, 1); 4764 dinfo->cfg.baseclass = pci_read_config(dev, PCIR_CLASS, 1); 4765 dinfo->cfg.subclass = pci_read_config(dev, PCIR_SUBCLASS, 1); 4766 dinfo->cfg.progif = pci_read_config(dev, PCIR_PROGIF, 1); 4767 dinfo->cfg.revid = pci_read_config(dev, PCIR_REVID, 1); 4768 4769 if (dinfo->cfg.pcie.pcie_location != 0) 4770 pci_cfg_save_pcie(dev, dinfo); 4771 4772 if (dinfo->cfg.pcix.pcix_location != 0) 4773 pci_cfg_save_pcix(dev, dinfo); 4774 4775 /* 4776 * don't set the state for display devices, base peripherals and 4777 * memory devices since bad things happen when they are powered down. 4778 * We should (a) have drivers that can easily detach and (b) use 4779 * generic drivers for these devices so that some device actually 4780 * attaches. We need to make sure that when we implement (a) we don't 4781 * power the device down on a reattach. 4782 */ 4783 cls = pci_get_class(dev); 4784 if (!setstate) 4785 return; 4786 switch (pci_do_power_nodriver) 4787 { 4788 case 0: /* NO powerdown at all */ 4789 return; 4790 case 1: /* Conservative about what to power down */ 4791 if (cls == PCIC_STORAGE) 4792 return; 4793 /*FALLTHROUGH*/ 4794 case 2: /* Agressive about what to power down */ 4795 if (cls == PCIC_DISPLAY || cls == PCIC_MEMORY || 4796 cls == PCIC_BASEPERIPH) 4797 return; 4798 /*FALLTHROUGH*/ 4799 case 3: /* Power down everything */ 4800 break; 4801 } 4802 /* 4803 * PCI spec says we can only go into D3 state from D0 state. 4804 * Transition from D[12] into D0 before going to D3 state. 4805 */ 4806 ps = pci_get_powerstate(dev); 4807 if (ps != PCI_POWERSTATE_D0 && ps != PCI_POWERSTATE_D3) 4808 pci_set_powerstate(dev, PCI_POWERSTATE_D0); 4809 if (pci_get_powerstate(dev) != PCI_POWERSTATE_D3) 4810 pci_set_powerstate(dev, PCI_POWERSTATE_D3); 4811 } 4812 4813 /* Wrapper APIs suitable for device driver use. */ 4814 void 4815 pci_save_state(device_t dev) 4816 { 4817 struct pci_devinfo *dinfo; 4818 4819 dinfo = device_get_ivars(dev); 4820 pci_cfg_save(dev, dinfo, 0); 4821 } 4822 4823 void 4824 pci_restore_state(device_t dev) 4825 { 4826 struct pci_devinfo *dinfo; 4827 4828 dinfo = device_get_ivars(dev); 4829 pci_cfg_restore(dev, dinfo); 4830 } 4831