On Mon, Feb 05, 2024 at 02:57:12PM +0100, Jan Beulich wrote:
> ..., thus allowing it and qinval_device_iotlb_sync() to become static.
> There's nothing x86-specific about the function anyway. While moving,
> adjust types to better match ./CODING_STYLE (albeit use of fixed-width
> types for parameters is retained to limit the effective change).
> 
> Signed-off-by: Jan Beulich <jbeul...@suse.com>

Acked-by: Roger Pau Monné <roger....@citrix.com>

> 
> --- a/xen/drivers/passthrough/vtd/extern.h
> +++ b/xen/drivers/passthrough/vtd/extern.h
> @@ -65,12 +65,6 @@ struct acpi_drhd_unit *ioapic_to_drhd(un
>  struct acpi_drhd_unit *hpet_to_drhd(unsigned int hpet_id);
>  struct acpi_rhsa_unit *drhd_to_rhsa(const struct acpi_drhd_unit *drhd);
>  
> -int dev_invalidate_iotlb(struct vtd_iommu *iommu, u16 did,
> -                         u64 addr, unsigned int size_order, u64 type);
> -
> -int __must_check qinval_device_iotlb_sync(struct vtd_iommu *iommu,
> -                                          struct pci_dev *pdev,
> -                                          u16 did, u16 size, u64 addr);
>  
>  uint64_t alloc_pgtable_maddr(unsigned long npages, nodeid_t node);
>  void free_pgtable_maddr(u64 maddr);
> --- a/xen/drivers/passthrough/vtd/qinval.c
> +++ b/xen/drivers/passthrough/vtd/qinval.c
> @@ -251,8 +251,9 @@ static int __must_check dev_invalidate_s
>      return rc;
>  }
>  
> -int qinval_device_iotlb_sync(struct vtd_iommu *iommu, struct pci_dev *pdev,
> -                             u16 did, u16 size, u64 addr)
> +static int qinval_device_iotlb_sync(struct vtd_iommu *iommu,
> +                                    struct pci_dev *pdev, uint16_t did,
> +                                    uint16_t size, paddr_t addr)
>  {
>      unsigned long flags;
>      unsigned int index;
> @@ -282,6 +283,101 @@ int qinval_device_iotlb_sync(struct vtd_
>      return dev_invalidate_sync(iommu, pdev, did);
>  }
>  
> +static bool device_in_domain(const struct vtd_iommu *iommu,
> +                             const struct pci_dev *pdev, uint16_t did)
> +{
> +    struct root_entry *root_entry;
> +    struct context_entry *ctxt_entry = NULL;
> +    unsigned int tt;
> +    bool found = false;
> +
> +    if ( unlikely(!iommu->root_maddr) )
> +    {
> +        ASSERT_UNREACHABLE();
> +        return false;
> +    }
> +
> +    root_entry = map_vtd_domain_page(iommu->root_maddr);
> +    if ( !root_present(root_entry[pdev->bus]) )
> +        goto out;
> +
> +    ctxt_entry = map_vtd_domain_page(root_entry[pdev->bus].val);
> +    if ( context_domain_id(ctxt_entry[pdev->devfn]) != did )
> +        goto out;
> +
> +    tt = context_translation_type(ctxt_entry[pdev->devfn]);
> +    if ( tt != CONTEXT_TT_DEV_IOTLB )
> +        goto out;
> +
> +    found = true;
> + out:
> +    if ( root_entry )
> +        unmap_vtd_domain_page(root_entry);
> +
> +    if ( ctxt_entry )
> +        unmap_vtd_domain_page(ctxt_entry);
> +
> +    return found;
> +}
> +
> +static int dev_invalidate_iotlb(struct vtd_iommu *iommu, uint16_t did,
> +                                paddr_t addr, unsigned int size_order,
> +                                uint64_t type)
> +{
> +    struct pci_dev *pdev, *temp;
> +    int ret = 0;
> +
> +    if ( !ecap_dev_iotlb(iommu->ecap) )
> +        return ret;
> +
> +    list_for_each_entry_safe( pdev, temp, &iommu->ats_devices, ats.list )
> +    {
> +        bool sbit;
> +        int rc = 0;
> +
> +        switch ( type )
> +        {
> +        case DMA_TLB_DSI_FLUSH:
> +            if ( !device_in_domain(iommu, pdev, did) )
> +                break;
> +            /* fall through if DSI condition met */
> +        case DMA_TLB_GLOBAL_FLUSH:
> +            /* invalidate all translations: sbit=1,bit_63=0,bit[62:12]=1 */
> +            sbit = 1;
> +            addr = (~0UL << PAGE_SHIFT_4K) & 0x7FFFFFFFFFFFFFFF;

Given the MISRA stuff, won't it be better to append 'UL' here while
moving?

Thanks, Roger.

Reply via email to