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