drhd->iommu = iommu;
iommu->reg = ioremap(drhd->address, PAGE_SIZE);
+ rc = -ENOMEM;
if ( !iommu->reg )
- return -ENOMEM;
+ goto free;
iommu->index = nr_iommus++;
iommu->cap = dmar_readq(iommu->reg, DMAR_CAP_REG);
printk(VTDPREFIX "cap = %"PRIx64" ecap = %"PRIx64"\n",
iommu->cap, iommu->ecap);
}
+ rc = -ENODEV;
if ( !(iommu->cap + 1) || !(iommu->ecap + 1) )
- return -ENODEV;
+ goto free;
quirk_iommu_caps(iommu);
{
printk(XENLOG_ERR VTDPREFIX "IOMMU: unsupported\n");
print_iommu_regs(drhd);
- return -ENODEV;
+ rc = -ENODEV;
+ goto free;
}
/* Calculate number of pagetable levels: 3 or 4. */
{
printk(XENLOG_ERR VTDPREFIX "IOMMU: unsupported sagaw %x\n", sagaw);
print_iommu_regs(drhd);
- return -ENODEV;
+ rc = -ENODEV;
+ goto free;
}
iommu->nr_pt_levels = agaw_to_level(agaw);
iommu->domid_bitmap = xzalloc_array(unsigned long,
BITS_TO_LONGS(nr_dom));
iommu->domid_map = xzalloc_array(domid_t, nr_dom);
+ rc = -ENOMEM;
if ( !iommu->domid_bitmap || !iommu->domid_map )
- return -ENOMEM;
+ goto free;
/*
* If Caching mode is set, then invalid translations are tagged