IOMMU: have vendor code announce supported page sizes

Generic code will use this information to determine what order values
can legitimately be passed to the ->{,un}map_page() hooks. For now all
ops structures simply get to announce 4k mappings (as base page size),
and there is (and always has been) an assumption that this matches the
CPU's MMU base page size (eventually we will want to permit IOMMUs with
a base page size smaller than the CPU MMU's).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Rahul Singh <rahul.singh@arm.com>
This commit is contained in:
Jan Beulich committed 2022-04-22 14:54:16 +02:00
1 parent 4e977a70ad
commit 36992d809d
7 files changed
+17 -1

No files matched your search

@@ -746,6 +746,7 @@ static void cf_check amd_dump_page_tables(struct domain *d)
}
static const struct iommu_ops __initconst_cf_clobber _iommu_ops = {
.page_sizes = PAGE_SIZE_4K,
.init = amd_iommu_domain_init,
.hwdom_init = amd_iommu_hwdom_init,
.quarantine_init = amd_iommu_quarantine_init,
+1
View File
@@ -1355,6 +1355,7 @@ static void ipmmu_iommu_domain_teardown(struct domain *d)
static const struct iommu_ops ipmmu_iommu_ops =
{
.page_sizes = PAGE_SIZE_4K,
.init = ipmmu_iommu_domain_init,
.hwdom_init = arch_iommu_hwdom_init,
.teardown = ipmmu_iommu_domain_teardown,
+2 -1
View File
@@ -3411,7 +3411,8 @@ static void arm_smmu_iommu_xen_domain_teardown(struct domain *d)
}
static const struct iommu_ops arm_smmu_iommu_ops = {
.init = arm_smmu_iommu_xen_domain_init,
.page_sizes = PAGE_SIZE_4K,
.init = arm_smmu_iommu_xen_domain_init,
.hwdom_init = arch_iommu_hwdom_init,
.teardown = arm_smmu_iommu_xen_domain_teardown,
.iotlb_flush = arm_smmu_iotlb_flush,
+1
View File
@@ -2858,6 +2858,7 @@ static void arm_smmu_iommu_domain_teardown(struct domain *d)
}
static const struct iommu_ops arm_smmu_iommu_ops = {
.page_sizes = PAGE_SIZE_4K,
.init = arm_smmu_iommu_domain_init,
.hwdom_init = arch_iommu_hwdom_init,
.add_device = arm_smmu_dt_add_device_generic,
+10
View File
@@ -494,7 +494,17 @@ int __init iommu_setup(void)
if ( iommu_enable )
{
const struct iommu_ops *ops = NULL;
rc = iommu_hardware_setup();
if ( !rc )
ops = iommu_get_ops();
if ( ops && (ops->page_sizes & -ops->page_sizes) != PAGE_SIZE )
{
printk(XENLOG_ERR "IOMMU: page size mask %lx unsupported\n",
ops->page_sizes);
rc = ops->page_sizes ? -EPERM : -ENODATA;
}
iommu_enabled = (rc == 0);
}
+1
View File
@@ -3127,6 +3127,7 @@ static int cf_check intel_iommu_quarantine_init(struct pci_dev *pdev,
}
static const struct iommu_ops __initconst_cf_clobber vtd_ops = {
.page_sizes = PAGE_SIZE_4K,
.init = intel_iommu_domain_init,
.hwdom_init = intel_iommu_hwdom_init,
.quarantine_init = intel_iommu_quarantine_init,
+1
View File
@@ -231,6 +231,7 @@ struct page_info;
typedef int iommu_grdm_t(xen_pfn_t start, xen_ulong_t nr, u32 id, void *ctxt);
struct iommu_ops {
unsigned long page_sizes;
int (*init)(struct domain *d);
void (*hwdom_init)(struct domain *d);
int (*quarantine_init)(device_t *dev, bool scratch_page);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.