5 #include "devices/pci.h"
6 #include "threads/io.h"
7 #include "threads/malloc.h"
9 struct list pci_dev_list;
11 static void scan_bus(uint8_t bus);
14 pci_read_config (unsigned bus, unsigned dev, unsigned func, unsigned reg)
22 0x80000000 | (bus << 16) | (dev << 11) | (func << 8) | (reg << 2));
27 pci_dump_dev (struct pci_dev *dev)
29 printf ("%04x:%02x:%02x.%x PCI device %04x:%04x\n",
30 0, dev->bus_id, dev->devfn >> 4, dev->devfn & 0xf,
31 dev->ven_id, dev->dev_id);
32 printf ("Class: %02x:%02x:%02x\n",
33 dev->base_class, dev->sub_class, dev->interface);
37 scan_device (uint8_t bus, uint8_t dev, uint8_t func)
41 int dev_id, vendor_id;
44 struct pci_dev *new_pci_dev;
46 byte_cfg = (uint8_t *) cfg;
48 /* Read configuration space header */
49 for (reg = 0; reg < 16; reg++)
50 cfg[reg] = pci_read_config (bus, dev, func, reg);
52 /* Get vendor and device ID */
53 dev_id = cfg[0] >> 16;
54 vendor_id = cfg[0] & 0xffff;
56 if (dev_id == 0 || dev_id == PCI_BAD_DEVICE ||
57 vendor_id == 0 || vendor_id == PCI_BAD_DEVICE)
60 /* We have a valid PCI device, set it up */
61 new_pci_dev = malloc (sizeof *new_pci_dev);
63 PANIC ("couldn't allocate memory for PCI device");
65 new_pci_dev->bus_id = bus;
66 new_pci_dev->devfn = (dev << 4) | func;
67 new_pci_dev->ven_id = vendor_id;
68 new_pci_dev->dev_id = dev_id;
69 new_pci_dev->base_class = byte_cfg[PCI_REG_CLASS_BASE];
70 new_pci_dev->sub_class = byte_cfg[PCI_REG_CLASS_SUB];
71 new_pci_dev->interface = byte_cfg[PCI_REG_CLASS_INTERFACE];
72 list_push_front (&pci_dev_list, &new_pci_dev->elem);
74 /* Debugging output */
75 pci_dump_dev(new_pci_dev);
76 for (line = 0; line < 16; line++)
80 printf ("%02x:", line * 4);
81 for (byte = 3; byte >= 0; byte--)
82 printf (" %02x", byte_cfg[line * 4 + byte]);
87 /* If device is PCI-to-PCI bridge, scan the bus behind it */
88 if (new_pci_dev->base_class == PCI_BRIDGE_BASE_CLASS &&
89 new_pci_dev->sub_class == PCI_BRIDGE_SUB_CLASS &&
90 (byte_cfg[PCI_REG_HEADER_TYPE] & 0x3f) == PCI_BRIDGE_HEADER_TYPE)
91 scan_bus(byte_cfg[PCI_BRIDGE_REG_SBUS]);
93 return byte_cfg[PCI_REG_HEADER_TYPE] & 0x80;
101 printf ("PCI: Scanning bus (%u)\n", bus);
103 for (dev = 0; dev < 32; dev++)
105 /* Returns true if device is multi-function */
106 if (scan_device (bus, dev, 0))
110 for (func = 1; func < 8; func++)
111 scan_device (bus, dev, func);
114 printf ("PCI: Done (%u)\n", bus);
120 printf ("PCI: Initializating\n");
121 list_init (&pci_dev_list);
123 printf ("PCI: Initialization done\n");
131 for (e = list_begin (&pci_dev_list); e != list_end (&pci_dev_list);
134 struct pci_dev *dev = list_entry (e, struct pci_dev, elem);