Skip to content

Commit

Permalink
pseries: Remove "busname" property for PCI host bridge
Browse files Browse the repository at this point in the history
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 "pci@800000020000000" 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 <aik@ozlabs.ru>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
  • Loading branch information
dgibson authored and agraf committed Mar 22, 2013
1 parent a4e044c commit 89dfd6e
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 12 deletions.
2 changes: 1 addition & 1 deletion hw/ppc/spapr.c
Expand Up @@ -856,7 +856,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];
Expand Down
30 changes: 22 additions & 8 deletions hw/spapr_pci.c
Expand Up @@ -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;
Expand Down Expand Up @@ -575,9 +576,6 @@ static int spapr_phb_init(SysBusDevice *s)
}

sphb->dtbusname = g_strdup_printf("pci@%" PRIx64, sphb->buid);
if (!sphb->busname) {
sphb->busname = sphb->dtbusname;
}

namebuf = alloca(strlen(sphb->dtbusname) + 32);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 1 addition & 3 deletions hw/spapr_pci.h
Expand Up @@ -39,7 +39,6 @@ typedef struct sPAPRPHBState {

int32_t index;
uint64_t buid;
char *busname;
char *dtbusname;

MemoryRegion memspace, iospace;
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 89dfd6e

Please sign in to comment.