device_def_domain_type() determines the domain type a device could have and currently it's called only during boot time. Since the function is called only during boot time, it *always* considers command line arguments like "intel_iommu=igfx_off" and "iommu=pt" to determine the domain type of a device. To support changing the domain of an iommu_group through sysfs, this function has to be called at runtime as well. Hence, modify this function such that command line arguments are considered to determine the domain type of a device *only* when the system is booting and ignored if the system is already up and running.
Cc: Christoph Hellwig <h...@lst.de> Cc: Joerg Roedel <j...@8bytes.org> Cc: Ashok Raj <ashok....@intel.com> Cc: Will Deacon <will.dea...@arm.com> Cc: Lu Baolu <baolu...@linux.intel.com> Cc: Sohil Mehta <sohil.me...@intel.com> Cc: Robin Murphy <robin.mur...@arm.com> Cc: Jacob Pan <jacob.jun....@linux.intel.com> Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prak...@intel.com> --- drivers/iommu/intel-iommu.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index b7454ca4a87c..27c3c893530a 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -2859,15 +2859,14 @@ static bool device_is_rmrr_locked(struct device *dev) } /* - * Return the required default domain type for a specific device. + * Returns the possible default domain types a device could have. * - * @dev: the device in query - * @startup: true if this is during early boot + * @dev: The device in query * * Returns: - * - IOMMU_DOMAIN_DMA: device requires a dynamic mapping domain - * - IOMMU_DOMAIN_IDENTITY: device requires an identical mapping domain - * - 0: both identity and dynamic domains work for this device + * - IOMMU_DOMAIN_DMA: Device should always be in dynamic mapping domain + * - IOMMU_DOMAIN_IDENTITY: Device should always be in identity mapping domain + * - 0: Device could be in any domain (i.e. identity or dynamic) */ static int device_def_domain_type(struct device *dev) { @@ -2884,11 +2883,22 @@ static int device_def_domain_type(struct device *dev) if (pdev->untrusted) return IOMMU_DOMAIN_DMA; + /* + * Azalia device should always be in identity domain if + * check_tylersburg_isoch() decides so. + */ if ((iommu_identity_mapping & IDENTMAP_AZALIA) && IS_AZALIA(pdev)) return IOMMU_DOMAIN_IDENTITY; - if ((iommu_identity_mapping & IDENTMAP_GFX) && IS_GFX_DEVICE(pdev)) - return IOMMU_DOMAIN_IDENTITY; + /* + * intel_iommu=igfx_off should have it's effect only during + * boot. + */ + if (system_state < SYSTEM_RUNNING) { + if ((iommu_identity_mapping & IDENTMAP_GFX) && + IS_GFX_DEVICE(pdev)) + return IOMMU_DOMAIN_IDENTITY; + } /* * We want to start off with all devices in the 1:1 domain, and @@ -2919,8 +2929,13 @@ static int device_def_domain_type(struct device *dev) return IOMMU_DOMAIN_DMA; } - return (iommu_identity_mapping & IDENTMAP_ALL) ? - IOMMU_DOMAIN_IDENTITY : 0; + /* iommu=pt should have it's effect only during boot */ + if (system_state < SYSTEM_RUNNING) { + if (iommu_identity_mapping & IDENTMAP_ALL) + return IOMMU_DOMAIN_IDENTITY; + } + + return 0; } static void intel_iommu_init_qi(struct intel_iommu *iommu) -- 2.19.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu