|
@@ -3019,37 +3019,16 @@ void destroy_irqs(unsigned int irq, unsigned int count)
|
|
|
/*
|
|
|
* MSI message composition
|
|
|
*/
|
|
|
-#ifdef CONFIG_PCI_MSI
|
|
|
-static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
|
|
|
- struct msi_msg *msg, u8 hpet_id)
|
|
|
+void native_compose_msi_msg(struct pci_dev *pdev,
|
|
|
+ unsigned int irq, unsigned int dest,
|
|
|
+ struct msi_msg *msg, u8 hpet_id)
|
|
|
{
|
|
|
- struct irq_cfg *cfg;
|
|
|
- int err;
|
|
|
- unsigned dest;
|
|
|
+ struct irq_cfg *cfg = irq_cfg(irq);
|
|
|
|
|
|
- if (disable_apic)
|
|
|
- return -ENXIO;
|
|
|
-
|
|
|
- cfg = irq_cfg(irq);
|
|
|
- err = assign_irq_vector(irq, cfg, apic->target_cpus());
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
-
|
|
|
- err = apic->cpu_mask_to_apicid_and(cfg->domain,
|
|
|
- apic->target_cpus(), &dest);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
-
|
|
|
- if (irq_remapped(cfg)) {
|
|
|
- compose_remapped_msi_msg(pdev, irq, dest, msg, hpet_id);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ msg->address_hi = MSI_ADDR_BASE_HI;
|
|
|
|
|
|
if (x2apic_enabled())
|
|
|
- msg->address_hi = MSI_ADDR_BASE_HI |
|
|
|
- MSI_ADDR_EXT_DEST_ID(dest);
|
|
|
- else
|
|
|
- msg->address_hi = MSI_ADDR_BASE_HI;
|
|
|
+ msg->address_hi |= MSI_ADDR_EXT_DEST_ID(dest);
|
|
|
|
|
|
msg->address_lo =
|
|
|
MSI_ADDR_BASE_LO |
|
|
@@ -3068,6 +3047,30 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
|
|
|
MSI_DATA_DELIVERY_FIXED:
|
|
|
MSI_DATA_DELIVERY_LOWPRI) |
|
|
|
MSI_DATA_VECTOR(cfg->vector);
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_PCI_MSI
|
|
|
+static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
|
|
|
+ struct msi_msg *msg, u8 hpet_id)
|
|
|
+{
|
|
|
+ struct irq_cfg *cfg;
|
|
|
+ int err;
|
|
|
+ unsigned dest;
|
|
|
+
|
|
|
+ if (disable_apic)
|
|
|
+ return -ENXIO;
|
|
|
+
|
|
|
+ cfg = irq_cfg(irq);
|
|
|
+ err = assign_irq_vector(irq, cfg, apic->target_cpus());
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ err = apic->cpu_mask_to_apicid_and(cfg->domain,
|
|
|
+ apic->target_cpus(), &dest);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ x86_msi.compose_msi_msg(pdev, irq, dest, msg, hpet_id);
|
|
|
|
|
|
return 0;
|
|
|
}
|