xref: /freebsd/sys/dev/pci/pci.c (revision f9218d3d4fd34f082473b3a021c6d4d109fb47cf)
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 (PCIB_READ_CONFIG(pcib, b, s, f, 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 void
572 pci_enable_busmaster_method(device_t dev, device_t child)
573 {
574 	pci_set_command_bit(dev, child, PCIM_CMD_BUSMASTEREN);
575 }
576 
577 void
578 pci_disable_busmaster_method(device_t dev, device_t child)
579 {
580 	pci_clear_command_bit(dev, child, PCIM_CMD_BUSMASTEREN);
581 }
582 
583 void
584 pci_enable_io_method(device_t dev, device_t child, int space)
585 {
586 	switch(space) {
587 	case SYS_RES_IOPORT:
588 		pci_set_command_bit(dev, child, PCIM_CMD_PORTEN);
589 		break;
590 	case SYS_RES_MEMORY:
591 		pci_set_command_bit(dev, child, PCIM_CMD_MEMEN);
592 		break;
593 	}
594 }
595 
596 void
597 pci_disable_io_method(device_t dev, device_t child, int space)
598 {
599 	switch(space) {
600 	case SYS_RES_IOPORT:
601 		pci_clear_command_bit(dev, child, PCIM_CMD_PORTEN);
602 		break;
603 	case SYS_RES_MEMORY:
604 		pci_clear_command_bit(dev, child, PCIM_CMD_MEMEN);
605 		break;
606 	}
607 }
608 
609 /*
610  * New style pci driver.  Parent device is either a pci-host-bridge or a
611  * pci-pci-bridge.  Both kinds are represented by instances of pcib.
612  */
613 
614 void
615 pci_print_verbose(struct pci_devinfo *dinfo)
616 {
617 	if (bootverbose) {
618 		pcicfgregs *cfg = &dinfo->cfg;
619 
620 		printf("found->\tvendor=0x%04x, dev=0x%04x, revid=0x%02x\n",
621 		    cfg->vendor, cfg->device, cfg->revid);
622 		printf("\tbus=%d, slot=%d, func=%d\n",
623 		    cfg->bus, cfg->slot, cfg->func);
624 		printf("\tclass=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n",
625 		    cfg->baseclass, cfg->subclass, cfg->progif, cfg->hdrtype,
626 		    cfg->mfdev);
627 		printf("\tcmdreg=0x%04x, statreg=0x%04x, cachelnsz=%d (dwords)\n",
628 		    cfg->cmdreg, cfg->statreg, cfg->cachelnsz);
629 		printf("\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), maxlat=0x%02x (%d ns)\n",
630 		    cfg->lattimer, cfg->lattimer * 30, cfg->mingnt,
631 		    cfg->mingnt * 250, cfg->maxlat, cfg->maxlat * 250);
632 		if (cfg->intpin > 0)
633 			printf("\tintpin=%c, irq=%d\n",
634 			    cfg->intpin +'a' -1, cfg->intline);
635 		if (cfg->pp_cap) {
636 			u_int16_t status;
637 
638 			status = pci_read_config(cfg->dev, cfg->pp_status, 2);
639 			printf("\tpowerspec %d  supports D0%s%s D3  current D%d\n",
640 			    cfg->pp_cap & PCIM_PCAP_SPEC,
641 			    cfg->pp_cap & PCIM_PCAP_D1SUPP ? " D1" : "",
642 			    cfg->pp_cap & PCIM_PCAP_D2SUPP ? " D2" : "",
643 			    status & PCIM_PSTAT_DMASK);
644 		}
645 	}
646 }
647 
648 static int
649 pci_porten(device_t pcib, int b, int s, int f)
650 {
651 	return (PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2)
652 		& PCIM_CMD_PORTEN) != 0;
653 }
654 
655 static int
656 pci_memen(device_t pcib, int b, int s, int f)
657 {
658 	return (PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2)
659 		& PCIM_CMD_MEMEN) != 0;
660 }
661 
662 /*
663  * Add a resource based on a pci map register. Return 1 if the map
664  * register is a 32bit map register or 2 if it is a 64bit register.
665  */
666 static int
667 pci_add_map(device_t pcib, int b, int s, int f, int reg,
668 	    struct resource_list *rl)
669 {
670 	u_int32_t map;
671 	u_int64_t base;
672 	u_int8_t ln2size;
673 	u_int8_t ln2range;
674 	u_int32_t testval;
675 	u_int16_t cmd;
676 	int type;
677 
678 	map = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4);
679 
680 	if (map == 0 || map == 0xffffffff)
681 		return (1); /* skip invalid entry */
682 
683 	PCIB_WRITE_CONFIG(pcib, b, s, f, reg, 0xffffffff, 4);
684 	testval = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4);
685 	PCIB_WRITE_CONFIG(pcib, b, s, f, reg, map, 4);
686 
687 	base = pci_mapbase(map);
688 	if (pci_maptype(map) & PCI_MAPMEM)
689 		type = SYS_RES_MEMORY;
690 	else
691 		type = SYS_RES_IOPORT;
692 	ln2size = pci_mapsize(testval);
693 	ln2range = pci_maprange(testval);
694 	if (ln2range == 64) {
695 		/* Read the other half of a 64bit map register */
696 		base |= (u_int64_t) PCIB_READ_CONFIG(pcib, b, s, f, reg + 4, 4) << 32;
697 	}
698 
699 	if (bootverbose) {
700 		printf("\tmap[%02x]: type %x, range %2d, base %08x, size %2d",
701 		    reg, pci_maptype(map), ln2range,
702 		    (unsigned int) base, ln2size);
703 		if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f))
704 			printf(", port disabled\n");
705 		else if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f))
706 			printf(", memory disabled\n");
707 		else
708 			printf(", enabled\n");
709 	}
710 
711 	/*
712 	 * This code theoretically does the right thing, but has
713 	 * undesirable side effects in some cases where
714 	 * peripherals respond oddly to having these bits
715 	 * enabled.  Leave them alone by default.
716 	 */
717 	if (pci_enable_io_modes) {
718 		/* Turn on resources that have been left off by a lazy BIOS */
719 		if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f)) {
720 			cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2);
721 			cmd |= PCIM_CMD_PORTEN;
722 			PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2);
723 		}
724 		if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f)) {
725 			cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2);
726 			cmd |= PCIM_CMD_MEMEN;
727 			PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2);
728 		}
729 	} else {
730 		if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f))
731 			return (1);
732 		if (type == SYS_RES_MEMORY && !pci_memen(pcib, b, s, f))
733 			return (1);
734 	}
735 	resource_list_add(rl, type, reg, base, base + (1 << ln2size) - 1,
736 	    (1 << ln2size));
737 
738 	return ((ln2range == 64) ? 2 : 1);
739 }
740 
741 static void
742 pci_add_resources(device_t pcib, device_t dev)
743 {
744 	struct pci_devinfo *dinfo = device_get_ivars(dev);
745 	pcicfgregs *cfg = &dinfo->cfg;
746 	struct resource_list *rl = &dinfo->resources;
747 	struct pci_quirk *q;
748 	int b, i, f, s;
749 
750 	b = cfg->bus;
751 	s = cfg->slot;
752 	f = cfg->func;
753 	for (i = 0; i < cfg->nummaps;) {
754 		i += pci_add_map(pcib, b, s, f, PCIR_MAPS + i*4, rl);
755 	}
756 
757 	for (q = &pci_quirks[0]; q->devid; q++) {
758 		if (q->devid == ((cfg->device << 16) | cfg->vendor)
759 		    && q->type == PCI_QUIRK_MAP_REG)
760 			pci_add_map(pcib, b, s, f, q->arg1, rl);
761 	}
762 
763 	if (cfg->intpin > 0 && PCI_INTERRUPT_VALID(cfg->intline)) {
764 #ifdef __ia64__
765 		/*
766 		 * Re-route interrupts on ia64 so that we can get the
767 		 * I/O SAPIC interrupt numbers (the BIOS leaves legacy
768 		 * PIC interrupt numbers in the intline registers).
769 		 */
770 		cfg->intline = PCIB_ROUTE_INTERRUPT(pcib, dev, cfg->intpin);
771 #endif
772 		resource_list_add(rl, SYS_RES_IRQ, 0, cfg->intline,
773 		  cfg->intline, 1);
774 	}
775 }
776 
777 void
778 pci_add_children(device_t dev, int busno, size_t dinfo_size)
779 {
780 	device_t pcib = device_get_parent(dev);
781 	struct pci_devinfo *dinfo;
782 	int maxslots;
783 	int s, f, pcifunchigh;
784 
785 	KASSERT(dinfo_size >= sizeof(struct pci_devinfo),
786 	    ("dinfo_size too small"));
787 	maxslots = PCIB_MAXSLOTS(pcib);
788 	for (s = 0; s <= maxslots; s++) {
789 		pcifunchigh = 0;
790 		for (f = 0; f <= pcifunchigh; f++) {
791 			dinfo = pci_read_device(pcib, busno, s, f, dinfo_size);
792 			if (dinfo != NULL) {
793 				if (dinfo->cfg.mfdev)
794 					pcifunchigh = PCI_FUNCMAX;
795 				pci_add_child(dev, dinfo);
796 			}
797 		}
798 	}
799 }
800 
801 void
802 pci_add_child(device_t bus, struct pci_devinfo *dinfo)
803 {
804 	device_t pcib;
805 
806 	pcib = device_get_parent(bus);
807 	dinfo->cfg.dev = device_add_child(bus, NULL, -1);
808 	device_set_ivars(dinfo->cfg.dev, dinfo);
809 	pci_add_resources(pcib, dinfo->cfg.dev);
810 	pci_print_verbose(dinfo);
811 }
812 
813 static int
814 pci_probe(device_t dev)
815 {
816 
817 	device_set_desc(dev, "PCI bus");
818 
819 	/* Allow other subclasses to override this driver. */
820 	return (-1000);
821 }
822 
823 static int
824 pci_attach(device_t dev)
825 {
826 	int busno;
827 
828 	/*
829 	 * Since there can be multiple independantly numbered PCI
830 	 * busses on some large alpha systems, we can't use the unit
831 	 * number to decide what bus we are probing. We ask the parent
832 	 * pcib what our bus number is.
833 	 */
834 	busno = pcib_get_bus(dev);
835 	if (bootverbose)
836 		device_printf(dev, "physical bus=%d\n", busno);
837 
838 	pci_add_children(dev, busno, sizeof(struct pci_devinfo));
839 
840 	return (bus_generic_attach(dev));
841 }
842 
843 static void
844 pci_load_vendor_data(void)
845 {
846 	caddr_t vendordata, info;
847 
848 	if ((vendordata = preload_search_by_type("pci_vendor_data")) != NULL) {
849 		info = preload_search_info(vendordata, MODINFO_ADDR);
850 		pci_vendordata = *(char **)info;
851 		info = preload_search_info(vendordata, MODINFO_SIZE);
852 		pci_vendordata_size = *(size_t *)info;
853 		/* terminate the database */
854 		pci_vendordata[pci_vendordata_size] = '\n';
855 	}
856 }
857 
858 int
859 pci_print_child(device_t dev, device_t child)
860 {
861 	struct pci_devinfo *dinfo;
862 	struct resource_list *rl;
863 	pcicfgregs *cfg;
864 	int retval = 0;
865 
866 	dinfo = device_get_ivars(child);
867 	cfg = &dinfo->cfg;
868 	rl = &dinfo->resources;
869 
870 	retval += bus_print_child_header(dev, child);
871 
872 	retval += resource_list_print_type(rl, "port", SYS_RES_IOPORT, "%#lx");
873 	retval += resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx");
874 	retval += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld");
875 	if (device_get_flags(dev))
876 		retval += printf(" flags %#x", device_get_flags(dev));
877 
878 	retval += printf(" at device %d.%d", pci_get_slot(child),
879 	    pci_get_function(child));
880 
881 	retval += bus_print_child_footer(dev, child);
882 
883 	return (retval);
884 }
885 
886 static struct
887 {
888 	int	class;
889 	int	subclass;
890 	char	*desc;
891 } pci_nomatch_tab[] = {
892 	{PCIC_OLD,		-1,			"old"},
893 	{PCIC_OLD,		PCIS_OLD_NONVGA,	"non-VGA display device"},
894 	{PCIC_OLD,		PCIS_OLD_VGA,		"VGA-compatible display device"},
895 	{PCIC_STORAGE,		-1,			"mass storage"},
896 	{PCIC_STORAGE,		PCIS_STORAGE_SCSI,	"SCSI"},
897 	{PCIC_STORAGE,		PCIS_STORAGE_IDE,	"ATA"},
898 	{PCIC_STORAGE,		PCIS_STORAGE_FLOPPY,	"floppy disk"},
899 	{PCIC_STORAGE,		PCIS_STORAGE_IPI,	"IPI"},
900 	{PCIC_STORAGE,		PCIS_STORAGE_RAID,	"RAID"},
901 	{PCIC_NETWORK,		-1,			"network"},
902 	{PCIC_NETWORK,		PCIS_NETWORK_ETHERNET,	"ethernet"},
903 	{PCIC_NETWORK,		PCIS_NETWORK_TOKENRING,	"token ring"},
904 	{PCIC_NETWORK,		PCIS_NETWORK_FDDI,	"fddi"},
905 	{PCIC_NETWORK,		PCIS_NETWORK_ATM,	"ATM"},
906 	{PCIC_DISPLAY,		-1,			"display"},
907 	{PCIC_DISPLAY,		PCIS_DISPLAY_VGA,	"VGA"},
908 	{PCIC_DISPLAY,		PCIS_DISPLAY_XGA,	"XGA"},
909 	{PCIC_MULTIMEDIA,	-1,			"multimedia"},
910 	{PCIC_MULTIMEDIA,	PCIS_MULTIMEDIA_VIDEO,	"video"},
911 	{PCIC_MULTIMEDIA,	PCIS_MULTIMEDIA_AUDIO,	"audio"},
912 	{PCIC_MEMORY,		-1,			"memory"},
913 	{PCIC_MEMORY,		PCIS_MEMORY_RAM,	"RAM"},
914 	{PCIC_MEMORY,		PCIS_MEMORY_FLASH,	"flash"},
915 	{PCIC_BRIDGE,		-1,			"bridge"},
916 	{PCIC_BRIDGE,		PCIS_BRIDGE_HOST,	"HOST-PCI"},
917 	{PCIC_BRIDGE,		PCIS_BRIDGE_ISA,	"PCI-ISA"},
918 	{PCIC_BRIDGE,		PCIS_BRIDGE_EISA,	"PCI-EISA"},
919 	{PCIC_BRIDGE,		PCIS_BRIDGE_MCA,	"PCI-MCA"},
920 	{PCIC_BRIDGE,		PCIS_BRIDGE_PCI,	"PCI-PCI"},
921 	{PCIC_BRIDGE,		PCIS_BRIDGE_PCMCIA,	"PCI-PCMCIA"},
922 	{PCIC_BRIDGE,		PCIS_BRIDGE_NUBUS,	"PCI-NuBus"},
923 	{PCIC_BRIDGE,		PCIS_BRIDGE_CARDBUS,	"PCI-CardBus"},
924 	{PCIC_BRIDGE,		PCIS_BRIDGE_OTHER,	"PCI-unknown"},
925 	{PCIC_SIMPLECOMM,	-1,			"simple comms"},
926 	{PCIC_SIMPLECOMM,	PCIS_SIMPLECOMM_UART,	"UART"},	/* could detect 16550 */
927 	{PCIC_SIMPLECOMM,	PCIS_SIMPLECOMM_PAR,	"parallel port"},
928 	{PCIC_BASEPERIPH,	-1,			"base peripheral"},
929 	{PCIC_BASEPERIPH,	PCIS_BASEPERIPH_PIC,	"interrupt controller"},
930 	{PCIC_BASEPERIPH,	PCIS_BASEPERIPH_DMA,	"DMA controller"},
931 	{PCIC_BASEPERIPH,	PCIS_BASEPERIPH_TIMER,	"timer"},
932 	{PCIC_BASEPERIPH,	PCIS_BASEPERIPH_RTC,	"realtime clock"},
933 	{PCIC_INPUTDEV,		-1,			"input device"},
934 	{PCIC_INPUTDEV,		PCIS_INPUTDEV_KEYBOARD,	"keyboard"},
935 	{PCIC_INPUTDEV,		PCIS_INPUTDEV_DIGITIZER,"digitizer"},
936 	{PCIC_INPUTDEV,		PCIS_INPUTDEV_MOUSE,	"mouse"},
937 	{PCIC_DOCKING,		-1,			"docking station"},
938 	{PCIC_PROCESSOR,	-1,			"processor"},
939 	{PCIC_SERIALBUS,	-1,			"serial bus"},
940 	{PCIC_SERIALBUS,	PCIS_SERIALBUS_FW,	"FireWire"},
941 	{PCIC_SERIALBUS,	PCIS_SERIALBUS_ACCESS,	"AccessBus"},
942 	{PCIC_SERIALBUS,	PCIS_SERIALBUS_SSA,	"SSA"},
943 	{PCIC_SERIALBUS,	PCIS_SERIALBUS_USB,	"USB"},
944 	{PCIC_SERIALBUS,	PCIS_SERIALBUS_FC,	"Fibre Channel"},
945 	{PCIC_SERIALBUS,	PCIS_SERIALBUS_SMBUS,	"SMBus"},
946 	{0, 0,		NULL}
947 };
948 
949 void
950 pci_probe_nomatch(device_t dev, device_t child)
951 {
952 	int	i;
953 	char	*cp, *scp, *device;
954 
955 	/*
956 	 * Look for a listing for this device in a loaded device database.
957 	 */
958 	if ((device = pci_describe_device(child)) != NULL) {
959 		device_printf(dev, "<%s>", device);
960 		free(device, M_DEVBUF);
961 	} else {
962 		/*
963 		 * Scan the class/subclass descriptions for a general
964 		 * description.
965 		 */
966 		cp = "unknown";
967 		scp = NULL;
968 		for (i = 0; pci_nomatch_tab[i].desc != NULL; i++) {
969 			if (pci_nomatch_tab[i].class == pci_get_class(child)) {
970 				if (pci_nomatch_tab[i].subclass == -1) {
971 					cp = pci_nomatch_tab[i].desc;
972 				} else if (pci_nomatch_tab[i].subclass ==
973 				    pci_get_subclass(child)) {
974 					scp = pci_nomatch_tab[i].desc;
975 				}
976 			}
977 		}
978 		device_printf(dev, "<%s%s%s>",
979 		    cp ? cp : "",
980 		    ((cp != NULL) && (scp != NULL)) ? ", " : "",
981 		    scp ? scp : "");
982 	}
983 	printf(" at device %d.%d (no driver attached)\n",
984 	    pci_get_slot(child), pci_get_function(child));
985 	return;
986 }
987 
988 /*
989  * Parse the PCI device database, if loaded, and return a pointer to a
990  * description of the device.
991  *
992  * The database is flat text formatted as follows:
993  *
994  * Any line not in a valid format is ignored.
995  * Lines are terminated with newline '\n' characters.
996  *
997  * A VENDOR line consists of the 4 digit (hex) vendor code, a TAB, then
998  * the vendor name.
999  *
1000  * A DEVICE line is entered immediately below the corresponding VENDOR ID.
1001  * - devices cannot be listed without a corresponding VENDOR line.
1002  * A DEVICE line consists of a TAB, the 4 digit (hex) device code,
1003  * another TAB, then the device name.
1004  */
1005 
1006 /*
1007  * Assuming (ptr) points to the beginning of a line in the database,
1008  * return the vendor or device and description of the next entry.
1009  * The value of (vendor) or (device) inappropriate for the entry type
1010  * is set to -1.  Returns nonzero at the end of the database.
1011  *
1012  * Note that this is slightly unrobust in the face of corrupt data;
1013  * we attempt to safeguard against this by spamming the end of the
1014  * database with a newline when we initialise.
1015  */
1016 static int
1017 pci_describe_parse_line(char **ptr, int *vendor, int *device, char **desc)
1018 {
1019 	char	*cp = *ptr;
1020 	int	left;
1021 
1022 	*device = -1;
1023 	*vendor = -1;
1024 	**desc = '\0';
1025 	for (;;) {
1026 		left = pci_vendordata_size - (cp - pci_vendordata);
1027 		if (left <= 0) {
1028 			*ptr = cp;
1029 			return(1);
1030 		}
1031 
1032 		/* vendor entry? */
1033 		if (*cp != '\t' &&
1034 		    sscanf(cp, "%x\t%80[^\n]", vendor, *desc) == 2)
1035 			break;
1036 		/* device entry? */
1037 		if (*cp == '\t' &&
1038 		    sscanf(cp, "%x\t%80[^\n]", device, *desc) == 2)
1039 			break;
1040 
1041 		/* skip to next line */
1042 		while (*cp != '\n' && left > 0) {
1043 			cp++;
1044 			left--;
1045 		}
1046 		if (*cp == '\n') {
1047 			cp++;
1048 			left--;
1049 		}
1050 	}
1051 	/* skip to next line */
1052 	while (*cp != '\n' && left > 0) {
1053 		cp++;
1054 		left--;
1055 	}
1056 	if (*cp == '\n' && left > 0)
1057 		cp++;
1058 	*ptr = cp;
1059 	return(0);
1060 }
1061 
1062 static char *
1063 pci_describe_device(device_t dev)
1064 {
1065 	int	vendor, device;
1066 	char	*desc, *vp, *dp, *line;
1067 
1068 	desc = vp = dp = NULL;
1069 
1070 	/*
1071 	 * If we have no vendor data, we can't do anything.
1072 	 */
1073 	if (pci_vendordata == NULL)
1074 		goto out;
1075 
1076 	/*
1077 	 * Scan the vendor data looking for this device
1078 	 */
1079 	line = pci_vendordata;
1080 	if ((vp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL)
1081 		goto out;
1082 	for (;;) {
1083 		if (pci_describe_parse_line(&line, &vendor, &device, &vp))
1084 			goto out;
1085 		if (vendor == pci_get_vendor(dev))
1086 			break;
1087 	}
1088 	if ((dp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL)
1089 		goto out;
1090 	for (;;) {
1091 		if (pci_describe_parse_line(&line, &vendor, &device, &dp)) {
1092 			*dp = 0;
1093 			break;
1094 		}
1095 		if (vendor != -1) {
1096 			*dp = 0;
1097 			break;
1098 		}
1099 		if (device == pci_get_device(dev))
1100 			break;
1101 	}
1102 	if (dp[0] == '\0')
1103 		snprintf(dp, 80, "0x%x", pci_get_device(dev));
1104 	if ((desc = malloc(strlen(vp) + strlen(dp) + 3, M_DEVBUF, M_NOWAIT)) !=
1105 	    NULL)
1106 		sprintf(desc, "%s, %s", vp, dp);
1107  out:
1108 	if (vp != NULL)
1109 		free(vp, M_DEVBUF);
1110 	if (dp != NULL)
1111 		free(dp, M_DEVBUF);
1112 	return(desc);
1113 }
1114 
1115 int
1116 pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
1117 {
1118 	struct pci_devinfo *dinfo;
1119 	pcicfgregs *cfg;
1120 
1121 	dinfo = device_get_ivars(child);
1122 	cfg = &dinfo->cfg;
1123 
1124 	switch (which) {
1125 	case PCI_IVAR_ETHADDR:
1126 		/*
1127 		 * The generic accessor doesn't deal with failure, so
1128 		 * we set the return value, then return an error.
1129 		 */
1130 		*((u_int8_t **) result) = NULL;
1131 		return (EINVAL);
1132 	case PCI_IVAR_SUBVENDOR:
1133 		*result = cfg->subvendor;
1134 		break;
1135 	case PCI_IVAR_SUBDEVICE:
1136 		*result = cfg->subdevice;
1137 		break;
1138 	case PCI_IVAR_VENDOR:
1139 		*result = cfg->vendor;
1140 		break;
1141 	case PCI_IVAR_DEVICE:
1142 		*result = cfg->device;
1143 		break;
1144 	case PCI_IVAR_DEVID:
1145 		*result = (cfg->device << 16) | cfg->vendor;
1146 		break;
1147 	case PCI_IVAR_CLASS:
1148 		*result = cfg->baseclass;
1149 		break;
1150 	case PCI_IVAR_SUBCLASS:
1151 		*result = cfg->subclass;
1152 		break;
1153 	case PCI_IVAR_PROGIF:
1154 		*result = cfg->progif;
1155 		break;
1156 	case PCI_IVAR_REVID:
1157 		*result = cfg->revid;
1158 		break;
1159 	case PCI_IVAR_INTPIN:
1160 		*result = cfg->intpin;
1161 		break;
1162 	case PCI_IVAR_IRQ:
1163 		*result = cfg->intline;
1164 		break;
1165 	case PCI_IVAR_BUS:
1166 		*result = cfg->bus;
1167 		break;
1168 	case PCI_IVAR_SLOT:
1169 		*result = cfg->slot;
1170 		break;
1171 	case PCI_IVAR_FUNCTION:
1172 		*result = cfg->func;
1173 		break;
1174 	default:
1175 		return (ENOENT);
1176 	}
1177 	return (0);
1178 }
1179 
1180 int
1181 pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
1182 {
1183 	struct pci_devinfo *dinfo;
1184 	pcicfgregs *cfg;
1185 
1186 	dinfo = device_get_ivars(child);
1187 	cfg = &dinfo->cfg;
1188 
1189 	switch (which) {
1190 	case PCI_IVAR_ETHADDR:
1191 	case PCI_IVAR_SUBVENDOR:
1192 	case PCI_IVAR_SUBDEVICE:
1193 	case PCI_IVAR_VENDOR:
1194 	case PCI_IVAR_DEVICE:
1195 	case PCI_IVAR_DEVID:
1196 	case PCI_IVAR_CLASS:
1197 	case PCI_IVAR_SUBCLASS:
1198 	case PCI_IVAR_PROGIF:
1199 	case PCI_IVAR_REVID:
1200 	case PCI_IVAR_INTPIN:
1201 	case PCI_IVAR_IRQ:
1202 	case PCI_IVAR_BUS:
1203 	case PCI_IVAR_SLOT:
1204 	case PCI_IVAR_FUNCTION:
1205 		return (EINVAL);	/* disallow for now */
1206 
1207 	default:
1208 		return (ENOENT);
1209 	}
1210 	return (0);
1211 }
1212 
1213 
1214 #include "opt_ddb.h"
1215 #ifdef DDB
1216 #include <ddb/ddb.h>
1217 #include <sys/cons.h>
1218 
1219 /*
1220  * List resources based on pci map registers, used for within ddb
1221  */
1222 
1223 DB_SHOW_COMMAND(pciregs, db_pci_dump)
1224 {
1225 	struct pci_devinfo *dinfo;
1226 	struct devlist *devlist_head;
1227 	struct pci_conf *p;
1228 	const char *name;
1229 	int i, error, none_count, nl;
1230 
1231 	none_count = 0;
1232 	nl = 0;
1233 	/* get the head of the device queue */
1234 	devlist_head = &pci_devq;
1235 
1236 	/*
1237 	 * Go through the list of devices and print out devices
1238 	 */
1239 	for (error = 0, i = 0,
1240 	     dinfo = STAILQ_FIRST(devlist_head);
1241 	     (dinfo != NULL) && (error == 0) && (i < pci_numdevs);
1242 	     dinfo = STAILQ_NEXT(dinfo, pci_links), i++) {
1243 
1244 		/* Populate pd_name and pd_unit */
1245 		name = NULL;
1246 		if (dinfo->cfg.dev)
1247 			name = device_get_name(dinfo->cfg.dev);
1248 
1249 		p = &dinfo->conf;
1250 		/*
1251 		 * XXX just take 20 for now...
1252 		 */
1253 		if (nl++ == 20) {
1254 			int c;
1255 
1256 			db_printf("--More--");
1257 			c = cngetc();
1258 			db_printf("\r");
1259 			/*
1260 			 * A whole screenfull or just one line?
1261 			 */
1262 			switch (c) {
1263 			case '\n':              /* just one line */
1264 				nl = 20;
1265 				break;
1266 			case ' ':
1267 				nl = 0;         /* another screenfull */
1268 				break;
1269 			default:                /* exit */
1270 				db_printf("\n");
1271 				return;
1272 			}
1273 		}
1274 
1275 		db_printf("%s%d@pci%d:%d:%d:\tclass=0x%06x card=0x%08x "
1276 			"chip=0x%08x rev=0x%02x hdr=0x%02x\n",
1277 			(name && *name) ? name : "none",
1278 			(name && *name) ? (int)device_get_unit(dinfo->cfg.dev) :
1279 			none_count++,
1280 			p->pc_sel.pc_bus, p->pc_sel.pc_dev,
1281 			p->pc_sel.pc_func, (p->pc_class << 16) |
1282 			(p->pc_subclass << 8) | p->pc_progif,
1283 			(p->pc_subdevice << 16) | p->pc_subvendor,
1284 			(p->pc_device << 16) | p->pc_vendor,
1285 			p->pc_revid, p->pc_hdr);
1286 	}
1287 }
1288 #endif /* DDB */
1289 
1290 struct resource *
1291 pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
1292 		   u_long start, u_long end, u_long count, u_int flags)
1293 {
1294 	struct pci_devinfo *dinfo = device_get_ivars(child);
1295 	struct resource_list *rl = &dinfo->resources;
1296 	pcicfgregs *cfg = &dinfo->cfg;
1297 
1298 	/*
1299 	 * Perform lazy resource allocation
1300 	 *
1301 	 * XXX add support here for SYS_RES_IOPORT and SYS_RES_MEMORY
1302 	 */
1303 	if (device_get_parent(child) == dev) {
1304 		/*
1305 		 * If the child device doesn't have an interrupt routed
1306 		 * and is deserving of an interrupt, try to assign it one.
1307 		 */
1308 		if ((type == SYS_RES_IRQ) &&
1309 		    !PCI_INTERRUPT_VALID(cfg->intline) &&
1310 		    (cfg->intpin != 0)) {
1311 			cfg->intline = PCIB_ROUTE_INTERRUPT(
1312 				device_get_parent(dev), child, cfg->intpin);
1313 			if (PCI_INTERRUPT_VALID(cfg->intline)) {
1314 				pci_write_config(child, PCIR_INTLINE,
1315 				    cfg->intline, 1);
1316 				resource_list_add(rl, SYS_RES_IRQ, 0,
1317 				    cfg->intline, cfg->intline, 1);
1318 			}
1319 		}
1320 	}
1321 
1322 	return (resource_list_alloc(rl, dev, child, type, rid,
1323 	    start, end, count, flags));
1324 }
1325 
1326 void
1327 pci_delete_resource(device_t dev, device_t child, int type, int rid)
1328 {
1329 	struct pci_devinfo *dinfo;
1330 	struct resource_list *rl;
1331 	struct resource_list_entry *rle;
1332 
1333 	if (device_get_parent(child) != dev)
1334 		return;
1335 
1336 	dinfo = device_get_ivars(child);
1337 	rl = &dinfo->resources;
1338 	rle = resource_list_find(rl, type, rid);
1339 	if (rle) {
1340 		if (rle->res) {
1341 			if (rman_get_device(rle->res) != dev ||
1342 			    rman_get_flags(rle->res) & RF_ACTIVE) {
1343 				device_printf(dev, "delete_resource: "
1344 				    "Resource still owned by child, oops. "
1345 				    "(type=%d, rid=%d, addr=%lx)\n",
1346 				    rle->type, rle->rid,
1347 				    rman_get_start(rle->res));
1348 				return;
1349 			}
1350 			bus_release_resource(dev, type, rid, rle->res);
1351 		}
1352 		resource_list_delete(rl, type, rid);
1353 	}
1354 	/*
1355 	 * Why do we turn off the PCI configuration BAR when we delete a
1356 	 * resource? -- imp
1357 	 */
1358 	pci_write_config(child, rid, 0, 4);
1359 	BUS_DELETE_RESOURCE(device_get_parent(dev), child, type, rid);
1360 }
1361 
1362 struct resource_list *
1363 pci_get_resource_list (device_t dev, device_t child)
1364 {
1365 	struct pci_devinfo *	dinfo = device_get_ivars(child);
1366 	struct resource_list *  rl = &dinfo->resources;
1367 
1368 	if (!rl)
1369 		return (NULL);
1370 
1371 	return (rl);
1372 }
1373 
1374 u_int32_t
1375 pci_read_config_method(device_t dev, device_t child, int reg, int width)
1376 {
1377 	struct pci_devinfo *dinfo = device_get_ivars(child);
1378 	pcicfgregs *cfg = &dinfo->cfg;
1379 
1380 	return (PCIB_READ_CONFIG(device_get_parent(dev),
1381 	    cfg->bus, cfg->slot, cfg->func, reg, width));
1382 }
1383 
1384 void
1385 pci_write_config_method(device_t dev, device_t child, int reg,
1386     u_int32_t val, int width)
1387 {
1388 	struct pci_devinfo *dinfo = device_get_ivars(child);
1389 	pcicfgregs *cfg = &dinfo->cfg;
1390 
1391 	PCIB_WRITE_CONFIG(device_get_parent(dev),
1392 	    cfg->bus, cfg->slot, cfg->func, reg, val, width);
1393 }
1394 
1395 int
1396 pci_child_location_str_method(device_t cbdev, device_t child, char *buf,
1397     size_t buflen)
1398 {
1399 	struct pci_devinfo *dinfo;
1400 	pcicfgregs *cfg;
1401 
1402 	dinfo = device_get_ivars(child);
1403 	cfg = &dinfo->cfg;
1404 	snprintf(buf, buflen, "slot=%d function=%d", pci_get_slot(child),
1405 	    pci_get_function(child));
1406 	return (0);
1407 }
1408 
1409 int
1410 pci_child_pnpinfo_str_method(device_t cbdev, device_t child, char *buf,
1411     size_t buflen)
1412 {
1413 	struct pci_devinfo *dinfo;
1414 	pcicfgregs *cfg;
1415 
1416 	dinfo = device_get_ivars(child);
1417 	cfg = &dinfo->cfg;
1418 	snprintf(buf, buflen, "vendor=0x%04x device=0x%04x subvendor=0x%04x "
1419 	    "subdevice=0x%04x class=0x%02x%02x%02x", cfg->vendor, cfg->device,
1420 	    cfg->subvendor, cfg->subdevice, cfg->baseclass, cfg->subclass,
1421 	    cfg->progif);
1422 	return (0);
1423 }
1424 
1425 static int
1426 pci_modevent(module_t mod, int what, void *arg)
1427 {
1428 	static dev_t pci_cdev;
1429 
1430 	switch (what) {
1431 	case MOD_LOAD:
1432 		STAILQ_INIT(&pci_devq);
1433 		pci_generation = 0;
1434 		pci_cdev = make_dev(&pcicdev, 0, UID_ROOT, GID_WHEEL, 0644,
1435 		    "pci");
1436 		pci_load_vendor_data();
1437 		break;
1438 
1439 	case MOD_UNLOAD:
1440 		destroy_dev(pci_cdev);
1441 		break;
1442 	}
1443 
1444 	return (0);
1445 }
1446