mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 22:52:19 +02:00
Merge branch 'core' into next
* core: iommu/qcom: Fix pgsize_bitmap iommu/intel: Convert to msi_create_parent_irq_domain() helper iommu/amd: Convert to msi_create_parent_irq_domain() helper iommu: Remove ops->pgsize_bitmap iommu/msm: Remove ops->pgsize_bitmap iommu/qcom: Remove iommu_ops pgsize_bitmap iommu/mtk: Remove iommu_ops pgsize_bitmap iommu: Remove iommu_ops pgsize_bitmap from simple drivers iommu: Remove ops.pgsize_bitmap from drivers that don't use it iommu/arm-smmu: Remove iommu_ops pgsize_bitmap qiommu/arm-smmu-v3: Remove iommu_ops pgsize_bitmap
This commit is contained in:
commit
6ed3d08a22
|
|
@ -200,6 +200,7 @@ source "drivers/iommu/riscv/Kconfig"
|
|||
config IRQ_REMAP
|
||||
bool "Support for Interrupt Remapping"
|
||||
depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI
|
||||
select IRQ_MSI_LIB
|
||||
help
|
||||
Supports Interrupt remapping for IO-APIC and MSI devices.
|
||||
To use x2apic mode in the CPU's which support x2APIC enhancements or
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ config AMD_IOMMU
|
|||
select PCI_ATS
|
||||
select PCI_PRI
|
||||
select PCI_PASID
|
||||
select IRQ_MSI_LIB
|
||||
select MMU_NOTIFIER
|
||||
select IOMMU_API
|
||||
select IOMMU_IOVA
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/notifier.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip/irq-msi-lib.h>
|
||||
#include <linux/msi.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/percpu.h>
|
||||
|
|
@ -3970,29 +3971,30 @@ static struct irq_chip amd_ir_chip = {
|
|||
|
||||
static const struct msi_parent_ops amdvi_msi_parent_ops = {
|
||||
.supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED | MSI_FLAG_MULTI_PCI_MSI,
|
||||
.bus_select_token = DOMAIN_BUS_AMDVI,
|
||||
.bus_select_mask = MATCH_PCI_MSI,
|
||||
.prefix = "IR-",
|
||||
.init_dev_msi_info = msi_parent_init_dev_msi_info,
|
||||
};
|
||||
|
||||
int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
|
||||
{
|
||||
struct fwnode_handle *fn;
|
||||
struct irq_domain_info info = {
|
||||
.fwnode = irq_domain_alloc_named_id_fwnode("AMD-IR", iommu->index),
|
||||
.ops = &amd_ir_domain_ops,
|
||||
.domain_flags = IRQ_DOMAIN_FLAG_ISOLATED_MSI,
|
||||
.host_data = iommu,
|
||||
.parent = arch_get_ir_parent_domain(),
|
||||
};
|
||||
|
||||
fn = irq_domain_alloc_named_id_fwnode("AMD-IR", iommu->index);
|
||||
if (!fn)
|
||||
if (!info.fwnode)
|
||||
return -ENOMEM;
|
||||
iommu->ir_domain = irq_domain_create_hierarchy(arch_get_ir_parent_domain(), 0, 0,
|
||||
fn, &amd_ir_domain_ops, iommu);
|
||||
|
||||
iommu->ir_domain = msi_create_parent_irq_domain(&info, &amdvi_msi_parent_ops);
|
||||
if (!iommu->ir_domain) {
|
||||
irq_domain_free_fwnode(fn);
|
||||
irq_domain_free_fwnode(info.fwnode);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
irq_domain_update_bus_token(iommu->ir_domain, DOMAIN_BUS_AMDVI);
|
||||
iommu->ir_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT |
|
||||
IRQ_DOMAIN_FLAG_ISOLATED_MSI;
|
||||
iommu->ir_domain->msi_parent_ops = &amdvi_msi_parent_ops;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -991,7 +991,6 @@ static const struct iommu_ops apple_dart_iommu_ops = {
|
|||
.of_xlate = apple_dart_of_xlate,
|
||||
.def_domain_type = apple_dart_def_domain_type,
|
||||
.get_resv_regions = apple_dart_get_resv_regions,
|
||||
.pgsize_bitmap = -1UL, /* Restricted during dart probe */
|
||||
.owner = THIS_MODULE,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = apple_dart_attach_dev_paging,
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ module_param(disable_msipolling, bool, 0444);
|
|||
MODULE_PARM_DESC(disable_msipolling,
|
||||
"Disable MSI-based polling for CMD_SYNC completion.");
|
||||
|
||||
static struct iommu_ops arm_smmu_ops;
|
||||
static const struct iommu_ops arm_smmu_ops;
|
||||
static struct iommu_dirty_ops arm_smmu_dirty_ops;
|
||||
|
||||
enum arm_smmu_msi_index {
|
||||
|
|
@ -3674,7 +3674,7 @@ static int arm_smmu_def_domain_type(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct iommu_ops arm_smmu_ops = {
|
||||
static const struct iommu_ops arm_smmu_ops = {
|
||||
.identity_domain = &arm_smmu_identity_domain,
|
||||
.blocked_domain = &arm_smmu_blocked_domain,
|
||||
.capable = arm_smmu_capable,
|
||||
|
|
@ -3690,7 +3690,6 @@ static struct iommu_ops arm_smmu_ops = {
|
|||
.def_domain_type = arm_smmu_def_domain_type,
|
||||
.viommu_alloc = arm_vsmmu_alloc,
|
||||
.user_pasid_table = 1,
|
||||
.pgsize_bitmap = -1UL, /* Restricted during device attach */
|
||||
.owner = THIS_MODULE,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = arm_smmu_attach_dev,
|
||||
|
|
@ -4504,11 +4503,6 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
|
|||
smmu->oas = 48;
|
||||
}
|
||||
|
||||
if (arm_smmu_ops.pgsize_bitmap == -1UL)
|
||||
arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap;
|
||||
else
|
||||
arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
|
||||
|
||||
/* Set the DMA mask for our table walker */
|
||||
if (dma_set_mask_and_coherent(smmu->dev, DMA_BIT_MASK(smmu->oas)))
|
||||
dev_warn(smmu->dev,
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom)
|
|||
}
|
||||
|
||||
static struct platform_driver arm_smmu_driver;
|
||||
static struct iommu_ops arm_smmu_ops;
|
||||
static const struct iommu_ops arm_smmu_ops;
|
||||
|
||||
#ifdef CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS
|
||||
static struct device_node *dev_get_dev_node(struct device *dev)
|
||||
|
|
@ -919,6 +919,8 @@ static void arm_smmu_destroy_domain_context(struct arm_smmu_domain *smmu_domain)
|
|||
static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev)
|
||||
{
|
||||
struct arm_smmu_domain *smmu_domain;
|
||||
struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
|
||||
struct arm_smmu_device *smmu = cfg->smmu;
|
||||
|
||||
/*
|
||||
* Allocate the domain and initialise some of its data structures.
|
||||
|
|
@ -931,6 +933,7 @@ static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev)
|
|||
|
||||
mutex_init(&smmu_domain->init_mutex);
|
||||
spin_lock_init(&smmu_domain->cb_lock);
|
||||
smmu_domain->domain.pgsize_bitmap = smmu->pgsize_bitmap;
|
||||
|
||||
return &smmu_domain->domain;
|
||||
}
|
||||
|
|
@ -1627,7 +1630,7 @@ static int arm_smmu_def_domain_type(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct iommu_ops arm_smmu_ops = {
|
||||
static const struct iommu_ops arm_smmu_ops = {
|
||||
.identity_domain = &arm_smmu_identity_domain,
|
||||
.blocked_domain = &arm_smmu_blocked_domain,
|
||||
.capable = arm_smmu_capable,
|
||||
|
|
@ -1639,7 +1642,6 @@ static struct iommu_ops arm_smmu_ops = {
|
|||
.of_xlate = arm_smmu_of_xlate,
|
||||
.get_resv_regions = arm_smmu_get_resv_regions,
|
||||
.def_domain_type = arm_smmu_def_domain_type,
|
||||
.pgsize_bitmap = -1UL, /* Restricted during device attach */
|
||||
.owner = THIS_MODULE,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = arm_smmu_attach_dev,
|
||||
|
|
@ -1919,10 +1921,6 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
|
|||
if (smmu->features & ARM_SMMU_FEAT_FMT_AARCH64_64K)
|
||||
smmu->pgsize_bitmap |= SZ_64K | SZ_512M;
|
||||
|
||||
if (arm_smmu_ops.pgsize_bitmap == -1UL)
|
||||
arm_smmu_ops.pgsize_bitmap = smmu->pgsize_bitmap;
|
||||
else
|
||||
arm_smmu_ops.pgsize_bitmap |= smmu->pgsize_bitmap;
|
||||
dev_notice(smmu->dev, "\tSupported page sizes: 0x%08lx\n",
|
||||
smmu->pgsize_bitmap);
|
||||
|
||||
|
|
|
|||
|
|
@ -229,7 +229,7 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain,
|
|||
goto out_unlock;
|
||||
|
||||
pgtbl_cfg = (struct io_pgtable_cfg) {
|
||||
.pgsize_bitmap = qcom_iommu_ops.pgsize_bitmap,
|
||||
.pgsize_bitmap = domain->pgsize_bitmap,
|
||||
.ias = 32,
|
||||
.oas = 40,
|
||||
.tlb = &qcom_flush_ops,
|
||||
|
|
@ -246,8 +246,6 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain,
|
|||
goto out_clear_iommu;
|
||||
}
|
||||
|
||||
/* Update the domain's page sizes to reflect the page table format */
|
||||
domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
|
||||
domain->geometry.aperture_end = (1ULL << pgtbl_cfg.ias) - 1;
|
||||
domain->geometry.force_aperture = true;
|
||||
|
||||
|
|
@ -337,6 +335,7 @@ static struct iommu_domain *qcom_iommu_domain_alloc_paging(struct device *dev)
|
|||
|
||||
mutex_init(&qcom_domain->init_mutex);
|
||||
spin_lock_init(&qcom_domain->pgtbl_lock);
|
||||
qcom_domain->domain.pgsize_bitmap = SZ_4K;
|
||||
|
||||
return &qcom_domain->domain;
|
||||
}
|
||||
|
|
@ -598,7 +597,6 @@ static const struct iommu_ops qcom_iommu_ops = {
|
|||
.probe_device = qcom_iommu_probe_device,
|
||||
.device_group = generic_device_group,
|
||||
.of_xlate = qcom_iommu_of_xlate,
|
||||
.pgsize_bitmap = SZ_4K | SZ_64K | SZ_1M | SZ_16M,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = qcom_iommu_attach_dev,
|
||||
.map_pages = qcom_iommu_map,
|
||||
|
|
|
|||
|
|
@ -925,6 +925,8 @@ static struct iommu_domain *exynos_iommu_domain_alloc_paging(struct device *dev)
|
|||
spin_lock_init(&domain->pgtablelock);
|
||||
INIT_LIST_HEAD(&domain->clients);
|
||||
|
||||
domain->domain.pgsize_bitmap = SECT_SIZE | LPAGE_SIZE | SPAGE_SIZE;
|
||||
|
||||
domain->domain.geometry.aperture_start = 0;
|
||||
domain->domain.geometry.aperture_end = ~0UL;
|
||||
domain->domain.geometry.force_aperture = true;
|
||||
|
|
@ -1477,7 +1479,6 @@ static const struct iommu_ops exynos_iommu_ops = {
|
|||
.device_group = generic_device_group,
|
||||
.probe_device = exynos_iommu_probe_device,
|
||||
.release_device = exynos_iommu_release_device,
|
||||
.pgsize_bitmap = SECT_SIZE | LPAGE_SIZE | SPAGE_SIZE,
|
||||
.of_xlate = exynos_iommu_of_xlate,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = exynos_iommu_attach_device,
|
||||
|
|
|
|||
|
|
@ -4365,7 +4365,6 @@ const struct iommu_ops intel_iommu_ops = {
|
|||
.device_group = intel_iommu_device_group,
|
||||
.is_attach_deferred = intel_iommu_is_attach_deferred,
|
||||
.def_domain_type = device_def_domain_type,
|
||||
.pgsize_bitmap = SZ_4K,
|
||||
.page_response = intel_iommu_page_response,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = intel_iommu_attach_device,
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/hpet.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip/irq-msi-lib.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/crash_dump.h>
|
||||
|
|
@ -518,8 +519,14 @@ static void iommu_enable_irq_remapping(struct intel_iommu *iommu)
|
|||
|
||||
static int intel_setup_irq_remapping(struct intel_iommu *iommu)
|
||||
{
|
||||
struct irq_domain_info info = {
|
||||
.ops = &intel_ir_domain_ops,
|
||||
.parent = arch_get_ir_parent_domain(),
|
||||
.domain_flags = IRQ_DOMAIN_FLAG_ISOLATED_MSI,
|
||||
.size = INTR_REMAP_TABLE_ENTRIES,
|
||||
.host_data = iommu,
|
||||
};
|
||||
struct ir_table *ir_table;
|
||||
struct fwnode_handle *fn;
|
||||
unsigned long *bitmap;
|
||||
void *ir_table_base;
|
||||
|
||||
|
|
@ -544,25 +551,16 @@ static int intel_setup_irq_remapping(struct intel_iommu *iommu)
|
|||
goto out_free_pages;
|
||||
}
|
||||
|
||||
fn = irq_domain_alloc_named_id_fwnode("INTEL-IR", iommu->seq_id);
|
||||
if (!fn)
|
||||
info.fwnode = irq_domain_alloc_named_id_fwnode("INTEL-IR", iommu->seq_id);
|
||||
if (!info.fwnode)
|
||||
goto out_free_bitmap;
|
||||
|
||||
iommu->ir_domain =
|
||||
irq_domain_create_hierarchy(arch_get_ir_parent_domain(),
|
||||
0, INTR_REMAP_TABLE_ENTRIES,
|
||||
fn, &intel_ir_domain_ops,
|
||||
iommu);
|
||||
iommu->ir_domain = msi_create_parent_irq_domain(&info, &dmar_msi_parent_ops);
|
||||
if (!iommu->ir_domain) {
|
||||
pr_err("IR%d: failed to allocate irqdomain\n", iommu->seq_id);
|
||||
goto out_free_fwnode;
|
||||
}
|
||||
|
||||
irq_domain_update_bus_token(iommu->ir_domain, DOMAIN_BUS_DMAR);
|
||||
iommu->ir_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT |
|
||||
IRQ_DOMAIN_FLAG_ISOLATED_MSI;
|
||||
iommu->ir_domain->msi_parent_ops = &dmar_msi_parent_ops;
|
||||
|
||||
ir_table->base = ir_table_base;
|
||||
ir_table->bitmap = bitmap;
|
||||
iommu->ir_table = ir_table;
|
||||
|
|
@ -608,7 +606,7 @@ static int intel_setup_irq_remapping(struct intel_iommu *iommu)
|
|||
irq_domain_remove(iommu->ir_domain);
|
||||
iommu->ir_domain = NULL;
|
||||
out_free_fwnode:
|
||||
irq_domain_free_fwnode(fn);
|
||||
irq_domain_free_fwnode(info.fwnode);
|
||||
out_free_bitmap:
|
||||
bitmap_free(bitmap);
|
||||
out_free_pages:
|
||||
|
|
@ -1530,6 +1528,8 @@ static const struct irq_domain_ops intel_ir_domain_ops = {
|
|||
|
||||
static const struct msi_parent_ops dmar_msi_parent_ops = {
|
||||
.supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED | MSI_FLAG_MULTI_PCI_MSI,
|
||||
.bus_select_token = DOMAIN_BUS_DMAR,
|
||||
.bus_select_mask = MATCH_PCI_MSI,
|
||||
.prefix = "IR-",
|
||||
.init_dev_msi_info = msi_parent_init_dev_msi_info,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2002,13 +2002,6 @@ static void iommu_domain_init(struct iommu_domain *domain, unsigned int type,
|
|||
domain->owner = ops;
|
||||
if (!domain->ops)
|
||||
domain->ops = ops->default_domain_ops;
|
||||
|
||||
/*
|
||||
* If not already set, assume all sizes by default; the driver
|
||||
* may override this later
|
||||
*/
|
||||
if (!domain->pgsize_bitmap)
|
||||
domain->pgsize_bitmap = ops->pgsize_bitmap;
|
||||
}
|
||||
|
||||
static struct iommu_domain *
|
||||
|
|
|
|||
|
|
@ -801,7 +801,6 @@ static const struct iommu_ops mock_ops = {
|
|||
.default_domain = &mock_blocking_domain,
|
||||
.blocked_domain = &mock_blocking_domain,
|
||||
.owner = THIS_MODULE,
|
||||
.pgsize_bitmap = MOCK_IO_PAGE_SIZE,
|
||||
.hw_info = mock_domain_hw_info,
|
||||
.domain_alloc_paging_flags = mock_domain_alloc_paging_flags,
|
||||
.domain_alloc_nested = mock_domain_alloc_nested,
|
||||
|
|
|
|||
|
|
@ -430,7 +430,7 @@ static int ipmmu_domain_init_context(struct ipmmu_vmsa_domain *domain)
|
|||
* non-secure mode.
|
||||
*/
|
||||
domain->cfg.quirks = IO_PGTABLE_QUIRK_ARM_NS;
|
||||
domain->cfg.pgsize_bitmap = SZ_1G | SZ_2M | SZ_4K;
|
||||
domain->cfg.pgsize_bitmap = domain->io_domain.pgsize_bitmap;
|
||||
domain->cfg.ias = 32;
|
||||
domain->cfg.oas = 40;
|
||||
domain->cfg.tlb = &ipmmu_flush_ops;
|
||||
|
|
@ -571,6 +571,7 @@ static struct iommu_domain *ipmmu_domain_alloc_paging(struct device *dev)
|
|||
return NULL;
|
||||
|
||||
mutex_init(&domain->mutex);
|
||||
domain->io_domain.pgsize_bitmap = SZ_1G | SZ_2M | SZ_4K;
|
||||
|
||||
return &domain->io_domain;
|
||||
}
|
||||
|
|
@ -882,7 +883,6 @@ static const struct iommu_ops ipmmu_ops = {
|
|||
*/
|
||||
.device_group = IS_ENABLED(CONFIG_ARM) && !IS_ENABLED(CONFIG_IOMMU_DMA)
|
||||
? generic_device_group : generic_single_device_group,
|
||||
.pgsize_bitmap = SZ_1G | SZ_2M | SZ_4K,
|
||||
.of_xlate = ipmmu_of_xlate,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = ipmmu_attach_device,
|
||||
|
|
|
|||
|
|
@ -312,6 +312,8 @@ static struct iommu_domain *msm_iommu_domain_alloc_paging(struct device *dev)
|
|||
|
||||
INIT_LIST_HEAD(&priv->list_attached);
|
||||
|
||||
priv->domain.pgsize_bitmap = MSM_IOMMU_PGSIZES;
|
||||
|
||||
priv->domain.geometry.aperture_start = 0;
|
||||
priv->domain.geometry.aperture_end = (1ULL << 32) - 1;
|
||||
priv->domain.geometry.force_aperture = true;
|
||||
|
|
@ -339,7 +341,7 @@ static int msm_iommu_domain_config(struct msm_priv *priv)
|
|||
spin_lock_init(&priv->pgtlock);
|
||||
|
||||
priv->cfg = (struct io_pgtable_cfg) {
|
||||
.pgsize_bitmap = msm_iommu_ops.pgsize_bitmap,
|
||||
.pgsize_bitmap = priv->domain.pgsize_bitmap,
|
||||
.ias = 32,
|
||||
.oas = 32,
|
||||
.tlb = &msm_iommu_flush_ops,
|
||||
|
|
@ -352,8 +354,6 @@ static int msm_iommu_domain_config(struct msm_priv *priv)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
msm_iommu_ops.pgsize_bitmap = priv->cfg.pgsize_bitmap;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -692,7 +692,6 @@ static struct iommu_ops msm_iommu_ops = {
|
|||
.domain_alloc_paging = msm_iommu_domain_alloc_paging,
|
||||
.probe_device = msm_iommu_probe_device,
|
||||
.device_group = generic_device_group,
|
||||
.pgsize_bitmap = MSM_IOMMU_PGSIZES,
|
||||
.of_xlate = qcom_iommu_of_xlate,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = msm_iommu_attach_dev,
|
||||
|
|
|
|||
|
|
@ -648,7 +648,7 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom,
|
|||
if (share_dom) {
|
||||
dom->iop = share_dom->iop;
|
||||
dom->cfg = share_dom->cfg;
|
||||
dom->domain.pgsize_bitmap = share_dom->cfg.pgsize_bitmap;
|
||||
dom->domain.pgsize_bitmap = share_dom->domain.pgsize_bitmap;
|
||||
goto update_iova_region;
|
||||
}
|
||||
|
||||
|
|
@ -656,7 +656,7 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom,
|
|||
.quirks = IO_PGTABLE_QUIRK_ARM_NS |
|
||||
IO_PGTABLE_QUIRK_NO_PERMS |
|
||||
IO_PGTABLE_QUIRK_ARM_MTK_EXT,
|
||||
.pgsize_bitmap = mtk_iommu_ops.pgsize_bitmap,
|
||||
.pgsize_bitmap = dom->domain.pgsize_bitmap,
|
||||
.ias = MTK_IOMMU_HAS_FLAG(data->plat_data, IOVA_34_EN) ? 34 : 32,
|
||||
.iommu_dev = data->dev,
|
||||
};
|
||||
|
|
@ -675,9 +675,6 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Update our support page sizes bitmap */
|
||||
dom->domain.pgsize_bitmap = dom->cfg.pgsize_bitmap;
|
||||
|
||||
data->share_dom = dom;
|
||||
|
||||
update_iova_region:
|
||||
|
|
@ -697,6 +694,7 @@ static struct iommu_domain *mtk_iommu_domain_alloc_paging(struct device *dev)
|
|||
if (!dom)
|
||||
return NULL;
|
||||
mutex_init(&dom->mutex);
|
||||
dom->domain.pgsize_bitmap = SZ_4K | SZ_64K | SZ_1M | SZ_16M;
|
||||
|
||||
return &dom->domain;
|
||||
}
|
||||
|
|
@ -1019,7 +1017,6 @@ static const struct iommu_ops mtk_iommu_ops = {
|
|||
.device_group = mtk_iommu_device_group,
|
||||
.of_xlate = mtk_iommu_of_xlate,
|
||||
.get_resv_regions = mtk_iommu_get_resv_regions,
|
||||
.pgsize_bitmap = SZ_4K | SZ_64K | SZ_1M | SZ_16M,
|
||||
.owner = THIS_MODULE,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = mtk_iommu_attach_device,
|
||||
|
|
|
|||
|
|
@ -288,6 +288,8 @@ static struct iommu_domain *mtk_iommu_v1_domain_alloc_paging(struct device *dev)
|
|||
if (!dom)
|
||||
return NULL;
|
||||
|
||||
dom->domain.pgsize_bitmap = MT2701_IOMMU_PAGE_SIZE;
|
||||
|
||||
return &dom->domain;
|
||||
}
|
||||
|
||||
|
|
@ -582,7 +584,6 @@ static const struct iommu_ops mtk_iommu_v1_ops = {
|
|||
.probe_finalize = mtk_iommu_v1_probe_finalize,
|
||||
.release_device = mtk_iommu_v1_release_device,
|
||||
.device_group = generic_device_group,
|
||||
.pgsize_bitmap = MT2701_IOMMU_PAGE_SIZE,
|
||||
.owner = THIS_MODULE,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = mtk_iommu_v1_attach_device,
|
||||
|
|
|
|||
|
|
@ -1584,6 +1584,8 @@ static struct iommu_domain *omap_iommu_domain_alloc_paging(struct device *dev)
|
|||
|
||||
spin_lock_init(&omap_domain->lock);
|
||||
|
||||
omap_domain->domain.pgsize_bitmap = OMAP_IOMMU_PGSIZES;
|
||||
|
||||
omap_domain->domain.geometry.aperture_start = 0;
|
||||
omap_domain->domain.geometry.aperture_end = (1ULL << 32) - 1;
|
||||
omap_domain->domain.geometry.force_aperture = true;
|
||||
|
|
@ -1735,7 +1737,6 @@ static const struct iommu_ops omap_iommu_ops = {
|
|||
.release_device = omap_iommu_release_device,
|
||||
.device_group = generic_single_device_group,
|
||||
.of_xlate = omap_iommu_of_xlate,
|
||||
.pgsize_bitmap = OMAP_IOMMU_PGSIZES,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = omap_iommu_attach_dev,
|
||||
.map_pages = omap_iommu_map,
|
||||
|
|
|
|||
|
|
@ -1533,7 +1533,6 @@ static void riscv_iommu_release_device(struct device *dev)
|
|||
}
|
||||
|
||||
static const struct iommu_ops riscv_iommu_ops = {
|
||||
.pgsize_bitmap = SZ_4K,
|
||||
.of_xlate = riscv_iommu_of_xlate,
|
||||
.identity_domain = &riscv_iommu_identity_domain,
|
||||
.blocked_domain = &riscv_iommu_blocking_domain,
|
||||
|
|
|
|||
|
|
@ -1081,6 +1081,8 @@ static struct iommu_domain *rk_iommu_domain_alloc_paging(struct device *dev)
|
|||
spin_lock_init(&rk_domain->dt_lock);
|
||||
INIT_LIST_HEAD(&rk_domain->iommus);
|
||||
|
||||
rk_domain->domain.pgsize_bitmap = RK_IOMMU_PGSIZE_BITMAP;
|
||||
|
||||
rk_domain->domain.geometry.aperture_start = 0;
|
||||
rk_domain->domain.geometry.aperture_end = DMA_BIT_MASK(32);
|
||||
rk_domain->domain.geometry.force_aperture = true;
|
||||
|
|
@ -1171,7 +1173,6 @@ static const struct iommu_ops rk_iommu_ops = {
|
|||
.probe_device = rk_iommu_probe_device,
|
||||
.release_device = rk_iommu_release_device,
|
||||
.device_group = generic_single_device_group,
|
||||
.pgsize_bitmap = RK_IOMMU_PGSIZE_BITMAP,
|
||||
.of_xlate = rk_iommu_of_xlate,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = rk_iommu_attach_device,
|
||||
|
|
|
|||
|
|
@ -557,6 +557,7 @@ static struct iommu_domain *s390_domain_alloc_paging(struct device *dev)
|
|||
}
|
||||
zdev->end_dma = zdev->start_dma + aperture_size - 1;
|
||||
|
||||
s390_domain->domain.pgsize_bitmap = SZ_4K;
|
||||
s390_domain->domain.geometry.force_aperture = true;
|
||||
s390_domain->domain.geometry.aperture_start = 0;
|
||||
s390_domain->domain.geometry.aperture_end = max_tbl_size(s390_domain);
|
||||
|
|
@ -1158,7 +1159,6 @@ static struct iommu_domain blocking_domain = {
|
|||
.domain_alloc_paging = s390_domain_alloc_paging, \
|
||||
.probe_device = s390_iommu_probe_device, \
|
||||
.device_group = generic_device_group, \
|
||||
.pgsize_bitmap = SZ_4K, \
|
||||
.get_resv_regions = s390_iommu_get_resv_regions, \
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) { \
|
||||
.attach_dev = s390_iommu_attach_device, \
|
||||
|
|
|
|||
|
|
@ -143,6 +143,8 @@ static struct iommu_domain *sprd_iommu_domain_alloc_paging(struct device *dev)
|
|||
|
||||
spin_lock_init(&dom->pgtlock);
|
||||
|
||||
dom->domain.pgsize_bitmap = SPRD_IOMMU_PAGE_SIZE;
|
||||
|
||||
dom->domain.geometry.aperture_start = 0;
|
||||
dom->domain.geometry.aperture_end = SZ_256M - 1;
|
||||
dom->domain.geometry.force_aperture = true;
|
||||
|
|
@ -410,7 +412,6 @@ static const struct iommu_ops sprd_iommu_ops = {
|
|||
.probe_device = sprd_iommu_probe_device,
|
||||
.device_group = generic_single_device_group,
|
||||
.of_xlate = sprd_iommu_of_xlate,
|
||||
.pgsize_bitmap = SPRD_IOMMU_PAGE_SIZE,
|
||||
.owner = THIS_MODULE,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = sprd_iommu_attach_device,
|
||||
|
|
|
|||
|
|
@ -697,6 +697,8 @@ sun50i_iommu_domain_alloc_paging(struct device *dev)
|
|||
|
||||
refcount_set(&sun50i_domain->refcnt, 1);
|
||||
|
||||
sun50i_domain->domain.pgsize_bitmap = SZ_4K;
|
||||
|
||||
sun50i_domain->domain.geometry.aperture_start = 0;
|
||||
sun50i_domain->domain.geometry.aperture_end = DMA_BIT_MASK(32);
|
||||
sun50i_domain->domain.geometry.force_aperture = true;
|
||||
|
|
@ -842,7 +844,6 @@ static int sun50i_iommu_of_xlate(struct device *dev,
|
|||
|
||||
static const struct iommu_ops sun50i_iommu_ops = {
|
||||
.identity_domain = &sun50i_iommu_identity_domain,
|
||||
.pgsize_bitmap = SZ_4K,
|
||||
.device_group = generic_single_device_group,
|
||||
.domain_alloc_paging = sun50i_iommu_domain_alloc_paging,
|
||||
.of_xlate = sun50i_iommu_of_xlate,
|
||||
|
|
|
|||
|
|
@ -318,6 +318,8 @@ static struct iommu_domain *tegra_smmu_domain_alloc_paging(struct device *dev)
|
|||
|
||||
spin_lock_init(&as->lock);
|
||||
|
||||
as->domain.pgsize_bitmap = SZ_4K;
|
||||
|
||||
/* setup aperture */
|
||||
as->domain.geometry.aperture_start = 0;
|
||||
as->domain.geometry.aperture_end = 0xffffffff;
|
||||
|
|
@ -1002,7 +1004,6 @@ static const struct iommu_ops tegra_smmu_ops = {
|
|||
.probe_device = tegra_smmu_probe_device,
|
||||
.device_group = tegra_smmu_device_group,
|
||||
.of_xlate = tegra_smmu_of_xlate,
|
||||
.pgsize_bitmap = SZ_4K,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = tegra_smmu_attach_dev,
|
||||
.map_pages = tegra_smmu_map,
|
||||
|
|
|
|||
|
|
@ -998,7 +998,7 @@ static void viommu_get_resv_regions(struct device *dev, struct list_head *head)
|
|||
iommu_dma_get_resv_regions(dev, head);
|
||||
}
|
||||
|
||||
static struct iommu_ops viommu_ops;
|
||||
static const struct iommu_ops viommu_ops;
|
||||
static struct virtio_driver virtio_iommu_drv;
|
||||
|
||||
static int viommu_match_node(struct device *dev, const void *data)
|
||||
|
|
@ -1086,7 +1086,7 @@ static bool viommu_capable(struct device *dev, enum iommu_cap cap)
|
|||
}
|
||||
}
|
||||
|
||||
static struct iommu_ops viommu_ops = {
|
||||
static const struct iommu_ops viommu_ops = {
|
||||
.capable = viommu_capable,
|
||||
.domain_alloc_identity = viommu_domain_alloc_identity,
|
||||
.domain_alloc_paging = viommu_domain_alloc_paging,
|
||||
|
|
@ -1217,8 +1217,6 @@ static int viommu_probe(struct virtio_device *vdev)
|
|||
viommu->first_domain++;
|
||||
}
|
||||
|
||||
viommu_ops.pgsize_bitmap = viommu->pgsize_bitmap;
|
||||
|
||||
virtio_device_ready(vdev);
|
||||
|
||||
/* Populate the event queue with buffers */
|
||||
|
|
|
|||
|
|
@ -604,7 +604,6 @@ iommu_copy_struct_from_full_user_array(void *kdst, size_t kdst_entry_size,
|
|||
* It is required to call iommufd_viommu_alloc() helper for
|
||||
* a bundled allocation of the core and the driver structures,
|
||||
* using the given @ictx pointer.
|
||||
* @pgsize_bitmap: bitmap of all possible supported page sizes
|
||||
* @owner: Driver module providing these ops
|
||||
* @identity_domain: An always available, always attachable identity
|
||||
* translation.
|
||||
|
|
@ -659,7 +658,6 @@ struct iommu_ops {
|
|||
struct iommufd_ctx *ictx, unsigned int viommu_type);
|
||||
|
||||
const struct iommu_domain_ops *default_domain_ops;
|
||||
unsigned long pgsize_bitmap;
|
||||
struct module *owner;
|
||||
struct iommu_domain *identity_domain;
|
||||
struct iommu_domain *blocked_domain;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user