[Skiboot] [PATCH 3/5] core/pci: Allow associating parameter with capability
Russell Currey
ruscur at russell.cc
Mon Feb 6 17:17:54 AEDT 2017
On Fri, 2016-11-18 at 16:05 +1100, Gavin Shan wrote:
> When we start to support SRIOV capability in subsequent patches,
> a data struct will be instantiated and associated with the SRIOV
> capability. This extends the current implementation for that.
>
> Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
> ---
> core/pci.c | 4 ++--
> include/pci.h | 27 ++++++++++++++++++++-------
> 2 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/core/pci.c b/core/pci.c
> index 02993e9..b38d5a0 100644
> --- a/core/pci.c
> +++ b/core/pci.c
> @@ -160,7 +160,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, false);
> + pci_set_cap(pd, PCI_CFG_CAP_ID_EXP, ecap, NULL, false);
>
> /*
> * XXX We observe a problem on some PLX switches where one
> @@ -197,7 +197,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, true);
> + pci_set_cap(pd, PCIECAP_ID_AER, pos, NULL, true);
> }
>
> void pci_init_capabilities(struct phb *phb, struct pci_device *pd)
> diff --git a/include/pci.h b/include/pci.h
> index c018e56..44bedf6 100644
> --- a/include/pci.h
> +++ b/include/pci.h
> @@ -74,7 +74,10 @@ struct pci_device {
> uint32_t sub_vdid;
> uint32_t class;
> uint64_t cap_list;
> - uint32_t cap[64];
> + struct {
> + uint32_t pos;
> + void *data;
> + } cap[64];
> uint32_t mps; /* Max payload size
> capability */
>
> uint32_t pcrf_start;
> @@ -88,15 +91,17 @@ struct pci_device {
> struct list_node link;
> };
>
> -static inline void pci_set_cap(struct pci_device *pd,
> - int id, int pos, bool ext)
> +static inline void pci_set_cap(struct pci_device *pd, int id,
> + int pos, void *data, bool ext)
> {
> if (!ext) {
> pd->cap_list |= (0x1ul << id);
> - pd->cap[id] = pos;
> + pd->cap[id].pos = pos;
> + pd->cap[id].data = data;
> } else {
> pd->cap_list |= (0x1ul << (id + 32));
> - pd->cap[id + 32] = pos;
> + pd->cap[id + 32].pos = pos;
> + pd->cap[id + 32].data = data;
> }
> }
>
> @@ -113,9 +118,17 @@ static inline int pci_cap(struct pci_device *pd,
> int id, bool ext)
> {
> if (!ext)
> - return pd->cap[id];
> + return pd->cap[id].pos;
> else
> - return pd->cap[id + 32];
> + return pd->cap[id + 32].pos;
> +}
> +
> +static inline void *pci_cap_data(struct pci_device *pd, int id, bool ext)
Does anything ever use this function?
> +{
> + if (!ext)
> + return pd->cap[id].data;
> + else
> + return pd->cap[id + 32].data;
> }
>
> /*
More information about the Skiboot
mailing list