| From d1e20222d5372e951bbb2fd3f6489ec4a6ea9b11 Mon Sep 17 00:00:00 2001 |
| From: Vivek Gautam <vivek.gautam@codeaurora.org> |
| Date: Thu, 19 Jul 2018 23:23:56 +0530 |
| Subject: iommu/arm-smmu: Error out only if not enough context interrupts |
| |
| From: Vivek Gautam <vivek.gautam@codeaurora.org> |
| |
| commit d1e20222d5372e951bbb2fd3f6489ec4a6ea9b11 upstream. |
| |
| Currently we check if the number of context banks is not equal to |
| num_context_interrupts. However, there are booloaders such as, one |
| on sdm845 that reserves few context banks and thus kernel views |
| less than the total available context banks. |
| So, although the hardware definition in device tree would mention |
| the correct number of context interrupts, this number can be |
| greater than the number of context banks visible to smmu in kernel. |
| We should therefore error out only when the number of context banks |
| is greater than the available number of context interrupts. |
| |
| Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org> |
| Suggested-by: Tomasz Figa <tfiga@chromium.org> |
| Cc: Robin Murphy <robin.murphy@arm.com> |
| Cc: Will Deacon <will.deacon@arm.com> |
| [will: drop useless printk] |
| Signed-off-by: Will Deacon <will.deacon@arm.com> |
| Cc: Jitendra Bhivare <jitendra.bhivare@broadcom.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/iommu/arm-smmu.c | 16 ++++++++++------ |
| 1 file changed, 10 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/iommu/arm-smmu.c |
| +++ b/drivers/iommu/arm-smmu.c |
| @@ -2100,12 +2100,16 @@ static int arm_smmu_device_probe(struct |
| if (err) |
| return err; |
| |
| - if (smmu->version == ARM_SMMU_V2 && |
| - smmu->num_context_banks != smmu->num_context_irqs) { |
| - dev_err(dev, |
| - "found only %d context interrupt(s) but %d required\n", |
| - smmu->num_context_irqs, smmu->num_context_banks); |
| - return -ENODEV; |
| + if (smmu->version == ARM_SMMU_V2) { |
| + if (smmu->num_context_banks > smmu->num_context_irqs) { |
| + dev_err(dev, |
| + "found only %d context irq(s) but %d required\n", |
| + smmu->num_context_irqs, smmu->num_context_banks); |
| + return -ENODEV; |
| + } |
| + |
| + /* Ignore superfluous interrupts */ |
| + smmu->num_context_irqs = smmu->num_context_banks; |
| } |
| |
| for (i = 0; i < smmu->num_global_irqs; ++i) { |