|
@@ -165,7 +165,7 @@ static struct irq_chip dmar_msi_type = {
|
|
|
.irq_retrigger = ia64_msi_retrigger_irq,
|
|
|
};
|
|
|
|
|
|
-static int
|
|
|
+static void
|
|
|
msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg)
|
|
|
{
|
|
|
struct irq_cfg *cfg = irq_cfg + irq;
|
|
@@ -186,21 +186,29 @@ msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg)
|
|
|
MSI_DATA_LEVEL_ASSERT |
|
|
|
MSI_DATA_DELIVERY_FIXED |
|
|
|
MSI_DATA_VECTOR(cfg->vector);
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
-int arch_setup_dmar_msi(unsigned int irq)
|
|
|
+int dmar_alloc_hwirq(int id, int node, void *arg)
|
|
|
{
|
|
|
- int ret;
|
|
|
+ int irq;
|
|
|
struct msi_msg msg;
|
|
|
|
|
|
- ret = msi_compose_msg(NULL, irq, &msg);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
- dmar_msi_write(irq, &msg);
|
|
|
- irq_set_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq,
|
|
|
- "edge");
|
|
|
- return 0;
|
|
|
+ irq = create_irq();
|
|
|
+ if (irq > 0) {
|
|
|
+ irq_set_handler_data(irq, arg);
|
|
|
+ irq_set_chip_and_handler_name(irq, &dmar_msi_type,
|
|
|
+ handle_edge_irq, "edge");
|
|
|
+ msi_compose_msg(NULL, irq, &msg);
|
|
|
+ dmar_msi_write(irq, &msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ return irq;
|
|
|
+}
|
|
|
+
|
|
|
+void dmar_free_hwirq(int irq)
|
|
|
+{
|
|
|
+ irq_set_handler_data(irq, NULL);
|
|
|
+ destroy_irq(irq);
|
|
|
}
|
|
|
#endif /* CONFIG_INTEL_IOMMU */
|
|
|
|