@@ -105,3 +105,27 @@ void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
}
EXPORT_SYMBOL(pcibios_bus_to_resource);
+
+resource_size_t pci_align_boundary(struct pci_bus *bus, unsigned long flags)
+{
+ resource_size_t align = 0;
+ struct pci_host_bridge *bridge = find_pci_host_bridge(bus);
+
+ flags &= (IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_PREFETCH);
+ switch (flags) {
+ case IORESOURCE_IO:
+ align = (1 << bridge->io_align_shift);
+ break;
+ case IORESOURCE_MEM:
+ align = (1 << bridge->mem_align_shift);
+ break;
+ case (IORESOURCE_MEM | IORESOURCE_PREFETCH):
+ align = (1 << bridge->pmem_align_shift);
+ break;
+ default:
+ printk(KERN_WARNING "%s: invalid flags 0x%lx\n",
+ __func__, flags);
+ }
+
+ return align;
+}
@@ -673,6 +673,7 @@ void __pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res,
struct pci_bus_region *region);
void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
struct pci_bus_region *region);
+resource_size_t pci_align_boundary(struct pci_bus *bus, unsigned long flags);
void pcibios_scan_specific_bus(int busn);
extern struct pci_bus *pci_find_bus(int domain, int busnr);
void pci_bus_add_devices(const struct pci_bus *bus);
The patch introduces function pci_align_boundary() to retrieve the minimal alignment of p2p bars according to the argument. Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com> --- drivers/pci/host-bridge.c | 24 ++++++++++++++++++++++++ include/linux/pci.h | 1 + 2 files changed, 25 insertions(+)