qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [PATCH 2/5] pseries: Remove "busname" property for PCI ho


From: Alexander Graf
Subject: Re: [Qemu-ppc] [PATCH 2/5] pseries: Remove "busname" property for PCI host bridge
Date: Fri, 15 Mar 2013 13:39:30 +0100

On 14.03.2013, at 02:53, David Gibson wrote:

> Currently the "spapr-pci-host-bridge" device has a "busname" property which
> can be used to override the default assignment of qbus names for the bus
> subordinate to the PHB.  We use that for the default primary PCI bus, to
> make libvirt happy, which expects there to be a bus named simply "pci".
> The default qdev core logic would name the bus "pci.0", and the pseries
> code would otherwise name it "address@hidden" which is the name it
> is given in the device tree based on its BUID.
> 
> The "busname" property is rather clunky though, so this patch simplifies
> things by just using a special case hack for the default PHB, setting
> busname to "pci" when index=0.
> 
> Signed-off-by: Alexey Kardashevskiy <address@hidden>
> Signed-off-by: David Gibson <address@hidden>

Thanks, applied to ppc-next.

Alex

> ---
> hw/ppc/spapr.c |    2 +-
> hw/spapr_pci.c |   30 ++++++++++++++++++++++--------
> hw/spapr_pci.h |    4 +---
> 3 files changed, 24 insertions(+), 12 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index fd24113..9a13697 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -852,7 +852,7 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
>     /* Set up PCI */
>     spapr_pci_rtas_init();
> 
> -    phb = spapr_create_phb(spapr, 0, "pci");
> +    phb = spapr_create_phb(spapr, 0);
> 
>     for (i = 0; i < nb_nics; i++) {
>         NICInfo *nd = &nd_table[i];
> diff --git a/hw/spapr_pci.c b/hw/spapr_pci.c
> index 36adbc5..42c8b61 100644
> --- a/hw/spapr_pci.c
> +++ b/hw/spapr_pci.c
> @@ -518,6 +518,7 @@ static int spapr_phb_init(SysBusDevice *s)
> {
>     sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(s);
>     PCIHostState *phb = PCI_HOST_BRIDGE(s);
> +    const char *busname;
>     char *namebuf;
>     int i;
>     PCIBus *bus;
> @@ -575,9 +576,6 @@ static int spapr_phb_init(SysBusDevice *s)
>     }
> 
>     sphb->dtbusname = g_strdup_printf("address@hidden" PRIx64, sphb->buid);
> -    if (!sphb->busname) {
> -        sphb->busname = sphb->dtbusname;
> -    }
> 
>     namebuf = alloca(strlen(sphb->dtbusname) + 32);
> 
> @@ -621,7 +619,26 @@ static int spapr_phb_init(SysBusDevice *s)
>                                     &sphb->msiwindow);
>     }
> 
> -    bus = pci_register_bus(DEVICE(s), sphb->busname,
> +    /*
> +     * Selecting a busname is more complex than you'd think, due to
> +     * interacting constraints.  If the user has specified an id
> +     * explicitly for the phb , then we want to use the qdev default
> +     * of naming the bus based on the bridge device (so the user can
> +     * then assign devices to it in the way they expect).  For the
> +     * first / default PCI bus (index=0) we want to use just "pci"
> +     * because libvirt expects there to be a bus called, simply,
> +     * "pci".  Otherwise, we use the same name as in the device tree,
> +     * since it's unique by construction, and makes the guest visible
> +     * BUID clear.
> +     */
> +    if (s->qdev.id) {
> +        busname = NULL;
> +    } else if (sphb->index == 0) {
> +        busname = "pci";
> +    } else {
> +        busname = sphb->dtbusname;
> +    }
> +    bus = pci_register_bus(DEVICE(s), busname,
>                            pci_spapr_set_irq, pci_spapr_map_irq, sphb,
>                            &sphb->memspace, &sphb->iospace,
>                            PCI_DEVFN(0, 0), PCI_NUM_PINS);
> @@ -663,7 +680,6 @@ static void spapr_phb_reset(DeviceState *qdev)
> }
> 
> static Property spapr_phb_properties[] = {
> -    DEFINE_PROP_STRING("busname", sPAPRPHBState, busname),
>     DEFINE_PROP_INT32("index", sPAPRPHBState, index, -1),
>     DEFINE_PROP_HEX64("buid", sPAPRPHBState, buid, -1),
>     DEFINE_PROP_HEX32("liobn", sPAPRPHBState, dma_liobn, -1),
> @@ -694,14 +710,12 @@ static const TypeInfo spapr_phb_info = {
>     .class_init    = spapr_phb_class_init,
> };
> 
> -PCIHostState *spapr_create_phb(sPAPREnvironment *spapr, int index,
> -                               const char *busname)
> +PCIHostState *spapr_create_phb(sPAPREnvironment *spapr, int index)
> {
>     DeviceState *dev;
> 
>     dev = qdev_create(NULL, TYPE_SPAPR_PCI_HOST_BRIDGE);
>     qdev_prop_set_uint32(dev, "index", index);
> -    qdev_prop_set_string(dev, "busname", busname);
>     qdev_init_nofail(dev);
> 
>     return PCI_HOST_BRIDGE(dev);
> diff --git a/hw/spapr_pci.h b/hw/spapr_pci.h
> index 8bb3c62..8bd8a66 100644
> --- a/hw/spapr_pci.h
> +++ b/hw/spapr_pci.h
> @@ -39,7 +39,6 @@ typedef struct sPAPRPHBState {
> 
>     int32_t index;
>     uint64_t buid;
> -    char *busname;
>     char *dtbusname;
> 
>     MemoryRegion memspace, iospace;
> @@ -82,8 +81,7 @@ static inline qemu_irq spapr_phb_lsi_qirq(struct 
> sPAPRPHBState *phb, int pin)
>     return xics_get_qirq(spapr->icp, phb->lsi_table[pin].irq);
> }
> 
> -PCIHostState *spapr_create_phb(sPAPREnvironment *spapr, int index,
> -                               const char *busname);
> +PCIHostState *spapr_create_phb(sPAPREnvironment *spapr, int index);
> 
> int spapr_populate_pci_dt(sPAPRPHBState *phb,
>                           uint32_t xics_phandle,
> -- 
> 1.7.10.4
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]