Commit 923d4012 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'iommu-fixes-v6.16-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux

Pull iommu fixes from Joerg Roedel:

 - Rockchip: fix infinite loop caused by probing race condition

 - Intel VT-d: assign devtlb cache tag on ATS enablement

* tag 'iommu-fixes-v6.16-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux:
  iommu/vt-d: Assign devtlb cache tag on ATS enablement
  iommu/rockchip: prevent iommus dead loop when two masters share one IOMMU
parents 1880df2c 25b1b75b
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -40,9 +40,8 @@ static bool cache_tage_match(struct cache_tag *tag, u16 domain_id,
}

/* Assign a cache tag with specified type to domain. */
static int cache_tag_assign(struct dmar_domain *domain, u16 did,
			    struct device *dev, ioasid_t pasid,
			    enum cache_tag_type type)
int cache_tag_assign(struct dmar_domain *domain, u16 did, struct device *dev,
		     ioasid_t pasid, enum cache_tag_type type)
{
	struct device_domain_info *info = dev_iommu_priv_get(dev);
	struct intel_iommu *iommu = info->iommu;
+10 −1
Original line number Diff line number Diff line
@@ -3780,8 +3780,17 @@ static void intel_iommu_probe_finalize(struct device *dev)
	    !pci_enable_pasid(to_pci_dev(dev), info->pasid_supported & ~1))
		info->pasid_enabled = 1;

	if (sm_supported(iommu) && !dev_is_real_dma_subdevice(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_pri(info);
}

+2 −0
Original line number Diff line number Diff line
@@ -1289,6 +1289,8 @@ struct cache_tag {
	unsigned int users;
};

int cache_tag_assign(struct dmar_domain *domain, u16 did, struct device *dev,
		     ioasid_t pasid, enum cache_tag_type type);
int cache_tag_assign_domain(struct dmar_domain *domain,
			    struct device *dev, ioasid_t pasid);
void cache_tag_unassign_domain(struct dmar_domain *domain,
+2 −1
Original line number Diff line number Diff line
@@ -1157,7 +1157,6 @@ static int rk_iommu_of_xlate(struct device *dev,
		return -ENOMEM;

	data->iommu = platform_get_drvdata(iommu_dev);
	data->iommu->domain = &rk_identity_domain;
	dev_iommu_priv_set(dev, data);

	platform_device_put(iommu_dev);
@@ -1195,6 +1194,8 @@ static int rk_iommu_probe(struct platform_device *pdev)
	if (!iommu)
		return -ENOMEM;

	iommu->domain = &rk_identity_domain;

	platform_set_drvdata(pdev, iommu);
	iommu->dev = dev;
	iommu->num_mmu = 0;