pnv_phb4_pec: Keep track of instantiated PHBs

Add an array on the PEC object to keep track of the PHBs which are
instantiated. The array can be sparsely populated when using
user-created PHBs. It will be useful for the next patch to only export
instantiated PHBs in the device tree.

Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com>
Message-Id: <20230302163715.129635-2-fbarrat@linux.ibm.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
Frederic Barrat 2023-03-02 17:37:12 +01:00 committed by Daniel Henrique Barboza
parent e64645ba80
commit 1068ebb606
3 changed files with 10 additions and 5 deletions

View File

@ -112,9 +112,9 @@ static const MemoryRegionOps pnv_pec_pci_xscom_ops = {
.endianness = DEVICE_BIG_ENDIAN, .endianness = DEVICE_BIG_ENDIAN,
}; };
static void pnv_pec_default_phb_realize(PnvPhb4PecState *pec, static PnvPHB *pnv_pec_default_phb_realize(PnvPhb4PecState *pec,
int stack_no, int stack_no,
Error **errp) Error **errp)
{ {
PnvPHB *phb = PNV_PHB(qdev_new(TYPE_PNV_PHB)); PnvPHB *phb = PNV_PHB(qdev_new(TYPE_PNV_PHB));
int phb_id = pnv_phb4_pec_get_phb_id(pec, stack_no); int phb_id = pnv_phb4_pec_get_phb_id(pec, stack_no);
@ -128,8 +128,9 @@ static void pnv_pec_default_phb_realize(PnvPhb4PecState *pec,
&error_fatal); &error_fatal);
if (!sysbus_realize(SYS_BUS_DEVICE(phb), errp)) { if (!sysbus_realize(SYS_BUS_DEVICE(phb), errp)) {
return; return NULL;
} }
return phb;
} }
static void pnv_pec_realize(DeviceState *dev, Error **errp) static void pnv_pec_realize(DeviceState *dev, Error **errp)
@ -148,8 +149,9 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
/* Create PHBs if running with defaults */ /* Create PHBs if running with defaults */
if (defaults_enabled()) { if (defaults_enabled()) {
g_assert(pec->num_phbs <= MAX_PHBS_PER_PEC);
for (i = 0; i < pec->num_phbs; i++) { for (i = 0; i < pec->num_phbs; i++) {
pnv_pec_default_phb_realize(pec, i, errp); pec->phbs[i] = pnv_pec_default_phb_realize(pec, i, errp);
} }
} }

View File

@ -314,6 +314,7 @@ static PnvPhb4PecState *pnv_phb4_get_pec(PnvChip *chip, PnvPHB4 *phb,
for (j = 0; j < pec->num_phbs; j++) { for (j = 0; j < pec->num_phbs; j++) {
if (index == pnv_phb4_pec_get_phb_id(pec, j)) { if (index == pnv_phb4_pec_get_phb_id(pec, j)) {
pec->phbs[j] = phb->phb_base;
return pec; return pec;
} }
} }

View File

@ -185,6 +185,8 @@ struct PnvPhb4PecState {
/* PHBs */ /* PHBs */
uint32_t num_phbs; uint32_t num_phbs;
#define MAX_PHBS_PER_PEC 3
PnvPHB *phbs[MAX_PHBS_PER_PEC];
PnvChip *chip; PnvChip *chip;
}; };