PCI: hv: Move retarget related structures into tlfs header
authorBoqun Feng <boqun.feng@gmail.com>
Mon, 10 Feb 2020 03:39:52 +0000 (11:39 +0800)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Mon, 9 Mar 2020 14:50:53 +0000 (14:50 +0000)
Currently, retarget_msi_interrupt and other structures it relys on are
defined in pci-hyperv.c. However, those structures are actually defined
in Hypervisor Top-Level Functional Specification [1] and may be
different in sizes of fields or layout from architecture to
architecture. Let's move those definitions into x86's tlfs header file
to support virtual PCI on non-x86 architectures in the future. Note that
"__packed" attribute is added to these structures during the movement
for the same reason as we use the attribute for other TLFS structures in
the header file: make sure the structures meet the specification and
avoid anything unexpected from the compilers.

Additionally, rename struct retarget_msi_interrupt to
hv_retarget_msi_interrupt for the consistent naming convention, also
mirroring the name in TLFS.

[1]: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs

Signed-off-by: Boqun Feng (Microsoft) <boqun.feng@gmail.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Dexuan Cui <decui@microsoft.com>
arch/x86/include/asm/hyperv-tlfs.h
drivers/pci/controller/pci-hyperv.c

index dffed0e10a683b3e7dcbc5de405592cd7e5e16a7..a0b6a88d2f05c1a153ae48b426416fbbd3167c51 100644 (file)
@@ -912,4 +912,35 @@ struct hv_tlb_flush_ex {
 struct hv_partition_assist_pg {
        u32 tlb_lock_count;
 };
+
+struct hv_interrupt_entry {
+       u32 source;                     /* 1 for MSI(-X) */
+       u32 reserved1;
+       u32 address;
+       u32 data;
+} __packed;
+
+/*
+ * flags for hv_device_interrupt_target.flags
+ */
+#define HV_DEVICE_INTERRUPT_TARGET_MULTICAST           1
+#define HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET       2
+
+struct hv_device_interrupt_target {
+       u32 vector;
+       u32 flags;
+       union {
+               u64 vp_mask;
+               struct hv_vpset vp_set;
+       };
+} __packed;
+
+/* HvRetargetDeviceInterrupt hypercall */
+struct hv_retarget_device_interrupt {
+       u64 partition_id;               /* use "self" */
+       u64 device_id;
+       struct hv_interrupt_entry int_entry;
+       u64 reserved2;
+       struct hv_device_interrupt_target int_target;
+} __packed __aligned(8);
 #endif
index c64c7ffdd653d87bb95fce00c1674a022f5a230e..9c6ec289839c6890994777cd87159aa0b5d3669c 100644 (file)
@@ -435,36 +435,6 @@ struct pci_eject_response {
 
 static int pci_ring_size = (4 * PAGE_SIZE);
 
-struct hv_interrupt_entry {
-       u32     source;                 /* 1 for MSI(-X) */
-       u32     reserved1;
-       u32     address;
-       u32     data;
-};
-
-/*
- * flags for hv_device_interrupt_target.flags
- */
-#define HV_DEVICE_INTERRUPT_TARGET_MULTICAST           1
-#define HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET       2
-
-struct hv_device_interrupt_target {
-       u32     vector;
-       u32     flags;
-       union {
-               u64              vp_mask;
-               struct hv_vpset vp_set;
-       };
-};
-
-struct retarget_msi_interrupt {
-       u64     partition_id;           /* use "self" */
-       u64     device_id;
-       struct hv_interrupt_entry int_entry;
-       u64     reserved2;
-       struct hv_device_interrupt_target int_target;
-} __packed __aligned(8);
-
 /*
  * Driver specific state.
  */
@@ -511,7 +481,7 @@ struct hv_pcibus_device {
        struct workqueue_struct *wq;
 
        /* hypercall arg, must not cross page boundary */
-       struct retarget_msi_interrupt retarget_msi_interrupt_params;
+       struct hv_retarget_device_interrupt retarget_msi_interrupt_params;
 
        /*
         * Don't put anything here: retarget_msi_interrupt_params must be last
@@ -1221,7 +1191,7 @@ static void hv_irq_unmask(struct irq_data *data)
 {
        struct msi_desc *msi_desc = irq_data_get_msi_desc(data);
        struct irq_cfg *cfg = irqd_cfg(data);
-       struct retarget_msi_interrupt *params;
+       struct hv_retarget_device_interrupt *params;
        struct hv_pcibus_device *hbus;
        struct cpumask *dest;
        cpumask_var_t tmp;