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