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