mirror of https://gitee.com/openkylin/qemu.git
ppc/pnv: fix default PHB4 QOM hierarchy
Commit3f4c369ea6
("ppc/pnv: make PECs create and realize PHB4s") changed phb4_pec code to create the default PHB4 objects in pnv_pec_default_phb_realize(). In this process the stacks[] PEC array was removed and each PHB4 object is tied together with its PEC via the phb->pec pointer. This change also broke the previous QOM hierarchy - the PHB4 objects are being created and not being parented to their respective chips. This can be verified by 'info pic' in a powernv9 domain with default settings. pnv_chip_power9_pic_print_info() will fail to find the PHBs because object_child_foreach_recursive() won't find any. The solution is to set the parent chip and the parent bus, in the same way done for user created PHB4 devices, for all PHB4 devices. Fixes:3f4c369ea6
("ppc/pnv: make PECs create and realize PHB4s") Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20220218202804.413157-1-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
632fc0b3ce
commit
6e7b967503
|
@ -1568,40 +1568,36 @@ static PnvPhb4PecState *pnv_phb4_get_pec(PnvChip *chip, PnvPHB4 *phb,
|
||||||
static void pnv_phb4_realize(DeviceState *dev, Error **errp)
|
static void pnv_phb4_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
PnvPHB4 *phb = PNV_PHB4(dev);
|
PnvPHB4 *phb = PNV_PHB4(dev);
|
||||||
|
PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
|
||||||
|
PnvChip *chip = pnv_get_chip(pnv, phb->chip_id);
|
||||||
PCIHostState *pci = PCI_HOST_BRIDGE(dev);
|
PCIHostState *pci = PCI_HOST_BRIDGE(dev);
|
||||||
XiveSource *xsrc = &phb->xsrc;
|
XiveSource *xsrc = &phb->xsrc;
|
||||||
|
BusState *s;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
int nr_irqs;
|
int nr_irqs;
|
||||||
char name[32];
|
char name[32];
|
||||||
|
|
||||||
/* User created PHB */
|
if (!chip) {
|
||||||
|
error_setg(errp, "invalid chip id: %d", phb->chip_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* User created PHBs need to be assigned to a PEC */
|
||||||
if (!phb->pec) {
|
if (!phb->pec) {
|
||||||
PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
|
|
||||||
PnvChip *chip = pnv_get_chip(pnv, phb->chip_id);
|
|
||||||
BusState *s;
|
|
||||||
|
|
||||||
if (!chip) {
|
|
||||||
error_setg(errp, "invalid chip id: %d", phb->chip_id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
phb->pec = pnv_phb4_get_pec(chip, phb, &local_err);
|
phb->pec = pnv_phb4_get_pec(chip, phb, &local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/* Reparent the PHB to the chip to build the device tree */
|
||||||
* Reparent user created devices to the chip to build
|
pnv_chip_parent_fixup(chip, OBJECT(phb), phb->phb_id);
|
||||||
* correctly the device tree.
|
|
||||||
*/
|
|
||||||
pnv_chip_parent_fixup(chip, OBJECT(phb), phb->phb_id);
|
|
||||||
|
|
||||||
s = qdev_get_parent_bus(DEVICE(chip));
|
s = qdev_get_parent_bus(DEVICE(chip));
|
||||||
if (!qdev_set_parent_bus(DEVICE(phb), s, &local_err)) {
|
if (!qdev_set_parent_bus(DEVICE(phb), s, &local_err)) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the "big_phb" flag */
|
/* Set the "big_phb" flag */
|
||||||
|
|
Loading…
Reference in New Issue