powerpc/powernv: Override pcibios_default_alignment() to force PCI devices to be...
authorYongji Xie <elohimes@gmail.com>
Mon, 10 Apr 2017 11:58:13 +0000 (19:58 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 19 Apr 2017 17:51:26 +0000 (12:51 -0500)
Override pcibios_default_alignment() to set default alignment to PAGE_SIZE
for all PCI devices on PowerNV platform.  Thus sub-page BARs would not
share a page and could be mapped into guest when VFIO passthrough them.

Signed-off-by: Yongji Xie <elohimes@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
arch/powerpc/include/asm/machdep.h
arch/powerpc/kernel/pci-common.c
arch/powerpc/platforms/powernv/pci-ioda.c

index 5011b69..f90b22c 100644 (file)
@@ -173,6 +173,8 @@ struct machdep_calls {
        /* Called after scan and before resource survey */
        void (*pcibios_fixup_phb)(struct pci_controller *hose);
 
+       resource_size_t (*pcibios_default_alignment)(void);
+
 #ifdef CONFIG_PCI_IOV
        void (*pcibios_fixup_sriov)(struct pci_dev *pdev);
        resource_size_t (*pcibios_iov_resource_alignment)(struct pci_dev *, int resno);
index ffda24a..03a7c9f 100644 (file)
@@ -233,6 +233,14 @@ void pcibios_reset_secondary_bus(struct pci_dev *dev)
        pci_reset_secondary_bus(dev);
 }
 
+resource_size_t pcibios_default_alignment(void)
+{
+       if (ppc_md.pcibios_default_alignment)
+               return ppc_md.pcibios_default_alignment();
+
+       return 0;
+}
+
 #ifdef CONFIG_PCI_IOV
 resource_size_t pcibios_iov_resource_alignment(struct pci_dev *pdev, int resno)
 {
index 6901a06..0529d56 100644 (file)
@@ -3287,6 +3287,11 @@ static void pnv_pci_setup_bridge(struct pci_bus *bus, unsigned long type)
        }
 }
 
+static resource_size_t pnv_pci_default_alignment(void)
+{
+       return PAGE_SIZE;
+}
+
 #ifdef CONFIG_PCI_IOV
 static resource_size_t pnv_pci_iov_resource_alignment(struct pci_dev *pdev,
                                                      int resno)
@@ -3820,6 +3825,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
                hose->controller_ops = pnv_pci_ioda_controller_ops;
        }
 
+       ppc_md.pcibios_default_alignment = pnv_pci_default_alignment;
+
 #ifdef CONFIG_PCI_IOV
        ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov_resources;
        ppc_md.pcibios_iov_resource_alignment = pnv_pci_iov_resource_alignment;