iommu/arm-smmu: Check for num_context_irqs > 0 to avoid divide by zero exception
With the right (or wrong;-) definition of v1 SMMU node in DTB it is possible to trigger a division by zero in arm_smmu_init_domain_context (if number of context irqs is 0): if (smmu->version == 1) { root_cfg->irptndx = atomic_inc_return(&smmu->irptndx); => root_cfg->irptndx %= smmu->num_context_irqs; } else { Avoid this by checking for num_context_irqs > 0 when probing for SMMU devices. Signed-off-by: Andreas Herrmann <andreas.herrmann@calxeda.com> [will: changed to dev_err on probe failure path] Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
c55af7f719
commit
44a08de2aa
|
@ -1798,12 +1798,11 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
|
|||
smmu->num_context_irqs++;
|
||||
}
|
||||
|
||||
if (num_irqs < smmu->num_global_irqs) {
|
||||
dev_warn(dev, "found %d interrupts but expected at least %d\n",
|
||||
num_irqs, smmu->num_global_irqs);
|
||||
smmu->num_global_irqs = num_irqs;
|
||||
if (!smmu->num_context_irqs) {
|
||||
dev_err(dev, "found %d interrupts but expected at least %d\n",
|
||||
num_irqs, smmu->num_global_irqs + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
smmu->num_context_irqs = num_irqs - smmu->num_global_irqs;
|
||||
|
||||
smmu->irqs = devm_kzalloc(dev, sizeof(*smmu->irqs) * num_irqs,
|
||||
GFP_KERNEL);
|
||||
|
|
Loading…
Reference in New Issue