[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 4/6] pci/arm: Use iommu_add_dt_pci_device() instead of arch hook
On 5/8/23 10:51, Jan Beulich wrote: > On 08.05.2023 16:16, Stewart Hildebrand wrote: >> On 5/2/23 03:50, Jan Beulich wrote: >>> On 01.05.2023 22:03, Stewart Hildebrand wrote: >>>> --- a/xen/drivers/passthrough/pci.c >>>> +++ b/xen/drivers/passthrough/pci.c >>>> @@ -1305,7 +1305,7 @@ __initcall(setup_dump_pcidevs); >>>> >>>> static int iommu_add_device(struct pci_dev *pdev) >>>> { >>>> - const struct domain_iommu *hd; >>>> + const struct domain_iommu *hd __maybe_unused; >>>> int rc; >>>> unsigned int devfn = pdev->devfn; >>>> >>>> @@ -1318,17 +1318,30 @@ static int iommu_add_device(struct pci_dev *pdev) >>>> if ( !is_iommu_enabled(pdev->domain) ) >>>> return 0; >>>> >>>> +#ifdef CONFIG_HAS_DEVICE_TREE >>>> + rc = iommu_add_dt_pci_device(devfn, pdev); >>>> +#else >>>> rc = iommu_call(hd->platform_ops, add_device, devfn, >>>> pci_to_dev(pdev)); >>>> - if ( rc || !pdev->phantom_stride ) >>>> +#endif >>>> + if ( rc < 0 || !pdev->phantom_stride ) >>>> + { >>>> + if ( rc < 0 ) >>>> + printk(XENLOG_WARNING "IOMMU: add %pp failed (%d)\n", >>>> + &pdev->sbdf, rc); >>>> return rc; >>>> + } >>>> >>>> for ( ; ; ) >>>> { >>>> devfn += pdev->phantom_stride; >>>> if ( PCI_SLOT(devfn) != PCI_SLOT(pdev->devfn) ) >>>> return 0; >>>> +#ifdef CONFIG_HAS_DEVICE_TREE >>>> + rc = iommu_add_dt_pci_device(devfn, pdev); >>>> +#else >>>> rc = iommu_call(hd->platform_ops, add_device, devfn, >>>> pci_to_dev(pdev)); >>>> - if ( rc ) >>>> +#endif >>>> + if ( rc < 0 ) >>>> printk(XENLOG_WARNING "IOMMU: add %pp failed (%d)\n", >>>> &PCI_SBDF(pdev->seg, pdev->bus, devfn), rc); >>>> } >>> >>> Such #ifdef-ary may be okay at the call site(s), but replacing a per- >>> IOMMU hook with a system-wide DT function here looks wrong to me. >> >> Perhaps a better approach would be to rely on the existing iommu add_device >> call. >> >> This might look something like: >> >> #ifdef CONFIG_HAS_DEVICE_TREE >> rc = iommu_add_dt_pci_device(pdev); >> if ( !rc ) /* or rc >= 0, or something... */ >> #endif >> rc = iommu_call(hd->platform_ops, add_device, devfn, >> pci_to_dev(pdev)); >> >> There would be no need to call iommu_add_dt_pci_device() in the loop >> iterating over phantom functions, as I will handle those inside >> iommu_add_dt_pci_device() in v2. > > But that still leaves #ifdef-ary inside the function. If for whatever reason > the hd->platform_ops hook isn't suitable (which I still don't understand), There's nothing wrong with the existing hd->platform_ops hook. We just need to ensure we've translated RID to AXI stream ID sometime before it. > then - as said - I'd view such #ifdef as possibly okay at the call site of > iommu_add_device(), but not inside. I'll move the #ifdef-ary.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |