Re: [PATCH v5 5/5] pci: Suspend iommu function prior to resetting a device
From: Baolu Lu
Date: Tue Nov 18 2025 - 00:44:07 EST
On 11/18/25 09:42, Nicolin Chen wrote:
On Tue, Nov 18, 2025 at 12:29:43AM +0000, Tian, Kevin wrote:
From: Nicolin Chen<nicolinc@xxxxxxxxxx>
Sent: Tuesday, November 18, 2025 3:27 AM
On Mon, Nov 17, 2025 at 04:52:05AM +0000, Tian, Kevin wrote:
From: Nicolin Chen<nicolinc@xxxxxxxxxx>
Sent: Saturday, November 15, 2025 2:01 AM
On Fri, Nov 14, 2025 at 09:45:31AM +0000, Tian, Kevin wrote:
From: Nicolin Chen<nicolinc@xxxxxxxxxx>
Sent: Tuesday, November 11, 2025 1:13 PM
+/*
+ * Per PCIe r6.3, sec 10.3.1 IMPLEMENTATION NOTE, software
disables
ATS
before
+ * initiating a reset. Notify the iommu driver that enabled ATS.
+ */
+int pci_reset_iommu_prepare(struct pci_dev *dev)
+{
+ if (pci_ats_supported(dev))
+ return iommu_dev_reset_prepare(&dev->dev);
+ return 0;
+}
the comment says "driver that enabled ATS", but the code checks
whether ATS is supported.
which one is desired?
The comments says "the iommu driver that enabled ATS". It doesn't
conflict with what the PCI core checks here?
actually this is sent to all IOMMU drivers. there is no check on whether
a specific driver has enabled ATS in this path.
But the comment doesn't say "check"..
How about "Notify the iommu driver that enables/disables ATS"?
The point is that pci_enable_ats() is called in iommu drivers.
but in current way even an iommu driver which doesn't call
pci_enable_ats() will also be notified then I didn't see the
point of adding an attribute to "the iommu driver".
Hmm, that's a fair point.
Having looked closely, I see only AMD and ARM call that to enable
ATs. How others (e.g. Intel) enable it?
The VT-d driver enables ATS in the iommu probe_finalize() path (for
scalable mode).
static void intel_iommu_probe_finalize(struct device *dev)
{
[...]
if (sm_supported(iommu) && !dev_is_real_dma_subdevice(dev)) {
iommu_enable_pci_ats(info);
/* Assign a DEVTLB cache tag to the default domain. */
if (info->ats_enabled && info->domain) {
u16 did = domain_id_iommu(info->domain, iommu);
if (cache_tag_assign(info->domain, did, dev,
IOMMU_NO_PASID,
CACHE_TAG_DEVTLB))
iommu_disable_pci_ats(info);
}
}
[...]
}
iommu_enable_pci_ats() will eventually call pci_enable_ats() after some
necessary checks.
Thanks,
baolu