From: Stewart Hildebrand Date: Tue, 22 Apr 2025 09:21:54 +0000 (+0200) Subject: vpci/msix: use host msix table address X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=d98df4c531adc5effe28489ca9cb865a27d2f85f;p=people%2Fandrewcoop%2Fxen.git vpci/msix: use host msix table address Introduce vmsix_table_host_{addr,base} returning the host physical MSI-X table address and base. Use them in update_entry() and get_table(). Remove stale comment. Signed-off-by: Stewart Hildebrand Reviewed-by: Roger Pau Monné --- diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index 6bd8c55bb4..f3804ce047 100644 --- a/xen/drivers/vpci/msix.c +++ b/xen/drivers/vpci/msix.c @@ -57,8 +57,8 @@ static void update_entry(struct vpci_msix_entry *entry, } rc = vpci_msix_arch_enable_entry(entry, pdev, - vmsix_table_base(pdev->vpci, - VPCI_MSIX_TABLE)); + vmsix_table_host_base(pdev->vpci, + VPCI_MSIX_TABLE)); if ( rc ) { gprintk(XENLOG_WARNING, "%pp: unable to enable entry %u: %d\n", @@ -218,14 +218,14 @@ static void __iomem *get_table(const struct vpci *vpci, unsigned int slot) addr = vmsix_table_size(vpci, VPCI_MSIX_TABLE); fallthrough; case VPCI_MSIX_TBL_HEAD: - addr += vmsix_table_addr(vpci, VPCI_MSIX_TABLE); + addr += vmsix_table_host_addr(vpci, VPCI_MSIX_TABLE); break; case VPCI_MSIX_PBA_TAIL: addr = vmsix_table_size(vpci, VPCI_MSIX_PBA); fallthrough; case VPCI_MSIX_PBA_HEAD: - addr += vmsix_table_addr(vpci, VPCI_MSIX_PBA); + addr += vmsix_table_host_addr(vpci, VPCI_MSIX_PBA); break; default: @@ -242,12 +242,6 @@ static unsigned int get_slot(const struct vpci *vpci, unsigned long addr) { unsigned long pfn = PFN_DOWN(addr); - /* - * The logic below relies on having the tables identity mapped to the guest - * address space, or for the `addr` parameter to be translated into its - * host physical memory address equivalent. - */ - if ( pfn == PFN_DOWN(vmsix_table_addr(vpci, VPCI_MSIX_TABLE)) ) return VPCI_MSIX_TBL_HEAD; if ( pfn == PFN_DOWN(vmsix_table_addr(vpci, VPCI_MSIX_TABLE) + diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index 807401b2ea..475981cb81 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -231,6 +231,19 @@ int vpci_msix_arch_print(const struct vpci_msix *msix); * Helper functions to fetch MSIX related data. They are used by both the * emulated MSIX code and the BAR handlers. */ +static inline paddr_t vmsix_table_host_base(const struct vpci *vpci, + unsigned int nr) +{ + return vpci->header.bars[vpci->msix->tables[nr] & PCI_MSIX_BIRMASK].addr; +} + +static inline paddr_t vmsix_table_host_addr(const struct vpci *vpci, + unsigned int nr) +{ + return vmsix_table_host_base(vpci, nr) + + (vpci->msix->tables[nr] & ~PCI_MSIX_BIRMASK); +} + static inline paddr_t vmsix_table_base(const struct vpci *vpci, unsigned int nr) { return vpci->header.bars[vpci->msix->tables[nr] &