1 /************************************************************************** 2 ** 3 ** $Id: pci.c,v 1.31 1995/09/14 23:24:29 se Exp $ 4 ** 5 ** General subroutines for the PCI bus. 6 ** pci_configure () 7 ** 8 ** FreeBSD 9 ** 10 **------------------------------------------------------------------------- 11 ** 12 ** Copyright (c) 1994 Wolfgang Stanglmeier. All rights reserved. 13 ** 14 ** Redistribution and use in source and binary forms, with or without 15 ** modification, are permitted provided that the following conditions 16 ** are met: 17 ** 1. Redistributions of source code must retain the above copyright 18 ** notice, this list of conditions and the following disclaimer. 19 ** 2. Redistributions in binary form must reproduce the above copyright 20 ** notice, this list of conditions and the following disclaimer in the 21 ** documentation and/or other materials provided with the distribution. 22 ** 3. The name of the author may not be used to endorse or promote products 23 ** derived from this software without specific prior written permission. 24 ** 25 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 26 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 27 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 28 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 29 ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 30 ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 34 ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 ** 36 *************************************************************************** 37 */ 38 39 #include <pci.h> 40 #if NPCI > 0 41 42 /*======================================================== 43 ** 44 ** #includes and declarations 45 ** 46 **======================================================== 47 */ 48 49 #include <sys/param.h> 50 #include <sys/systm.h> 51 #include <sys/malloc.h> 52 #include <sys/errno.h> 53 #include <sys/kernel.h> 54 #include <sys/proc.h> /* declaration of wakeup(), used by vm.h */ 55 #include <sys/devconf.h> 56 57 #include <machine/cpu.h> /* bootverbose */ 58 59 #include <vm/vm.h> 60 #include <vm/vm_param.h> 61 62 #include <machine/pmap.h> 63 #include <sys/devconf.h> 64 65 #include <pci/pcivar.h> 66 #include <pci/pcireg.h> 67 #include <pci/pcibus.h> 68 69 #define PCI_MAX_IRQ (16) 70 71 72 /*======================================================== 73 ** 74 ** Structs and Functions 75 ** 76 **======================================================== 77 */ 78 79 struct pci_devconf { 80 struct kern_devconf pdc_kdc; 81 struct pci_info pdc_pi; 82 }; 83 84 struct pcicb { 85 struct pcicb *pcicb_next; 86 struct pcicb *pcicb_up; 87 struct pcicb *pcicb_down; 88 pcici_t pcicb_bridge; 89 90 u_long pcicb_seen; 91 u_char pcicb_bus; 92 u_char pcicb_subordinate; 93 u_char pcicb_flags; 94 #define PCICB_ISAMEM 0x01 95 u_int pcicb_mfrom; 96 u_int pcicb_mupto; 97 u_int pcicb_mamount; 98 u_short pcicb_pfrom; 99 u_short pcicb_pupto; 100 u_short pcicb_pamount; 101 u_char pcicb_bfrom; 102 u_char pcicb_bupto; 103 104 u_long pcicb_iobase; 105 u_long pcicb_iolimit; 106 u_long pcicb_membase; 107 u_long pcicb_memlimit; 108 u_long pcicb_p_membase; 109 u_long pcicb_p_memlimit; 110 }; 111 112 static int 113 pci_externalize (struct proc *, struct kern_devconf *, void *, size_t); 114 115 static int 116 pci_internalize (struct proc *, struct kern_devconf *, void *, size_t); 117 118 static void 119 not_supported (pcici_t tag, u_long type); 120 121 static void 122 pci_bus_config (void); 123 124 static void 125 pci_bridge_config (void); 126 127 /*======================================================== 128 ** 129 ** Variables 130 ** 131 **======================================================== 132 */ 133 134 /* 135 ** log2 of safe burst len (in words) 136 */ 137 138 unsigned pci_max_burst_len = 2; /* 2=16Byte, 3=32Byte, 4=64Byte, ... */ 139 unsigned pci_mechanism = 0; 140 unsigned pci_maxdevice = 0; 141 struct pcibus* pcibus; 142 143 /*-------------------------------------------------------- 144 ** 145 ** Local variables. 146 ** 147 **-------------------------------------------------------- 148 */ 149 150 static int pci_conf_count; 151 static int pci_info_done; 152 static struct pcicb pcibus0 = { 153 NULL, NULL, NULL, 154 { 0 }, 155 0, 0, 0, 0, 156 0, 0, 0, 0, 0, 0, 0, 0, /* real allocation */ 157 0, 0xFFFF, /* iobase/limit */ 158 0x4000000, 0xFFFFFFFFu, /* nonprefetch membase/limit */ 159 0x4000000, 0xFFFFFFFFu /* prefetch membase/limit */ 160 }; 161 static struct pcicb *pcicb; 162 163 /*======================================================== 164 ** 165 ** pci_configure () 166 ** 167 ** Autoconfiguration of pci devices. 168 ** 169 ** May be called more than once. 170 ** Any device is attached only once. 171 ** 172 ** Has to take care of mirrored devices, which are 173 ** entailed by incomplete decoding of pci address lines. 174 ** 175 **======================================================== 176 */ 177 178 void pci_configure() 179 { 180 struct pcibus **pbp = (struct pcibus**) pcibus_set.ls_items; 181 182 /* 183 ** check pci bus present 184 */ 185 186 while (!pci_maxdevice && (pcibus = *pbp++)) { 187 (*pcibus->pb_setup)(); 188 } 189 190 if (!pci_maxdevice) return; 191 192 /* 193 ** hello world .. 194 */ 195 196 for (pcicb = &pcibus0; pcicb != NULL;) { 197 pci_bus_config (); 198 199 if (pcicb->pcicb_down) { 200 pcicb = pcicb->pcicb_down; 201 continue; 202 }; 203 204 while (pcicb && !pcicb->pcicb_next) 205 pcicb = pcicb->pcicb_up; 206 207 if (pcicb) 208 pcicb = pcicb->pcicb_next; 209 } 210 pci_conf_count++; 211 } 212 213 /*======================================================== 214 ** 215 ** Subroutines for configuration. 216 ** 217 **======================================================== 218 */ 219 220 static void 221 pci_register_io (struct pcicb * cb, u_int base, u_int limit) 222 { 223 #ifdef PCI_BRIDGE_DEBUG 224 if (bootverbose) 225 printf ("register_io: bus=%d base=%x limit=%x\n", 226 cb->pcicb_bus, base, limit); 227 #endif 228 229 if (!cb->pcicb_pfrom || base < cb->pcicb_pfrom) 230 cb->pcicb_pfrom = base; 231 if (limit > cb->pcicb_pupto) 232 cb->pcicb_pupto = limit; 233 234 /* 235 ** XXX should set bridge io mapping here 236 ** but it can be mapped in 4k blocks only, 237 ** leading to conflicts with isa/eisa .. 238 */ 239 } 240 241 static void 242 pci_register_memory (struct pcicb * cb, u_int base, u_int limit) 243 { 244 #ifdef PCI_BRIDGE_DEBUG 245 if (bootverbose) 246 printf ("register_mem: bus=%d base=%x limit=%x\n", 247 cb->pcicb_bus, base, limit); 248 #endif 249 250 if (!cb->pcicb_mfrom || base < cb->pcicb_mfrom) 251 cb->pcicb_mfrom = base; 252 if (limit > cb->pcicb_mupto) 253 cb->pcicb_mupto = limit; 254 /* 255 ** set the bridges mapping 256 ** 257 ** XXX should handle the 1Mb granularity. 258 */ 259 if (cb->pcicb_bridge.tag) { 260 pci_conf_write(cb->pcicb_bridge, 261 PCI_PCI_BRIDGE_MEM_REG, 262 (cb->pcicb_memlimit & 0xffff0000) | 263 (cb->pcicb_membase >> 16)); 264 if (bootverbose) 265 printf ("\t[pci%d uses memory from %x to %x]\n", 266 cb->pcicb_bus, 267 (unsigned) cb->pcicb_membase, 268 (unsigned) cb->pcicb_memlimit); 269 } 270 } 271 272 /* 273 ** XXX This function is neither complete nor tested. 274 ** It's only used if the bios hasn't done it's job 275 ** of mapping the pci devices in the physical memory. 276 */ 277 278 static u_int 279 pci_memalloc (struct pcicb * cb, u_int addr, u_int size) 280 { 281 u_int result = 0, limit=0, newbase=0; 282 #ifdef PCI_BRIDGE_DEBUG 283 if (bootverbose) 284 printf ("memalloc: bus=%d addr=%x size=%x ..\n", 285 cb->pcicb_bus, addr, size); 286 #endif 287 288 if (!cb) goto done; 289 290 if (!cb->pcicb_membase) { 291 printf ("memalloc: bus%d: membase not set.\n", 292 cb->pcicb_bus); 293 goto done; 294 } 295 296 /* 297 ** get upper allocation limit 298 */ 299 limit = cb->pcicb_memlimit; 300 if (cb->pcicb_mfrom && cb->pcicb_mfrom <= limit) 301 limit = cb->pcicb_mfrom-1; 302 303 /* 304 ** address fixed, and impossible to allocate ? 305 */ 306 if (addr && addr+size-1 > limit) 307 goto done; 308 309 /* 310 ** get possible address 311 */ 312 313 result = addr; 314 if (!result) result = ((limit + 1) / size - 1) * size; 315 316 /* 317 ** if not local available, request from parent. 318 */ 319 320 if (result < cb->pcicb_membase) { 321 newbase = pci_memalloc (cb->pcicb_up, result, size); 322 if (newbase) cb->pcicb_membase = result; 323 else result=0; 324 } 325 done: 326 if (result) 327 pci_register_memory (cb, result, result+size-1); 328 329 #ifdef PCI_BRIDGE_DEBUG 330 printf ("memalloc: bus=%d addr=%x size=%x --> %x (limit=%x).\n", 331 cb->pcicb_bus, addr, size, result, limit); 332 #endif 333 334 return (result); 335 } 336 337 /*======================================================== 338 ** 339 ** pci_bus_config() 340 ** 341 ** Autoconfiguration of one pci bus. 342 ** 343 **======================================================== 344 */ 345 346 static void 347 pci_bus_config (void) 348 { 349 u_char device; 350 u_char reg; 351 pcici_t tag, mtag; 352 pcidi_t type; 353 u_long data; 354 int unit; 355 int pciint; 356 int irq; 357 358 struct pci_device *dvp; 359 360 struct pci_devconf *pdcp; 361 362 /* 363 ** first initialize the bridge (bus controller chip) 364 */ 365 pci_bridge_config (); 366 367 printf ("Probing for devices on the PCI bus:\n"); 368 #ifndef PCI_QUIET 369 if (bootverbose && !pci_info_done) { 370 pci_info_done=1; 371 printf ("\tconfiguration mode %d allows %d devices.\n", 372 pci_mechanism, pci_maxdevice); 373 }; 374 #endif 375 for (device=0; device<pci_maxdevice; device ++) { 376 char *name = NULL; 377 struct pci_device **dvpp; 378 379 if ((pcicb->pcicb_seen >> device) & 1) 380 continue; 381 382 tag = pcibus->pb_tag (pcicb->pcicb_bus, device, 0); 383 type = pcibus->pb_read (tag, PCI_ID_REG); 384 385 if ((!type) || (type==0xfffffffful)) continue; 386 387 /* 388 ** lookup device in ioconfiguration: 389 */ 390 391 dvpp = (struct pci_device **)pcidevice_set.ls_items; 392 393 while (dvp = *dvpp++) { 394 if (dvp->pd_probe) { 395 if (name=(*dvp->pd_probe)(tag, type)) 396 break; 397 } 398 }; 399 /* 400 ** check for mirrored devices. 401 */ 402 if (device & 0x10) { 403 mtag=pcibus->pb_tag (pcicb->pcicb_bus, 404 (u_char)(device & ~0x10), 0); 405 } else if (device & 0x08) { 406 mtag=pcibus->pb_tag (pcicb->pcicb_bus, 407 (u_char)(device & ~0x08), 0); 408 } else goto real_device; 409 410 if (type!=pcibus->pb_read (mtag, PCI_ID_REG)) 411 goto real_device; 412 413 for (reg=PCI_MAP_REG_START;reg<PCI_MAP_REG_END;reg+=4) 414 if (pcibus->pb_read(tag,reg)!=pcibus->pb_read(mtag,reg)) 415 goto real_device; 416 417 #ifndef PCI_QUIET 418 if (dvp==NULL) continue; 419 if (bootverbose) 420 printf ("%s? <%s> mirrored on pci%d:%d\n", 421 dvp->pd_name, name, pcicb->pcicb_bus, device); 422 #endif 423 continue; 424 425 real_device: 426 427 if (dvp==NULL) { 428 #ifndef PCI_QUIET 429 if (pci_conf_count) 430 continue; 431 printf("%s%d:%d: ", pcibus->pb_name, 432 pcicb->pcicb_bus, device); 433 not_supported (tag, type); 434 #endif 435 continue; 436 }; 437 438 pcicb->pcicb_seen |= (1ul << device); 439 440 /* 441 ** Get and increment the unit. 442 */ 443 444 unit = (*dvp->pd_count)++; 445 446 /* 447 ** ignore device ? 448 */ 449 450 if (!*name) continue; 451 452 /* 453 ** Announce this device 454 */ 455 456 printf ("%s%d <%s> rev %d", dvp->pd_name, unit, name, 457 (unsigned) pci_conf_read (tag, PCI_CLASS_REG) & 0xff); 458 459 /* 460 ** Get the int pin number (pci interrupt number a-d) 461 ** from the pci configuration space. 462 */ 463 464 data = pcibus->pb_read (tag, PCI_INTERRUPT_REG); 465 pciint = PCI_INTERRUPT_PIN_EXTRACT(data); 466 467 if (pciint) { 468 469 printf (" int %c irq ", 0x60+pciint); 470 471 irq = PCI_INTERRUPT_LINE_EXTRACT(data); 472 473 /* 474 ** If it's zero, the isa irq number is unknown, 475 ** and we cannot bind the pci interrupt. 476 */ 477 478 if (irq) 479 printf ("%d", irq); 480 else 481 printf ("??"); 482 }; 483 484 printf (" on pci%d:%d\n", pcicb->pcicb_bus, device); 485 486 /* 487 ** Read the current mapping, 488 ** and update the pcicb fields. 489 */ 490 491 for (reg=PCI_MAP_REG_START;reg<PCI_MAP_REG_END;reg+=4) { 492 u_int map, addr, size; 493 494 data = pci_conf_read(tag, PCI_CLASS_REG); 495 switch (data & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) { 496 case PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI: 497 continue; 498 }; 499 500 map = pcibus->pb_read (tag, reg); 501 if (!(map & PCI_MAP_MEMORY_ADDRESS_MASK)) 502 continue; 503 504 pcibus->pb_write (tag, reg, 0xffffffff); 505 data = pcibus->pb_read (tag, reg); 506 pcibus->pb_write (tag, reg, map); 507 508 switch (data & 7) { 509 510 default: 511 continue; 512 case 1: 513 case 5: 514 size = -(data & PCI_MAP_IO_ADDRESS_MASK); 515 addr = map & PCI_MAP_IO_ADDRESS_MASK; 516 517 pci_register_io (pcicb, addr, addr+size-1); 518 pcicb->pcicb_pamount += size; 519 break; 520 521 case 0: 522 case 2: 523 case 4: 524 size = -(data & PCI_MAP_MEMORY_ADDRESS_MASK); 525 addr = map & PCI_MAP_MEMORY_ADDRESS_MASK; 526 if (addr >= 0x100000) { 527 pci_register_memory 528 (pcicb, addr, addr+size-1); 529 pcicb->pcicb_mamount += size; 530 } else { 531 pcicb->pcicb_flags |= PCICB_ISAMEM; 532 }; 533 break; 534 }; 535 if (bootverbose) 536 printf ("\tmapreg[%02x] type=%d addr=%08x size=%04x.\n", 537 reg, map&7, addr, size); 538 }; 539 540 /* 541 ** Allocate a devconf structure 542 ** We should, and eventually will, set the 543 ** parent pointer to a pci bus devconf structure, 544 ** and arrange to set the state field dynamically. 545 */ 546 547 pdcp = (struct pci_devconf *) 548 malloc (sizeof (struct pci_devconf),M_DEVBUF,M_WAITOK); 549 bzero(pdcp, sizeof(struct pci_devconf)); 550 551 pdcp -> pdc_pi.pi_bus = pcicb->pcicb_bus; 552 pdcp -> pdc_pi.pi_device = device; 553 554 pdcp -> pdc_kdc.kdc_name = dvp->pd_name; 555 pdcp -> pdc_kdc.kdc_unit = unit; 556 557 pdcp -> pdc_kdc.kdc_md.mddc_devtype = MDDT_PCI; 558 559 pdcp -> pdc_kdc.kdc_externalize = pci_externalize; 560 pdcp -> pdc_kdc.kdc_internalize = pci_internalize; 561 562 pdcp -> pdc_kdc.kdc_datalen = PCI_EXTERNAL_LEN; 563 pdcp -> pdc_kdc.kdc_parentdata = &pdcp->pdc_pi; 564 pdcp -> pdc_kdc.kdc_state = DC_UNKNOWN; 565 pdcp -> pdc_kdc.kdc_description = name; 566 pdcp -> pdc_kdc.kdc_shutdown = dvp->pd_shutdown; 567 568 /* 569 ** And register this device 570 */ 571 572 dev_attach (&pdcp->pdc_kdc); 573 574 /* 575 ** attach device 576 ** may produce additional log messages, 577 ** i.e. when installing subdevices. 578 */ 579 580 (*dvp->pd_attach) (tag, unit); 581 582 /* 583 ** Special processing of certain classes 584 */ 585 586 data = pci_conf_read(tag, PCI_CLASS_REG); 587 588 switch (data & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) { 589 struct pcicb *this, **link; 590 unsigned char primary, secondary, subordinate; 591 u_int command; 592 593 case PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI: 594 595 /* 596 ** get current configuration of the bridge. 597 */ 598 data = pci_conf_read (tag, PCI_PCI_BRIDGE_BUS_REG); 599 primary = PCI_PRIMARY_BUS_EXTRACT (data); 600 secondary = PCI_SECONDARY_BUS_EXTRACT(data); 601 subordinate = PCI_SUBORDINATE_BUS_EXTRACT(data); 602 #ifndef PCI_QUIET 603 if (bootverbose) { 604 printf ("\tbridge from pci%d to pci%d through %d.\n", 605 primary, secondary, subordinate); 606 printf ("\tmapping regs: io:%08lx mem:%08lx pmem:%08lx", 607 pci_conf_read (tag, PCI_PCI_BRIDGE_IO_REG), 608 pci_conf_read (tag, PCI_PCI_BRIDGE_MEM_REG), 609 pci_conf_read (tag, PCI_PCI_BRIDGE_PMEM_REG)); 610 } 611 #endif 612 /* 613 ** check for uninitialized bridge. 614 */ 615 if (secondary == 0 || secondary < primary || 616 pcicb->pcicb_bus != primary) 617 { 618 printf ("\tINCORRECTLY or NEVER CONFIGURED.\n"); 619 /* 620 ** disable this bridge 621 */ 622 pcibus->pb_write (tag, PCI_COMMAND_STATUS_REG, 623 0xffff0000); 624 secondary = 0; 625 subordinate = 0; 626 }; 627 628 /* 629 ** allocate bus descriptor for bus behind the bridge 630 */ 631 link = &pcicb->pcicb_down; 632 while (*link) link = &(*link)->pcicb_next; 633 634 this = malloc (sizeof (*this), M_DEVBUF, M_WAITOK); 635 636 /* 637 ** Initialize this descriptor so far. 638 ** (the initialization is completed just before 639 ** scanning the bus behind the bridge. 640 */ 641 bzero (this, sizeof(*this)); 642 this->pcicb_up = pcicb; 643 this->pcicb_bridge = tag; 644 this->pcicb_bus = secondary; 645 this->pcicb_subordinate = subordinate; 646 647 command = pci_conf_read(tag,PCI_COMMAND_STATUS_REG); 648 649 if (command & PCI_COMMAND_IO_ENABLE){ 650 /* 651 ** Bridge was configured by the bios. 652 ** Read out the mapped io region. 653 */ 654 u_int reg, data, mask; 655 656 reg = pci_conf_read (tag, 657 PCI_PCI_BRIDGE_IO_REG); 658 pci_conf_write(tag, 659 PCI_PCI_BRIDGE_IO_REG, 0xFFFF); 660 data = pci_conf_read (tag, 661 PCI_PCI_BRIDGE_IO_REG); 662 pci_conf_write(tag, 663 PCI_PCI_BRIDGE_IO_REG, reg & 0xffff); 664 665 mask = (0xFF00 ^ (data & 0xFF00)) | 0xFF; 666 667 this->pcicb_iobase = 668 PCI_PPB_IOBASE_EXTRACT (reg); 669 this->pcicb_iolimit = 670 PCI_PPB_IOLIMIT_EXTRACT(reg) | mask; 671 672 /* 673 ** Note the used io space. 674 */ 675 pci_register_io (pcicb, this->pcicb_iobase, 676 this->pcicb_iolimit); 677 678 }; 679 680 if (command & PCI_COMMAND_MEM_ENABLE) { 681 /* 682 ** Bridge was configured by the bios. 683 ** Read out the mapped memory regions. 684 */ 685 u_int reg, data, mask; 686 687 /* 688 ** non prefetchable memory 689 */ 690 reg = pci_conf_read (tag, 691 PCI_PCI_BRIDGE_MEM_REG); 692 pci_conf_write(tag, 693 PCI_PCI_BRIDGE_MEM_REG, 0xFFFFFFFF); 694 data = pci_conf_read (tag, 695 PCI_PCI_BRIDGE_MEM_REG); 696 pci_conf_write(tag, 697 PCI_PCI_BRIDGE_MEM_REG, reg); 698 699 mask = 0xFFFFFFFF ^ (data & 0xFFFF0000); 700 this->pcicb_membase = 701 PCI_PPB_MEMBASE_EXTRACT (reg); 702 this->pcicb_memlimit = 703 PCI_PPB_MEMLIMIT_EXTRACT(reg) | mask; 704 705 /* 706 ** Register used memory space. 707 */ 708 pci_register_memory (pcicb, 709 this->pcicb_membase, 710 this->pcicb_memlimit); 711 712 /* 713 ** prefetchable memory 714 */ 715 reg = pci_conf_read (tag, 716 PCI_PCI_BRIDGE_PMEM_REG); 717 pci_conf_write(tag, 718 PCI_PCI_BRIDGE_PMEM_REG, 0xFFFFFFFF); 719 data = pci_conf_read (tag, 720 PCI_PCI_BRIDGE_PMEM_REG); 721 pci_conf_write(tag, 722 PCI_PCI_BRIDGE_PMEM_REG, reg); 723 724 mask = 0xFFFFFFFF ^ (data & 0xFFFF0000); 725 this->pcicb_p_membase= 726 PCI_PPB_MEMBASE_EXTRACT (reg); 727 this->pcicb_p_memlimit= 728 PCI_PPB_MEMLIMIT_EXTRACT(reg) | mask; 729 730 /* 731 ** Register used memory space. 732 */ 733 pci_register_memory (pcicb, 734 this->pcicb_p_membase, 735 this->pcicb_p_memlimit); 736 } 737 738 /* 739 ** Link it in chain. 740 */ 741 *link=this; 742 743 /* 744 ** Update mapping info of parent bus. 745 */ 746 if (!pcicb->pcicb_bfrom||secondary< pcicb->pcicb_bfrom) 747 pcicb->pcicb_bfrom = secondary; 748 if (subordinate > pcicb->pcicb_bupto) 749 pcicb->pcicb_bupto = subordinate; 750 751 break; 752 } 753 } 754 755 #ifndef PCI_QUIET 756 if (bootverbose) { 757 if (pcicb->pcicb_mamount) 758 printf ("%s%d: uses %d bytes of memory from %x upto %x.\n", 759 pcibus->pb_name, pcicb->pcicb_bus, 760 pcicb->pcicb_mamount, 761 pcicb->pcicb_mfrom, pcicb->pcicb_mupto); 762 if (pcicb->pcicb_pamount) 763 printf ("%s%d: uses %d bytes of I/O space from %x upto %x.\n", 764 pcibus->pb_name, pcicb->pcicb_bus, 765 pcicb->pcicb_pamount, 766 pcicb->pcicb_pfrom, pcicb->pcicb_pupto); 767 if (pcicb->pcicb_bfrom) 768 printf ("%s%d: subordinate busses from %x upto %x.\n", 769 pcibus->pb_name, pcicb->pcicb_bus, 770 pcicb->pcicb_bfrom, pcicb->pcicb_bupto); 771 } 772 #endif 773 } 774 775 /*======================================================== 776 ** 777 ** pci_bridge_config() 778 ** 779 ** Configuration of a pci bridge. 780 ** 781 **======================================================== 782 */ 783 784 static void 785 pci_bridge_config (void) 786 { 787 pcici_t tag; 788 struct pcicb* parent; 789 790 tag = pcicb->pcicb_bridge; 791 if (!tag.tag) return; 792 793 if (!pcicb->pcicb_bus) { 794 u_int data; 795 /* 796 ** Get the lowest available bus number. 797 */ 798 pcicb->pcicb_bus = ++pcibus0.pcicb_subordinate; 799 800 /* 801 ** and configure the bridge 802 */ 803 data = pci_conf_read (tag, PCI_PCI_BRIDGE_BUS_REG); 804 data = PCI_PRIMARY_BUS_INSERT(data, pcicb->pcicb_up->pcicb_bus); 805 data = PCI_SECONDARY_BUS_INSERT(data, pcicb->pcicb_bus); 806 data = PCI_SUBORDINATE_BUS_INSERT(data, pcicb->pcicb_bus); 807 pci_conf_write (tag, PCI_PCI_BRIDGE_BUS_REG, data); 808 809 /* 810 ** Propagate the new upper bus number limit. 811 */ 812 for (parent = pcicb->pcicb_up; parent != NULL; 813 parent = parent->pcicb_up) 814 { 815 if (parent->pcicb_subordinate >= pcicb->pcicb_bus) 816 continue; 817 parent->pcicb_subordinate = pcicb->pcicb_bus; 818 if (!parent->pcicb_bridge.tag) 819 continue; 820 data = pci_conf_read 821 (parent->pcicb_bridge, PCI_PCI_BRIDGE_BUS_REG); 822 data = PCI_SUBORDINATE_BUS_INSERT 823 (data, pcicb->pcicb_bus); 824 pci_conf_write (parent->pcicb_bridge, 825 PCI_PCI_BRIDGE_BUS_REG, data); 826 } 827 } 828 829 if (!pcicb->pcicb_membase) { 830 u_int size = 0x100000; 831 pcicb->pcicb_membase = pci_memalloc (pcicb->pcicb_up, 0, size); 832 if (pcicb->pcicb_membase) 833 pcicb->pcicb_memlimit = pcicb->pcicb_membase+size-1; 834 } 835 } 836 837 /*----------------------------------------------------------------- 838 ** 839 ** The following functions are provided for the device driver 840 ** to read/write the configuration space. 841 ** 842 ** pci_conf_read(): 843 ** Read a long word from the pci configuration space. 844 ** Requires a tag (from pcitag) and the register 845 ** number (should be a long word alligned one). 846 ** 847 ** pci_conf_write(): 848 ** Writes a long word to the pci configuration space. 849 ** Requires a tag (from pcitag), the register number 850 ** (should be a long word alligned one), and a value. 851 ** 852 **----------------------------------------------------------------- 853 */ 854 855 u_long 856 pci_conf_read (pcici_t tag, u_long reg) 857 { 858 return (pcibus->pb_read (tag, reg)); 859 } 860 861 void 862 pci_conf_write (pcici_t tag, u_long reg, u_long data) 863 { 864 pcibus->pb_write (tag, reg, data); 865 } 866 867 /*----------------------------------------------------------------------- 868 ** 869 ** Map device into port space. 870 ** 871 ** Actually the device should have been mapped by the bios. 872 ** This function only reads and verifies the value. 873 ** 874 ** PCI-Specification: 6.2.5.1: address maps 875 ** 876 **----------------------------------------------------------------------- 877 */ 878 879 int pci_map_port (pcici_t tag, u_long reg, u_short* pa) 880 { 881 unsigned data, ioaddr, iosize; 882 struct pcicb *link = pcicb; 883 884 /* 885 ** sanity check 886 */ 887 888 if (reg < PCI_MAP_REG_START || reg >= PCI_MAP_REG_END || (reg & 3)) { 889 printf ("pci_map_port failed: bad register=0x%x\n", 890 (unsigned)reg); 891 return (0); 892 }; 893 894 /*if (pcicb->pcicb_flags & PCICB_NOIOSET) { 895 printf ("pci_map_port failed: pci%d has not been configured for I/O access\n", 896 pcicb->pcicb_bus); 897 return (0); 898 }*/ 899 900 /* 901 ** get size and type of port 902 ** 903 ** type is in the lowest two bits. 904 ** If device requires 2^n bytes, the next 905 ** n-2 bits are hardwired as 0. 906 */ 907 908 ioaddr = pcibus->pb_read (tag, reg) & PCI_MAP_IO_ADDRESS_MASK; 909 if (!ioaddr || ioaddr > 0xfffful) { 910 printf ("pci_map_port failed: not configured by bios.\n"); 911 return (0); 912 }; 913 914 pcibus->pb_write (tag, reg, 0xfffffffful); 915 data = pcibus->pb_read (tag, reg); 916 pcibus->pb_write (tag, reg, ioaddr); 917 918 if ((data & 0x03) != PCI_MAP_IO) { 919 printf ("pci_map_port failed: bad port type=0x%x\n", 920 (unsigned) data); 921 return (0); 922 }; 923 iosize = -(data & PCI_MAP_IO_ADDRESS_MASK); 924 if (ioaddr < pcicb->pcicb_iobase 925 || ioaddr + iosize > pcicb->pcicb_iolimit) { 926 printf ("pci_map_port failed: device's iorange 0x%x-0x%x " 927 "is incompatible with its bridge's range 0x%x-0x%x\n", 928 (unsigned) ioaddr, (unsigned) ioaddr + iosize - 1, 929 (unsigned) pcicb->pcicb_iobase, 930 (unsigned) pcicb->pcicb_iolimit); 931 return (0); 932 } 933 934 #ifndef PCI_QUIET 935 if (bootverbose) 936 printf ("\treg%d: ioaddr=0x%x size=0x%x\n", 937 (unsigned) reg, (unsigned) ioaddr, (unsigned) iosize); 938 #endif 939 /* 940 ** set the configuration register of and 941 ** return the address to the driver. 942 ** Make sure to enable each upstream bridge 943 ** so I/O and DMA can go all the way. 944 */ 945 946 for (;;) { 947 data = pcibus->pb_read (tag, PCI_COMMAND_STATUS_REG) & 0xffff; 948 data |= PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MASTER_ENABLE; 949 (void) pcibus->pb_write(tag, PCI_COMMAND_STATUS_REG, data); 950 if ((link = link->pcicb_up) == NULL) 951 break; 952 tag = link->pcicb_bridge; 953 } 954 955 *pa = ioaddr; 956 957 return (1); 958 } 959 960 /*----------------------------------------------------------------------- 961 ** 962 ** Map device into virtual and physical space 963 ** 964 ** Actually the device should have been mapped by the bios. 965 ** This function only reads and verifies the value. 966 ** 967 ** PCI-Specification: 6.2.5.1: address maps 968 ** 969 **----------------------------------------------------------------------- 970 */ 971 972 int pci_map_mem (pcici_t tag, u_long reg, vm_offset_t* va, vm_offset_t* pa) 973 { 974 struct pcicb *link = pcicb; 975 unsigned data ,paddr; 976 vm_size_t psize, poffs; 977 vm_offset_t vaddr; 978 979 /* 980 ** sanity check 981 */ 982 983 if (reg < PCI_MAP_REG_START || reg >= PCI_MAP_REG_END || (reg & 3)) { 984 printf ("pci_map_mem failed: bad register=0x%x\n", 985 (unsigned)reg); 986 return (0); 987 }; 988 989 /* 990 ** save old mapping, get size and type of memory 991 ** 992 ** type is in the lowest four bits. 993 ** If device requires 2^n bytes, the next 994 ** n-4 bits are read as 0. 995 */ 996 997 paddr = pcibus->pb_read (tag, reg) & PCI_MAP_MEMORY_ADDRESS_MASK; 998 pcibus->pb_write (tag, reg, 0xfffffffful); 999 data = pcibus->pb_read (tag, reg); 1000 pcibus->pb_write (tag, reg, paddr); 1001 1002 /* 1003 ** check the type 1004 */ 1005 1006 if ((data & PCI_MAP_MEMORY_TYPE_MASK) != PCI_MAP_MEMORY_TYPE_32BIT) { 1007 printf ("pci_map_mem failed: bad memory type=0x%x\n", 1008 (unsigned) data); 1009 return (0); 1010 }; 1011 1012 /* 1013 ** get the size. 1014 */ 1015 1016 psize = -(data & PCI_MAP_MEMORY_ADDRESS_MASK); 1017 1018 if (!paddr || paddr == PCI_MAP_MEMORY_ADDRESS_MASK) { 1019 paddr = pci_memalloc (pcicb, 0, psize); 1020 if (!paddr) { 1021 printf ("pci_map_mem: not configured by bios.\n"); 1022 return (0); 1023 }; 1024 pci_register_memory (pcicb, paddr, paddr+psize-1); 1025 }; 1026 1027 if (paddr < pcicb->pcicb_membase || 1028 paddr + psize - 1 > pcicb->pcicb_memlimit) { 1029 printf ("pci_map_mem failed: device's memrange 0x%x-0x%x is " 1030 "incompatible with its bridge's memrange 0x%x-0x%x\n", 1031 (unsigned) paddr, 1032 (unsigned) (paddr + psize - 1), 1033 (unsigned) pcicb->pcicb_membase, 1034 (unsigned) pcicb->pcicb_memlimit); 1035 /* return (0);*/ 1036 /* ACHTUNG: Ist der Code richtig, wenn eine PCI-PCI-Bridge fuer 1037 * die PCI-Slots verwendet wird, aber die Onboard-Devices direkt 1038 * an der CPU-PCI-Bridge haengen (Siehe Compaq Prolinea Problem) ??? 1039 */ 1040 } 1041 pcibus->pb_write (tag, reg, paddr); 1042 1043 /* 1044 ** Truncate paddr to page boundary. 1045 ** (Or does pmap_mapdev the job?) 1046 */ 1047 1048 poffs = paddr - trunc_page (paddr); 1049 vaddr = (vm_offset_t) pmap_mapdev (paddr-poffs, psize+poffs); 1050 1051 if (!vaddr) return (0); 1052 1053 vaddr += poffs; 1054 1055 #ifndef PCI_QUIET 1056 /* 1057 ** display values. 1058 */ 1059 1060 if (bootverbose) 1061 printf ("\treg%d: virtual=0x%lx physical=0x%lx size=0x%lx\n", 1062 (unsigned) reg, (u_long)vaddr, (u_long)paddr, (u_long)psize); 1063 #endif 1064 /* 1065 ** set the configuration register and 1066 ** return the address to the driver 1067 ** Make sure to enable each upstream bridge 1068 ** so memory and DMA can go all the way. 1069 */ 1070 1071 for (;;) { 1072 data = pcibus->pb_read (tag, PCI_COMMAND_STATUS_REG) & 0xffff; 1073 data |= PCI_COMMAND_MEM_ENABLE | PCI_COMMAND_MASTER_ENABLE; 1074 (void) pcibus->pb_write(tag, PCI_COMMAND_STATUS_REG, data); 1075 if ((link = link->pcicb_up) == NULL) 1076 break; 1077 tag = link->pcicb_bridge; 1078 } 1079 1080 *va = vaddr; 1081 *pa = paddr; 1082 1083 return (1); 1084 } 1085 1086 /*------------------------------------------------------------ 1087 ** 1088 ** Interface functions for the devconf module. 1089 ** 1090 **------------------------------------------------------------ 1091 */ 1092 1093 static int 1094 pci_externalize (struct proc *p, struct kern_devconf *kdcp, void *u, size_t l) 1095 { 1096 struct pci_externalize_buffer buffer; 1097 struct pci_info * pip = kdcp->kdc_parentdata; 1098 pcici_t tag; 1099 int i; 1100 1101 if (l < sizeof buffer) { 1102 return ENOMEM; 1103 }; 1104 1105 tag = pcibus->pb_tag (pip->pi_bus, pip->pi_device, 0); 1106 1107 buffer.peb_pci_info = *pip; 1108 1109 for (i=0; i<PCI_EXT_CONF_LEN; i++) { 1110 buffer.peb_config[i] = pcibus->pb_read (tag, i*4); 1111 }; 1112 1113 return copyout(&buffer, u, sizeof buffer); 1114 } 1115 1116 1117 static int 1118 pci_internalize (struct proc *p, struct kern_devconf *kdcp, void *u, size_t s) 1119 { 1120 return EOPNOTSUPP; 1121 } 1122 1123 /*----------------------------------------------------------------------- 1124 ** 1125 ** Pci meta interrupt handler 1126 ** 1127 ** This handler assumes level triggered interrupts. 1128 ** It's possible to build a kernel which handles shared 1129 ** edge triggered interrupts by the options "PCI_EDGE_INT". 1130 ** But there is a performance penalty. 1131 ** 1132 ** (Of course you can delete the #ifdef PCI_EDGE_INT bracketed 1133 ** code at all :-) :-) :-) 1134 ** 1135 **----------------------------------------------------------------------- 1136 */ 1137 1138 struct pci_int_desc* 1139 pci_int_desc [PCI_MAX_IRQ]; 1140 1141 #ifndef NO_SHARED_IRQ 1142 1143 static inline unsigned 1144 splq (unsigned mask) 1145 { 1146 unsigned temp=cpl; 1147 cpl |= mask; 1148 return temp; 1149 } 1150 1151 static void 1152 pci_int (int irq) 1153 { 1154 struct pci_int_desc * p; 1155 int c, s; 1156 #ifdef PCI_EDGE_INT 1157 int i, n; 1158 #endif 1159 if (irq<0 || irq >= PCI_MAX_IRQ) { 1160 printf ("pci_int: irq %d out of range, ignored\n", irq); 1161 return; 1162 }; 1163 1164 #ifdef PCI_EDGE_INT 1165 for (i=0; i<1000; i++) { 1166 n = 0; 1167 #endif 1168 for (p = pci_int_desc[irq]; p!=NULL; p=p->pcid_next) { 1169 s = splq (*p->pcid_maskptr); 1170 c= (*p->pcid_handler) (p->pcid_argument); 1171 p-> pcid_tally += c; 1172 splx (s); 1173 #ifdef PCI_EDGE_INT 1174 n += c; 1175 #endif 1176 #if 0 1177 if (c && p->pcid_tally<20) 1178 printf ("PCI_INT: irq=%d h=%p cpl o=%x n=%x val=%d\n", 1179 irq, p->pcid_handler, s, cpl, c); 1180 #endif 1181 }; 1182 #ifdef PCI_EDGE_INT 1183 if (!n) return; 1184 }; 1185 printf ("pci_int(%d): permanent interrupt request.\n", irq); 1186 #endif 1187 } 1188 #endif 1189 1190 /*----------------------------------------------------------------------- 1191 ** 1192 ** Auxiliary function for interrupt (un)mapping. 1193 ** 1194 **----------------------------------------------------------------------- 1195 */ 1196 1197 static u_int 1198 getirq (pcici_t tag) 1199 { 1200 u_int irq; 1201 1202 irq = PCI_INTERRUPT_LINE_EXTRACT( 1203 pcibus->pb_read (tag, PCI_INTERRUPT_REG)); 1204 1205 if (irq <= 0) { 1206 printf ("\tint line register not set by bios\n"); 1207 return (0); 1208 } 1209 1210 if (irq >= pcibus->pb_maxirq || irq >= PCI_MAX_IRQ) { 1211 printf ("\tirq %d invalid.\n", irq); 1212 return (0); 1213 } 1214 1215 return (irq); 1216 } 1217 1218 static struct pci_int_desc ** 1219 getintdescbytag (u_int irq, pcici_t tag) 1220 { 1221 struct pci_int_desc *p, **pp; 1222 1223 pp=&pci_int_desc[irq]; 1224 while (((p=*pp)) && !sametag(p->pcid_tag,tag)) 1225 pp=&p->pcid_next; 1226 1227 if (!p) return (NULL); 1228 1229 return (pp); 1230 } 1231 1232 static struct pci_int_desc * 1233 getintdescbymptr (u_int irq, unsigned * mptr) 1234 { 1235 struct pci_int_desc *p; 1236 1237 for (p=pci_int_desc[irq];p;p=p->pcid_next) 1238 if (p->pcid_maskptr == mptr) break; 1239 return (p); 1240 } 1241 1242 /*----------------------------------------------------------------------- 1243 ** 1244 ** Map pci interrupt. 1245 ** 1246 **----------------------------------------------------------------------- 1247 */ 1248 1249 static unsigned pci_mask0 = 0; 1250 1251 int pci_map_int (pcici_t tag, int(*func)(), void* arg, unsigned* maskptr) 1252 { 1253 u_int irq; 1254 int result, oldspl; 1255 unsigned mask; 1256 struct pci_int_desc *tail, *mdp=NULL, *new=NULL; 1257 1258 /* 1259 ** Get irq line from configuration space, 1260 ** and check for consistency. 1261 */ 1262 1263 irq = getirq (tag); 1264 if (irq >= PCI_MAX_IRQ) { 1265 printf ("\tillegal irq %d.\n", irq); 1266 return (0); 1267 }; 1268 mask= 1ul << irq; 1269 1270 /* 1271 ** disable this interrupt. 1272 */ 1273 1274 oldspl = splq (mask); 1275 1276 /* 1277 ** If handler for this tag already installed, 1278 ** remove it first. 1279 */ 1280 1281 if (getintdescbytag (irq, tag) != NULL) 1282 pci_unmap_int (tag); 1283 1284 /* 1285 ** If this irq not yet included in the mask, include it. 1286 */ 1287 1288 mdp = getintdescbymptr (irq, maskptr); 1289 if (!mdp) { 1290 result = pcibus->pb_imaskinc (irq, maskptr); 1291 if (result) 1292 goto conflict; 1293 }; 1294 1295 /* 1296 ** Allocate descriptor and initialize it. 1297 */ 1298 1299 tail = pci_int_desc[irq]; 1300 1301 new = malloc (sizeof (*new), M_DEVBUF, M_WAITOK); 1302 bzero (new, sizeof (*new)); 1303 1304 new->pcid_next = tail; 1305 new->pcid_tag = tag; 1306 new->pcid_handler = func; 1307 new->pcid_argument = arg; 1308 new->pcid_maskptr = maskptr; 1309 new->pcid_tally = 0; 1310 new->pcid_mask = mask; 1311 1312 /* 1313 ** If first handler: install it. 1314 ** If second handler: install shared-int-handler. 1315 */ 1316 1317 if (!tail) { 1318 /* 1319 ** first handler for this irq. 1320 */ 1321 1322 result = pcibus->pb_iattach 1323 (irq, (void(*)()) func, (int) arg, maskptr); 1324 if (result) goto conflict; 1325 1326 #ifdef NO_SHARED_IRQ 1327 } else goto conflict; 1328 #else 1329 } else if (!tail->pcid_next) { 1330 /* 1331 ** Second handler for this irq. 1332 */ 1333 1334 if (bootverbose) 1335 printf ("\tusing shared irq %d.\n", irq); 1336 1337 /* 1338 ** replace old handler by shared-int-handler. 1339 */ 1340 1341 result = pcibus->pb_idetach (irq,(void(*)())tail->pcid_handler); 1342 if (result) 1343 printf ("\tCANNOT DETACH INT HANDLER.\n"); 1344 1345 result = pcibus->pb_iattach (irq, pci_int, irq, &pci_mask0); 1346 if (result) { 1347 printf ("\tCANNOT ATTACH SHARED INT HANDLER.\n"); 1348 goto fail; 1349 }; 1350 } 1351 #endif 1352 /* 1353 ** Link new descriptor, reenable ints and done. 1354 */ 1355 1356 pci_int_desc[irq] = new; 1357 splx (oldspl); 1358 return (1); 1359 1360 /* 1361 ** Handle some problems. 1362 */ 1363 1364 conflict: 1365 printf ("\tirq %d already in use.\n", irq); 1366 fail: 1367 /* 1368 ** If descriptor allocated, free it. 1369 ** If included in mask, remove it. 1370 */ 1371 1372 if (new) free(new, M_DEVBUF); 1373 if (!mdp) (void) pcibus->pb_imaskexc (irq, maskptr); 1374 splx (oldspl); 1375 return (0); 1376 } 1377 1378 /*----------------------------------------------------------------------- 1379 ** 1380 ** Unmap pci interrupt. 1381 ** 1382 **----------------------------------------------------------------------- 1383 */ 1384 1385 int pci_unmap_int (pcici_t tag) 1386 { 1387 int result, oldspl; 1388 struct pci_int_desc *this, **hook, *tail; 1389 unsigned irq; 1390 1391 /* 1392 ** Get irq line from configuration space, 1393 ** and check for consistency. 1394 */ 1395 1396 irq = getirq (tag); 1397 if (irq >= PCI_MAX_IRQ) { 1398 printf ("\tillegal irq %d.\n", irq); 1399 return (0); 1400 }; 1401 1402 /* 1403 ** Search and unlink interrupt descriptor. 1404 */ 1405 1406 hook = getintdescbytag (irq, tag); 1407 if (hook == NULL) { 1408 printf ("\tno irq %d handler for pci %x\n", 1409 irq, tag.tag); 1410 return (0); 1411 }; 1412 1413 this = *hook; 1414 *hook= this->pcid_next; 1415 1416 /* 1417 ** Message 1418 */ 1419 1420 printf ("\tirq %d handler %p(%p) unmapped for pci %x after %d ints.\n", 1421 irq, this->pcid_handler, this->pcid_argument, 1422 this->pcid_tag.tag, this->pcid_tally); 1423 1424 /* 1425 ** If this irq no longer included in the mask, remove it. 1426 */ 1427 1428 if (!getintdescbymptr (irq, this->pcid_maskptr)) 1429 (void) pcibus->pb_imaskexc (irq, this->pcid_maskptr); 1430 1431 tail = pci_int_desc[irq]; 1432 1433 if (tail == NULL) { 1434 1435 /* 1436 ** Remove the old handler. 1437 */ 1438 1439 result = pcibus->pb_idetach (irq,(void(*)())this->pcid_handler); 1440 if (result) 1441 printf ("\tirq %d: cannot remove handler.\n", irq); 1442 1443 } else if (tail->pcid_next == NULL) { 1444 1445 /* 1446 ** Remove the shared int handler. 1447 ** Install the last remaining handler. 1448 */ 1449 1450 oldspl = splq (1ul << irq); 1451 1452 result = pcibus->pb_idetach (irq, pci_int); 1453 if (result) 1454 printf ("\tirq %d: cannot remove handler.\n", irq); 1455 1456 result = pcibus->pb_iattach (irq, 1457 (void(*)()) tail->pcid_handler, 1458 (int) tail->pcid_argument, 1459 tail->pcid_maskptr); 1460 1461 if (result) 1462 printf ("\tirq %d: cannot install handler.\n", irq); 1463 1464 splx (oldspl); 1465 }; 1466 1467 free (this, M_DEVBUF); 1468 return (1); 1469 } 1470 1471 /*----------------------------------------------------------- 1472 ** 1473 ** Display of unknown devices. 1474 ** 1475 **----------------------------------------------------------- 1476 */ 1477 struct vt { 1478 u_short ident; 1479 char* name; 1480 }; 1481 1482 static struct vt VendorTable[] = { 1483 {0x0e11, "Compaq"}, 1484 {0x1000, "NCR/Symbios"}, 1485 {0x1002, "ATI Technologies Inc."}, 1486 {0x1004, "VLSI"}, 1487 {0x100B, "National Semiconductor"}, 1488 {0x100E, "Weitek"}, 1489 {0x1011, "Digital Equipment Corporation"}, 1490 {0x1013, "Cirrus Logic"}, 1491 {0x101A, "NCR"}, 1492 {0x1022, "AMD"}, 1493 {0x102B, "Matrox"}, 1494 {0x102C, "Chips & Technologies"}, 1495 {0x1039, "Silicon Integrated Systems"}, 1496 {0x1042, "SMC"}, 1497 {0x1044, "DPT"}, 1498 {0x1045, "OPTI"}, 1499 {0x104B, "Bus Logic"}, 1500 {0x1060, "UMC"}, 1501 {0x1080, "Contaq"}, 1502 {0x1095, "CMD"}, 1503 {0x1106, "VIA Technologies"}, 1504 {0x5333, "S3 Inc."}, 1505 {0x8086, "Intel Corporation"}, 1506 {0x9004, "Adaptec"}, 1507 {0,0} 1508 }; 1509 1510 typedef struct { 1511 const char subclass; 1512 const char *name; 1513 } subclass_name; 1514 1515 /* 0x00 prehistoric subclasses */ 1516 static const subclass_name old_subclasses[] = 1517 { 1518 { 0x00, "misc" }, 1519 { 0x01, "vga" }, 1520 { 0x00, NULL } 1521 }; 1522 1523 /* 0x01 mass storage subclasses */ 1524 static const subclass_name storage_subclasses[] = 1525 { 1526 { 0x00, "scsi" }, 1527 { 0x01, "ide" }, 1528 { 0x02, "floppy"}, 1529 { 0x03, "ipi" }, 1530 { 0x80, "misc" }, 1531 { 0x00, NULL } 1532 }; 1533 1534 /* 0x02 network subclasses */ 1535 static const subclass_name network_subclasses[] = 1536 { 1537 { 0x00, "ethernet" }, 1538 { 0x01, "tokenring" }, 1539 { 0x02, "fddi" }, 1540 { 0x80, "misc" }, 1541 { 0x00, NULL } 1542 }; 1543 1544 /* 0x03 display subclasses */ 1545 static const subclass_name display_subclasses[] = 1546 { 1547 { 0x00, "vga" }, 1548 { 0x01, "xga" }, 1549 { 0x80, "misc" }, 1550 { 0x00, NULL } 1551 }; 1552 1553 /* 0x04 multimedia subclasses */ 1554 static const subclass_name multimedia_subclasses[] = 1555 { 1556 { 0x00, "video" }, 1557 { 0x01, "audio" }, 1558 { 0x80, "misc" }, 1559 { 0x00, NULL } 1560 }; 1561 1562 /* 0x05 memory subclasses */ 1563 static const subclass_name memory_subclasses[] = 1564 { 1565 { 0x00, "ram" }, 1566 { 0x01, "flash" }, 1567 { 0x80, "misc" }, 1568 { 0x00, NULL } 1569 }; 1570 1571 /* 0x06 bridge subclasses */ 1572 static const subclass_name bridge_subclasses[] = 1573 { 1574 { 0x00, "host" }, 1575 { 0x01, "isa" }, 1576 { 0x02, "eisa" }, 1577 { 0x03, "mc" }, 1578 { 0x04, "pci" }, 1579 { 0x05, "pcmcia"}, 1580 { 0x80, "misc" }, 1581 { 0x00, NULL } 1582 }; 1583 1584 static const subclass_name *const subclasses[] = { 1585 old_subclasses, 1586 storage_subclasses, 1587 network_subclasses, 1588 display_subclasses, 1589 multimedia_subclasses, 1590 memory_subclasses, 1591 bridge_subclasses, 1592 }; 1593 1594 static const char *const majclasses[] = { 1595 "old", 1596 "storage", 1597 "network", 1598 "display", 1599 "multimedia", 1600 "memory", 1601 "bridge" 1602 }; 1603 1604 1605 void not_supported (pcici_t tag, u_long type) 1606 { 1607 u_char reg; 1608 u_long data; 1609 struct vt * vp; 1610 1611 /* 1612 ** lookup the names. 1613 */ 1614 1615 for (vp=VendorTable; vp->ident; vp++) 1616 if (vp->ident == (type & 0xffff)) 1617 break; 1618 1619 /* 1620 ** and display them. 1621 */ 1622 1623 if (vp->ident) printf (vp->name); 1624 else printf ("vendor=0x%04lx", type & 0xffff); 1625 1626 printf (", device=0x%04lx", type >> 16); 1627 1628 data = (pcibus->pb_read(tag, PCI_CLASS_REG) >> 24) & 0xff; 1629 if (data < sizeof(majclasses) / sizeof(majclasses[0])) 1630 printf(", class=%s", majclasses[data]); 1631 if (data < sizeof(subclasses) / sizeof(subclasses[0])) { 1632 const subclass_name *p = subclasses[data]; 1633 1634 data = (pcibus->pb_read(tag, PCI_CLASS_REG) >> 16) & 0xff; 1635 while (p->name && (p->subclass != data)) 1636 p++; 1637 if (p->name) { 1638 printf(" (%s)", p->name); 1639 } else { 1640 printf(" (unknown subclass 0x%02lx)", data); 1641 } 1642 } 1643 1644 printf (" [no driver assigned]\n"); 1645 1646 if (bootverbose) { 1647 for (reg=PCI_MAP_REG_START; reg<PCI_MAP_REG_END; reg+=4) { 1648 data = pcibus->pb_read (tag, reg); 1649 if ((data&~7)==0) continue; 1650 switch (data&7) { 1651 1652 case 1: 1653 case 5: 1654 printf (" map(%x): io(%lx)\n", 1655 reg, data & ~3); 1656 break; 1657 case 0: 1658 printf (" map(%x): mem32(%lx)\n", 1659 reg, data & ~7); 1660 break; 1661 case 2: 1662 printf (" map(%x): mem20(%lx)\n", 1663 reg, data & ~7); 1664 break; 1665 case 4: 1666 printf (" map(%x): mem64(%lx)\n", 1667 reg, data & ~7); 1668 break; 1669 } 1670 } 1671 } 1672 } 1673 #endif /* NPCI */ 1674