Use the num_stacks class attribute to compute the PHB index depending
on the PEC index :
* PEC0 provides 1 PHB (PHB0)
* PEC1 provides 2 PHBs (PHB1 and PHB2)
* PEC2 provides 3 PHBs (PHB3, PHB4 and PHB5)
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/pci-host/pnv_phb4_pec.c | 16 ++++++++++++++++
hw/ppc/pnv.c | 4 +---
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
index 293909b5cb90..a7dd4173d598 100644
--- a/hw/pci-host/pnv_phb4_pec.c
+++ b/hw/pci-host/pnv_phb4_pec.c
@@ -374,6 +374,19 @@ static void pnv_pec_instance_init(Object *obj)
}
}
+static int pnv_pec_phb_offset(PnvPhb4PecState *pec)
+{
+ PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec);
+ int index = pec->index;
+ int offset = 0;
+
+ while (index--) {
+ offset += pecc->num_stacks[index];
+ }
+
+ return offset;
+}
+
static void pnv_pec_realize(DeviceState *dev, Error **errp)
{
PnvPhb4PecState *pec = PNV_PHB4_PEC(dev);
@@ -394,8 +407,10 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
for (i = 0; i < pec->num_stacks; i++) {
PnvPhb4PecStack *stack = &pec->stacks[i];
Object *stk_obj = OBJECT(stack);
+ int phb_id = pnv_pec_phb_offset(pec) + i;
object_property_set_int(stk_obj, "stack-no", i, &error_abort);
+ object_property_set_int(stk_obj, "phb-id", phb_id, &error_abort);
object_property_set_link(stk_obj, "pec", OBJECT(pec), &error_abort);
if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
return;
@@ -538,6 +553,7 @@ static void pnv_pec_stk_instance_init(Object *obj)
PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(obj);
object_initialize_child(obj, "phb", &stack->phb, TYPE_PNV_PHB4);
+ object_property_add_alias(obj, "phb-id", OBJECT(&stack->phb), "index");
}
static void pnv_pec_stk_realize(DeviceState *dev, Error **errp)
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 957f0bdfaa6b..f8b0b2a28383 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1371,7 +1371,6 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
{
Pnv9Chip *chip9 = PNV9_CHIP(chip);
int i, j;
- int phb_id = 0;
for (i = 0; i < chip->num_pecs; i++) {
PnvPhb4PecState *pec = &chip9->pecs[i];
@@ -1396,11 +1395,10 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
pnv_xscom_add_subregion(chip, pec_nest_base, &pec->nest_regs_mr);
pnv_xscom_add_subregion(chip, pec_pci_base, &pec->pci_regs_mr);
- for (j = 0; j < pec->num_stacks; j++, phb_id++) {
+ for (j = 0; j < pec->num_stacks; j++) {
PnvPhb4PecStack *stack = &pec->stacks[j];
Object *obj = OBJECT(&stack->phb);
- object_property_set_int(obj, "index", phb_id, &error_fatal);
object_property_set_int(obj, "chip-id", chip->chip_id,
&error_fatal);
object_property_set_int(obj, "version", pecc->version,
--
2.31.1
On 02/12/2021 15:42, Cédric Le Goater wrote:
> Use the num_stacks class attribute to compute the PHB index depending
> on the PEC index :
>
> * PEC0 provides 1 PHB (PHB0)
> * PEC1 provides 2 PHBs (PHB1 and PHB2)
> * PEC2 provides 3 PHBs (PHB3, PHB4 and PHB5)
>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
> hw/pci-host/pnv_phb4_pec.c | 16 ++++++++++++++++
> hw/ppc/pnv.c | 4 +---
> 2 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
> index 293909b5cb90..a7dd4173d598 100644
> --- a/hw/pci-host/pnv_phb4_pec.c
> +++ b/hw/pci-host/pnv_phb4_pec.c
> @@ -374,6 +374,19 @@ static void pnv_pec_instance_init(Object *obj)
> }
> }
>
> +static int pnv_pec_phb_offset(PnvPhb4PecState *pec)
> +{
> + PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec);
> + int index = pec->index;
> + int offset = 0;
> +
> + while (index--) {
> + offset += pecc->num_stacks[index];
> + }
> +
> + return offset;
> +}
> +
That seems overly complicated to me and not very readable. The log
message is a lot more clear. I'd prefer we have a switch() statement
returning the base PHB ID based on the PEC index.
Fred
> static void pnv_pec_realize(DeviceState *dev, Error **errp)
> {
> PnvPhb4PecState *pec = PNV_PHB4_PEC(dev);
> @@ -394,8 +407,10 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
> for (i = 0; i < pec->num_stacks; i++) {
> PnvPhb4PecStack *stack = &pec->stacks[i];
> Object *stk_obj = OBJECT(stack);
> + int phb_id = pnv_pec_phb_offset(pec) + i;
>
> object_property_set_int(stk_obj, "stack-no", i, &error_abort);
> + object_property_set_int(stk_obj, "phb-id", phb_id, &error_abort);
> object_property_set_link(stk_obj, "pec", OBJECT(pec), &error_abort);
> if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
> return;
> @@ -538,6 +553,7 @@ static void pnv_pec_stk_instance_init(Object *obj)
> PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(obj);
>
> object_initialize_child(obj, "phb", &stack->phb, TYPE_PNV_PHB4);
> + object_property_add_alias(obj, "phb-id", OBJECT(&stack->phb), "index");
> }
>
> static void pnv_pec_stk_realize(DeviceState *dev, Error **errp)
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 957f0bdfaa6b..f8b0b2a28383 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -1371,7 +1371,6 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
> {
> Pnv9Chip *chip9 = PNV9_CHIP(chip);
> int i, j;
> - int phb_id = 0;
>
> for (i = 0; i < chip->num_pecs; i++) {
> PnvPhb4PecState *pec = &chip9->pecs[i];
> @@ -1396,11 +1395,10 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
> pnv_xscom_add_subregion(chip, pec_nest_base, &pec->nest_regs_mr);
> pnv_xscom_add_subregion(chip, pec_pci_base, &pec->pci_regs_mr);
>
> - for (j = 0; j < pec->num_stacks; j++, phb_id++) {
> + for (j = 0; j < pec->num_stacks; j++) {
> PnvPhb4PecStack *stack = &pec->stacks[j];
> Object *obj = OBJECT(&stack->phb);
>
> - object_property_set_int(obj, "index", phb_id, &error_fatal);
> object_property_set_int(obj, "chip-id", chip->chip_id,
> &error_fatal);
> object_property_set_int(obj, "version", pecc->version,
>
On 12/7/21 11:06, Frederic Barrat wrote:
>
>
> On 02/12/2021 15:42, Cédric Le Goater wrote:
>> Use the num_stacks class attribute to compute the PHB index depending
>> on the PEC index :
>>
>> * PEC0 provides 1 PHB (PHB0)
>> * PEC1 provides 2 PHBs (PHB1 and PHB2)
>> * PEC2 provides 3 PHBs (PHB3, PHB4 and PHB5)
>>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>> ---
>> hw/pci-host/pnv_phb4_pec.c | 16 ++++++++++++++++
>> hw/ppc/pnv.c | 4 +---
>> 2 files changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
>> index 293909b5cb90..a7dd4173d598 100644
>> --- a/hw/pci-host/pnv_phb4_pec.c
>> +++ b/hw/pci-host/pnv_phb4_pec.c
>> @@ -374,6 +374,19 @@ static void pnv_pec_instance_init(Object *obj)
>> }
>> }
>> +static int pnv_pec_phb_offset(PnvPhb4PecState *pec)
>> +{
>> + PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec);
>> + int index = pec->index;
>> + int offset = 0;
>> +
>> + while (index--) {
>> + offset += pecc->num_stacks[index];
>> + }
>> +
>> + return offset;
>> +}
>> +
>
>
> That seems overly complicated to me and not very readable. The log message is a lot more clear. I'd prefer we have a switch() statement returning the base PHB ID based on the PEC index.
yes I agree but PHB5 is on its way and this is compatible. See :
https://github.com/legoater/qemu/commit/d7caa1b74f3f8a90815fa086b87a1bd467b7c988
I will take any good idea fitting both :)
Thanks,
C.
>
> Fred
>
>
>
>> static void pnv_pec_realize(DeviceState *dev, Error **errp)
>> {
>> PnvPhb4PecState *pec = PNV_PHB4_PEC(dev);
>> @@ -394,8 +407,10 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
>> for (i = 0; i < pec->num_stacks; i++) {
>> PnvPhb4PecStack *stack = &pec->stacks[i];
>> Object *stk_obj = OBJECT(stack);
>> + int phb_id = pnv_pec_phb_offset(pec) + i;
>> object_property_set_int(stk_obj, "stack-no", i, &error_abort);
>> + object_property_set_int(stk_obj, "phb-id", phb_id, &error_abort);
>> object_property_set_link(stk_obj, "pec", OBJECT(pec), &error_abort);
>> if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
>> return;
>> @@ -538,6 +553,7 @@ static void pnv_pec_stk_instance_init(Object *obj)
>> PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(obj);
>> object_initialize_child(obj, "phb", &stack->phb, TYPE_PNV_PHB4);
>> + object_property_add_alias(obj, "phb-id", OBJECT(&stack->phb), "index");
>> }
>> static void pnv_pec_stk_realize(DeviceState *dev, Error **errp)
>> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
>> index 957f0bdfaa6b..f8b0b2a28383 100644
>> --- a/hw/ppc/pnv.c
>> +++ b/hw/ppc/pnv.c
>> @@ -1371,7 +1371,6 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
>> {
>> Pnv9Chip *chip9 = PNV9_CHIP(chip);
>> int i, j;
>> - int phb_id = 0;
>> for (i = 0; i < chip->num_pecs; i++) {
>> PnvPhb4PecState *pec = &chip9->pecs[i];
>> @@ -1396,11 +1395,10 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
>> pnv_xscom_add_subregion(chip, pec_nest_base, &pec->nest_regs_mr);
>> pnv_xscom_add_subregion(chip, pec_pci_base, &pec->pci_regs_mr);
>> - for (j = 0; j < pec->num_stacks; j++, phb_id++) {
>> + for (j = 0; j < pec->num_stacks; j++) {
>> PnvPhb4PecStack *stack = &pec->stacks[j];
>> Object *obj = OBJECT(&stack->phb);
>> - object_property_set_int(obj, "index", phb_id, &error_fatal);
>> object_property_set_int(obj, "chip-id", chip->chip_id,
>> &error_fatal);
>> object_property_set_int(obj, "version", pecc->version,
>>
On 12/2/21 11:42, Cédric Le Goater wrote:
> Use the num_stacks class attribute to compute the PHB index depending
> on the PEC index :
>
> * PEC0 provides 1 PHB (PHB0)
> * PEC1 provides 2 PHBs (PHB1 and PHB2)
> * PEC2 provides 3 PHBs (PHB3, PHB4 and PHB5)
>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
> hw/pci-host/pnv_phb4_pec.c | 16 ++++++++++++++++
> hw/ppc/pnv.c | 4 +---
> 2 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
> index 293909b5cb90..a7dd4173d598 100644
> --- a/hw/pci-host/pnv_phb4_pec.c
> +++ b/hw/pci-host/pnv_phb4_pec.c
> @@ -374,6 +374,19 @@ static void pnv_pec_instance_init(Object *obj)
> }
> }
>
> +static int pnv_pec_phb_offset(PnvPhb4PecState *pec)
> +{
> + PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec);
> + int index = pec->index;
> + int offset = 0;
> +
> + while (index--) {
> + offset += pecc->num_stacks[index];
> + }
> +
> + return offset;
> +}
> +
> static void pnv_pec_realize(DeviceState *dev, Error **errp)
> {
> PnvPhb4PecState *pec = PNV_PHB4_PEC(dev);
> @@ -394,8 +407,10 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
> for (i = 0; i < pec->num_stacks; i++) {
> PnvPhb4PecStack *stack = &pec->stacks[i];
> Object *stk_obj = OBJECT(stack);
> + int phb_id = pnv_pec_phb_offset(pec) + i;
>
> object_property_set_int(stk_obj, "stack-no", i, &error_abort);
> + object_property_set_int(stk_obj, "phb-id", phb_id, &error_abort);
> object_property_set_link(stk_obj, "pec", OBJECT(pec), &error_abort);
> if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
> return;
> @@ -538,6 +553,7 @@ static void pnv_pec_stk_instance_init(Object *obj)
> PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(obj);
>
> object_initialize_child(obj, "phb", &stack->phb, TYPE_PNV_PHB4);
> + object_property_add_alias(obj, "phb-id", OBJECT(&stack->phb), "index");
> }
>
> static void pnv_pec_stk_realize(DeviceState *dev, Error **errp)
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 957f0bdfaa6b..f8b0b2a28383 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -1371,7 +1371,6 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
> {
> Pnv9Chip *chip9 = PNV9_CHIP(chip);
> int i, j;
> - int phb_id = 0;
>
> for (i = 0; i < chip->num_pecs; i++) {
> PnvPhb4PecState *pec = &chip9->pecs[i];
> @@ -1396,11 +1395,10 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
> pnv_xscom_add_subregion(chip, pec_nest_base, &pec->nest_regs_mr);
> pnv_xscom_add_subregion(chip, pec_pci_base, &pec->pci_regs_mr);
>
> - for (j = 0; j < pec->num_stacks; j++, phb_id++) {
> + for (j = 0; j < pec->num_stacks; j++) {
> PnvPhb4PecStack *stack = &pec->stacks[j];
> Object *obj = OBJECT(&stack->phb);
>
> - object_property_set_int(obj, "index", phb_id, &error_fatal);
> object_property_set_int(obj, "chip-id", chip->chip_id,
> &error_fatal);
> object_property_set_int(obj, "version", pecc->version,
>
© 2016 - 2026 Red Hat, Inc.