#include <device/pci_ids.h>
#include <device/pciexp.h>
-
static void pciexp_tune_dev(device_t dev)
{
- unsigned cap;
+ unsigned int cap;
+#ifdef CONFIG_PCIE_TUNING
+ u32 reg32;
+#endif
cap = pci_find_capability(dev, PCI_CAP_ID_PCIE);
- if (!cap) {
- /* error... */
+ if (!cap)
return;
- }
- // printk_debug("PCIe: tuning %s\n", dev_path(dev));
- /* TODO: Implement PCI Express tuning. */
+
+#ifdef CONFIG_PCIE_TUNING
+ printk(BIOS_DEBUG, "PCIe: tuning %s\n", dev_path(dev));
+
+ // TODO make this depending on ASPM.
+
+ /* Enable ASPM role based error reporting. */
+ reg32 = pci_read_config32(dev, cap + PCI_EXP_DEVCAP);
+ reg32 |= PCI_EXP_DEVCAP_RBER;
+ pci_write_config32(dev, cap + PCI_EXP_DEVCAP, reg32);
+#endif
}
-unsigned int pciexp_scan_bus(struct bus *bus,
- unsigned min_devfn, unsigned max_devfn,
- unsigned int max)
+unsigned int pciexp_scan_bus(struct bus *bus, unsigned int min_devfn,
+ unsigned int max_devfn, unsigned int max)
{
device_t child;
+
max = pci_scan_bus(bus, min_devfn, max_devfn, max);
- for(child = bus->children; child; child = child->sibling) {
- if ( (child->path.pci.devfn < min_devfn) ||
- (child->path.pci.devfn > max_devfn))
- {
+
+ for (child = bus->children; child; child = child->sibling) {
+ if ((child->path.pci.devfn < min_devfn) ||
+ (child->path.pci.devfn > max_devfn)) {
continue;
}
pciexp_tune_dev(child);
return max;
}
-
unsigned int pciexp_scan_bridge(device_t dev, unsigned int max)
{
return do_pci_scan_bridge(dev, max, pciexp_scan_bus);
.read_resources = pci_bus_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = pci_bus_enable_resources,
- .init = 0,
- .scan_bus = pciexp_scan_bridge,
+ .init = 0,
+ .scan_bus = pciexp_scan_bridge,
.enable = 0,
.reset_bus = pci_bus_reset,
.ops_pci = &pciexp_bus_ops_pci,