mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 06:43:53 -06:00
ppc/pnv: Fix number of I2C engines and ports for power9/10
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>
This commit is contained in:
parent
1ceda19c28
commit
0d1dcb0bb1
2 changed files with 10 additions and 8 deletions
12
hw/ppc/pnv.c
12
hw/ppc/pnv.c
|
@ -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)) {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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)) {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue