Skip to content

Commit

Permalink
ppc/pnv: Fix number of I2C engines and ports for power9/10
Browse files Browse the repository at this point in the history
Power9 is supposed to have 4 PIB-connected I2C engines with the
following number of ports on each engine:

    0: 2
    1: 13
    2: 2
    3: 2

Power10 also has 4 engines but has the following number of ports
on each engine:

    0: 14
    1: 14
    2: 2
    3: 16

Current code assumes that they all have the same (maximum) number.
This can be a problem if software expects to see a certain number
of ports present (Power Hypervisor seems to care).

Fixed this by adding separate tables for power9 and power10 that
map the I2C controller number to the number of I2C buses that should
be attached for that engine.

Reviewed-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Glenn Miles <milesg@linux.vnet.ibm.com>
Message-ID: <20231025152714.956664-1-milesg@linux.vnet.ibm.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
  • Loading branch information
milesg-github authored and danielhb committed Nov 7, 2023
1 parent 1ceda19 commit 0d1dcb0
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
12 changes: 8 additions & 4 deletions hw/ppc/pnv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1615,7 +1615,8 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
Object *obj = OBJECT(&chip9->i2c[i]);

object_property_set_int(obj, "engine", i + 1, &error_fatal);
object_property_set_int(obj, "num-busses", pcc->i2c_num_ports,
object_property_set_int(obj, "num-busses",
pcc->i2c_ports_per_engine[i],
&error_fatal);
object_property_set_link(obj, "chip", OBJECT(chip), &error_abort);
if (!qdev_realize(DEVICE(obj), NULL, errp)) {
Expand All @@ -1640,6 +1641,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
PnvChipClass *k = PNV_CHIP_CLASS(klass);
static const int i2c_ports_per_engine[PNV9_CHIP_MAX_I2C] = {2, 13, 2, 2};

k->chip_cfam_id = 0x220d104900008000ull; /* P9 Nimbus DD2.0 */
k->cores_mask = POWER9_CORE_MASK;
Expand All @@ -1656,7 +1658,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
dc->desc = "PowerNV Chip POWER9";
k->num_pecs = PNV9_CHIP_MAX_PEC;
k->i2c_num_engines = PNV9_CHIP_MAX_I2C;
k->i2c_num_ports = PNV9_CHIP_MAX_I2C_PORTS;
k->i2c_ports_per_engine = i2c_ports_per_engine;

device_class_set_parent_realize(dc, pnv_chip_power9_realize,
&k->parent_realize);
Expand Down Expand Up @@ -1861,7 +1863,8 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
Object *obj = OBJECT(&chip10->i2c[i]);

object_property_set_int(obj, "engine", i + 1, &error_fatal);
object_property_set_int(obj, "num-busses", pcc->i2c_num_ports,
object_property_set_int(obj, "num-busses",
pcc->i2c_ports_per_engine[i],
&error_fatal);
object_property_set_link(obj, "chip", OBJECT(chip), &error_abort);
if (!qdev_realize(DEVICE(obj), NULL, errp)) {
Expand All @@ -1886,6 +1889,7 @@ static void pnv_chip_power10_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
PnvChipClass *k = PNV_CHIP_CLASS(klass);
static const int i2c_ports_per_engine[PNV10_CHIP_MAX_I2C] = {14, 14, 2, 16};

k->chip_cfam_id = 0x120da04900008000ull; /* P10 DD1.0 (with NX) */
k->cores_mask = POWER10_CORE_MASK;
Expand All @@ -1902,7 +1906,7 @@ static void pnv_chip_power10_class_init(ObjectClass *klass, void *data)
dc->desc = "PowerNV Chip POWER10";
k->num_pecs = PNV10_CHIP_MAX_PEC;
k->i2c_num_engines = PNV10_CHIP_MAX_I2C;
k->i2c_num_ports = PNV10_CHIP_MAX_I2C_PORTS;
k->i2c_ports_per_engine = i2c_ports_per_engine;

device_class_set_parent_realize(dc, pnv_chip_power10_realize,
&k->parent_realize);
Expand Down
6 changes: 2 additions & 4 deletions include/hw/ppc/pnv_chip.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,7 @@ struct Pnv9Chip {
#define PNV9_CHIP_MAX_PEC 3
PnvPhb4PecState pecs[PNV9_CHIP_MAX_PEC];

#define PNV9_CHIP_MAX_I2C 3
#define PNV9_CHIP_MAX_I2C_PORTS 1
#define PNV9_CHIP_MAX_I2C 4
PnvI2C i2c[PNV9_CHIP_MAX_I2C];
};

Expand Down Expand Up @@ -122,7 +121,6 @@ struct Pnv10Chip {
PnvPhb4PecState pecs[PNV10_CHIP_MAX_PEC];

#define PNV10_CHIP_MAX_I2C 4
#define PNV10_CHIP_MAX_I2C_PORTS 2
PnvI2C i2c[PNV10_CHIP_MAX_I2C];
};

Expand All @@ -140,7 +138,7 @@ struct PnvChipClass {
uint32_t num_phbs;

uint32_t i2c_num_engines;
uint32_t i2c_num_ports;
const int *i2c_ports_per_engine;

DeviceRealize parent_realize;

Expand Down

0 comments on commit 0d1dcb0

Please sign in to comment.