From: Roger Pau Monné Date: Fri, 25 Aug 2017 12:08:19 +0000 (+0200) Subject: x86/pci: introduce hvm_pci_decode_addr X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~1607 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a16e826da9e891ca2b67a45afafe76e995958fc0;p=xen.git x86/pci: introduce hvm_pci_decode_addr And use it in the ioreq code to decode accesses to the PCI IO ports into bus, slot, function and register values. Signed-off-by: Roger Pau Monné Reviewed-by: Paul Durrant --- diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c index 214ab307c4..bf41954f59 100644 --- a/xen/arch/x86/hvm/io.c +++ b/xen/arch/x86/hvm/io.c @@ -256,6 +256,25 @@ void register_g2m_portio_handler(struct domain *d) handler->ops = &g2m_portio_ops; } +unsigned int hvm_pci_decode_addr(unsigned int cf8, unsigned int addr, + unsigned int *bus, unsigned int *slot, + unsigned int *func) +{ + unsigned int bdf; + + ASSERT(CF8_ENABLED(cf8)); + + bdf = CF8_BDF(cf8); + *bus = PCI_BUS(bdf); + *slot = PCI_SLOT(bdf); + *func = PCI_FUNC(bdf); + /* + * NB: the lower 2 bits of the register address are fetched from the + * offset into the 0xcfc register when reading/writing to it. + */ + return CF8_ADDR_LO(cf8) | (addr & 3); +} + /* * Local variables: * mode: C diff --git a/xen/arch/x86/hvm/ioreq.c b/xen/arch/x86/hvm/ioreq.c index b2a8b0e986..752976d16d 100644 --- a/xen/arch/x86/hvm/ioreq.c +++ b/xen/arch/x86/hvm/ioreq.c @@ -1178,18 +1178,16 @@ struct hvm_ioreq_server *hvm_select_ioreq_server(struct domain *d, CF8_ENABLED(cf8) ) { uint32_t sbdf, x86_fam; + unsigned int bus, slot, func, reg; + + reg = hvm_pci_decode_addr(cf8, p->addr, &bus, &slot, &func); /* PCI config data cycle */ - sbdf = XEN_DMOP_PCI_SBDF(0, - PCI_BUS(CF8_BDF(cf8)), - PCI_SLOT(CF8_BDF(cf8)), - PCI_FUNC(CF8_BDF(cf8))); + sbdf = XEN_DMOP_PCI_SBDF(0, bus, slot, func); type = XEN_DMOP_IO_RANGE_PCI; - addr = ((uint64_t)sbdf << 32) | - CF8_ADDR_LO(cf8) | - (p->addr & 3); + addr = ((uint64_t)sbdf << 32) | reg; /* AMD extended configuration space access? */ if ( CF8_ADDR_HI(cf8) && d->arch.cpuid->x86_vendor == X86_VENDOR_AMD && diff --git a/xen/include/asm-x86/hvm/io.h b/xen/include/asm-x86/hvm/io.h index 2484eb1c75..51659b6c7f 100644 --- a/xen/include/asm-x86/hvm/io.h +++ b/xen/include/asm-x86/hvm/io.h @@ -149,6 +149,11 @@ void stdvga_deinit(struct domain *d); extern void hvm_dpci_msi_eoi(struct domain *d, int vector); +/* Decode a PCI port IO access into a bus/slot/func/reg. */ +unsigned int hvm_pci_decode_addr(unsigned int cf8, unsigned int addr, + unsigned int *bus, unsigned int *slot, + unsigned int *func); + /* * HVM port IO handler that performs forwarding of guest IO ports into machine * IO ports.