pci.c revision 131459
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 131459 2004-07-02 13:42:36Z imp $");
31
32#include "opt_bus.h"
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/malloc.h>
37#include <sys/module.h>
38#include <sys/linker.h>
39#include <sys/fcntl.h>
40#include <sys/conf.h>
41#include <sys/kernel.h>
42#include <sys/queue.h>
43#include <sys/sysctl.h>
44#include <sys/types.h>
45
46#include <vm/vm.h>
47#include <vm/pmap.h>
48#include <vm/vm_extern.h>
49
50#include <sys/bus.h>
51#include <machine/bus.h>
52#include <sys/rman.h>
53#include <machine/resource.h>
54
55#include <sys/pciio.h>
56#include <dev/pci/pcireg.h>
57#include <dev/pci/pcivar.h>
58#include <dev/pci/pci_private.h>
59
60#include "pcib_if.h"
61#include "pci_if.h"
62
63static uint32_t		pci_mapbase(unsigned mapreg);
64static int		pci_maptype(unsigned mapreg);
65static int		pci_mapsize(unsigned testval);
66static int		pci_maprange(unsigned mapreg);
67static void		pci_fixancient(pcicfgregs *cfg);
68
69static int		pci_porten(device_t pcib, int b, int s, int f);
70static int		pci_memen(device_t pcib, int b, int s, int f);
71static int		pci_add_map(device_t pcib, device_t bus, device_t dev,
72			    int b, int s, int f, int reg,
73			    struct resource_list *rl);
74static void		pci_add_resources(device_t pcib, device_t bus,
75			    device_t dev);
76static int		pci_probe(device_t dev);
77static int		pci_attach(device_t dev);
78static void		pci_load_vendor_data(void);
79static int		pci_describe_parse_line(char **ptr, int *vendor,
80			    int *device, char **desc);
81static char		*pci_describe_device(device_t dev);
82static int		pci_modevent(module_t mod, int what, void *arg);
83static void		pci_hdrtypedata(device_t pcib, int b, int s, int f,
84			    pcicfgregs *cfg);
85static void		pci_read_extcap(device_t pcib, pcicfgregs *cfg);
86static void		pci_cfg_restore(device_t, struct pci_devinfo *);
87static void		pci_cfg_save(device_t, struct pci_devinfo *, int);
88
89static device_method_t pci_methods[] = {
90	/* Device interface */
91	DEVMETHOD(device_probe,		pci_probe),
92	DEVMETHOD(device_attach,	pci_attach),
93	DEVMETHOD(device_shutdown,	bus_generic_shutdown),
94	DEVMETHOD(device_suspend,	pci_suspend),
95	DEVMETHOD(device_resume,	pci_resume),
96
97	/* Bus interface */
98	DEVMETHOD(bus_print_child,	pci_print_child),
99	DEVMETHOD(bus_probe_nomatch,	pci_probe_nomatch),
100	DEVMETHOD(bus_read_ivar,	pci_read_ivar),
101	DEVMETHOD(bus_write_ivar,	pci_write_ivar),
102	DEVMETHOD(bus_driver_added,	pci_driver_added),
103	DEVMETHOD(bus_setup_intr,	bus_generic_setup_intr),
104	DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
105
106	DEVMETHOD(bus_get_resource_list,pci_get_resource_list),
107	DEVMETHOD(bus_set_resource,	bus_generic_rl_set_resource),
108	DEVMETHOD(bus_get_resource,	bus_generic_rl_get_resource),
109	DEVMETHOD(bus_delete_resource,	pci_delete_resource),
110	DEVMETHOD(bus_alloc_resource,	pci_alloc_resource),
111	DEVMETHOD(bus_release_resource,	bus_generic_rl_release_resource),
112	DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
113	DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
114	DEVMETHOD(bus_child_pnpinfo_str, pci_child_pnpinfo_str_method),
115	DEVMETHOD(bus_child_location_str, pci_child_location_str_method),
116
117	/* PCI interface */
118	DEVMETHOD(pci_read_config,	pci_read_config_method),
119	DEVMETHOD(pci_write_config,	pci_write_config_method),
120	DEVMETHOD(pci_enable_busmaster,	pci_enable_busmaster_method),
121	DEVMETHOD(pci_disable_busmaster, pci_disable_busmaster_method),
122	DEVMETHOD(pci_enable_io,	pci_enable_io_method),
123	DEVMETHOD(pci_disable_io,	pci_disable_io_method),
124	DEVMETHOD(pci_get_powerstate,	pci_get_powerstate_method),
125	DEVMETHOD(pci_set_powerstate,	pci_set_powerstate_method),
126	DEVMETHOD(pci_assign_interrupt,	pci_assign_interrupt_method),
127
128	{ 0, 0 }
129};
130
131DEFINE_CLASS_0(pci, pci_driver, pci_methods, 0);
132
133devclass_t	pci_devclass;
134DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, 0);
135MODULE_VERSION(pci, 1);
136
137static char	*pci_vendordata;
138static size_t	pci_vendordata_size;
139
140
141struct pci_quirk {
142	uint32_t devid;	/* Vendor/device of the card */
143	int	type;
144#define PCI_QUIRK_MAP_REG	1 /* PCI map register in weird place */
145	int	arg1;
146	int	arg2;
147};
148
149struct pci_quirk pci_quirks[] = {
150	/* The Intel 82371AB and 82443MX has a map register at offset 0x90. */
151	{ 0x71138086, PCI_QUIRK_MAP_REG,	0x90,	 0 },
152	{ 0x719b8086, PCI_QUIRK_MAP_REG,	0x90,	 0 },
153	/* As does the Serverworks OSB4 (the SMBus mapping register) */
154	{ 0x02001166, PCI_QUIRK_MAP_REG,	0x90,	 0 },
155
156	{ 0 }
157};
158
159/* map register information */
160#define PCI_MAPMEM	0x01	/* memory map */
161#define PCI_MAPMEMP	0x02	/* prefetchable memory map */
162#define PCI_MAPPORT	0x04	/* port map */
163
164struct devlist pci_devq;
165uint32_t pci_generation;
166uint32_t pci_numdevs = 0;
167
168/* sysctl vars */
169SYSCTL_NODE(_hw, OID_AUTO, pci, CTLFLAG_RD, 0, "PCI bus tuning parameters");
170
171static int pci_enable_io_modes = 1;
172TUNABLE_INT("hw.pci.enable_io_modes", (int *)&pci_enable_io_modes);
173SYSCTL_INT(_hw_pci, OID_AUTO, enable_io_modes, CTLFLAG_RW,
174    &pci_enable_io_modes, 1,
175    "Enable I/O and memory bits in the config register.  Some BIOSes do not\n\
176enable these bits correctly.  We'd like to do this all the time, but there\n\
177are some peripherals that this causes problems with.");
178
179static int pci_do_powerstate = 0;
180TUNABLE_INT("hw.pci.do_powerstate", (int *)&pci_do_powerstate);
181SYSCTL_INT(_hw_pci, OID_AUTO, do_powerstate, CTLFLAG_RW,
182    &pci_do_powerstate, 0,
183    "Power down devices into D3 state when no driver attaches to them.\n\
184Otherwise, leave the device in D0 state when no driver attaches.");
185
186/* Find a device_t by bus/slot/function */
187
188device_t
189pci_find_bsf(uint8_t bus, uint8_t slot, uint8_t func)
190{
191	struct pci_devinfo *dinfo;
192
193	STAILQ_FOREACH(dinfo, &pci_devq, pci_links) {
194		if ((dinfo->cfg.bus == bus) &&
195		    (dinfo->cfg.slot == slot) &&
196		    (dinfo->cfg.func == func)) {
197			return (dinfo->cfg.dev);
198		}
199	}
200
201	return (NULL);
202}
203
204/* Find a device_t by vendor/device ID */
205
206device_t
207pci_find_device(uint16_t vendor, uint16_t device)
208{
209	struct pci_devinfo *dinfo;
210
211	STAILQ_FOREACH(dinfo, &pci_devq, pci_links) {
212		if ((dinfo->cfg.vendor == vendor) &&
213		    (dinfo->cfg.device == device)) {
214			return (dinfo->cfg.dev);
215		}
216	}
217
218	return (NULL);
219}
220
221/* return base address of memory or port map */
222
223static uint32_t
224pci_mapbase(unsigned mapreg)
225{
226	int mask = 0x03;
227	if ((mapreg & 0x01) == 0)
228		mask = 0x0f;
229	return (mapreg & ~mask);
230}
231
232/* return map type of memory or port map */
233
234static int
235pci_maptype(unsigned mapreg)
236{
237	static uint8_t maptype[0x10] = {
238		PCI_MAPMEM,		PCI_MAPPORT,
239		PCI_MAPMEM,		0,
240		PCI_MAPMEM,		PCI_MAPPORT,
241		0,			0,
242		PCI_MAPMEM|PCI_MAPMEMP,	PCI_MAPPORT,
243		PCI_MAPMEM|PCI_MAPMEMP, 0,
244		PCI_MAPMEM|PCI_MAPMEMP,	PCI_MAPPORT,
245		0,			0,
246	};
247
248	return maptype[mapreg & 0x0f];
249}
250
251/* return log2 of map size decoded for memory or port map */
252
253static int
254pci_mapsize(unsigned testval)
255{
256	int ln2size;
257
258	testval = pci_mapbase(testval);
259	ln2size = 0;
260	if (testval != 0) {
261		while ((testval & 1) == 0)
262		{
263			ln2size++;
264			testval >>= 1;
265		}
266	}
267	return (ln2size);
268}
269
270/* return log2 of address range supported by map register */
271
272static int
273pci_maprange(unsigned mapreg)
274{
275	int ln2range = 0;
276	switch (mapreg & 0x07) {
277	case 0x00:
278	case 0x01:
279	case 0x05:
280		ln2range = 32;
281		break;
282	case 0x02:
283		ln2range = 20;
284		break;
285	case 0x04:
286		ln2range = 64;
287		break;
288	}
289	return (ln2range);
290}
291
292/* adjust some values from PCI 1.0 devices to match 2.0 standards ... */
293
294static void
295pci_fixancient(pcicfgregs *cfg)
296{
297	if (cfg->hdrtype != 0)
298		return;
299
300	/* PCI to PCI bridges use header type 1 */
301	if (cfg->baseclass == PCIC_BRIDGE && cfg->subclass == PCIS_BRIDGE_PCI)
302		cfg->hdrtype = 1;
303}
304
305/* extract header type specific config data */
306
307static void
308pci_hdrtypedata(device_t pcib, int b, int s, int f, pcicfgregs *cfg)
309{
310#define REG(n, w)	PCIB_READ_CONFIG(pcib, b, s, f, n, w)
311	switch (cfg->hdrtype) {
312	case 0:
313		cfg->subvendor      = REG(PCIR_SUBVEND_0, 2);
314		cfg->subdevice      = REG(PCIR_SUBDEV_0, 2);
315		cfg->nummaps	    = PCI_MAXMAPS_0;
316		break;
317	case 1:
318		cfg->subvendor      = REG(PCIR_SUBVEND_1, 2);
319		cfg->subdevice      = REG(PCIR_SUBDEV_1, 2);
320		cfg->nummaps	    = PCI_MAXMAPS_1;
321		break;
322	case 2:
323		cfg->subvendor      = REG(PCIR_SUBVEND_2, 2);
324		cfg->subdevice      = REG(PCIR_SUBDEV_2, 2);
325		cfg->nummaps	    = PCI_MAXMAPS_2;
326		break;
327	}
328#undef REG
329}
330
331/* read configuration header into pcicfgregs structure */
332
333struct pci_devinfo *
334pci_read_device(device_t pcib, int b, int s, int f, size_t size)
335{
336#define REG(n, w)	PCIB_READ_CONFIG(pcib, b, s, f, n, w)
337	pcicfgregs *cfg = NULL;
338	struct pci_devinfo *devlist_entry;
339	struct devlist *devlist_head;
340
341	devlist_head = &pci_devq;
342
343	devlist_entry = NULL;
344
345	if (REG(PCIR_DEVVENDOR, 4) != -1) {
346		devlist_entry = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO);
347		if (devlist_entry == NULL)
348			return (NULL);
349
350		cfg = &devlist_entry->cfg;
351
352		cfg->bus		= b;
353		cfg->slot		= s;
354		cfg->func		= f;
355		cfg->vendor		= REG(PCIR_VENDOR, 2);
356		cfg->device		= REG(PCIR_DEVICE, 2);
357		cfg->cmdreg		= REG(PCIR_COMMAND, 2);
358		cfg->statreg		= REG(PCIR_STATUS, 2);
359		cfg->baseclass		= REG(PCIR_CLASS, 1);
360		cfg->subclass		= REG(PCIR_SUBCLASS, 1);
361		cfg->progif		= REG(PCIR_PROGIF, 1);
362		cfg->revid		= REG(PCIR_REVID, 1);
363		cfg->hdrtype		= REG(PCIR_HDRTYPE, 1);
364		cfg->cachelnsz		= REG(PCIR_CACHELNSZ, 1);
365		cfg->lattimer		= REG(PCIR_LATTIMER, 1);
366		cfg->intpin		= REG(PCIR_INTPIN, 1);
367		cfg->intline		= REG(PCIR_INTLINE, 1);
368
369		cfg->mingnt		= REG(PCIR_MINGNT, 1);
370		cfg->maxlat		= REG(PCIR_MAXLAT, 1);
371
372		cfg->mfdev		= (cfg->hdrtype & PCIM_MFDEV) != 0;
373		cfg->hdrtype		&= ~PCIM_MFDEV;
374
375		pci_fixancient(cfg);
376		pci_hdrtypedata(pcib, b, s, f, cfg);
377
378		if (REG(PCIR_STATUS, 2) & PCIM_STATUS_CAPPRESENT)
379			pci_read_extcap(pcib, cfg);
380
381		STAILQ_INSERT_TAIL(devlist_head, devlist_entry, pci_links);
382
383		devlist_entry->conf.pc_sel.pc_bus = cfg->bus;
384		devlist_entry->conf.pc_sel.pc_dev = cfg->slot;
385		devlist_entry->conf.pc_sel.pc_func = cfg->func;
386		devlist_entry->conf.pc_hdr = cfg->hdrtype;
387
388		devlist_entry->conf.pc_subvendor = cfg->subvendor;
389		devlist_entry->conf.pc_subdevice = cfg->subdevice;
390		devlist_entry->conf.pc_vendor = cfg->vendor;
391		devlist_entry->conf.pc_device = cfg->device;
392
393		devlist_entry->conf.pc_class = cfg->baseclass;
394		devlist_entry->conf.pc_subclass = cfg->subclass;
395		devlist_entry->conf.pc_progif = cfg->progif;
396		devlist_entry->conf.pc_revid = cfg->revid;
397
398		pci_numdevs++;
399		pci_generation++;
400	}
401	return (devlist_entry);
402#undef REG
403}
404
405static void
406pci_read_extcap(device_t pcib, pcicfgregs *cfg)
407{
408#define REG(n, w)	PCIB_READ_CONFIG(pcib, cfg->bus, cfg->slot, cfg->func, n, w)
409	int	ptr, nextptr, ptrptr;
410
411	switch (cfg->hdrtype & PCIM_HDRTYPE) {
412	case 0:
413		ptrptr = PCIR_CAP_PTR;
414		break;
415	case 2:
416		ptrptr = 0x14;
417		break;
418	default:
419		return;		/* no extended capabilities support */
420	}
421	nextptr = REG(ptrptr, 1);	/* sanity check? */
422
423	/*
424	 * Read capability entries.
425	 */
426	while (nextptr != 0) {
427		/* Sanity check */
428		if (nextptr > 255) {
429			printf("illegal PCI extended capability offset %d\n",
430			    nextptr);
431			return;
432		}
433		/* Find the next entry */
434		ptr = nextptr;
435		nextptr = REG(ptr + 1, 1);
436
437		/* Process this entry */
438		switch (REG(ptr, 1)) {
439		case PCIY_PMG:		/* PCI power management */
440			if (cfg->pp.pp_cap == 0) {
441				cfg->pp.pp_cap = REG(ptr + PCIR_POWER_CAP, 2);
442				cfg->pp.pp_status = ptr + PCIR_POWER_STATUS;
443				cfg->pp.pp_pmcsr = ptr + PCIR_POWER_PMCSR;
444				if ((nextptr - ptr) > PCIR_POWER_DATA)
445					cfg->pp.pp_data = ptr + PCIR_POWER_DATA;
446			}
447			break;
448		case PCIY_MSI:		/* PCI MSI */
449			cfg->msi.msi_ctrl = REG(ptr + PCIR_MSI_CTRL, 2);
450			if (cfg->msi.msi_ctrl & PCIM_MSICTRL_64BIT)
451				cfg->msi.msi_data = PCIR_MSI_DATA_64BIT;
452			else
453				cfg->msi.msi_data = PCIR_MSI_DATA;
454			cfg->msi.msi_msgnum = 1 << ((cfg->msi.msi_ctrl &
455						     PCIM_MSICTRL_MMC_MASK)>>1);
456		default:
457			break;
458		}
459	}
460#undef REG
461}
462
463/* free pcicfgregs structure and all depending data structures */
464
465int
466pci_freecfg(struct pci_devinfo *dinfo)
467{
468	struct devlist *devlist_head;
469
470	devlist_head = &pci_devq;
471
472	STAILQ_REMOVE(devlist_head, dinfo, pci_devinfo, pci_links);
473	free(dinfo, M_DEVBUF);
474
475	/* increment the generation count */
476	pci_generation++;
477
478	/* we're losing one device */
479	pci_numdevs--;
480	return (0);
481}
482
483/*
484 * PCI power manangement
485 */
486int
487pci_set_powerstate_method(device_t dev, device_t child, int state)
488{
489	struct pci_devinfo *dinfo = device_get_ivars(child);
490	pcicfgregs *cfg = &dinfo->cfg;
491	uint16_t status;
492	int result;
493
494	/*
495	 * Dx -> Dx is a nop always.
496	 */
497	if (pci_get_powerstate(child) == state)
498		return (0);
499
500	if (cfg->pp.pp_cap != 0) {
501		status = PCI_READ_CONFIG(dev, child, cfg->pp.pp_status, 2)
502		    & ~PCIM_PSTAT_DMASK;
503		result = 0;
504		switch (state) {
505		case PCI_POWERSTATE_D0:
506			status |= PCIM_PSTAT_D0;
507			break;
508		case PCI_POWERSTATE_D1:
509			if (cfg->pp.pp_cap & PCIM_PCAP_D1SUPP) {
510				status |= PCIM_PSTAT_D1;
511			} else {
512				result = EOPNOTSUPP;
513			}
514			break;
515		case PCI_POWERSTATE_D2:
516			if (cfg->pp.pp_cap & PCIM_PCAP_D2SUPP) {
517				status |= PCIM_PSTAT_D2;
518			} else {
519				result = EOPNOTSUPP;
520			}
521			break;
522		case PCI_POWERSTATE_D3:
523			status |= PCIM_PSTAT_D3;
524			break;
525		default:
526			result = EINVAL;
527		}
528		if (result == 0)
529			PCI_WRITE_CONFIG(dev, child, cfg->pp.pp_status, status,
530					 2);
531	} else {
532		result = ENXIO;
533	}
534	return(result);
535}
536
537int
538pci_get_powerstate_method(device_t dev, device_t child)
539{
540	struct pci_devinfo *dinfo = device_get_ivars(child);
541	pcicfgregs *cfg = &dinfo->cfg;
542	uint16_t status;
543	int result;
544
545	if (cfg->pp.pp_cap != 0) {
546		status = PCI_READ_CONFIG(dev, child, cfg->pp.pp_status, 2);
547		switch (status & PCIM_PSTAT_DMASK) {
548		case PCIM_PSTAT_D0:
549			result = PCI_POWERSTATE_D0;
550			break;
551		case PCIM_PSTAT_D1:
552			result = PCI_POWERSTATE_D1;
553			break;
554		case PCIM_PSTAT_D2:
555			result = PCI_POWERSTATE_D2;
556			break;
557		case PCIM_PSTAT_D3:
558			result = PCI_POWERSTATE_D3;
559			break;
560		default:
561			result = PCI_POWERSTATE_UNKNOWN;
562			break;
563		}
564	} else {
565		/* No support, device is always at D0 */
566		result = PCI_POWERSTATE_D0;
567	}
568	return(result);
569}
570
571/*
572 * Some convenience functions for PCI device drivers.
573 */
574
575static __inline void
576pci_set_command_bit(device_t dev, device_t child, uint16_t bit)
577{
578	uint16_t	command;
579
580	command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
581	command |= bit;
582	PCI_WRITE_CONFIG(dev, child, PCIR_COMMAND, command, 2);
583}
584
585static __inline void
586pci_clear_command_bit(device_t dev, device_t child, uint16_t bit)
587{
588	uint16_t	command;
589
590	command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
591	command &= ~bit;
592	PCI_WRITE_CONFIG(dev, child, PCIR_COMMAND, command, 2);
593}
594
595int
596pci_enable_busmaster_method(device_t dev, device_t child)
597{
598	pci_set_command_bit(dev, child, PCIM_CMD_BUSMASTEREN);
599	return (0);
600}
601
602int
603pci_disable_busmaster_method(device_t dev, device_t child)
604{
605	pci_clear_command_bit(dev, child, PCIM_CMD_BUSMASTEREN);
606	return (0);
607}
608
609int
610pci_enable_io_method(device_t dev, device_t child, int space)
611{
612	uint16_t command;
613	uint16_t bit;
614	char *error;
615
616	bit = 0;
617	error = NULL;
618
619	switch(space) {
620	case SYS_RES_IOPORT:
621		bit = PCIM_CMD_PORTEN;
622		error = "port";
623		break;
624	case SYS_RES_MEMORY:
625		bit = PCIM_CMD_MEMEN;
626		error = "memory";
627		break;
628	default:
629		return (EINVAL);
630	}
631	pci_set_command_bit(dev, child, bit);
632	/* Some devices seem to need a brief stall here, what do to? */
633	command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
634	if (command & bit)
635		return (0);
636	device_printf(child, "failed to enable %s mapping!\n", error);
637	return (ENXIO);
638}
639
640int
641pci_disable_io_method(device_t dev, device_t child, int space)
642{
643	uint16_t command;
644	uint16_t bit;
645	char *error;
646
647	bit = 0;
648	error = NULL;
649
650	switch(space) {
651	case SYS_RES_IOPORT:
652		bit = PCIM_CMD_PORTEN;
653		error = "port";
654		break;
655	case SYS_RES_MEMORY:
656		bit = PCIM_CMD_MEMEN;
657		error = "memory";
658		break;
659	default:
660		return (EINVAL);
661	}
662	pci_clear_command_bit(dev, child, bit);
663	command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
664	if (command & bit) {
665		device_printf(child, "failed to disable %s mapping!\n", error);
666		return (ENXIO);
667	}
668	return (0);
669}
670
671/*
672 * New style pci driver.  Parent device is either a pci-host-bridge or a
673 * pci-pci-bridge.  Both kinds are represented by instances of pcib.
674 */
675
676void
677pci_print_verbose(struct pci_devinfo *dinfo)
678{
679	if (bootverbose) {
680		pcicfgregs *cfg = &dinfo->cfg;
681
682		printf("found->\tvendor=0x%04x, dev=0x%04x, revid=0x%02x\n",
683		    cfg->vendor, cfg->device, cfg->revid);
684		printf("\tbus=%d, slot=%d, func=%d\n",
685		    cfg->bus, cfg->slot, cfg->func);
686		printf("\tclass=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n",
687		    cfg->baseclass, cfg->subclass, cfg->progif, cfg->hdrtype,
688		    cfg->mfdev);
689		printf("\tcmdreg=0x%04x, statreg=0x%04x, cachelnsz=%d (dwords)\n",
690		    cfg->cmdreg, cfg->statreg, cfg->cachelnsz);
691		printf("\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), maxlat=0x%02x (%d ns)\n",
692		    cfg->lattimer, cfg->lattimer * 30, cfg->mingnt,
693		    cfg->mingnt * 250, cfg->maxlat, cfg->maxlat * 250);
694		if (cfg->intpin > 0)
695			printf("\tintpin=%c, irq=%d\n",
696			    cfg->intpin +'a' -1, cfg->intline);
697		if (cfg->pp.pp_cap) {
698			uint16_t status;
699
700			status = pci_read_config(cfg->dev, cfg->pp.pp_status, 2);
701			printf("\tpowerspec %d  supports D0%s%s D3  current D%d\n",
702			    cfg->pp.pp_cap & PCIM_PCAP_SPEC,
703			    cfg->pp.pp_cap & PCIM_PCAP_D1SUPP ? " D1" : "",
704			    cfg->pp.pp_cap & PCIM_PCAP_D2SUPP ? " D2" : "",
705			    status & PCIM_PSTAT_DMASK);
706		}
707		if (cfg->msi.msi_data) {
708			int ctrl;
709
710			ctrl =  cfg->msi.msi_ctrl;
711			printf("\tMSI supports %d message%s%s%s\n",
712			    cfg->msi.msi_msgnum,
713			    (cfg->msi.msi_msgnum == 1) ? "" : "s",
714			    (ctrl & PCIM_MSICTRL_64BIT) ? ", 64 bit" : "",
715			    (ctrl & PCIM_MSICTRL_VECTOR) ? ", vector masks":"");
716		}
717	}
718}
719
720static int
721pci_porten(device_t pcib, int b, int s, int f)
722{
723	return (PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2)
724		& PCIM_CMD_PORTEN) != 0;
725}
726
727static int
728pci_memen(device_t pcib, int b, int s, int f)
729{
730	return (PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2)
731		& PCIM_CMD_MEMEN) != 0;
732}
733
734/*
735 * Add a resource based on a pci map register. Return 1 if the map
736 * register is a 32bit map register or 2 if it is a 64bit register.
737 */
738static int
739pci_add_map(device_t pcib, device_t bus, device_t dev,
740    int b, int s, int f, int reg, struct resource_list *rl)
741{
742	uint32_t map;
743	uint64_t base;
744	uint64_t start, end, count;
745	uint8_t ln2size;
746	uint8_t ln2range;
747	uint32_t testval;
748	uint16_t cmd;
749	int type;
750
751	map = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4);
752	PCIB_WRITE_CONFIG(pcib, b, s, f, reg, 0xffffffff, 4);
753	testval = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4);
754	PCIB_WRITE_CONFIG(pcib, b, s, f, reg, map, 4);
755
756	if (pci_maptype(map) & PCI_MAPMEM)
757		type = SYS_RES_MEMORY;
758	else
759		type = SYS_RES_IOPORT;
760	ln2size = pci_mapsize(testval);
761	ln2range = pci_maprange(testval);
762	base = pci_mapbase(map);
763
764	/*
765	 * For I/O registers, if bottom bit is set, and the next bit up
766	 * isn't clear, we know we have a BAR that doesn't conform to the
767	 * spec, so ignore it.  Also, sanity check the size of the data
768	 * areas to the type of memory involved.  Memory must be at least
769	 * 32 bytes in size, while I/O ranges must be at least 4.
770	 */
771	if ((testval & 0x1) == 0x1 &&
772	    (testval & 0x2) != 0)
773		return (1);
774	if ((type == SYS_RES_MEMORY && ln2size < 5) ||
775	    (type == SYS_RES_IOPORT && ln2size < 2))
776		return (1);
777
778	if (ln2range == 64)
779		/* Read the other half of a 64bit map register */
780		base |= (uint64_t) PCIB_READ_CONFIG(pcib, b, s, f, reg + 4, 4) << 32;
781
782	if (bootverbose) {
783		printf("\tmap[%02x]: type %x, range %2d, base %08x, size %2d",
784		    reg, pci_maptype(map), ln2range,
785		    (unsigned int) base, ln2size);
786		if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f))
787			printf(", port disabled\n");
788		else if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f))
789			printf(", memory disabled\n");
790		else
791			printf(", enabled\n");
792	}
793
794	/*
795	 * This code theoretically does the right thing, but has
796	 * undesirable side effects in some cases where peripherals
797	 * respond oddly to having these bits enabled.  Let the user
798	 * be able to turn them off (since pci_enable_io_modes is 1 by
799	 * default).
800	 */
801	if (pci_enable_io_modes) {
802		/* Turn on resources that have been left off by a lazy BIOS */
803		if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f)) {
804			cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2);
805			cmd |= PCIM_CMD_PORTEN;
806			PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2);
807		}
808		if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f)) {
809			cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2);
810			cmd |= PCIM_CMD_MEMEN;
811			PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2);
812		}
813	} else {
814		if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f))
815			return (1);
816		if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f))
817			return (1);
818	}
819	/*
820	 * If base is 0, then we have problems.  It is best to ignore
821	 * such entires for the moment.  These will be allocated later if
822	 * the driver specifically requests them.
823	 */
824	if (base == 0)
825		return 1;
826
827	start = base;
828	end = base + (1 << ln2size) - 1;
829	count = 1 << ln2size;
830	resource_list_add(rl, type, reg, start, end, count);
831
832	/*
833	 * Not quite sure what to do on failure of allocating the resource
834	 * since I can postulate several right answers.
835	 */
836	resource_list_alloc(rl, bus, dev, type, &reg, start, end, count, 0);
837	return ((ln2range == 64) ? 2 : 1);
838}
839
840/*
841 * For ATA devices we need to decide early what addressing mode to use.
842 * Legacy demands that the primary and secondary ATA ports sits on the
843 * same addresses that old ISA hardware did. This dictates that we use
844 * those addresses and ignore the BAR's if we cannot set PCI native
845 * addressing mode.
846 */
847static void
848pci_ata_maps(device_t pcib, device_t bus, device_t dev, int b,
849	     int s, int f, struct resource_list *rl)
850{
851	int rid, type, progif;
852#if 0
853	/* if this device supports PCI native addressing use it */
854	progif = pci_read_config(dev, PCIR_PROGIF, 1);
855	if ((progif & 0x8a) == 0x8a) {
856		if (pci_mapbase(pci_read_config(dev, PCIR_BAR(0), 4)) &&
857		    pci_mapbase(pci_read_config(dev, PCIR_BAR(2), 4))) {
858			printf("Trying ATA native PCI addressing mode\n");
859			pci_write_config(dev, PCIR_PROGIF, progif | 0x05, 1);
860		}
861	}
862#endif
863	progif = pci_read_config(dev, PCIR_PROGIF, 1);
864	type = SYS_RES_IOPORT;
865	if (progif & PCIP_STORAGE_IDE_MODEPRIM) {
866		pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(0), rl);
867		pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(1), rl);
868	}
869	else {
870		rid = PCIR_BAR(0);
871		resource_list_add(rl, type, rid, 0x1f0, 0x1f7, 8);
872		resource_list_alloc(rl, bus, dev, type, &rid, 0x1f0, 0x1f7,8,0);
873		rid = PCIR_BAR(1);
874		resource_list_add(rl, type, rid, 0x3f6, 0x3f6, 1);
875		resource_list_alloc(rl, bus, dev, type, &rid, 0x3f6, 0x3f6,1,0);
876	}
877	if (progif & PCIP_STORAGE_IDE_MODESEC) {
878		pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(2), rl);
879		pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(3), rl);
880	}
881	else {
882		rid = PCIR_BAR(2);
883		resource_list_add(rl, type, rid, 0x170, 0x177, 8);
884		resource_list_alloc(rl, bus, dev, type, &rid, 0x170, 0x177,8,0);
885		rid = PCIR_BAR(3);
886		resource_list_add(rl, type, rid, 0x376, 0x376, 1);
887		resource_list_alloc(rl, bus, dev, type, &rid, 0x376, 0x376,1,0);
888	}
889	pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(4), rl);
890}
891
892static void
893pci_add_resources(device_t pcib, device_t bus, device_t dev)
894{
895	struct pci_devinfo *dinfo = device_get_ivars(dev);
896	pcicfgregs *cfg = &dinfo->cfg;
897	struct resource_list *rl = &dinfo->resources;
898	struct pci_quirk *q;
899	int b, i, irq, f, s;
900
901	b = cfg->bus;
902	s = cfg->slot;
903	f = cfg->func;
904
905	/* ATA devices needs special map treatment */
906	if ((pci_get_class(dev) == PCIC_STORAGE) &&
907	    (pci_get_subclass(dev) == PCIS_STORAGE_IDE) &&
908	    (pci_get_progif(dev) & PCIP_STORAGE_IDE_MASTERDEV))
909		pci_ata_maps(pcib, bus, dev, b, s, f, rl);
910	else
911		for (i = 0; i < cfg->nummaps;)
912			i += pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(i),
913			    rl);
914
915	for (q = &pci_quirks[0]; q->devid; q++) {
916		if (q->devid == ((cfg->device << 16) | cfg->vendor)
917		    && q->type == PCI_QUIRK_MAP_REG)
918			pci_add_map(pcib, bus, dev, b, s, f, q->arg1, rl);
919	}
920
921	if (cfg->intpin > 0 && PCI_INTERRUPT_VALID(cfg->intline)) {
922#if defined(__ia64__) || defined(__i386__) || defined(__amd64__)
923		/*
924		 * Try to re-route interrupts. Sometimes the BIOS or
925		 * firmware may leave bogus values in these registers.
926		 * If the re-route fails, then just stick with what we
927		 * have.
928		 */
929		irq = PCI_ASSIGN_INTERRUPT(bus, dev);
930		if (PCI_INTERRUPT_VALID(irq)) {
931			pci_write_config(dev, PCIR_INTLINE, irq, 1);
932			cfg->intline = irq;
933		} else
934#endif
935			irq = cfg->intline;
936		resource_list_add(rl, SYS_RES_IRQ, 0, irq, irq, 1);
937	}
938}
939
940void
941pci_add_children(device_t dev, int busno, size_t dinfo_size)
942{
943#define REG(n, w)	PCIB_READ_CONFIG(pcib, busno, s, f, n, w)
944	device_t pcib = device_get_parent(dev);
945	struct pci_devinfo *dinfo;
946	int maxslots;
947	int s, f, pcifunchigh;
948	uint8_t hdrtype;
949
950	KASSERT(dinfo_size >= sizeof(struct pci_devinfo),
951	    ("dinfo_size too small"));
952	maxslots = PCIB_MAXSLOTS(pcib);
953	for (s = 0; s <= maxslots; s++) {
954		pcifunchigh = 0;
955		f = 0;
956		hdrtype = REG(PCIR_HDRTYPE, 1);
957		if ((hdrtype & PCIM_HDRTYPE) > PCI_MAXHDRTYPE)
958			continue;
959		if (hdrtype & PCIM_MFDEV)
960			pcifunchigh = PCI_FUNCMAX;
961		for (f = 0; f <= pcifunchigh; f++) {
962			dinfo = pci_read_device(pcib, busno, s, f, dinfo_size);
963			if (dinfo != NULL) {
964				pci_add_child(dev, dinfo);
965			}
966		}
967	}
968#undef REG
969}
970
971void
972pci_add_child(device_t bus, struct pci_devinfo *dinfo)
973{
974	device_t pcib;
975
976	pcib = device_get_parent(bus);
977	dinfo->cfg.dev = device_add_child(bus, NULL, -1);
978	device_set_ivars(dinfo->cfg.dev, dinfo);
979	pci_cfg_save(dinfo->cfg.dev, dinfo, 0);
980	pci_cfg_restore(dinfo->cfg.dev, dinfo);
981	pci_add_resources(pcib, bus, dinfo->cfg.dev);
982	pci_print_verbose(dinfo);
983}
984
985static int
986pci_probe(device_t dev)
987{
988
989	device_set_desc(dev, "PCI bus");
990
991	/* Allow other subclasses to override this driver. */
992	return (-1000);
993}
994
995static int
996pci_attach(device_t dev)
997{
998	int busno;
999
1000	/*
1001	 * Since there can be multiple independantly numbered PCI
1002	 * busses on some large alpha systems, we can't use the unit
1003	 * number to decide what bus we are probing. We ask the parent
1004	 * pcib what our bus number is.
1005	 */
1006	busno = pcib_get_bus(dev);
1007	if (bootverbose)
1008		device_printf(dev, "physical bus=%d\n", busno);
1009
1010	pci_add_children(dev, busno, sizeof(struct pci_devinfo));
1011
1012	return (bus_generic_attach(dev));
1013}
1014
1015int
1016pci_suspend(device_t dev)
1017{
1018	int numdevs;
1019	device_t *devlist;
1020	device_t child;
1021	struct pci_devinfo *dinfo;
1022	int i;
1023
1024	/*
1025	 * Save the pci configuration space for each child.  We don't need
1026	 * to do this, unless the BIOS suspend code powers down the bus and
1027	 * the devices on the bus.
1028	 */
1029	device_get_children(dev, &devlist, &numdevs);
1030	for (i = 0; i < numdevs; i++) {
1031		child = devlist[i];
1032		dinfo = (struct pci_devinfo *) device_get_ivars(child);
1033		pci_cfg_save(child, dinfo, 0);
1034	}
1035	free(devlist, M_TEMP);
1036	return (bus_generic_suspend(dev));
1037}
1038
1039int
1040pci_resume(device_t dev)
1041{
1042	int numdevs;
1043	device_t *devlist;
1044	device_t child;
1045	struct pci_devinfo *dinfo;
1046	int i;
1047
1048	/*
1049	 * Restore the pci configuration space for each child.
1050	 */
1051	device_get_children(dev, &devlist, &numdevs);
1052	for (i = 0; i < numdevs; i++) {
1053		child = devlist[i];
1054		dinfo = (struct pci_devinfo *) device_get_ivars(child);
1055		pci_cfg_restore(child, dinfo);
1056	}
1057	free(devlist, M_TEMP);
1058	return (bus_generic_resume(dev));
1059}
1060
1061static void
1062pci_load_vendor_data(void)
1063{
1064	caddr_t vendordata, info;
1065
1066	if ((vendordata = preload_search_by_type("pci_vendor_data")) != NULL) {
1067		info = preload_search_info(vendordata, MODINFO_ADDR);
1068		pci_vendordata = *(char **)info;
1069		info = preload_search_info(vendordata, MODINFO_SIZE);
1070		pci_vendordata_size = *(size_t *)info;
1071		/* terminate the database */
1072		pci_vendordata[pci_vendordata_size] = '\n';
1073	}
1074}
1075
1076void
1077pci_driver_added(device_t dev, driver_t *driver)
1078{
1079	int numdevs;
1080	device_t *devlist;
1081	device_t child;
1082	struct pci_devinfo *dinfo;
1083	int i;
1084
1085	if (bootverbose)
1086		device_printf(dev, "driver added\n");
1087	DEVICE_IDENTIFY(driver, dev);
1088	device_get_children(dev, &devlist, &numdevs);
1089	for (i = 0; i < numdevs; i++) {
1090		child = devlist[i];
1091		if (device_get_state(child) != DS_NOTPRESENT)
1092			continue;
1093		dinfo = device_get_ivars(child);
1094		pci_print_verbose(dinfo);
1095/*XXX???*/	/* resource_list_init(&dinfo->cfg.resources); */
1096		if (bootverbose)
1097			printf("pci%d:%d:%d: reprobing on driver added\n",
1098			    dinfo->cfg.bus, dinfo->cfg.slot, dinfo->cfg.func);
1099		pci_cfg_restore(child, dinfo);
1100		if (device_probe_and_attach(child) != 0)
1101			pci_cfg_save(child, dinfo, 1);
1102	}
1103	free(devlist, M_TEMP);
1104}
1105
1106int
1107pci_print_child(device_t dev, device_t child)
1108{
1109	struct pci_devinfo *dinfo;
1110	struct resource_list *rl;
1111	int retval = 0;
1112
1113	dinfo = device_get_ivars(child);
1114	rl = &dinfo->resources;
1115
1116	retval += bus_print_child_header(dev, child);
1117
1118	retval += resource_list_print_type(rl, "port", SYS_RES_IOPORT, "%#lx");
1119	retval += resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx");
1120	retval += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld");
1121	if (device_get_flags(dev))
1122		retval += printf(" flags %#x", device_get_flags(dev));
1123
1124	retval += printf(" at device %d.%d", pci_get_slot(child),
1125	    pci_get_function(child));
1126
1127	retval += bus_print_child_footer(dev, child);
1128
1129	return (retval);
1130}
1131
1132static struct
1133{
1134	int	class;
1135	int	subclass;
1136	char	*desc;
1137} pci_nomatch_tab[] = {
1138	{PCIC_OLD,		-1,			"old"},
1139	{PCIC_OLD,		PCIS_OLD_NONVGA,	"non-VGA display device"},
1140	{PCIC_OLD,		PCIS_OLD_VGA,		"VGA-compatible display device"},
1141	{PCIC_STORAGE,		-1,			"mass storage"},
1142	{PCIC_STORAGE,		PCIS_STORAGE_SCSI,	"SCSI"},
1143	{PCIC_STORAGE,		PCIS_STORAGE_IDE,	"ATA"},
1144	{PCIC_STORAGE,		PCIS_STORAGE_FLOPPY,	"floppy disk"},
1145	{PCIC_STORAGE,		PCIS_STORAGE_IPI,	"IPI"},
1146	{PCIC_STORAGE,		PCIS_STORAGE_RAID,	"RAID"},
1147	{PCIC_NETWORK,		-1,			"network"},
1148	{PCIC_NETWORK,		PCIS_NETWORK_ETHERNET,	"ethernet"},
1149	{PCIC_NETWORK,		PCIS_NETWORK_TOKENRING,	"token ring"},
1150	{PCIC_NETWORK,		PCIS_NETWORK_FDDI,	"fddi"},
1151	{PCIC_NETWORK,		PCIS_NETWORK_ATM,	"ATM"},
1152	{PCIC_DISPLAY,		-1,			"display"},
1153	{PCIC_DISPLAY,		PCIS_DISPLAY_VGA,	"VGA"},
1154	{PCIC_DISPLAY,		PCIS_DISPLAY_XGA,	"XGA"},
1155	{PCIC_MULTIMEDIA,	-1,			"multimedia"},
1156	{PCIC_MULTIMEDIA,	PCIS_MULTIMEDIA_VIDEO,	"video"},
1157	{PCIC_MULTIMEDIA,	PCIS_MULTIMEDIA_AUDIO,	"audio"},
1158	{PCIC_MEMORY,		-1,			"memory"},
1159	{PCIC_MEMORY,		PCIS_MEMORY_RAM,	"RAM"},
1160	{PCIC_MEMORY,		PCIS_MEMORY_FLASH,	"flash"},
1161	{PCIC_BRIDGE,		-1,			"bridge"},
1162	{PCIC_BRIDGE,		PCIS_BRIDGE_HOST,	"HOST-PCI"},
1163	{PCIC_BRIDGE,		PCIS_BRIDGE_ISA,	"PCI-ISA"},
1164	{PCIC_BRIDGE,		PCIS_BRIDGE_EISA,	"PCI-EISA"},
1165	{PCIC_BRIDGE,		PCIS_BRIDGE_MCA,	"PCI-MCA"},
1166	{PCIC_BRIDGE,		PCIS_BRIDGE_PCI,	"PCI-PCI"},
1167	{PCIC_BRIDGE,		PCIS_BRIDGE_PCMCIA,	"PCI-PCMCIA"},
1168	{PCIC_BRIDGE,		PCIS_BRIDGE_NUBUS,	"PCI-NuBus"},
1169	{PCIC_BRIDGE,		PCIS_BRIDGE_CARDBUS,	"PCI-CardBus"},
1170	{PCIC_BRIDGE,		PCIS_BRIDGE_OTHER,	"PCI-unknown"},
1171	{PCIC_SIMPLECOMM,	-1,			"simple comms"},
1172	{PCIC_SIMPLECOMM,	PCIS_SIMPLECOMM_UART,	"UART"},	/* could detect 16550 */
1173	{PCIC_SIMPLECOMM,	PCIS_SIMPLECOMM_PAR,	"parallel port"},
1174	{PCIC_BASEPERIPH,	-1,			"base peripheral"},
1175	{PCIC_BASEPERIPH,	PCIS_BASEPERIPH_PIC,	"interrupt controller"},
1176	{PCIC_BASEPERIPH,	PCIS_BASEPERIPH_DMA,	"DMA controller"},
1177	{PCIC_BASEPERIPH,	PCIS_BASEPERIPH_TIMER,	"timer"},
1178	{PCIC_BASEPERIPH,	PCIS_BASEPERIPH_RTC,	"realtime clock"},
1179	{PCIC_INPUTDEV,		-1,			"input device"},
1180	{PCIC_INPUTDEV,		PCIS_INPUTDEV_KEYBOARD,	"keyboard"},
1181	{PCIC_INPUTDEV,		PCIS_INPUTDEV_DIGITIZER,"digitizer"},
1182	{PCIC_INPUTDEV,		PCIS_INPUTDEV_MOUSE,	"mouse"},
1183	{PCIC_DOCKING,		-1,			"docking station"},
1184	{PCIC_PROCESSOR,	-1,			"processor"},
1185	{PCIC_SERIALBUS,	-1,			"serial bus"},
1186	{PCIC_SERIALBUS,	PCIS_SERIALBUS_FW,	"FireWire"},
1187	{PCIC_SERIALBUS,	PCIS_SERIALBUS_ACCESS,	"AccessBus"},
1188	{PCIC_SERIALBUS,	PCIS_SERIALBUS_SSA,	"SSA"},
1189	{PCIC_SERIALBUS,	PCIS_SERIALBUS_USB,	"USB"},
1190	{PCIC_SERIALBUS,	PCIS_SERIALBUS_FC,	"Fibre Channel"},
1191	{PCIC_SERIALBUS,	PCIS_SERIALBUS_SMBUS,	"SMBus"},
1192	{0, 0,		NULL}
1193};
1194
1195void
1196pci_probe_nomatch(device_t dev, device_t child)
1197{
1198	int	i;
1199	char	*cp, *scp, *device;
1200
1201	/*
1202	 * Look for a listing for this device in a loaded device database.
1203	 */
1204	if ((device = pci_describe_device(child)) != NULL) {
1205		device_printf(dev, "<%s>", device);
1206		free(device, M_DEVBUF);
1207	} else {
1208		/*
1209		 * Scan the class/subclass descriptions for a general
1210		 * description.
1211		 */
1212		cp = "unknown";
1213		scp = NULL;
1214		for (i = 0; pci_nomatch_tab[i].desc != NULL; i++) {
1215			if (pci_nomatch_tab[i].class == pci_get_class(child)) {
1216				if (pci_nomatch_tab[i].subclass == -1) {
1217					cp = pci_nomatch_tab[i].desc;
1218				} else if (pci_nomatch_tab[i].subclass ==
1219				    pci_get_subclass(child)) {
1220					scp = pci_nomatch_tab[i].desc;
1221				}
1222			}
1223		}
1224		device_printf(dev, "<%s%s%s>",
1225		    cp ? cp : "",
1226		    ((cp != NULL) && (scp != NULL)) ? ", " : "",
1227		    scp ? scp : "");
1228	}
1229	printf(" at device %d.%d (no driver attached)\n",
1230	    pci_get_slot(child), pci_get_function(child));
1231	if (pci_do_powerstate)
1232		pci_cfg_save(child,
1233		    (struct pci_devinfo *) device_get_ivars(child), 1);
1234	return;
1235}
1236
1237/*
1238 * Parse the PCI device database, if loaded, and return a pointer to a
1239 * description of the device.
1240 *
1241 * The database is flat text formatted as follows:
1242 *
1243 * Any line not in a valid format is ignored.
1244 * Lines are terminated with newline '\n' characters.
1245 *
1246 * A VENDOR line consists of the 4 digit (hex) vendor code, a TAB, then
1247 * the vendor name.
1248 *
1249 * A DEVICE line is entered immediately below the corresponding VENDOR ID.
1250 * - devices cannot be listed without a corresponding VENDOR line.
1251 * A DEVICE line consists of a TAB, the 4 digit (hex) device code,
1252 * another TAB, then the device name.
1253 */
1254
1255/*
1256 * Assuming (ptr) points to the beginning of a line in the database,
1257 * return the vendor or device and description of the next entry.
1258 * The value of (vendor) or (device) inappropriate for the entry type
1259 * is set to -1.  Returns nonzero at the end of the database.
1260 *
1261 * Note that this is slightly unrobust in the face of corrupt data;
1262 * we attempt to safeguard against this by spamming the end of the
1263 * database with a newline when we initialise.
1264 */
1265static int
1266pci_describe_parse_line(char **ptr, int *vendor, int *device, char **desc)
1267{
1268	char	*cp = *ptr;
1269	int	left;
1270
1271	*device = -1;
1272	*vendor = -1;
1273	**desc = '\0';
1274	for (;;) {
1275		left = pci_vendordata_size - (cp - pci_vendordata);
1276		if (left <= 0) {
1277			*ptr = cp;
1278			return(1);
1279		}
1280
1281		/* vendor entry? */
1282		if (*cp != '\t' &&
1283		    sscanf(cp, "%x\t%80[^\n]", vendor, *desc) == 2)
1284			break;
1285		/* device entry? */
1286		if (*cp == '\t' &&
1287		    sscanf(cp, "%x\t%80[^\n]", device, *desc) == 2)
1288			break;
1289
1290		/* skip to next line */
1291		while (*cp != '\n' && left > 0) {
1292			cp++;
1293			left--;
1294		}
1295		if (*cp == '\n') {
1296			cp++;
1297			left--;
1298		}
1299	}
1300	/* skip to next line */
1301	while (*cp != '\n' && left > 0) {
1302		cp++;
1303		left--;
1304	}
1305	if (*cp == '\n' && left > 0)
1306		cp++;
1307	*ptr = cp;
1308	return(0);
1309}
1310
1311static char *
1312pci_describe_device(device_t dev)
1313{
1314	int	vendor, device;
1315	char	*desc, *vp, *dp, *line;
1316
1317	desc = vp = dp = NULL;
1318
1319	/*
1320	 * If we have no vendor data, we can't do anything.
1321	 */
1322	if (pci_vendordata == NULL)
1323		goto out;
1324
1325	/*
1326	 * Scan the vendor data looking for this device
1327	 */
1328	line = pci_vendordata;
1329	if ((vp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL)
1330		goto out;
1331	for (;;) {
1332		if (pci_describe_parse_line(&line, &vendor, &device, &vp))
1333			goto out;
1334		if (vendor == pci_get_vendor(dev))
1335			break;
1336	}
1337	if ((dp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL)
1338		goto out;
1339	for (;;) {
1340		if (pci_describe_parse_line(&line, &vendor, &device, &dp)) {
1341			*dp = 0;
1342			break;
1343		}
1344		if (vendor != -1) {
1345			*dp = 0;
1346			break;
1347		}
1348		if (device == pci_get_device(dev))
1349			break;
1350	}
1351	if (dp[0] == '\0')
1352		snprintf(dp, 80, "0x%x", pci_get_device(dev));
1353	if ((desc = malloc(strlen(vp) + strlen(dp) + 3, M_DEVBUF, M_NOWAIT)) !=
1354	    NULL)
1355		sprintf(desc, "%s, %s", vp, dp);
1356 out:
1357	if (vp != NULL)
1358		free(vp, M_DEVBUF);
1359	if (dp != NULL)
1360		free(dp, M_DEVBUF);
1361	return(desc);
1362}
1363
1364int
1365pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
1366{
1367	struct pci_devinfo *dinfo;
1368	pcicfgregs *cfg;
1369
1370	dinfo = device_get_ivars(child);
1371	cfg = &dinfo->cfg;
1372
1373	switch (which) {
1374	case PCI_IVAR_ETHADDR:
1375		/*
1376		 * The generic accessor doesn't deal with failure, so
1377		 * we set the return value, then return an error.
1378		 */
1379		*((uint8_t **) result) = NULL;
1380		return (EINVAL);
1381	case PCI_IVAR_SUBVENDOR:
1382		*result = cfg->subvendor;
1383		break;
1384	case PCI_IVAR_SUBDEVICE:
1385		*result = cfg->subdevice;
1386		break;
1387	case PCI_IVAR_VENDOR:
1388		*result = cfg->vendor;
1389		break;
1390	case PCI_IVAR_DEVICE:
1391		*result = cfg->device;
1392		break;
1393	case PCI_IVAR_DEVID:
1394		*result = (cfg->device << 16) | cfg->vendor;
1395		break;
1396	case PCI_IVAR_CLASS:
1397		*result = cfg->baseclass;
1398		break;
1399	case PCI_IVAR_SUBCLASS:
1400		*result = cfg->subclass;
1401		break;
1402	case PCI_IVAR_PROGIF:
1403		*result = cfg->progif;
1404		break;
1405	case PCI_IVAR_REVID:
1406		*result = cfg->revid;
1407		break;
1408	case PCI_IVAR_INTPIN:
1409		*result = cfg->intpin;
1410		break;
1411	case PCI_IVAR_IRQ:
1412		*result = cfg->intline;
1413		break;
1414	case PCI_IVAR_BUS:
1415		*result = cfg->bus;
1416		break;
1417	case PCI_IVAR_SLOT:
1418		*result = cfg->slot;
1419		break;
1420	case PCI_IVAR_FUNCTION:
1421		*result = cfg->func;
1422		break;
1423	default:
1424		return (ENOENT);
1425	}
1426	return (0);
1427}
1428
1429int
1430pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
1431{
1432	struct pci_devinfo *dinfo;
1433
1434	dinfo = device_get_ivars(child);
1435
1436	switch (which) {
1437	case PCI_IVAR_INTPIN:
1438		dinfo->cfg.intpin = value;
1439		return (0);
1440	case PCI_IVAR_ETHADDR:
1441	case PCI_IVAR_SUBVENDOR:
1442	case PCI_IVAR_SUBDEVICE:
1443	case PCI_IVAR_VENDOR:
1444	case PCI_IVAR_DEVICE:
1445	case PCI_IVAR_DEVID:
1446	case PCI_IVAR_CLASS:
1447	case PCI_IVAR_SUBCLASS:
1448	case PCI_IVAR_PROGIF:
1449	case PCI_IVAR_REVID:
1450	case PCI_IVAR_IRQ:
1451	case PCI_IVAR_BUS:
1452	case PCI_IVAR_SLOT:
1453	case PCI_IVAR_FUNCTION:
1454		return (EINVAL);	/* disallow for now */
1455
1456	default:
1457		return (ENOENT);
1458	}
1459}
1460
1461
1462#include "opt_ddb.h"
1463#ifdef DDB
1464#include <ddb/ddb.h>
1465#include <sys/cons.h>
1466
1467/*
1468 * List resources based on pci map registers, used for within ddb
1469 */
1470
1471DB_SHOW_COMMAND(pciregs, db_pci_dump)
1472{
1473	struct pci_devinfo *dinfo;
1474	struct devlist *devlist_head;
1475	struct pci_conf *p;
1476	const char *name;
1477	int i, error, none_count, quit;
1478
1479	none_count = 0;
1480	/* get the head of the device queue */
1481	devlist_head = &pci_devq;
1482
1483	/*
1484	 * Go through the list of devices and print out devices
1485	 */
1486	db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE);
1487	for (error = 0, i = 0, quit = 0,
1488	     dinfo = STAILQ_FIRST(devlist_head);
1489	     (dinfo != NULL) && (error == 0) && (i < pci_numdevs) && !quit;
1490	     dinfo = STAILQ_NEXT(dinfo, pci_links), i++) {
1491
1492		/* Populate pd_name and pd_unit */
1493		name = NULL;
1494		if (dinfo->cfg.dev)
1495			name = device_get_name(dinfo->cfg.dev);
1496
1497		p = &dinfo->conf;
1498		db_printf("%s%d@pci%d:%d:%d:\tclass=0x%06x card=0x%08x "
1499			"chip=0x%08x rev=0x%02x hdr=0x%02x\n",
1500			(name && *name) ? name : "none",
1501			(name && *name) ? (int)device_get_unit(dinfo->cfg.dev) :
1502			none_count++,
1503			p->pc_sel.pc_bus, p->pc_sel.pc_dev,
1504			p->pc_sel.pc_func, (p->pc_class << 16) |
1505			(p->pc_subclass << 8) | p->pc_progif,
1506			(p->pc_subdevice << 16) | p->pc_subvendor,
1507			(p->pc_device << 16) | p->pc_vendor,
1508			p->pc_revid, p->pc_hdr);
1509	}
1510}
1511#endif /* DDB */
1512
1513static struct resource *
1514pci_alloc_map(device_t dev, device_t child, int type, int *rid,
1515    u_long start, u_long end, u_long count, u_int flags)
1516{
1517	struct pci_devinfo *dinfo = device_get_ivars(child);
1518	struct resource_list *rl = &dinfo->resources;
1519	struct resource_list_entry *rle;
1520	struct resource *res;
1521	uint32_t map, testval;
1522	int mapsize;
1523
1524	/*
1525	 * Weed out the bogons, and figure out how large the BAR/map
1526	 * is.  Bars that read back 0 here are bogus and unimplemented.
1527	 * Note: atapci in legacy mode are special and handled elsewhere
1528	 * in the code.  If you have a atapci device in legacy mode and
1529	 * it fails here, that other code is broken.
1530	 */
1531	res = NULL;
1532	map = pci_read_config(child, *rid, 4);
1533	pci_write_config(child, *rid, 0xffffffff, 4);
1534	testval = pci_read_config(child, *rid, 4);
1535	if (testval == 0)
1536		return (NULL);
1537	if (pci_maptype(testval) & PCI_MAPMEM) {
1538		if (type != SYS_RES_MEMORY) {
1539			device_printf(child,
1540			    "failed: rid %#x is memory, requested %d\n",
1541			    *rid, type);
1542			goto out;
1543		}
1544	} else {
1545		if (type != SYS_RES_IOPORT) {
1546			device_printf(child,
1547			    "failed: rid %#x is ioport, requested %d\n",
1548			    *rid, type);
1549			goto out;
1550		}
1551	}
1552	/*
1553	 * For real BARs, we need to override the size that
1554	 * the driver requests, because that's what the BAR
1555	 * actually uses and we would otherwise have a
1556	 * situation where we might allocate the excess to
1557	 * another driver, which won't work.
1558	 */
1559	mapsize = pci_mapsize(testval);
1560	count = 1 << mapsize;
1561	if (RF_ALIGNMENT(flags) < mapsize)
1562		flags = (flags & ~RF_ALIGNMENT_MASK) | RF_ALIGNMENT_LOG2(mapsize);
1563
1564	/*
1565	 * Allocate enough resource, and then write back the
1566	 * appropriate bar for that resource.
1567	 */
1568	res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child, type, rid,
1569	    start, end, count, flags);
1570	if (res == NULL) {
1571		device_printf(child, "%#lx bytes of rid %#x res %d failed.\n",
1572		    count, *rid, type);
1573		goto out;
1574	}
1575	resource_list_add(rl, type, *rid, start, end, count);
1576	rle = resource_list_find(rl, type, *rid);
1577	if (rle == NULL)
1578		panic("pci_alloc_map: unexpedly can't find resource.");
1579	rle->res = res;
1580	if (bootverbose)
1581		device_printf(child,
1582		    "Lazy allocation of %#lx bytes rid %#x type %d at %#lx\n",
1583		    count, *rid, type, rman_get_start(res));
1584	map = rman_get_start(res);
1585out:;
1586	pci_write_config(child, *rid, map, 4);
1587	return (res);
1588}
1589
1590
1591struct resource *
1592pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
1593		   u_long start, u_long end, u_long count, u_int flags)
1594{
1595	struct pci_devinfo *dinfo = device_get_ivars(child);
1596	struct resource_list *rl = &dinfo->resources;
1597	struct resource_list_entry *rle;
1598	pcicfgregs *cfg = &dinfo->cfg;
1599
1600	/*
1601	 * Perform lazy resource allocation
1602	 */
1603	if (device_get_parent(child) == dev) {
1604		switch (type) {
1605		case SYS_RES_IRQ:
1606			/*
1607			 * If the child device doesn't have an
1608			 * interrupt routed and is deserving of an
1609			 * interrupt, try to assign it one.
1610			 */
1611			if (!PCI_INTERRUPT_VALID(cfg->intline) &&
1612			    (cfg->intpin != 0)) {
1613				cfg->intline = PCI_ASSIGN_INTERRUPT(dev, child);
1614				if (PCI_INTERRUPT_VALID(cfg->intline)) {
1615					pci_write_config(child, PCIR_INTLINE,
1616					    cfg->intline, 1);
1617					resource_list_add(rl, SYS_RES_IRQ, 0,
1618					    cfg->intline, cfg->intline, 1);
1619				}
1620			}
1621			break;
1622		case SYS_RES_IOPORT:
1623		case SYS_RES_MEMORY:
1624			if (*rid < PCIR_BAR(cfg->nummaps)) {
1625				/*
1626				 * Enable the I/O mode.  We should
1627				 * also be assigning resources too
1628				 * when none are present.  The
1629				 * resource_list_alloc kind of sorta does
1630				 * this...
1631				 */
1632				if (PCI_ENABLE_IO(dev, child, type))
1633					return (NULL);
1634			}
1635			rle = resource_list_find(rl, type, *rid);
1636			if (rle == NULL)
1637				return (pci_alloc_map(dev, child, type, rid,
1638				    start, end, count, flags));
1639			break;
1640		}
1641		/*
1642		 * If we've already allocated the resource, then
1643		 * return it now.  But first we may need to activate
1644		 * it, since we don't allocate the resource as active
1645		 * above.  Normally this would be done down in the
1646		 * nexus, but since we short-circuit that path we have
1647		 * to do its job here.  Not sure if we should free the
1648		 * resource if it fails to activate.
1649		 */
1650		rle = resource_list_find(rl, type, *rid);
1651		if (rle != NULL && rle->res != NULL) {
1652			if (bootverbose)
1653				device_printf(child,
1654			    "Reserved %#lx bytes for rid %#x type %d at %#lx\n",
1655				    rman_get_size(rle->res), *rid, type,
1656				    rman_get_start(rle->res));
1657			if ((flags & RF_ACTIVE) &&
1658			    bus_generic_activate_resource(dev, child, type,
1659			    *rid, rle->res) != 0)
1660				return NULL;
1661			return (rle->res);
1662		}
1663	}
1664	return (resource_list_alloc(rl, dev, child, type, rid,
1665	    start, end, count, flags));
1666}
1667
1668void
1669pci_delete_resource(device_t dev, device_t child, int type, int rid)
1670{
1671	struct pci_devinfo *dinfo;
1672	struct resource_list *rl;
1673	struct resource_list_entry *rle;
1674
1675	if (device_get_parent(child) != dev)
1676		return;
1677
1678	dinfo = device_get_ivars(child);
1679	rl = &dinfo->resources;
1680	rle = resource_list_find(rl, type, rid);
1681	if (rle) {
1682		if (rle->res) {
1683			if (rman_get_device(rle->res) != dev ||
1684			    rman_get_flags(rle->res) & RF_ACTIVE) {
1685				device_printf(dev, "delete_resource: "
1686				    "Resource still owned by child, oops. "
1687				    "(type=%d, rid=%d, addr=%lx)\n",
1688				    rle->type, rle->rid,
1689				    rman_get_start(rle->res));
1690				return;
1691			}
1692			bus_release_resource(dev, type, rid, rle->res);
1693		}
1694		resource_list_delete(rl, type, rid);
1695	}
1696	/*
1697	 * Why do we turn off the PCI configuration BAR when we delete a
1698	 * resource? -- imp
1699	 */
1700	pci_write_config(child, rid, 0, 4);
1701	BUS_DELETE_RESOURCE(device_get_parent(dev), child, type, rid);
1702}
1703
1704struct resource_list *
1705pci_get_resource_list (device_t dev, device_t child)
1706{
1707	struct pci_devinfo *dinfo = device_get_ivars(child);
1708
1709	return (&dinfo->resources);
1710}
1711
1712uint32_t
1713pci_read_config_method(device_t dev, device_t child, int reg, int width)
1714{
1715	struct pci_devinfo *dinfo = device_get_ivars(child);
1716	pcicfgregs *cfg = &dinfo->cfg;
1717
1718	return (PCIB_READ_CONFIG(device_get_parent(dev),
1719	    cfg->bus, cfg->slot, cfg->func, reg, width));
1720}
1721
1722void
1723pci_write_config_method(device_t dev, device_t child, int reg,
1724    uint32_t val, int width)
1725{
1726	struct pci_devinfo *dinfo = device_get_ivars(child);
1727	pcicfgregs *cfg = &dinfo->cfg;
1728
1729	PCIB_WRITE_CONFIG(device_get_parent(dev),
1730	    cfg->bus, cfg->slot, cfg->func, reg, val, width);
1731}
1732
1733int
1734pci_child_location_str_method(device_t dev, device_t child, char *buf,
1735    size_t buflen)
1736{
1737	struct pci_devinfo *dinfo;
1738
1739	dinfo = device_get_ivars(child);
1740	snprintf(buf, buflen, "slot=%d function=%d", pci_get_slot(child),
1741	    pci_get_function(child));
1742	return (0);
1743}
1744
1745int
1746pci_child_pnpinfo_str_method(device_t dev, device_t child, char *buf,
1747    size_t buflen)
1748{
1749	struct pci_devinfo *dinfo;
1750	pcicfgregs *cfg;
1751
1752	dinfo = device_get_ivars(child);
1753	cfg = &dinfo->cfg;
1754	snprintf(buf, buflen, "vendor=0x%04x device=0x%04x subvendor=0x%04x "
1755	    "subdevice=0x%04x class=0x%02x%02x%02x", cfg->vendor, cfg->device,
1756	    cfg->subvendor, cfg->subdevice, cfg->baseclass, cfg->subclass,
1757	    cfg->progif);
1758	return (0);
1759}
1760
1761int
1762pci_assign_interrupt_method(device_t dev, device_t child)
1763{
1764	struct pci_devinfo *dinfo = device_get_ivars(child);
1765	pcicfgregs *cfg = &dinfo->cfg;
1766
1767	return (PCIB_ROUTE_INTERRUPT(device_get_parent(dev), child,
1768	    cfg->intpin));
1769}
1770
1771static int
1772pci_modevent(module_t mod, int what, void *arg)
1773{
1774	static struct cdev *pci_cdev;
1775
1776	switch (what) {
1777	case MOD_LOAD:
1778		STAILQ_INIT(&pci_devq);
1779		pci_generation = 0;
1780		pci_cdev = make_dev(&pcicdev, 0, UID_ROOT, GID_WHEEL, 0644,
1781		    "pci");
1782		pci_load_vendor_data();
1783		break;
1784
1785	case MOD_UNLOAD:
1786		destroy_dev(pci_cdev);
1787		break;
1788	}
1789
1790	return (0);
1791}
1792
1793static void
1794pci_cfg_restore(device_t dev, struct pci_devinfo *dinfo)
1795{
1796	int i;
1797
1798	/*
1799	 * Only do header type 0 devices.  Type 1 devices are bridges,
1800	 * which we know need special treatment.  Type 2 devices are
1801	 * cardbus bridges which also require special treatment.
1802	 * Other types are unknown, and we err on the side of safety
1803	 * by ignoring them.
1804	 */
1805	if (dinfo->cfg.hdrtype != 0)
1806		return;
1807
1808	/*
1809	 * Restore the device to full power mode.  We must do this
1810	 * before we restore the registers because moving from D3 to
1811	 * D0 will cause the chip's BARs and some other registers to
1812	 * be reset to some unknown power on reset values.  Cut down
1813	 * the noise on boot by doing nothing if we are already in
1814	 * state D0.
1815	 */
1816	if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
1817		if (bootverbose)
1818			printf(
1819			    "pci%d:%d:%d: Transition from D%d to D0\n",
1820			    dinfo->cfg.bus, dinfo->cfg.slot, dinfo->cfg.func,
1821			    pci_get_powerstate(dev));
1822		pci_set_powerstate(dev, PCI_POWERSTATE_D0);
1823	}
1824	for (i = 0; i < dinfo->cfg.nummaps; i++)
1825		pci_write_config(dev, PCIR_BAR(i), dinfo->cfg.bar[i], 4);
1826	pci_write_config(dev, PCIR_BIOS, dinfo->cfg.bios, 4);
1827	pci_write_config(dev, PCIR_COMMAND, dinfo->cfg.cmdreg, 2);
1828	pci_write_config(dev, PCIR_INTLINE, dinfo->cfg.intline, 1);
1829	pci_write_config(dev, PCIR_INTPIN, dinfo->cfg.intpin, 1);
1830	pci_write_config(dev, PCIR_MINGNT, dinfo->cfg.mingnt, 1);
1831	pci_write_config(dev, PCIR_MAXLAT, dinfo->cfg.maxlat, 1);
1832	pci_write_config(dev, PCIR_CACHELNSZ, dinfo->cfg.cachelnsz, 1);
1833	pci_write_config(dev, PCIR_LATTIMER, dinfo->cfg.lattimer, 1);
1834	pci_write_config(dev, PCIR_PROGIF, dinfo->cfg.progif, 1);
1835	pci_write_config(dev, PCIR_REVID, dinfo->cfg.revid, 1);
1836}
1837
1838static void
1839pci_cfg_save(device_t dev, struct pci_devinfo *dinfo, int setstate)
1840{
1841	int i;
1842	uint32_t cls;
1843	int ps;
1844
1845	/*
1846	 * Only do header type 0 devices.  Type 1 devices are bridges, which
1847	 * we know need special treatment.  Type 2 devices are cardbus bridges
1848	 * which also require special treatment.  Other types are unknown, and
1849	 * we err on the side of safety by ignoring them.  Powering down
1850	 * bridges should not be undertaken lightly.
1851	 */
1852	if (dinfo->cfg.hdrtype != 0)
1853		return;
1854	for (i = 0; i < dinfo->cfg.nummaps; i++)
1855		dinfo->cfg.bar[i] = pci_read_config(dev, PCIR_BAR(i), 4);
1856	dinfo->cfg.bios = pci_read_config(dev, PCIR_BIOS, 4);
1857
1858	/*
1859	 * Some drivers apparently write to these registers w/o
1860	 * updating our cahced copy.  No harm happens if we update the
1861	 * copy, so do so here so we can restore them.  The COMMAND
1862	 * register is modified by the bus w/o updating the cache.  This
1863	 * should represent the normally writable portion of the 'defined'
1864	 * part of type 0 headers.  In theory we also need to save/restore
1865	 * the PCI capability structures we know about, but apart from power
1866	 * we don't know any that are writable.
1867	 */
1868	dinfo->cfg.subvendor = pci_read_config(dev, PCIR_SUBVEND_0, 2);
1869	dinfo->cfg.subdevice = pci_read_config(dev, PCIR_SUBDEV_0, 2);
1870	dinfo->cfg.vendor = pci_read_config(dev, PCIR_VENDOR, 2);
1871	dinfo->cfg.device = pci_read_config(dev, PCIR_DEVICE, 2);
1872	dinfo->cfg.cmdreg = pci_read_config(dev, PCIR_COMMAND, 2);
1873	dinfo->cfg.intline = pci_read_config(dev, PCIR_INTLINE, 1);
1874	dinfo->cfg.intpin = pci_read_config(dev, PCIR_INTPIN, 1);
1875	dinfo->cfg.mingnt = pci_read_config(dev, PCIR_MINGNT, 1);
1876	dinfo->cfg.maxlat = pci_read_config(dev, PCIR_MAXLAT, 1);
1877	dinfo->cfg.cachelnsz = pci_read_config(dev, PCIR_CACHELNSZ, 1);
1878	dinfo->cfg.lattimer = pci_read_config(dev, PCIR_LATTIMER, 1);
1879	dinfo->cfg.baseclass = pci_read_config(dev, PCIR_CLASS, 1);
1880	dinfo->cfg.subclass = pci_read_config(dev, PCIR_SUBCLASS, 1);
1881	dinfo->cfg.progif = pci_read_config(dev, PCIR_PROGIF, 1);
1882	dinfo->cfg.revid = pci_read_config(dev, PCIR_REVID, 1);
1883
1884	/*
1885	 * don't set the state for display devices and for memory devices
1886	 * since bad things happen.  we should (a) have drivers that can easily
1887	 * detach and (b) use generic drivers for these devices so that some
1888	 * device actually attaches.  We need to make sure that when we
1889	 * implement (a) we don't power the device down on a reattach.
1890	 */
1891	cls = pci_get_class(dev);
1892	if (setstate && cls != PCIC_DISPLAY && cls != PCIC_MEMORY) {
1893		/*
1894		 * PCI spec is clear that we can only go into D3 state from
1895		 * D0 state.  Transition from D[12] into D0 before going
1896		 * to D3 state.
1897		 */
1898		ps = pci_get_powerstate(dev);
1899		if (ps != PCI_POWERSTATE_D0 && ps != PCI_POWERSTATE_D3) {
1900			if (bootverbose)
1901				printf(
1902				    "pci%d:%d:%d: Transition from D%d to D0\n",
1903				    dinfo->cfg.bus, dinfo->cfg.slot,
1904				    dinfo->cfg.func, ps);
1905			pci_set_powerstate(dev, PCI_POWERSTATE_D0);
1906		}
1907		if (pci_get_powerstate(dev) != PCI_POWERSTATE_D3) {
1908			if (bootverbose)
1909				printf(
1910				    "pci%d:%d:%d: Transition from D0 to D3\n",
1911				    dinfo->cfg.bus, dinfo->cfg.slot,
1912				    dinfo->cfg.func);
1913			pci_set_powerstate(dev, PCI_POWERSTATE_D3);
1914		}
1915	}
1916}
1917