Commit 50a7e2c6 authored by Lu Baolu's avatar Lu Baolu Committed by Joerg Roedel

iommu/vt-d: Cleanup si_domain

The static identity domain has been introduced, rendering the si_domain
obsolete. Remove si_domain and cleanup the code accordingly.
Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20240809055431.36513-8-baolu.lu@linux.intel.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 2031c469
...@@ -167,8 +167,6 @@ static void device_rbtree_remove(struct device_domain_info *info) ...@@ -167,8 +167,6 @@ static void device_rbtree_remove(struct device_domain_info *info)
spin_unlock_irqrestore(&iommu->device_rbtree_lock, flags); spin_unlock_irqrestore(&iommu->device_rbtree_lock, flags);
} }
static struct dmar_domain *si_domain;
struct dmar_rmrr_unit { struct dmar_rmrr_unit {
struct list_head list; /* list of rmrr units */ struct list_head list; /* list of rmrr units */
struct acpi_dmar_header *hdr; /* ACPI header */ struct acpi_dmar_header *hdr; /* ACPI header */
...@@ -286,11 +284,6 @@ static int __init intel_iommu_setup(char *str) ...@@ -286,11 +284,6 @@ static int __init intel_iommu_setup(char *str)
} }
__setup("intel_iommu=", intel_iommu_setup); __setup("intel_iommu=", intel_iommu_setup);
static int domain_type_is_si(struct dmar_domain *domain)
{
return domain->domain.type == IOMMU_DOMAIN_IDENTITY;
}
static int domain_pfn_supported(struct dmar_domain *domain, unsigned long pfn) static int domain_pfn_supported(struct dmar_domain *domain, unsigned long pfn)
{ {
int addr_width = agaw_to_width(domain->agaw) - VTD_PAGE_SHIFT; int addr_width = agaw_to_width(domain->agaw) - VTD_PAGE_SHIFT;
...@@ -1664,9 +1657,6 @@ static int domain_context_mapping_one(struct dmar_domain *domain, ...@@ -1664,9 +1657,6 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
struct context_entry *context; struct context_entry *context;
int agaw, ret; int agaw, ret;
if (domain_type_is_si(domain))
translation = CONTEXT_TT_PASS_THROUGH;
pr_debug("Set context mapping for %02x:%02x.%d\n", pr_debug("Set context mapping for %02x:%02x.%d\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
...@@ -1685,34 +1675,24 @@ static int domain_context_mapping_one(struct dmar_domain *domain, ...@@ -1685,34 +1675,24 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
context_set_domain_id(context, did); context_set_domain_id(context, did);
if (translation != CONTEXT_TT_PASS_THROUGH) { /*
/* * Skip top levels of page tables for iommu which has
* Skip top levels of page tables for iommu which has * less agaw than default. Unnecessary for PT mode.
* less agaw than default. Unnecessary for PT mode. */
*/ for (agaw = domain->agaw; agaw > iommu->agaw; agaw--) {
for (agaw = domain->agaw; agaw > iommu->agaw; agaw--) { ret = -ENOMEM;
ret = -ENOMEM; pgd = phys_to_virt(dma_pte_addr(pgd));
pgd = phys_to_virt(dma_pte_addr(pgd)); if (!dma_pte_present(pgd))
if (!dma_pte_present(pgd)) goto out_unlock;
goto out_unlock;
}
if (info && info->ats_supported)
translation = CONTEXT_TT_DEV_IOTLB;
else
translation = CONTEXT_TT_MULTI_LEVEL;
context_set_address_root(context, virt_to_phys(pgd));
context_set_address_width(context, agaw);
} else {
/*
* In pass through mode, AW must be programmed to
* indicate the largest AGAW value supported by
* hardware. And ASR is ignored by hardware.
*/
context_set_address_width(context, iommu->msagaw);
} }
if (info && info->ats_supported)
translation = CONTEXT_TT_DEV_IOTLB;
else
translation = CONTEXT_TT_MULTI_LEVEL;
context_set_address_root(context, virt_to_phys(pgd));
context_set_address_width(context, agaw);
context_set_translation_type(context, translation); context_set_translation_type(context, translation);
context_set_fault_enable(context); context_set_fault_enable(context);
context_set_present(context); context_set_present(context);
...@@ -1977,23 +1957,6 @@ static bool dev_is_real_dma_subdevice(struct device *dev) ...@@ -1977,23 +1957,6 @@ static bool dev_is_real_dma_subdevice(struct device *dev)
pci_real_dma_dev(to_pci_dev(dev)) != to_pci_dev(dev); pci_real_dma_dev(to_pci_dev(dev)) != to_pci_dev(dev);
} }
static int md_domain_init(struct dmar_domain *domain, int guest_width);
static int __init si_domain_init(void)
{
si_domain = alloc_domain(IOMMU_DOMAIN_IDENTITY);
if (!si_domain)
return -EFAULT;
if (md_domain_init(si_domain, DEFAULT_DOMAIN_ADDRESS_WIDTH)) {
domain_exit(si_domain);
si_domain = NULL;
return -EFAULT;
}
return 0;
}
static int dmar_domain_attach_device(struct dmar_domain *domain, static int dmar_domain_attach_device(struct dmar_domain *domain,
struct device *dev) struct device *dev)
{ {
...@@ -2016,8 +1979,6 @@ static int dmar_domain_attach_device(struct dmar_domain *domain, ...@@ -2016,8 +1979,6 @@ static int dmar_domain_attach_device(struct dmar_domain *domain,
if (!sm_supported(iommu)) if (!sm_supported(iommu))
ret = domain_context_mapping(domain, dev); ret = domain_context_mapping(domain, dev);
else if (domain_type_is_si(domain))
ret = intel_pasid_setup_pass_through(iommu, dev, IOMMU_NO_PASID);
else if (domain->use_first_level) else if (domain->use_first_level)
ret = domain_setup_first_level(iommu, domain, dev, IOMMU_NO_PASID); ret = domain_setup_first_level(iommu, domain, dev, IOMMU_NO_PASID);
else else
...@@ -2026,8 +1987,7 @@ static int dmar_domain_attach_device(struct dmar_domain *domain, ...@@ -2026,8 +1987,7 @@ static int dmar_domain_attach_device(struct dmar_domain *domain,
if (ret) if (ret)
goto out_block_translation; goto out_block_translation;
if (sm_supported(info->iommu) || !domain_type_is_si(info->domain)) iommu_enable_pci_caps(info);
iommu_enable_pci_caps(info);
ret = cache_tag_assign_domain(domain, dev, IOMMU_NO_PASID); ret = cache_tag_assign_domain(domain, dev, IOMMU_NO_PASID);
if (ret) if (ret)
...@@ -2386,10 +2346,6 @@ static int __init init_dmars(void) ...@@ -2386,10 +2346,6 @@ static int __init init_dmars(void)
check_tylersburg_isoch(); check_tylersburg_isoch();
ret = si_domain_init();
if (ret)
goto free_iommu;
/* /*
* for each drhd * for each drhd
* enable fault log * enable fault log
...@@ -2435,10 +2391,6 @@ static int __init init_dmars(void) ...@@ -2435,10 +2391,6 @@ static int __init init_dmars(void)
disable_dmar_iommu(iommu); disable_dmar_iommu(iommu);
free_dmar_iommu(iommu); free_dmar_iommu(iommu);
} }
if (si_domain) {
domain_exit(si_domain);
si_domain = NULL;
}
return ret; return ret;
} }
...@@ -3572,8 +3524,6 @@ static struct iommu_domain *intel_iommu_domain_alloc(unsigned type) ...@@ -3572,8 +3524,6 @@ static struct iommu_domain *intel_iommu_domain_alloc(unsigned type)
domain->geometry.force_aperture = true; domain->geometry.force_aperture = true;
return domain; return domain;
case IOMMU_DOMAIN_IDENTITY:
return &si_domain->domain;
default: default:
return NULL; return NULL;
} }
...@@ -3640,8 +3590,7 @@ static void intel_iommu_domain_free(struct iommu_domain *domain) ...@@ -3640,8 +3590,7 @@ static void intel_iommu_domain_free(struct iommu_domain *domain)
WARN_ON(dmar_domain->nested_parent && WARN_ON(dmar_domain->nested_parent &&
!list_empty(&dmar_domain->s1_domains)); !list_empty(&dmar_domain->s1_domains));
if (domain != &si_domain->domain) domain_exit(dmar_domain);
domain_exit(dmar_domain);
} }
int prepare_domain_attach_device(struct iommu_domain *domain, int prepare_domain_attach_device(struct iommu_domain *domain,
...@@ -4364,9 +4313,7 @@ static int intel_iommu_set_dev_pasid(struct iommu_domain *domain, ...@@ -4364,9 +4313,7 @@ static int intel_iommu_set_dev_pasid(struct iommu_domain *domain,
if (ret) if (ret)
goto out_detach_iommu; goto out_detach_iommu;
if (domain_type_is_si(dmar_domain)) if (dmar_domain->use_first_level)
ret = intel_pasid_setup_pass_through(iommu, dev, pasid);
else if (dmar_domain->use_first_level)
ret = domain_setup_first_level(iommu, dmar_domain, ret = domain_setup_first_level(iommu, dmar_domain,
dev, pasid); dev, pasid);
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment