aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Auger <eric.auger@redhat.com>2017-01-19 15:57:55 -0500
committerWill Deacon <will.deacon@arm.com>2017-01-23 10:00:12 -0500
commitf3ebee80b3131d4cdb49d39cf07b32afe40b811c (patch)
tree7605cae50d5e14dfaada36a32aece099b9341ba8
parent4397f32c03a757acb3e44d268c20233fa1758ed9 (diff)
iommu/arm-smmu: Implement reserved region get/put callbacks
The get() populates the list with the MSI IOVA reserved window. At the moment an arbitray MSI IOVA window is set at 0x8000000 of size 1MB. This will allow to report those info in iommu-group sysfs. Signed-off-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Tomasz Nowicki <tomasz.nowicki@caviumnetworks.com> Tested-by: Tomasz Nowicki <tomasz.nowicki@caviumnetworks.com> Tested-by: Bharat Bhushan <bharat.bhushan@nxp.com> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--drivers/iommu/arm-smmu.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index a60cded8a6ed..a354572491c8 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -281,6 +281,9 @@ enum arm_smmu_s2cr_privcfg {
281 281
282#define FSYNR0_WNR (1 << 4) 282#define FSYNR0_WNR (1 << 4)
283 283
284#define MSI_IOVA_BASE 0x8000000
285#define MSI_IOVA_LENGTH 0x100000
286
284static int force_stage; 287static int force_stage;
285module_param(force_stage, int, S_IRUGO); 288module_param(force_stage, int, S_IRUGO);
286MODULE_PARM_DESC(force_stage, 289MODULE_PARM_DESC(force_stage,
@@ -1549,6 +1552,29 @@ static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
1549 return iommu_fwspec_add_ids(dev, &fwid, 1); 1552 return iommu_fwspec_add_ids(dev, &fwid, 1);
1550} 1553}
1551 1554
1555static void arm_smmu_get_resv_regions(struct device *dev,
1556 struct list_head *head)
1557{
1558 struct iommu_resv_region *region;
1559 int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
1560
1561 region = iommu_alloc_resv_region(MSI_IOVA_BASE, MSI_IOVA_LENGTH,
1562 prot, IOMMU_RESV_MSI);
1563 if (!region)
1564 return;
1565
1566 list_add_tail(&region->list, head);
1567}
1568
1569static void arm_smmu_put_resv_regions(struct device *dev,
1570 struct list_head *head)
1571{
1572 struct iommu_resv_region *entry, *next;
1573
1574 list_for_each_entry_safe(entry, next, head, list)
1575 kfree(entry);
1576}
1577
1552static struct iommu_ops arm_smmu_ops = { 1578static struct iommu_ops arm_smmu_ops = {
1553 .capable = arm_smmu_capable, 1579 .capable = arm_smmu_capable,
1554 .domain_alloc = arm_smmu_domain_alloc, 1580 .domain_alloc = arm_smmu_domain_alloc,
@@ -1564,6 +1590,8 @@ static struct iommu_ops arm_smmu_ops = {
1564 .domain_get_attr = arm_smmu_domain_get_attr, 1590 .domain_get_attr = arm_smmu_domain_get_attr,
1565 .domain_set_attr = arm_smmu_domain_set_attr, 1591 .domain_set_attr = arm_smmu_domain_set_attr,
1566 .of_xlate = arm_smmu_of_xlate, 1592 .of_xlate = arm_smmu_of_xlate,
1593 .get_resv_regions = arm_smmu_get_resv_regions,
1594 .put_resv_regions = arm_smmu_put_resv_regions,
1567 .pgsize_bitmap = -1UL, /* Restricted during device attach */ 1595 .pgsize_bitmap = -1UL, /* Restricted during device attach */
1568}; 1596};
1569 1597