static int setup_intr_remapping(struct intel_iommu *iommu, int mode) { struct ir_table *ir_table; struct page *pages; ir_table = iommu->ir_table = kzalloc(sizeof(struct ir_table), GFP_ATOMIC); if (!iommu->ir_table) return -ENOMEM; pages = alloc_pages_node(iommu->node, GFP_ATOMIC | __GFP_ZERO, INTR_REMAP_PAGE_ORDER); if (!pages) { printk(KERN_ERR "failed to allocate pages of order %d\n", INTR_REMAP_PAGE_ORDER); kfree(iommu->ir_table); return -ENOMEM; } ir_table->base = page_address(pages); iommu_set_intr_remapping(iommu, mode); return 0; }
int reenable_intr_remapping(int eim) { struct dmar_drhd_unit *drhd; int setup = 0; struct intel_iommu *iommu = NULL; for_each_iommu(iommu, drhd) if (iommu->qi) dmar_reenable_qi(iommu); /* * Setup Interrupt-remapping for all the DRHD's now. */ for_each_iommu(iommu, drhd) { if (!ecap_ir_support(iommu->ecap)) continue; /* Set up interrupt remapping for iommu.*/ iommu_set_intr_remapping(iommu, eim); setup = 1; } if (!setup) goto error; return 0; error: /* * handle error condition gracefully here! */ return -1; }
int reenable_intr_remapping(int eim) { struct dmar_drhd_unit *drhd; int setup = 0; struct intel_iommu *iommu = NULL; for_each_iommu(iommu, drhd) if (iommu->qi) dmar_reenable_qi(iommu); for_each_iommu(iommu, drhd) { if (!ecap_ir_support(iommu->ecap)) continue; iommu_set_intr_remapping(iommu, eim); setup = 1; } if (!setup) goto error; return 0; error: return -1; }