From 7669a76f95a2aae72022c654f7b6c000659afc95 Mon Sep 17 00:00:00 2001 From: Binbin Wu Date: Fri, 15 Mar 2019 12:00:24 +0800 Subject: [PATCH] dm: passthru: pass pbdf when reset msi/msix interrupt Physcial bdf is needed in hypervisor to find the right pci dev. Tracked-On: #2788 Signed-off-by: Binbin Wu Reviewed-by: Jason Chen CJ --- devicemodel/core/vmmapi.c | 3 ++- devicemodel/hw/pci/passthrough.c | 5 ++--- devicemodel/include/vmmapi.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/devicemodel/core/vmmapi.c b/devicemodel/core/vmmapi.c index e6d5a6f67..80a0b577d 100644 --- a/devicemodel/core/vmmapi.c +++ b/devicemodel/core/vmmapi.c @@ -541,7 +541,7 @@ vm_set_ptdev_msix_info(struct vmctx *ctx, struct ic_ptdev_irq *ptirq) } int -vm_reset_ptdev_msix_info(struct vmctx *ctx, uint16_t virt_bdf, +vm_reset_ptdev_msix_info(struct vmctx *ctx, uint16_t virt_bdf, uint16_t phys_bdf, int vector_count) { struct ic_ptdev_irq ptirq; @@ -549,6 +549,7 @@ vm_reset_ptdev_msix_info(struct vmctx *ctx, uint16_t virt_bdf, bzero(&ptirq, sizeof(ptirq)); ptirq.type = IRQ_MSIX; ptirq.virt_bdf = virt_bdf; + ptirq.phys_bdf = phys_bdf; ptirq.msix.vector_cnt = vector_count; return ioctl(ctx->fd, IC_RESET_PTDEV_INTR_INFO, &ptirq); diff --git a/devicemodel/hw/pci/passthrough.c b/devicemodel/hw/pci/passthrough.c index efef7314f..ba07b827d 100644 --- a/devicemodel/hw/pci/passthrough.c +++ b/devicemodel/hw/pci/passthrough.c @@ -508,7 +508,7 @@ deinit_msix_table(struct vmctx *ctx, struct passthru_dev *ptdev) if (ptdev->msix.ptirq_allocated) { printf("ptdev reset msix: 0x%x-%x, vector_cnt=%d.\n", virt_bdf, ptdev->phys_bdf, vector_cnt); - vm_reset_ptdev_msix_info(ctx, virt_bdf, vector_cnt); + vm_reset_ptdev_msix_info(ctx, virt_bdf, ptdev->phys_bdf, vector_cnt); ptdev->msix.ptirq_allocated = false; } @@ -909,8 +909,7 @@ passthru_deinit(struct vmctx *ctx, struct pci_vdev *dev, char *opts) deinit_msix_table(ctx, ptdev); else if(ptdev->msi.capoff != 0) { /* Currently only support 1 vector */ - printf("ptdev reset msi: 0x%x-%x\n", virt_bdf, ptdev->phys_bdf); - vm_reset_ptdev_msix_info(ctx, virt_bdf, 1); + vm_reset_ptdev_msix_info(ctx, virt_bdf, ptdev->phys_bdf, 1); } printf("vm_reset_ptdev_intx:0x%x-%x, ioapic virpin=%d.\n", diff --git a/devicemodel/include/vmmapi.h b/devicemodel/include/vmmapi.h index 1e8753286..ac2453159 100644 --- a/devicemodel/include/vmmapi.h +++ b/devicemodel/include/vmmapi.h @@ -130,7 +130,7 @@ int vm_unmap_ptdev_mmio(struct vmctx *ctx, int bus, int slot, int func, int vm_setup_ptdev_msi(struct vmctx *ctx, struct acrn_vm_pci_msix_remap *msi_remap); int vm_set_ptdev_msix_info(struct vmctx *ctx, struct ic_ptdev_irq *ptirq); -int vm_reset_ptdev_msix_info(struct vmctx *ctx, uint16_t virt_bdf, +int vm_reset_ptdev_msix_info(struct vmctx *ctx, uint16_t virt_bdf, uint16_t phys_bdf, int vector_count); int vm_set_ptdev_intx_info(struct vmctx *ctx, uint16_t virt_bdf, uint16_t phys_bdf, int virt_pin, int phys_pin, bool pic_pin);