|
@@ -510,6 +510,71 @@ void pci_cfgfunc_do_nothing(struct pci_controller *hose,
|
|
|
extern int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev);
|
|
|
extern void pciauto_config_init(struct pci_controller *hose);
|
|
|
|
|
|
+#if defined(CONFIG_CMD_PCI) || defined(CONFIG_PCI_SCAN_SHOW)
|
|
|
+const char * pci_class_str(u8 class)
|
|
|
+{
|
|
|
+ switch (class) {
|
|
|
+ case PCI_CLASS_NOT_DEFINED:
|
|
|
+ return "Build before PCI Rev2.0";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_STORAGE:
|
|
|
+ return "Mass storage controller";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_NETWORK:
|
|
|
+ return "Network controller";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_DISPLAY:
|
|
|
+ return "Display controller";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_MULTIMEDIA:
|
|
|
+ return "Multimedia device";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_MEMORY:
|
|
|
+ return "Memory controller";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_BRIDGE:
|
|
|
+ return "Bridge device";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_COMMUNICATION:
|
|
|
+ return "Simple comm. controller";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_SYSTEM:
|
|
|
+ return "Base system peripheral";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_INPUT:
|
|
|
+ return "Input device";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_DOCKING:
|
|
|
+ return "Docking station";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_PROCESSOR:
|
|
|
+ return "Processor";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_SERIAL:
|
|
|
+ return "Serial bus controller";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_INTELLIGENT:
|
|
|
+ return "Intelligent controller";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_SATELLITE:
|
|
|
+ return "Satellite controller";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_CRYPT:
|
|
|
+ return "Cryptographic device";
|
|
|
+ break;
|
|
|
+ case PCI_BASE_CLASS_SIGNAL_PROCESSING:
|
|
|
+ return "DSP";
|
|
|
+ break;
|
|
|
+ case PCI_CLASS_OTHERS:
|
|
|
+ return "Does not fit any class";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return "???";
|
|
|
+ break;
|
|
|
+ };
|
|
|
+}
|
|
|
+#endif /* CONFIG_CMD_PCI || CONFIG_PCI_SCAN_SHOW */
|
|
|
+
|
|
|
int __pci_skip_dev(struct pci_controller *hose, pci_dev_t dev)
|
|
|
{
|
|
|
/*
|
|
@@ -568,44 +633,40 @@ int pci_hose_scan_bus(struct pci_controller *hose, int bus)
|
|
|
|
|
|
pci_hose_read_config_word(hose, dev, PCI_VENDOR_ID, &vendor);
|
|
|
|
|
|
- if (vendor != 0xffff && vendor != 0x0000) {
|
|
|
+ if (vendor == 0xffff || vendor == 0x0000)
|
|
|
+ continue;
|
|
|
|
|
|
- if (!PCI_FUNC(dev))
|
|
|
- found_multi = header_type & 0x80;
|
|
|
+ if (!PCI_FUNC(dev))
|
|
|
+ found_multi = header_type & 0x80;
|
|
|
|
|
|
- debug ("PCI Scan: Found Bus %d, Device %d, Function %d\n",
|
|
|
- PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev) );
|
|
|
+ debug ("PCI Scan: Found Bus %d, Device %d, Function %d\n",
|
|
|
+ PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev) );
|
|
|
|
|
|
- pci_hose_read_config_word(hose, dev, PCI_DEVICE_ID, &device);
|
|
|
- pci_hose_read_config_word(hose, dev, PCI_CLASS_DEVICE, &class);
|
|
|
+ pci_hose_read_config_word(hose, dev, PCI_DEVICE_ID, &device);
|
|
|
+ pci_hose_read_config_word(hose, dev, PCI_CLASS_DEVICE, &class);
|
|
|
|
|
|
- cfg = pci_find_config(hose, class, vendor, device,
|
|
|
- PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev));
|
|
|
- if (cfg) {
|
|
|
- cfg->config_device(hose, dev, cfg);
|
|
|
- sub_bus = max(sub_bus, hose->current_busno);
|
|
|
+ cfg = pci_find_config(hose, class, vendor, device,
|
|
|
+ PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev));
|
|
|
+ if (cfg) {
|
|
|
+ cfg->config_device(hose, dev, cfg);
|
|
|
+ sub_bus = max(sub_bus, hose->current_busno);
|
|
|
#ifdef CONFIG_PCI_PNP
|
|
|
- } else {
|
|
|
- int n = pciauto_config_device(hose, dev);
|
|
|
+ } else {
|
|
|
+ int n = pciauto_config_device(hose, dev);
|
|
|
|
|
|
- sub_bus = max(sub_bus, n);
|
|
|
+ sub_bus = max(sub_bus, n);
|
|
|
#endif
|
|
|
- }
|
|
|
- if (hose->fixup_irq)
|
|
|
- hose->fixup_irq(hose, dev);
|
|
|
+ }
|
|
|
+ if (hose->fixup_irq)
|
|
|
+ hose->fixup_irq(hose, dev);
|
|
|
|
|
|
#ifdef CONFIG_PCI_SCAN_SHOW
|
|
|
- if (pci_print_dev(hose, dev)) {
|
|
|
- unsigned char int_line;
|
|
|
-
|
|
|
- pci_hose_read_config_byte(hose, dev, PCI_INTERRUPT_LINE,
|
|
|
- &int_line);
|
|
|
- printf(" %02x %02x %04x %04x %04x %02x\n",
|
|
|
- PCI_BUS(dev), PCI_DEV(dev), vendor, device, class,
|
|
|
- int_line);
|
|
|
- }
|
|
|
-#endif
|
|
|
+ if (pci_print_dev(hose, dev)) {
|
|
|
+ printf(" %02x:%02x.%x - %04x:%04x - %s\n",
|
|
|
+ PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev),
|
|
|
+ vendor, device, pci_class_str(class >> 8));
|
|
|
}
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
return sub_bus;
|