diff --git a/src/arch/armv7/include/arch/pci_ops.h b/src/arch/armv7/include/arch/pci_ops.h index 4bbb7d3de5..7a7ed32a67 100644 --- a/src/arch/armv7/include/arch/pci_ops.h +++ b/src/arch/armv7/include/arch/pci_ops.h @@ -20,9 +20,6 @@ #ifndef ARCH_ARMV7_PCI_OPS_H #define ARCH_ARMV7_PCI_OPS_H -static inline const struct pci_bus_operations *pci_config_default(void) -{ - return NULL; -} +/* Empty stub until PCI includes are properly fixed. */ #endif diff --git a/src/arch/x86/include/arch/pci_ops.h b/src/arch/x86/include/arch/pci_ops.h index fa293173d5..b7ec0ba8d8 100644 --- a/src/arch/x86/include/arch/pci_ops.h +++ b/src/arch/x86/include/arch/pci_ops.h @@ -7,19 +7,6 @@ extern const struct pci_bus_operations pci_cf8_conf1; extern const struct pci_bus_operations pci_ops_mmconf; #endif -#if CONFIG_MMCONF_SUPPORT_DEFAULT -#define pci_bus_default_ops &pci_ops_mmconf -#else -#define pci_bus_default_ops &pci_cf8_conf1 -#endif - -static inline const struct pci_bus_operations *pci_config_default(void) -{ -#if CONFIG_MMCONF_SUPPORT_DEFAULT - return &pci_ops_mmconf; -#else - return &pci_cf8_conf1; -#endif -} +const struct pci_bus_operations *pci_bus_default_ops(device_t dev); #endif /* ARCH_I386_PCI_OPS_H */ diff --git a/src/device/pci_ops.c b/src/device/pci_ops.c index b0281f4943..5b633c8667 100644 --- a/src/device/pci_ops.c +++ b/src/device/pci_ops.c @@ -25,9 +25,30 @@ #include #include +const struct pci_bus_operations *pci_bus_default_ops(device_t dev) +{ +#if CONFIG_MMCONF_SUPPORT_DEFAULT + return &pci_ops_mmconf; +#else + return &pci_cf8_conf1; +#endif +} + +static const struct pci_bus_operations *pci_bus_ops(struct bus *bus, device_t dev) +{ + const struct pci_bus_operations *bops; + bops = NULL; + if (bus && bus->dev && bus->dev->ops && bus->dev->ops->ops_pci_bus) { + bops = bus->dev->ops->ops_pci_bus(dev); + } + if (!bops) + bops = pci_bus_default_ops(dev); + return bops; +} + /* - * The only consumer of the return value of get_pbus() is ops_pci_bus(). - * ops_pci_bus() can handle being passed NULL and auto-picks working ops. + * The only consumer of the return value of get_pbus() is pci_bus_ops(). + * pci_bus_ops() can handle being passed NULL and auto-picks working ops. */ static struct bus *get_pbus(device_t dev) { @@ -38,10 +59,10 @@ static struct bus *get_pbus(device_t dev) else pbus = dev->bus; - while (pbus && pbus->dev && !ops_pci_bus(pbus)) { + while (pbus && pbus->dev && !pci_bus_ops(pbus, dev)) { if (pbus == pbus->dev->bus) { printk(BIOS_ALERT, "%s in endless loop looking for a " - "parent bus with ops_pci_bus for %s, breaking " + "parent bus with pci_bus_ops for %s, breaking " "out.\n", __func__, dev_path(dev)); break; } @@ -64,42 +85,42 @@ static struct bus *get_pbus(device_t dev) u8 pci_read_config8(device_t dev, unsigned int where) { struct bus *pbus = get_pbus(dev); - return ops_pci_bus(pbus)->read8(pbus, dev->bus->secondary, + return pci_bus_ops(pbus, dev)->read8(pbus, dev->bus->secondary, dev->path.pci.devfn, where); } u16 pci_read_config16(device_t dev, unsigned int where) { struct bus *pbus = get_pbus(dev); - return ops_pci_bus(pbus)->read16(pbus, dev->bus->secondary, + return pci_bus_ops(pbus, dev)->read16(pbus, dev->bus->secondary, dev->path.pci.devfn, where); } u32 pci_read_config32(device_t dev, unsigned int where) { struct bus *pbus = get_pbus(dev); - return ops_pci_bus(pbus)->read32(pbus, dev->bus->secondary, + return pci_bus_ops(pbus, dev)->read32(pbus, dev->bus->secondary, dev->path.pci.devfn, where); } void pci_write_config8(device_t dev, unsigned int where, u8 val) { struct bus *pbus = get_pbus(dev); - ops_pci_bus(pbus)->write8(pbus, dev->bus->secondary, + pci_bus_ops(pbus, dev)->write8(pbus, dev->bus->secondary, dev->path.pci.devfn, where, val); } void pci_write_config16(device_t dev, unsigned int where, u16 val) { struct bus *pbus = get_pbus(dev); - ops_pci_bus(pbus)->write16(pbus, dev->bus->secondary, + pci_bus_ops(pbus, dev)->write16(pbus, dev->bus->secondary, dev->path.pci.devfn, where, val); } void pci_write_config32(device_t dev, unsigned int where, u32 val) { struct bus *pbus = get_pbus(dev); - ops_pci_bus(pbus)->write32(pbus, dev->bus->secondary, + pci_bus_ops(pbus, dev)->write32(pbus, dev->bus->secondary, dev->path.pci.devfn, where, val); } diff --git a/src/include/device/device.h b/src/include/device/device.h index 9defb19d83..1eff4a29c6 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -42,7 +42,7 @@ struct device_operations { #endif const struct pci_operations *ops_pci; const struct smbus_bus_operations *ops_smbus_bus; - const struct pci_bus_operations *ops_pci_bus; + const struct pci_bus_operations * (*ops_pci_bus)(device_t dev); const struct pnp_mode_ops *ops_pnp_mode; }; #endif diff --git a/src/include/device/pci.h b/src/include/device/pci.h index 1f47dafeca..2dea1cf088 100644 --- a/src/include/device/pci.h +++ b/src/include/device/pci.h @@ -94,17 +94,5 @@ static inline const struct pci_operations *ops_pci(device_t dev) return pops; } -static inline const struct pci_bus_operations *ops_pci_bus(struct bus *bus) -{ - const struct pci_bus_operations *bops; - bops = 0; - if (bus && bus->dev && bus->dev->ops) { - bops = bus->dev->ops->ops_pci_bus; - } - if (!bops) - bops = pci_config_default(); - return bops; -} - #endif #endif /* PCI_H */