You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
powerpc/powernv: Shift VF resource with an offset
On PowerNV platform, resource position in M64 BAR implies the PE# the
resource belongs to. In some cases, adjustment of a resource is necessary
to locate it to a correct position in M64 BAR .
This patch adds pnv_pci_vf_resource_shift() to shift the 'real' PF IOV BAR
address according to an offset.
Note:
After doing so, there would be a "hole" in the /proc/iomem when offset
is a positive value. It looks like the device return some mmio back to
the system, which actually no one could use it.
[bhelgaas: rework loops, rework overlap check, index resource[]
conventionally, remove pci_regs.h include, squashed with next patch]
Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
committed by
Benjamin Herrenschmidt
parent
5350ab3fd7
commit
781a868f31
@@ -180,6 +180,10 @@ struct pci_dn {
|
||||
int pe_number;
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
u16 vfs_expanded; /* number of VFs IOV BAR expanded */
|
||||
u16 num_vfs; /* number of VFs enabled*/
|
||||
int offset; /* PE# for the first VF PE */
|
||||
#define IODA_INVALID_M64 (-1)
|
||||
int m64_wins[PCI_SRIOV_NUM_BARS];
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
#endif
|
||||
struct list_head child_list;
|
||||
|
||||
@@ -217,6 +217,19 @@ void remove_dev_pci_data(struct pci_dev *pdev)
|
||||
struct pci_dn *pdn, *tmp;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* VF and VF PE are created/released dynamically, so we need to
|
||||
* bind/unbind them. Otherwise the VF and VF PE would be mismatched
|
||||
* when re-enabling SR-IOV.
|
||||
*/
|
||||
if (pdev->is_virtfn) {
|
||||
pdn = pci_get_pdn(pdev);
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
pdn->pe_number = IODA_INVALID_PE;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
/* Only support IOV PF for now */
|
||||
if (!pdev->is_physfn)
|
||||
return;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -714,6 +714,24 @@ static void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
||||
struct pnv_phb *phb = hose->private_data;
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
struct pnv_ioda_pe *pe;
|
||||
struct pci_dn *pdn;
|
||||
|
||||
/* Fix the VF pdn PE number */
|
||||
if (pdev->is_virtfn) {
|
||||
pdn = pci_get_pdn(pdev);
|
||||
WARN_ON(pdn->pe_number != IODA_INVALID_PE);
|
||||
list_for_each_entry(pe, &phb->ioda.pe_list, list) {
|
||||
if (pe->rid == ((pdev->bus->number << 8) |
|
||||
(pdev->devfn & 0xff))) {
|
||||
pdn->pe_number = pe->pe_number;
|
||||
pe->pdev = pdev;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
|
||||
/* If we have no phb structure, try to setup a fallback based on
|
||||
* the device-tree (RTAS PCI for example)
|
||||
|
||||
@@ -23,6 +23,7 @@ enum pnv_phb_model {
|
||||
#define PNV_IODA_PE_BUS_ALL (1 << 2) /* PE has subordinate buses */
|
||||
#define PNV_IODA_PE_MASTER (1 << 3) /* Master PE in compound case */
|
||||
#define PNV_IODA_PE_SLAVE (1 << 4) /* Slave PE in compound case */
|
||||
#define PNV_IODA_PE_VF (1 << 5) /* PE for one VF */
|
||||
|
||||
/* Data associated with a PE, including IOMMU tracking etc.. */
|
||||
struct pnv_phb;
|
||||
@@ -34,6 +35,9 @@ struct pnv_ioda_pe {
|
||||
* entire bus (& children). In the former case, pdev
|
||||
* is populated, in the later case, pbus is.
|
||||
*/
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
struct pci_dev *parent_dev;
|
||||
#endif
|
||||
struct pci_dev *pdev;
|
||||
struct pci_bus *pbus;
|
||||
|
||||
@@ -145,6 +149,8 @@ struct pnv_phb {
|
||||
|
||||
/* PE allocation bitmap */
|
||||
unsigned long *pe_alloc;
|
||||
/* PE allocation mutex */
|
||||
struct mutex pe_alloc_mutex;
|
||||
|
||||
/* M32 & IO segment maps */
|
||||
unsigned int *m32_segmap;
|
||||
@@ -159,6 +165,7 @@ struct pnv_phb {
|
||||
* on the sequence of creation
|
||||
*/
|
||||
struct list_head pe_list;
|
||||
struct mutex pe_list_mutex;
|
||||
|
||||
/* Reverse map of PEs, will have to extend if
|
||||
* we are to support more than 256 PEs, indexed
|
||||
|
||||
Reference in New Issue
Block a user