+++ /dev/null
-From 9bca0c9bf6f44644f491b0bdf313086fc144a0fa Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 22 Nov 2022 08:29:43 +0800
-Subject: iommu/vt-d: Allocate pasid table in device probe path
-
-From: Lu Baolu <baolu.lu@linux.intel.com>
-
-[ Upstream commit ec62b4424174f41bdcedd08d12d7bed80088453d ]
-
-Whether or not a domain is attached to the device, the pasid table should
-always be valid as long as it has been probed. This moves the pasid table
-allocation from the domain attaching device path to device probe path and
-frees it in the device release path.
-
-Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
-Reviewed-by: Kevin Tian <kevin.tian@intel.com>
-Link: https://lore.kernel.org/r/20221118132451.114406-2-baolu.lu@linux.intel.com
-Signed-off-by: Joerg Roedel <jroedel@suse.de>
-Stable-dep-of: da37dddcf4ca ("iommu/vt-d: Disable PCI ATS in legacy passthrough mode")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/iommu/intel/iommu.c | 20 ++++++++++++--------
- 1 file changed, 12 insertions(+), 8 deletions(-)
-
-diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
-index bd34fcc5a5274..3dbf86c61f073 100644
---- a/drivers/iommu/intel/iommu.c
-+++ b/drivers/iommu/intel/iommu.c
-@@ -2494,13 +2494,6 @@ static int domain_add_dev_info(struct dmar_domain *domain, struct device *dev)
-
- /* PASID table is mandatory for a PCI device in scalable mode. */
- if (sm_supported(iommu) && !dev_is_real_dma_subdevice(dev)) {
-- ret = intel_pasid_alloc_table(dev);
-- if (ret) {
-- dev_err(dev, "PASID table allocation failed\n");
-- dmar_remove_one_dev_info(dev);
-- return ret;
-- }
--
- /* Setup the PASID entry for requests without PASID: */
- if (hw_pass_through && domain_type_is_si(domain))
- ret = intel_pasid_setup_pass_through(iommu, domain,
-@@ -4112,7 +4105,6 @@ static void dmar_remove_one_dev_info(struct device *dev)
-
- iommu_disable_dev_iotlb(info);
- domain_context_clear(info);
-- intel_pasid_free_table(info->dev);
- }
-
- spin_lock_irqsave(&domain->lock, flags);
-@@ -4477,6 +4469,7 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
- struct device_domain_info *info;
- struct intel_iommu *iommu;
- u8 bus, devfn;
-+ int ret;
-
- iommu = device_to_iommu(dev, &bus, &devfn);
- if (!iommu || !iommu->iommu.ops)
-@@ -4521,6 +4514,16 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
-
- dev_iommu_priv_set(dev, info);
-
-+ if (sm_supported(iommu) && !dev_is_real_dma_subdevice(dev)) {
-+ ret = intel_pasid_alloc_table(dev);
-+ if (ret) {
-+ dev_err(dev, "PASID table allocation failed\n");
-+ dev_iommu_priv_set(dev, NULL);
-+ kfree(info);
-+ return ERR_PTR(ret);
-+ }
-+ }
-+
- return &iommu->iommu;
- }
-
-@@ -4529,6 +4532,7 @@ static void intel_iommu_release_device(struct device *dev)
- struct device_domain_info *info = dev_iommu_priv_get(dev);
-
- dmar_remove_one_dev_info(dev);
-+ intel_pasid_free_table(dev);
- dev_iommu_priv_set(dev, NULL);
- kfree(info);
- set_dma_ops(dev, NULL);
---
-2.42.0
-