This patch implements the pcibios_sriov_resource_alignment() on powernv
platform.

Signed-off-by: Wei Yang <weiy...@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/machdep.h        |    3 +++
 arch/powerpc/kernel/pci-common.c          |   14 ++++++++++++++
 arch/powerpc/platforms/powernv/pci-ioda.c |   18 ++++++++++++++++++
 3 files changed, 35 insertions(+)

diff --git a/arch/powerpc/include/asm/machdep.h 
b/arch/powerpc/include/asm/machdep.h
index fabb8016..5c023be 100644
--- a/arch/powerpc/include/asm/machdep.h
+++ b/arch/powerpc/include/asm/machdep.h
@@ -254,6 +254,9 @@ struct machdep_calls {
 
 #ifdef CONFIG_PCI_IOV
        void (*pcibios_fixup_sriov)(struct pci_bus *bus);
+       resource_size_t (*pcibios_sriov_resource_alignment)(struct pci_dev *,
+                                                           int resno,
+                                                           resource_size_t 
align);
 #endif /* CONFIG_PCI_IOV */
 
        /* Called to shutdown machine specific hardware not already controlled
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index c2b7930..942a3e5 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -140,6 +140,20 @@ void pcibios_reset_secondary_bus(struct pci_dev *dev)
        ssleep(1);
 }
 
+#ifdef CONFIG_PCI_IOV
+resource_size_t pcibios_sriov_resource_alignment(struct pci_dev *pdev,
+                                                int resno,
+                                                resource_size_t align)
+{
+       if (ppc_md.pcibios_sriov_resource_alignment)
+               return ppc_md.pcibios_sriov_resource_alignment(pdev,
+                                                              resno,
+                                                              align);
+
+       return 0;
+}
+#endif /* CONFIG_PCI_IOV */
+
 static resource_size_t pcibios_io_size(const struct pci_controller *hose)
 {
 #ifdef CONFIG_PPC64
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c 
b/arch/powerpc/platforms/powernv/pci-ioda.c
index 6fd2377..3aeb87b 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -1767,6 +1767,23 @@ resource_size_t pnv_pci_sriov_resource_size(struct 
pci_dev *pdev, int resno)
 
        return size;
 }
+
+static resource_size_t pnv_pcibios_sriov_resource_alignment(struct pci_dev 
*pdev,
+                                                           int resno,
+                                                           resource_size_t 
align)
+{
+       struct pci_dn *pdn = pci_get_pdn(pdev);
+       resource_size_t iov_align;
+
+       iov_align = resource_size(&pdev->resource[resno]);
+       if (iov_align)
+               return iov_align;
+
+       if (pdn->vfs)
+               return pdn->vfs * align;
+
+       return align;
+}
 #endif /* CONFIG_PCI_IOV */
 
 /* Prevent enabling devices for which we couldn't properly
@@ -1976,6 +1993,7 @@ void __init pnv_pci_init_ioda_phb(struct device_node *np,
        ppc_md.pcibios_reset_secondary_bus = pnv_pci_reset_secondary_bus;
 #ifdef CONFIG_PCI_IOV
        ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_sriov;
+       ppc_md.pcibios_sriov_resource_alignment = 
pnv_pcibios_sriov_resource_alignment;
 #endif /* CONFIG_PCI_IOV */
        pci_add_flags(PCI_REASSIGN_ALL_RSRC);
 
-- 
1.7.9.5

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to