From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Philippe Mathieu-Daudé" <philmd@linaro.org>
Cc: qemu-devel@nongnu.org, Marcel Apfelbaum <marcel@redhat.com>,
Peter Maydell <peter.maydell@linaro.org>,
Kevin O'Connor <kevin@koconnor.net>
Subject: Re: [Qemu-devel] [PULL 16/17] hw/pci-bridge: format special OFW unit address for PXB host
Date: Mon, 24 Nov 2025 15:51:47 -0500 [thread overview]
Message-ID: <20251124154615-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <c782890b-1dc5-4ac6-9792-d31a07c2354e@linaro.org>
On Wed, Nov 12, 2025 at 11:35:21PM +0100, Philippe Mathieu-Daudé wrote:
> Hi Michael and Marcel,
>
> (old patch...)
>
> On 26/6/15 15:46, Michael S. Tsirkin wrote:
> > From: Laszlo Ersek <lersek@redhat.com>
> >
> > We have agreed that OpenFirmware device paths in the "bootorder" fw_cfg
> > file should follow the pattern
> >
> > /pci@i0cf8,%x/...
> >
> > for devices that live behind an extra root bus. The extra root bus in
> > question is the %x'th among the extra root buses. (In other words, %x
> > gives the position of the affected extra root bus relative to the other
> > extra root buses, in bus_nr order.) %x starts at 1, and is formatted in
> > hex.
> >
> > The portion of the unit address that comes before the comma is dynamically
> > taken from the main host bridge, similarly to sysbus_get_fw_dev_path().
> >
> > Cc: Kevin O'Connor <kevin@koconnor.net>
> > Cc: Michael S. Tsirkin <mst@redhat.com>
> > Cc: Marcel Apfelbaum <marcel@redhat.com>
> > Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> > Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> > hw/pci-bridge/pci_expander_bridge.c | 53 +++++++++++++++++++++++++++++++++++++
> > 1 file changed, 53 insertions(+)
> >
> > diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
> > index 70708ef..57f8a37 100644
> > --- a/hw/pci-bridge/pci_expander_bridge.c
> > +++ b/hw/pci-bridge/pci_expander_bridge.c
> > @@ -43,6 +43,8 @@ typedef struct PXBDev {
> > uint16_t numa_node;
> > } PXBDev;
> > +static GList *pxb_dev_list;
>
> This list is static ...
>
> > +
> > #define TYPE_PXB_HOST "pxb-host"
> > static int pxb_bus_num(PCIBus *bus)
> > @@ -89,12 +91,45 @@ static const char *pxb_host_root_bus_path(PCIHostState *host_bridge,
> > return bus->bus_path;
> > }
> > +static char *pxb_host_ofw_unit_address(const SysBusDevice *dev)
> > +{
> > + const PCIHostState *pxb_host;
> > + const PCIBus *pxb_bus;
> > + const PXBDev *pxb_dev;
> > + int position;
> > + const DeviceState *pxb_dev_base;
> > + const PCIHostState *main_host;
> > + const SysBusDevice *main_host_sbd;
> > +
> > + pxb_host = PCI_HOST_BRIDGE(dev);
> > + pxb_bus = pxb_host->bus;
> > + pxb_dev = PXB_DEV(pxb_bus->parent_dev);
> > + position = g_list_index(pxb_dev_list, pxb_dev);
> > + assert(position >= 0);
>
> ... and for some reason when calling pxb_host_ofw_unit_address() twice
> it triggers the following:
>
> Assertion failed: (position >= 0), function pxb_host_ofw_unit_address, file
> pci_expander_bridge.c, line 154.
>
> Any idea why it got implemented this way and how to modify to
> avoid the assertion? All other devices implementing the
> SysBusDeviceClass::explicit_ofw_unit_address handler don't abort
> when being called multiple times, what is so particular here?
>
> Thanks,
>
> Phil.
IIUC what is weird about this one is that the ofw address depends on other
devices.
The fix is probably to scan the list once at machine done time
and save the position in the device.
> > +
> > + pxb_dev_base = DEVICE(pxb_dev);
> > + main_host = PCI_HOST_BRIDGE(pxb_dev_base->parent_bus->parent);
> > + main_host_sbd = SYS_BUS_DEVICE(main_host);
> > +
> > + if (main_host_sbd->num_mmio > 0) {
> > + return g_strdup_printf(TARGET_FMT_plx ",%x",
> > + main_host_sbd->mmio[0].addr, position + 1);
> > + }
> > + if (main_host_sbd->num_pio > 0) {
> > + return g_strdup_printf("i%04x,%x",
> > + main_host_sbd->pio[0], position + 1);
> > + }
> > + return NULL;
> > +}
> > +
> > static void pxb_host_class_init(ObjectClass *class, void *data)
> > {
> > DeviceClass *dc = DEVICE_CLASS(class);
> > + SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(class);
> > PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_CLASS(class);
> > dc->fw_name = "pci";
> > + sbc->explicit_ofw_unit_address = pxb_host_ofw_unit_address;
> > hc->root_bus_path = pxb_host_root_bus_path;
> > }
> > @@ -149,6 +184,15 @@ static int pxb_map_irq_fn(PCIDevice *pci_dev, int pin)
> > return pin - PCI_SLOT(pxb->devfn);
> > }
> > +static gint pxb_compare(gconstpointer a, gconstpointer b)
> > +{
> > + const PXBDev *pxb_a = a, *pxb_b = b;
> > +
> > + return pxb_a->bus_nr < pxb_b->bus_nr ? -1 :
> > + pxb_a->bus_nr > pxb_b->bus_nr ? 1 :
> > + 0;
> > +}
> > +
> > static int pxb_dev_initfn(PCIDevice *dev)
> > {
> > PXBDev *pxb = PXB_DEV(dev);
> > @@ -192,9 +236,17 @@ static int pxb_dev_initfn(PCIDevice *dev)
> > PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK);
> > pci_config_set_class(dev->config, PCI_CLASS_BRIDGE_HOST);
> > + pxb_dev_list = g_list_insert_sorted(pxb_dev_list, pxb, pxb_compare);
> > return 0;
> > }
> > +static void pxb_dev_exitfn(PCIDevice *pci_dev)
> > +{
> > + PXBDev *pxb = PXB_DEV(pci_dev);
> > +
> > + pxb_dev_list = g_list_remove(pxb_dev_list, pxb);
> > +}
> > +
> > static Property pxb_dev_properties[] = {
> > /* Note: 0 is not a legal a PXB bus number. */
> > DEFINE_PROP_UINT8("bus_nr", PXBDev, bus_nr, 0),
> > @@ -208,6 +260,7 @@ static void pxb_dev_class_init(ObjectClass *klass, void *data)
> > PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> > k->init = pxb_dev_initfn;
> > + k->exit = pxb_dev_exitfn;
> > k->vendor_id = PCI_VENDOR_ID_REDHAT;
> > k->device_id = PCI_DEVICE_ID_REDHAT_PXB;
> > k->class_id = PCI_CLASS_BRIDGE_HOST;
next prev parent reply other threads:[~2025-11-24 20:52 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-26 13:45 [Qemu-devel] [PULL 00/17] virtio, pci fixes, enhancements Michael S. Tsirkin
2015-06-26 13:45 ` [Qemu-devel] [PULL 01/17] virito-pci: fix OVERRUN problem Michael S. Tsirkin
2015-06-26 13:45 ` [Qemu-devel] [PULL 02/17] qdev: fix OVERFLOW_BEFORE_WIDEN Michael S. Tsirkin
2015-06-26 13:45 ` [Qemu-devel] [PULL 03/17] balloon: add a feature bit to let Guest OS deflate balloon on oom Michael S. Tsirkin
2015-06-26 13:45 ` [Qemu-devel] [PULL 04/17] vhost: correctly pass error to caller in vhost_dev_enable_notifiers() Michael S. Tsirkin
2015-06-26 13:45 ` [Qemu-devel] [PULL 05/17] MAINTAINERS: add ACPI entry Michael S. Tsirkin
2015-06-26 13:45 ` [Qemu-devel] [PULL 06/17] pc: cleanup and convert TMP ACPI device description to AML API Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 07/17] add pci-bridge-seat Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 08/17] migration: introduce VMSTATE_BUFFER_UNSAFE_INFO_TEST() Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 09/17] hw/pci-bridge: expose _test parameter in SHPC_VMSTATE() Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 10/17] hw/pci-bridge: add macro for "chassis_nr" property Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 11/17] hw/pci-bridge: add macro for "msi" property Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 12/17] hw/pci: introduce shpc_present() helper function Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 13/17] hw/pci-bridge: introduce "shpc" property Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 14/17] hw/pci-bridge: disable SHPC in PXB Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 15/17] hw/core: explicit OFW unit address callback for SysBusDeviceClass Michael S. Tsirkin
2015-06-26 13:46 ` [Qemu-devel] [PULL 16/17] hw/pci-bridge: format special OFW unit address for PXB host Michael S. Tsirkin
2015-06-26 14:28 ` Laszlo Ersek
2015-06-26 15:46 ` Marcel Apfelbaum
2025-11-12 22:35 ` Philippe Mathieu-Daudé
2025-11-24 3:53 ` Philippe Mathieu-Daudé
2025-11-24 20:51 ` Michael S. Tsirkin [this message]
2015-06-26 13:46 ` [Qemu-devel] [PULL 17/17] Fix glib_subprocess test Michael S. Tsirkin
2015-06-29 9:30 ` [Qemu-devel] [PULL 00/17] virtio, pci fixes, enhancements Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251124154615-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=kevin@koconnor.net \
--cc=marcel@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).