On Tue, Sep 01, 2020 at 11:44:03PM -0500, Jordan Hargrave wrote:
> This patch adds a common function for scanning PCIE Express Capability list
> The PCIE Capability list starts at 0x100 in extended PCI configuration space.
This seems to only handle extended capabilities?
Something like pcie_get_ext_capability() would be a better name.
It is 'PCI Express' not 'PCIExpress'
'ofs & 3' test doesn't make sense when PCI_PCIE_ECAP_NEXT() always
masks those bits.
>
> ---
> sys/dev/pci/pci.c | 28 ++++++++++++++++++++++++++++
> sys/dev/pci/pcivar.h | 2 ++
> 2 files changed, 30 insertions(+)
>
> diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
> index bf75f875e..8f9a5ef7a 100644
> --- a/sys/dev/pci/pci.c
> +++ b/sys/dev/pci/pci.c
> @@ -677,6 +677,34 @@ pci_get_ht_capability(pci_chipset_tag_t pc, pcitag_t
> tag, int capid,
> return (0);
> }
>
> +int
> +pcie_get_capability(pci_chipset_tag_t pc, pcitag_t tag, int capid,
> + int *offset, pcireg_t *value)
> +{
> + pcireg_t reg;
> + unsigned int ofs;
> +
> + /* Make sure we support PCIExpress device */
> + if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, NULL, NULL) == 0)
> + return (0);
> + /* Scan PCIExpress capabilities */
> + ofs = PCI_PCIE_ECAP;
> + while (ofs != 0) {
> + if ((ofs & 3) || (ofs < PCI_PCIE_ECAP))
> + return (0);
> + reg = pci_conf_read(pc, tag, ofs);
> + if (PCI_PCIE_ECAP_ID(reg) == capid) {
> + if (offset)
> + *offset = ofs;
> + if (value)
> + *value = reg;
> + return (1);
> + }
> + ofs = PCI_PCIE_ECAP_NEXT(reg);
> + }
> + return (0);
> +}
> +
> uint16_t
> pci_requester_id(pci_chipset_tag_t pc, pcitag_t tag)
> {
> diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
> index bdfe0404f..0376ba992 100644
> --- a/sys/dev/pci/pcivar.h
> +++ b/sys/dev/pci/pcivar.h
> @@ -233,6 +233,8 @@ int pci_io_find(pci_chipset_tag_t, pcitag_t, int,
> bus_addr_t *,
> int pci_mem_find(pci_chipset_tag_t, pcitag_t, int, bus_addr_t *,
> bus_size_t *, int *);
>
> +int pcie_get_capability(pci_chipset_tag_t, pcitag_t, int,
> + int *, pcireg_t *);
> int pci_get_capability(pci_chipset_tag_t, pcitag_t, int,
> int *, pcireg_t *);
> int pci_get_ht_capability(pci_chipset_tag_t, pcitag_t, int,
> --
> 2.26.2
>
>