RE: [PATCH 1/1] PCI: hv: Support for create interrupt v3
From: Sunil Muthuswamy <hidden>
Date: 2021-07-12 19:13:43
Also in:
linux-pci, lkml
quoted
--- a/drivers/pci/controller/pci-hyperv.c +++ b/drivers/pci/controller/pci-hyperv.c@@ -64,6 +64,7 @@ enum pci_protocol_version_t { PCI_PROTOCOL_VERSION_1_1 = PCI_MAKE_VERSION(1, 1), /* Win10 */ PCI_PROTOCOL_VERSION_1_2 = PCI_MAKE_VERSION(1, 2), /* RS1 */ PCI_PROTOCOL_VERSION_1_3 = PCI_MAKE_VERSION(1, 3), /* Vibranium */ + PCI_PROTOCOL_VERSION_1_4 = PCI_MAKE_VERSION(1, 4), /* Fe */It would be better if we can avoid annotating with internal code names. Inside of MSFT we tend to forget over time, and people outside usually have no idea what they mean.
Would you like me to just delete the 'Fe' comment or the previous ones as well?
quoted
@@ -235,6 +239,21 @@ struct hv_msi_desc2 { u16 processor_array[32]; } __packed; +/* + * struct hv_msi_desc3 - 1.3 version of hv_msi_desc + * Everything is the same as in 'hv_msi_desc2' except that the size + * of the 'vector_count' field is larger to support bigger vectorActually, it's the "vector" field that's bigger, not "vector_count".
Will update the comment, thanks.
quoted
+ * values. For ex: LPI vectors on ARM. + */ +struct hv_msi_desc3 { + u32 vector; + u8 delivery_mode; + u8 reserved; + u16 vector_count; + u16 processor_count; + u16 processor_array[32]; +} __packed; + /** * struct tran_int_desc * @reserved: unused, padding@@ -383,6 +402,12 @@ struct pci_create_interrupt2 { struct hv_msi_desc2 int_desc; } __packed; +struct pci_create_interrupt3 { + struct pci_message message_type; + union win_slot_encoding wslot; + struct hv_msi_desc3 int_desc; +} __packed; + struct pci_delete_interrupt { struct pci_message message_type; union win_slot_encoding wslot;@@ -1334,26 +1359,55 @@ static u32 hv_compose_msi_req_v1( return sizeof(*int_pkt); } +static void hv_compose_msi_req_get_cpu(struct cpumask *affinity, int *cpu, + u16 *count) +{ + /* + * Create MSI w/ dummy vCPU set targeting just one vCPU, overwritten + * by subsequent retarget in hv_irq_unmask(). + */ + *cpu = cpumask_first_and(affinity, cpu_online_mask); + *count = 1; +} + static u32 hv_compose_msi_req_v2( struct pci_create_interrupt2 *int_pkt, struct cpumask *affinity, u32 slot, u8 vector) { int cpu; + u16 cpu_count; int_pkt->message_type.type = PCI_CREATE_INTERRUPT_MESSAGE2; int_pkt->wslot.slot = slot; int_pkt->int_desc.vector = vector; int_pkt->int_desc.vector_count = 1; int_pkt->int_desc.delivery_mode = APIC_DELIVERY_MODE_FIXED; - - /* - * Create MSI w/ dummy vCPU set targeting just one vCPU, overwritten - * by subsequent retarget in hv_irq_unmask(). - */ cpu = cpumask_first_and(affinity, cpu_online_mask);Shouldn't this line be deleted since the new hv_compose_msi_req_get_cpu() function is doing the work?
Yes, this is fixed in v2 that I just sent out.