[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 4/6] PCI: pass pdev to pci_find_{,next_}ext_capability()



Le 06/01/2026 à 14:52, Jan Beulich a écrit :
> This is in preparation of using attributes recorded for devices.
> Additionally locating (extended) capabilities of non-devices (e.g. phantom
> functions) makes no sense.
>
> While there also eliminate open-coding of PCI_CFG_SPACE_SIZE in adjacent
> code.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/msi.c
> +++ b/xen/arch/x86/msi.c
> @@ -676,7 +676,7 @@ static uint64_t read_pci_mem_bar(const s
>           unsigned int pos;
>           uint16_t ctrl, num_vf, offset, stride;
>
> -        pos = pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_SRIOV);
> +        pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV);
>           ctrl = pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_CTRL);
>           num_vf = pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_NUM_VF);
>           offset = pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_VF_OFFSET);
> --- a/xen/drivers/passthrough/ats.c
> +++ b/xen/drivers/passthrough/ats.c
> @@ -26,7 +26,7 @@ int enable_ats_device(struct pci_dev *pd
>       u32 value;
>       int pos;
>
> -    pos = pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS);
> +    pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS);
>       BUG_ON(!pos);
>
>       if ( iommu_verbose )
> --- a/xen/drivers/passthrough/ats.h
> +++ b/xen/drivers/passthrough/ats.h
> @@ -32,7 +32,7 @@ static inline int pci_ats_enabled(const
>       u32 value;
>       int pos;
>
> -    pos = pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS);
> +    pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS);
>       BUG_ON(!pos);
>
>       value = pci_conf_read16(pdev->sbdf, pos + ATS_REG_CTL);
> @@ -45,7 +45,7 @@ static inline int pci_ats_device(const s
>       if ( !ats_enabled )
>           return 0;
>
> -    return pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS);
> +    return pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS);
>   }
>
>   #endif /* DRIVERS__PASSTHROUGH__ATS_H */
> --- a/xen/drivers/passthrough/pci.c
> +++ b/xen/drivers/passthrough/pci.c
> @@ -641,7 +641,7 @@ static void pci_enable_acs(struct pci_de
>       if ( !is_iommu_enabled(pdev->domain) )
>           return;
>
> -    pos = pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ACS);
> +    pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ACS);
>       if (!pos)
>           return;
>
> @@ -787,8 +787,7 @@ int pci_add_device(u16 seg, u8 bus, u8 d
>
>       if ( !pdev->info.is_virtfn && !pdev->physfn.vf_rlen[0] )
>       {
> -        unsigned int pos = pci_find_ext_capability(pdev->sbdf,
> -                                                   PCI_EXT_CAP_ID_SRIOV);
> +        unsigned int pos = pci_find_ext_capability(pdev, 
> PCI_EXT_CAP_ID_SRIOV);
>           uint16_t ctrl = pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_CTRL);
>
>           if ( !pos )
> --- a/xen/drivers/passthrough/vtd/x86/ats.c
> +++ b/xen/drivers/passthrough/vtd/x86/ats.c
> @@ -62,7 +62,7 @@ int ats_device(const struct pci_dev *pde
>           return 0;
>
>       ats_drhd = find_ats_dev_drhd(drhd->iommu);
> -    pos = pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS);
> +    pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS);
>
>       if ( pos && (ats_drhd == NULL) )
>       {
> --- a/xen/drivers/passthrough/vtd/quirks.c
> +++ b/xen/drivers/passthrough/vtd/quirks.c
> @@ -531,10 +531,10 @@ void pci_vtd_quirk(const struct pci_dev
>       /* Sandybridge-EP (Romley) */
>       case 0x3c00: /* host bridge */
>       case 0x3c01 ... 0x3c0b: /* root ports */
> -        pos = pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ERR);
> +        pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
>           if ( !pos )
>           {
> -            pos = pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_VNDR);
> +            pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_VNDR);
>               while ( pos )
>               {
>                   val = pci_conf_read32(pdev->sbdf, pos + PCI_VNDR_HEADER);
> @@ -543,7 +543,7 @@ void pci_vtd_quirk(const struct pci_dev
>                       pos += PCI_VNDR_HEADER;
>                       break;
>                   }
> -                pos = pci_find_next_ext_capability(pdev->sbdf, pos,
> +                pos = pci_find_next_ext_capability(pdev, pos,
>                                                      PCI_EXT_CAP_ID_VNDR);
>               }
>               ff = 0;
> --- a/xen/drivers/pci/pci.c
> +++ b/xen/drivers/pci/pci.c
> @@ -89,9 +89,10 @@ unsigned int pci_find_next_cap(pci_sbdf_
>    * within the device's PCI configuration space or 0 if the device does
>    * not support it.
>    */
> -unsigned int pci_find_ext_capability(pci_sbdf_t sbdf, unsigned int cap)
> +unsigned int pci_find_ext_capability(const struct pci_dev *pdev,
> +                                     unsigned int cap)
>   {
> -    return pci_find_next_ext_capability(sbdf, 0, cap);
> +    return pci_find_next_ext_capability(pdev, 0, cap);
>   }
>
>   /**
> @@ -104,14 +105,15 @@ unsigned int pci_find_ext_capability(pci
>    * within the device's PCI configuration space or 0 if the device does
>    * not support it.
>    */
> -unsigned int pci_find_next_ext_capability(pci_sbdf_t sbdf, unsigned int 
> start,
> +unsigned int pci_find_next_ext_capability(const struct pci_dev *pdev,
> +                                          unsigned int start,
>                                             unsigned int cap)
>   {
>       u32 header;
>       int ttl = 480; /* 3840 bytes, minimum 8 bytes per capability */
> -    unsigned int pos = max(start, 0x100U);
> +    unsigned int pos = max(start, PCI_CFG_SPACE_SIZE + 0U);
>
> -    header = pci_conf_read32(sbdf, pos);
> +    header = pci_conf_read32(pdev->sbdf, pos);
>
>       /*
>        * If we have no capabilities, this is indicated by cap ID,
> @@ -125,9 +127,9 @@ unsigned int pci_find_next_ext_capabilit
>           if ( PCI_EXT_CAP_ID(header) == cap && pos != start )
>               return pos;
>           pos = PCI_EXT_CAP_NEXT(header);
> -        if ( pos < 0x100 )
> +        if ( pos < PCI_CFG_SPACE_SIZE )
>               break;
> -        header = pci_conf_read32(sbdf, pos);
> +        header = pci_conf_read32(pdev->sbdf, pos);
>       }
>       return 0;
>   }
> --- a/xen/drivers/vpci/rebar.c
> +++ b/xen/drivers/vpci/rebar.c
> @@ -53,7 +53,7 @@ static int cf_check init_rebar(struct pc
>   {
>       uint32_t ctrl;
>       unsigned int nbars;
> -    unsigned int rebar_offset = pci_find_ext_capability(pdev->sbdf,
> +    unsigned int rebar_offset = pci_find_ext_capability(pdev,
>                                                           
> PCI_EXT_CAP_ID_REBAR);
>
>       if ( !rebar_offset )
> --- a/xen/drivers/vpci/vpci.c
> +++ b/xen/drivers/vpci/vpci.c
> @@ -196,7 +196,7 @@ static struct vpci_register *vpci_get_pr
>   static int vpci_ext_capability_hide(
>       const struct pci_dev *pdev, unsigned int cap)
>   {
> -    const unsigned int offset = pci_find_ext_capability(pdev->sbdf, cap);
> +    const unsigned int offset = pci_find_ext_capability(pdev, cap);
>       struct vpci_register *r, *prev_r;
>       struct vpci *vpci = pdev->vpci;
>       uint32_t header, pre_header;
> @@ -264,7 +264,7 @@ static int vpci_init_capabilities(struct
>           if ( !is_ext )
>               pos = pci_find_cap_offset(pdev->sbdf, cap);
>           else if ( is_hardware_domain(pdev->domain) )
> -            pos = pci_find_ext_capability(pdev->sbdf, cap);
> +            pos = pci_find_ext_capability(pdev, cap);
>
>           if ( !pos )
>               continue;
> @@ -333,7 +333,7 @@ void vpci_deassign_device(struct pci_dev
>           if ( !capability->is_ext )
>               pos = pci_find_cap_offset(pdev->sbdf, cap);
>           else if ( is_hardware_domain(pdev->domain) )
> -            pos = pci_find_ext_capability(pdev->sbdf, cap);
> +            pos = pci_find_ext_capability(pdev, cap);
>           if ( pos )
>           {
>               int rc = capability->cleanup(pdev, false);
> --- a/xen/include/xen/pci.h
> +++ b/xen/include/xen/pci.h
> @@ -263,8 +263,10 @@ unsigned int pci_find_next_cap_ttl(pci_s
>                                      unsigned int *ttl);
>   unsigned int pci_find_next_cap(pci_sbdf_t sbdf, unsigned int pos,
>                                  unsigned int cap);
> -unsigned int pci_find_ext_capability(pci_sbdf_t sbdf, unsigned int cap);
> -unsigned int pci_find_next_ext_capability(pci_sbdf_t sbdf, unsigned int 
> start,
> +unsigned int pci_find_ext_capability(const struct pci_dev *pdev,
> +                                     unsigned int cap);
> +unsigned int pci_find_next_ext_capability(const struct pci_dev *pdev,
> +                                          unsigned int start,
>                                             unsigned int cap);
>   const char *parse_pci(const char *s, unsigned int *seg_p, unsigned int 
> *bus_p,
>                         unsigned int *dev_p, unsigned int *func_p);
>
>

Reviewed-by: Teddy Astie <teddy.astie@xxxxxxxxxx>


--
Teddy Astie | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech





 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.