[PATCH 06/12] iommu: Add ops entry for vendor specific default domain type

From: Lu Baolu
Date: Wed Mar 06 2019 - 21:50:27 EST


This adds an iommu ops entry for iommu vendor driver to specify
the type of the default domain for each device. This is needed
for the vendor driver, which already has its own logic to
determine the use of identity domain for a long time, when it
switches to apply default domain.

Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
---
drivers/iommu/iommu.c | 12 +++++++++---
include/linux/iommu.h | 4 ++++
2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 374327018a11..4101f38a7844 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -1102,12 +1102,18 @@ struct iommu_group *iommu_group_get_for_dev(struct device *dev)
*/
if (!group->default_domain) {
struct iommu_domain *dom;
+ int domain_type = iommu_def_domain_type;

- dom = __iommu_domain_alloc(dev->bus, iommu_def_domain_type);
- if (!dom && iommu_def_domain_type != IOMMU_DOMAIN_DMA) {
+ if (ops->is_identity_map)
+ domain_type = ops->is_identity_map(dev) ?
+ IOMMU_DOMAIN_IDENTITY :
+ IOMMU_DOMAIN_DMA;
+
+ dom = __iommu_domain_alloc(dev->bus, domain_type);
+ if (!dom && domain_type != IOMMU_DOMAIN_DMA) {
dev_warn(dev,
"failed to allocate default IOMMU domain of type %u; falling back to IOMMU_DOMAIN_DMA",
- iommu_def_domain_type);
+ domain_type);
dom = __iommu_domain_alloc(dev->bus, IOMMU_DOMAIN_DMA);
}

diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index e90da6b6f3d1..8e298fd631d0 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -184,6 +184,7 @@ struct iommu_resv_region {
* @domain_window_disable: Disable a particular window for a domain
* @of_xlate: add OF master IDs to iommu grouping
* @pgsize_bitmap: bitmap of all possible supported page sizes
+ * @is_identity_map: vendor customized identity map adjudicator
*/
struct iommu_ops {
bool (*capable)(enum iommu_cap);
@@ -226,6 +227,9 @@ struct iommu_ops {
int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
bool (*is_attach_deferred)(struct iommu_domain *domain, struct device *dev);

+ /* Vendor customized identity map adjudicator */
+ bool (*is_identity_map)(struct device *dev);
+
unsigned long pgsize_bitmap;
};

--
2.17.1


--------------52A37280C28FB8979E38AF0A
Content-Type: text/x-patch;
name="0007-iommu-vt-d-Add-is_identity_map-ops-entry.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="0007-iommu-vt-d-Add-is_identity_map-ops-entry.patch"