Message ID | 20210120120058.29138-13-wei.liu@kernel.org (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | None | expand |
From: Wei Liu <wei.liu@kernel.org> Sent: Wednesday, January 20, 2021 4:01 AM > > We will soon use the same structure to handle IO-APIC interrupts as > well. Introduce an enum to identify the source and a data structure for > IO-APIC RTE. > > While at it, update pci-hyperv.c to use the enum. > > No functional change. > > Signed-off-by: Wei Liu <wei.liu@kernel.org> > Acked-by: Rob Herring <robh@kernel.org> > --- > drivers/pci/controller/pci-hyperv.c | 2 +- > include/asm-generic/hyperv-tlfs.h | 36 +++++++++++++++++++++++++++-- > 2 files changed, 35 insertions(+), 3 deletions(-) > > diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c > index 6db8d96a78eb..87aa62ee0368 100644 > --- a/drivers/pci/controller/pci-hyperv.c > +++ b/drivers/pci/controller/pci-hyperv.c > @@ -1216,7 +1216,7 @@ static void hv_irq_unmask(struct irq_data *data) > params = &hbus->retarget_msi_interrupt_params; > memset(params, 0, sizeof(*params)); > params->partition_id = HV_PARTITION_ID_SELF; > - params->int_entry.source = 1; /* MSI(-X) */ > + params->int_entry.source = HV_INTERRUPT_SOURCE_MSI; > hv_set_msi_entry_from_desc(¶ms->int_entry.msi_entry, msi_desc); > params->device_id = (hbus->hdev->dev_instance.b[5] << 24) | > (hbus->hdev->dev_instance.b[4] << 16) | > diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h > index 7e103be42799..8423bf53c237 100644 > --- a/include/asm-generic/hyperv-tlfs.h > +++ b/include/asm-generic/hyperv-tlfs.h > @@ -480,6 +480,11 @@ struct hv_create_vp { > u64 flags; > } __packed; > > +enum hv_interrupt_source { > + HV_INTERRUPT_SOURCE_MSI = 1, /* MSI and MSI-X */ > + HV_INTERRUPT_SOURCE_IOAPIC, > +}; > + > union hv_msi_address_register { > u32 as_uint32; > struct { > @@ -513,10 +518,37 @@ union hv_msi_entry { > } __packed; > }; > > +union hv_ioapic_rte { > + u64 as_uint64; > + > + struct { > + u32 vector:8; > + u32 delivery_mode:3; > + u32 destination_mode:1; > + u32 delivery_status:1; > + u32 interrupt_polarity:1; > + u32 remote_irr:1; > + u32 trigger_mode:1; > + u32 interrupt_mask:1; > + u32 reserved1:15; > + > + u32 reserved2:24; > + u32 destination_id:8; > + }; > + > + struct { > + u32 low_uint32; > + u32 high_uint32; > + }; > +} __packed; > + > struct hv_interrupt_entry { > - u32 source; /* 1 for MSI(-X) */ > + u32 source; > u32 reserved1; > - union hv_msi_entry msi_entry; > + union { > + union hv_msi_entry msi_entry; > + union hv_ioapic_rte ioapic_rte; > + }; > } __packed; > > /* > -- > 2.20.1 Reviewed-by: Michael Kelley <mikelley@microsoft.com>
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c index 6db8d96a78eb..87aa62ee0368 100644 --- a/drivers/pci/controller/pci-hyperv.c +++ b/drivers/pci/controller/pci-hyperv.c @@ -1216,7 +1216,7 @@ static void hv_irq_unmask(struct irq_data *data) params = &hbus->retarget_msi_interrupt_params; memset(params, 0, sizeof(*params)); params->partition_id = HV_PARTITION_ID_SELF; - params->int_entry.source = 1; /* MSI(-X) */ + params->int_entry.source = HV_INTERRUPT_SOURCE_MSI; hv_set_msi_entry_from_desc(¶ms->int_entry.msi_entry, msi_desc); params->device_id = (hbus->hdev->dev_instance.b[5] << 24) | (hbus->hdev->dev_instance.b[4] << 16) | diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h index 7e103be42799..8423bf53c237 100644 --- a/include/asm-generic/hyperv-tlfs.h +++ b/include/asm-generic/hyperv-tlfs.h @@ -480,6 +480,11 @@ struct hv_create_vp { u64 flags; } __packed; +enum hv_interrupt_source { + HV_INTERRUPT_SOURCE_MSI = 1, /* MSI and MSI-X */ + HV_INTERRUPT_SOURCE_IOAPIC, +}; + union hv_msi_address_register { u32 as_uint32; struct { @@ -513,10 +518,37 @@ union hv_msi_entry { } __packed; }; +union hv_ioapic_rte { + u64 as_uint64; + + struct { + u32 vector:8; + u32 delivery_mode:3; + u32 destination_mode:1; + u32 delivery_status:1; + u32 interrupt_polarity:1; + u32 remote_irr:1; + u32 trigger_mode:1; + u32 interrupt_mask:1; + u32 reserved1:15; + + u32 reserved2:24; + u32 destination_id:8; + }; + + struct { + u32 low_uint32; + u32 high_uint32; + }; +} __packed; + struct hv_interrupt_entry { - u32 source; /* 1 for MSI(-X) */ + u32 source; u32 reserved1; - union hv_msi_entry msi_entry; + union { + union hv_msi_entry msi_entry; + union hv_ioapic_rte ioapic_rte; + }; } __packed; /*