Re: [PATCH v2] hw/sparc64/sun4u: Mark unusable PCI busses as full to ease device plugging
Philippe Mathieu-Daudé <[email protected]> Mon, 6 Jul 2026 23:19:24 +0200
| Newsgroups | org.nongnu.qemu-trivial,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
Hey Mark, On 6/7/26 23:16, Mark Cave-Ayland wrote: > On 06/07/2026 21:29, Philippe Mathieu-Daudé wrote: > >> On 6/7/26 19:29, Philippe Mathieu-Daudé wrote: >>> Hi, >>> >>> On 30/6/26 00:20, Mark Cave-Ayland wrote: >>>> On 29/06/2026 14:43, Thomas Huth wrote: >>>> >>>>> On 09/06/2026 08.02, Thomas Huth wrote: >>>>>> On 08/06/2026 23.29, Mark Cave-Ayland wrote: >>>>>>> On 08/06/2026 09:26, Michael Tokarev wrote: >>>>>>> >>>>>>>> On 30.04.2026 12:50, Thomas Huth wrote: >>>>>>>>> On 09/03/2026 19.14, Thomas Huth wrote: >>>>>>>>>> From: Thomas Huth <[email protected]> >>>>>>>>>> >>>>>>>>>> When trying to plug a PCI device to a Sparc64 machine, you >>>>>>>>>> currently >>>>>>>>>> have to specify the right bus ("bus=pciB"), otherwise you get >>>>>>>>>> this error: >>>>>>>>>> >>>>>>>>>> $ qemu-system-sparc64 -device virtio-scsi-pci >>>>>>>>>> qemu-system-sparc64: -device virtio-scsi-pci: PCI: no slot/ >>>>>>>>>> function >>>>>>>>>> available for virtio-scsi-pci, all in use or reserved >>>>>>>>>> >>>>>>>>>> This is quite annoying for the unexperienced users, and it >>>>>>>>>> also breaks >>>>>>>>>> e.g. the iotests ("make check-block") when running with qemu- >>>>>>>>>> system- sparc64. >>>>>>>>>> >>>>>>>>>> Mark the non-usable PCI busses as full now, so that QEMU can >>>>>>>>>> automatically >>>>>>>>>> plug new PCI devices to the right "pciB" bus. >>>>>>>>>> >>>>>>>>>> Signed-off-by: Thomas Huth <[email protected]> >>>>>>>>>> --- >>>>>>>>>> v2: Do the change in the machine code, not in the sabre device >>>>>>>>>> >>>>>>>>>> hw/sparc64/sun4u.c | 7 +++++++ >>>>>>>>>> 1 file changed, 7 insertions(+) >>>>>>>>>> >>>>>>>>>> diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c >>>>>>>>>> index b8bda1eb816..37539535c6c 100644 >>>>>>>>>> --- a/hw/sparc64/sun4u.c >>>>>>>>>> +++ b/hw/sparc64/sun4u.c >>>>>>>>>> @@ -723,6 +723,13 @@ static void sun4uv_init(MemoryRegion >>>>>>>>>> *address_space_mem, >>>>>>>>>> fw_cfg_add_i16(fw_cfg, FW_CFG_SPARC64_DEPTH, >>>>>>>>>> graphic_depth); >>>>>>>>>> qemu_register_boot_set(fw_cfg_boot_set, fw_cfg); >>>>>>>>>> + >>>>>>>>>> + /* >>>>>>>>>> + * Mark internal PCI busses as full so that the plugging >>>>>>>>>> of additional >>>>>>>>>> + * PCI devices happens on the right bus that still has >>>>>>>>>> free slots: >>>>>>>>>> + */ >>>>>>>>>> + qbus_mark_full(&pci_bus->qbus); >>>>>>>>>> + qbus_mark_full(&pci_busA->qbus); >>>>>>>>>> } >>>>>>>>>> enum { >>>>>>>>> >>>>>>>>> Friendly ping! >>>>>>>> >>>>>>>> This, being a simple change, somehow has not been reviewed >>>>>>>> still, so >>>>>>>> it's sitting in the queue... >>>>>>> >>>>>>> Yes, apologies - I've been absolutely flat out recently, and I've >>>>>>> got a note to take a look at this and Peter's patch as soon as I >>>>>>> can. >>>>>>> >>>>>>> Is this fixing an urgent issue with "make check-block" or similar? >>>>>> >>>>>> It's not urgent since this has been broken forever, but yes, it >>>>>> fixes "make check- block" for the case where sparc64 is the only >>>>>> available target during "configure -- target-list=sparc64-softmmu" >>>>>> and thus the iotests run with qemu- system-sparc64. >>>>> Ping! >>>>> >>>>> While it's not urgent, soft-freeze date is in a week, so it would >>>>> be nice to get this merged before it misses another release ... WDYT? >>>> >>>> Hi Thomas, >>>> >>>> I'm still playing catch-up a bit here, but I can't immediately find >>>> my notes on using pciA under QEMU. I think if it fixes the iotests >>>> then go ahead and merge it for now, which gives me time in freeze to >>>> investigate any reported issues. >> >> >>> Anyway, back to the problem here, the first part is indeed as noticed >>> Thomas to use qbus_mark_full() for the root bus: >>> >>> -- >8 -- >>> diff --git a/hw/pci-host/sabre.c b/hw/pci-host/sabre.c >>> index cd2328ad53f..6a8d0b6c6d2 100644 >>> --- a/hw/pci-host/sabre.c >>> +++ b/hw/pci-host/sabre.c >>> @@ -400,6 +400,9 @@ static void sabre_realize(DeviceState *dev, Error >>> **errp) >>> s->bridgeA = PCI_BRIDGE(pci_dev); >>> pci_bridge_map_irq(s->bridgeA, "pciA", pci_simbaA_map_irq); >>> pci_realize_and_unref(pci_dev, phb->bus, &error_fatal); >>> + >>> + /* Only in-built Simba APBs can exist on the root bus */ >>> + qbus_mark_full(&phb->bus->qbus); >>> } >>> >>> static void sabre_init(Object *obj) >>> diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c >>> index d69ed9a81ac..b65f3d1a140 100644 >>> --- a/hw/sparc64/sun4u.c >>> +++ b/hw/sparc64/sun4u.c >>> @@ -546,7 +546,7 @@ static void sun4uv_init(MemoryRegion >>> *address_space_mem, >>> unsigned int i; >>> uint64_t initrd_addr, initrd_size, kernel_addr, kernel_size, >>> kernel_entry; >>> SabreState *sabre; >>> - PCIBus *pci_bus, *pci_busA, *pci_busB; >>> + PCIBus *pci_busA, *pci_busB; >>> PCIDevice *ebus, *pci_dev; >>> SysBusDevice *s; >>> DeviceState *iommu, *dev; >>> @@ -588,14 +588,13 @@ static void sun4uv_init(MemoryRegion >>> *address_space_mem, >>> qdev_get_gpio_in_named(DEVICE(cpu), "ivec-irq", i)); >>> } >>> >>> - pci_bus = PCI_HOST_BRIDGE(sabre)->bus; >>> pci_busA = pci_bridge_get_sec_bus(sabre->bridgeA); >>> pci_busB = pci_bridge_get_sec_bus(sabre->bridgeB); >>> >>> - /* Only in-built Simba APBs can exist on the root bus, slot 0 on >>> busA is >>> - reserved (leaving no slots free after on-board devices) >>> however slots >>> - 0-3 are free on busB */ >>> - pci_bus_set_slot_reserved_mask(pci_bus, 0xfffffffc); >>> + /* >>> + * Slot 0 on busA is reserved (leaving no slots free after on-board >>> + * devices) however slots 0-3 are free on busB >>> + */ >>> pci_bus_set_slot_reserved_mask(pci_busA, 0xfffffff1); >>> pci_bus_set_slot_reserved_mask(pci_busB, 0xfffffff0); >>> >>> --- >>> >>> I'm still looking at the 2nd part, the reserved slots. >> >> (Because with this patch, the test passes as we can plug devices from >> the command line, but they end plugged on pciA instead of pciB -- thus >> the 2nd part missing). > > Thanks for taking a look, Phil. IIRC the reason I added > slot_reserved_mask was so that it was possible to populate pciA > programatically in sun4uv_init(), and then enable the mask so that > specifying an additional PCI device using -device on the command line > without an explict PCI bus would cause the automatic allocation to place > the device on pciB. The slot_reserved_mask calls make sense, but AFAICT they don't work as expected, since CLI devices are added on pciA. If you want to have a look on top of this snippet, be my guest! Otherwise I'll continue debugging that tomorrow, long day and late here :\ Regards, Phil.