@@ -252,6 +252,7 @@ void pci_init_iov_cap(struct phb *phb, struct pci_device *pd)
iov->pd = pd;
iov->pos = pos;
iov->enabled = false;
+ pd->iov = iov;
pci_iov_update_parameters(iov);
- pci_set_cap(pd, PCIECAP_ID_SRIOV, pos, iov, true);
+ pci_set_cap(pd, PCIECAP_ID_SRIOV, pos, true);
}
@@ -162,7 +162,7 @@ static void pci_init_pcie_cap(struct phb *phb, struct pci_device *pd)
return;
}
- pci_set_cap(pd, PCI_CFG_CAP_ID_EXP, ecap, NULL, false);
+ pci_set_cap(pd, PCI_CFG_CAP_ID_EXP, ecap, false);
/*
* XXX We observe a problem on some PLX switches where one
@@ -198,7 +198,7 @@ static void pci_init_aer_cap(struct phb *phb, struct pci_device *pd)
pos = pci_find_ecap(phb, pd->bdfn, PCIECAP_ID_AER, NULL);
if (pos > 0)
- pci_set_cap(pd, PCIECAP_ID_AER, pos, NULL, true);
+ pci_set_cap(pd, PCIECAP_ID_AER, pos, true);
}
static void pci_init_pm_cap(struct phb *phb, struct pci_device *pd)
@@ -207,7 +207,7 @@ static void pci_init_pm_cap(struct phb *phb, struct pci_device *pd)
pos = pci_find_cap(phb, pd->bdfn, PCI_CFG_CAP_ID_PM);
if (pos > 0)
- pci_set_cap(pd, PCI_CFG_CAP_ID_PM, pos, NULL, false);
+ pci_set_cap(pd, PCI_CFG_CAP_ID_PM, pos, false);
}
void pci_init_capabilities(struct phb *phb, struct pci_device *pd)
@@ -79,7 +79,6 @@ struct pci_device {
uint64_t cap_list;
struct {
uint32_t pos;
- void *data;
} cap[64];
uint32_t mps; /* Max payload size capability */
@@ -87,6 +86,7 @@ struct pci_device {
uint32_t pcrf_end;
struct list_head pcrf;
+ struct pci_iov *iov;
struct dt_node *dn;
struct pci_slot *slot;
struct pci_device *parent;
@@ -95,17 +95,14 @@ struct pci_device {
struct list_node link;
};
-static inline void pci_set_cap(struct pci_device *pd, int id,
- int pos, void *data, bool ext)
+static inline void pci_set_cap(struct pci_device *pd, int id, int pos, bool ext)
{
if (!ext) {
pd->cap_list |= (0x1ul << id);
pd->cap[id].pos = pos;
- pd->cap[id].data = data;
} else {
pd->cap_list |= (0x1ul << (id + 32));
pd->cap[id + 32].pos = pos;
- pd->cap[id + 32].data = data;
}
}
@@ -127,14 +124,6 @@ static inline int pci_cap(struct pci_device *pd,
return pd->cap[id + 32].pos;
}
-static inline void *pci_cap_data(struct pci_device *pd, int id, bool ext)
-{
- if (!ext)
- return pd->cap[id].data;
- else
- return pd->cap[id + 32].data;
-}
-
/*
* When generating the device-tree, we need to keep track of
* the LSI mapping & swizzle it. This state structure is
The IOV struct is associated with the capability descriptor, but it's never used. This detachs IOV struct from the capability descriptor, binds IOV struct with PCI device instead. Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> --- core/pci-iov.c | 3 ++- core/pci.c | 6 +++--- include/pci.h | 15 ++------------- 3 files changed, 7 insertions(+), 17 deletions(-)