[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PULL v1 10/12] hw/xen: pvh-common: Add support for creating PCIe/GPEX
 
- To: Philippe Mathieu-Daudé <philmd@xxxxxxxxxx>
 
- From: "Edgar E. Iglesias" <edgar.iglesias@xxxxxxxxx>
 
- Date: Tue, 18 Feb 2025 10:34:47 -0600
 
- Cc: qemu-devel@xxxxxxxxxx, sstabellini@xxxxxxxxxx, 	Paolo Bonzini <pbonzini@xxxxxxxxxx>, anthony@xxxxxxxxxxxxxx, paul@xxxxxxx, 	peter.maydell@xxxxxxxxxx, alex.bennee@xxxxxxxxxx, xenia.ragiadakou@xxxxxxx, 	jason.andryuk@xxxxxxx, edgar.iglesias@xxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxxx
 
- Delivery-date: Tue, 18 Feb 2025 16:35:04 +0000
 
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
 
 
 
 
 Hi Edgar, 
 
On 4/9/24 18:15, Edgar E. Iglesias wrote: 
> From: "Edgar E. Iglesias" <edgar.iglesias@xxxxxxx> 
>  
> Add support for optionally creating a PCIe/GPEX controller. 
>  
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xxxxxxx> 
> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> 
> --- 
>   hw/xen/xen-pvh-common.c         | 76 +++++++++++++++++++++++++++++++++ 
>   include/hw/xen/xen-pvh-common.h | 29 +++++++++++++ 
>   2 files changed, 105 insertions(+) 
 
 
> +/* 
> + * We use the GPEX PCIe controller with its internal INTX PCI interrupt 
> + * swizzling. This swizzling is emulated in QEMU and routes all INTX 
> + * interrupts from endpoints down to only 4 INTX interrupts. 
> + * See include/hw/pci/pci.h : pci_swizzle() 
> + */ 
> +static inline void xenpvh_gpex_init(XenPVHMachineState *s, 
> +                                    XenPVHMachineClass *xpc, 
> +                                    MemoryRegion *sysmem) 
> +{ 
> +    MemoryRegion *ecam_reg; 
> +    MemoryRegion *mmio_reg; 
> +    DeviceState *dev; 
> +    int i; 
> + 
> +    object_initialize_child(OBJECT(s), "gpex", &s->pci.gpex, 
> +                            TYPE_GPEX_HOST); 
> +    dev = DEVICE(&s->pci.gpex); 
> +    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); 
> + 
> +    ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0); 
> +    memory_region_add_subregion(sysmem, s->cfg.pci_ecam.base, ecam_reg); 
> + 
> +    mmio_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1); 
> + 
> +    if (s->cfg.pci_mmio.size) { 
> +        memory_region_init_alias(&s->pci.mmio_alias, OBJECT(dev), "pcie-mmio", 
> +                                 mmio_reg, 
> +                                 s->cfg.pci_mmio.base, s->cfg.pci_mmio.size); 
> +        memory_region_add_subregion(sysmem, s->cfg.pci_mmio.base, 
> +                                    &s->pci.mmio_alias); 
> +    } 
> + 
> +    if (s->cfg.pci_mmio_high.size) { 
> +        memory_region_init_alias(&s->pci.mmio_high_alias, OBJECT(dev), 
> +                "pcie-mmio-high", 
> +                mmio_reg, s->cfg.pci_mmio_high.base, s->cfg.pci_mmio_high.size); 
> +        memory_region_add_subregion(sysmem, s->cfg.pci_mmio_high.base, 
> +                &s->pci.mmio_high_alias); 
> +    } 
> + 
> +    /* 
> +     * PVH implementations with PCI enabled must provide set_pci_intx_irq() 
> +     * and optionally an implementation of set_pci_link_route(). 
> +     */ 
> +    assert(xpc->set_pci_intx_irq); 
> + 
> +    for (i = 0; i < GPEX_NUM_IRQS; i++) { 
> +        qemu_irq irq = qemu_allocate_irq(xpc->set_pci_intx_irq, s, i); 
> + 
> +        sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, irq); 
> +        gpex_set_irq_num(GPEX_HOST(dev), i, s->cfg.pci_intx_irq_base + i); 
> +        if (xpc->set_pci_link_route) { 
> +            xpc->set_pci_link_route(i, s->cfg.pci_intx_irq_base + i); 
> +        } 
> +    } 
> +} 
 
Some Kconfig selector seems missing here: 
 
/usr/bin/ld: libqemu-aarch64-softmmu.a.p/hw_xen_xen-pvh-common.c.o: in  
function `xenpvh_gpex_init': 
hw/xen/xen-pvh-common.c:174: undefined reference to `gpex_set_irq_num' 
/usr/bin/ld: libqemu-aarch64-softmmu.a.p/hw_xen_xen-hvm-common.c.o: in  
function `pci_dev_bus_num': 
include/hw/pci/pci.h:337: undefined reference to `pci_bus_num' 
/usr/bin/ld: include/hw/pci/pci.h:337: undefined reference to `pci_bus_num' 
/usr/bin/ld: include/hw/pci/pci.h:337: undefined reference to `pci_bus_num' 
/usr/bin/ld: include/hw/pci/pci.h:337: undefined reference to `pci_bus_num' 
/usr/bin/ld: include/hw/pci/pci.h:337: undefined reference to `pci_bus_num' 
/usr/bin/ld: libqemu-aarch64-softmmu.a.p/hw_xen_xen-hvm-common.c.o: in  
function `cpu_ioreq_config': 
hw/xen/xen-hvm-common.c:412: undefined reference to  
`pci_host_config_read_common' 
/usr/bin/ld: hw/xen/xen-hvm-common.c:428: undefined reference to  
`pci_host_config_read_common' 
/usr/bin/ld: hw/xen/xen-hvm-common.c:438: undefined reference to  
`pci_host_config_write_common' 
 
The current 'XEN' key represents both the "accelerator" part and 
the common Xen HW, which isn't helping to follow. Anyhow, this 
snippet fixes the build issue: 
 
-- >8 -- 
diff --git a/accel/Kconfig b/accel/Kconfig 
index 794e0d18d2..4263cab722 100644 
--- a/accel/Kconfig 
+++ b/accel/Kconfig 
@@ -16,4 +16,5 @@ config KVM 
  config XEN 
      bool 
      select FSDEV_9P if VIRTFS 
+    select PCI_EXPRESS_GENERIC_BRIDGE 
      select XEN_BUS 
--- 
 
I'll post a patch later.
  
 
 
 
 Sounds good, thanks Phil! 
 
 Cheers, Edgar   
 
Regards, 
 
Phil. 
  
 
    
     |