diff mbox series

[v3,3/8] ppc/pnv: PNV I2C engines assigned incorrect XSCOM addresses

Message ID 20231114195659.1219821-4-milesg@linux.vnet.ibm.com
State New
Headers show
Series Add powernv10 I2C devices and tests | expand

Commit Message

Glenn Miles Nov. 14, 2023, 7:56 p.m. UTC
The PNV I2C engines for power9 and power10 were being assigned a base
XSCOM address that was off by one I2C engine's address range such
that engine 0 had engine 1's address and so on.  The xscom address
assignment was being based on the device tree engine numbering, which
starts at 1.  Rather than changing the device tree numbering to start
with 0, the addressing was changed to be based on the existing device
tree numbers minus one.

Fixes: 1ceda19c28a1 ("ppc/pnv: Connect PNV I2C controller to powernv10)
Signed-off-by: Glenn Miles <milesg@linux.vnet.ibm.com>
---

Changes from v2:
    - Added Fixes: tag

 hw/ppc/pnv.c     | 6 ++++--
 hw/ppc/pnv_i2c.c | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

Comments

Cédric Le Goater Nov. 15, 2023, 10:19 p.m. UTC | #1
On 11/14/23 20:56, Glenn Miles wrote:
> The PNV I2C engines for power9 and power10 were being assigned a base
> XSCOM address that was off by one I2C engine's address range such
> that engine 0 had engine 1's address and so on.  The xscom address
> assignment was being based on the device tree engine numbering, which
> starts at 1.  Rather than changing the device tree numbering to start
> with 0, the addressing was changed to be based on the existing device
> tree numbers minus one.
> 
> Fixes: 1ceda19c28a1 ("ppc/pnv: Connect PNV I2C controller to powernv10)
> Signed-off-by: Glenn Miles <milesg@linux.vnet.ibm.com>
> ---

This is 8.2 material.

Reviewed-by: Cédric Le Goater <clg@kaod.org>

Thanks,

C.


> 
> Changes from v2:
>      - Added Fixes: tag
> 
>   hw/ppc/pnv.c     | 6 ++++--
>   hw/ppc/pnv_i2c.c | 2 +-
>   2 files changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 645379d5bf..e82e9b30ec 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -1623,7 +1623,8 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>               return;
>           }
>           pnv_xscom_add_subregion(chip, PNV9_XSCOM_I2CM_BASE +
> -                               chip9->i2c[i].engine * PNV9_XSCOM_I2CM_SIZE,
> +                                (chip9->i2c[i].engine - 1) *
> +                                        PNV9_XSCOM_I2CM_SIZE,
>                                   &chip9->i2c[i].xscom_regs);
>           qdev_connect_gpio_out(DEVICE(&chip9->i2c[i]), 0,
>                                 qdev_get_gpio_in(DEVICE(&chip9->psi),
> @@ -1871,7 +1872,8 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
>               return;
>           }
>           pnv_xscom_add_subregion(chip, PNV10_XSCOM_I2CM_BASE +
> -                                chip10->i2c[i].engine * PNV10_XSCOM_I2CM_SIZE,
> +                                (chip10->i2c[i].engine - 1) *
> +                                        PNV10_XSCOM_I2CM_SIZE,
>                                   &chip10->i2c[i].xscom_regs);
>           qdev_connect_gpio_out(DEVICE(&chip10->i2c[i]), 0,
>                                 qdev_get_gpio_in(DEVICE(&chip10->psi),
> diff --git a/hw/ppc/pnv_i2c.c b/hw/ppc/pnv_i2c.c
> index f75e59e709..b2c738da50 100644
> --- a/hw/ppc/pnv_i2c.c
> +++ b/hw/ppc/pnv_i2c.c
> @@ -593,7 +593,7 @@ static int pnv_i2c_dt_xscom(PnvXScomInterface *dev, void *fdt,
>       int i2c_offset;
>       const char i2c_compat[] = "ibm,power8-i2cm\0ibm,power9-i2cm";
>       uint32_t i2c_pcba = PNV9_XSCOM_I2CM_BASE +
> -        i2c->engine * PNV9_XSCOM_I2CM_SIZE;
> +        (i2c->engine - 1) * PNV9_XSCOM_I2CM_SIZE;
>       uint32_t reg[2] = {
>           cpu_to_be32(i2c_pcba),
>           cpu_to_be32(PNV9_XSCOM_I2CM_SIZE)
Cédric Le Goater Nov. 18, 2023, 7:36 a.m. UTC | #2
Nick,

Since I started collecting fixes for 8.2 while you were away, I will
finish this cycle with a last PR next week and let you take over 9.0.



On 11/14/23 20:56, Glenn Miles wrote:
> The PNV I2C engines for power9 and power10 were being assigned a base
> XSCOM address that was off by one I2C engine's address range such
> that engine 0 had engine 1's address and so on.  The xscom address
> assignment was being based on the device tree engine numbering, which
> starts at 1.  Rather than changing the device tree numbering to start
> with 0, the addressing was changed to be based on the existing device
> tree numbers minus one.
> 
> Fixes: 1ceda19c28a1 ("ppc/pnv: Connect PNV I2C controller to powernv10)
> Signed-off-by: Glenn Miles <milesg@linux.vnet.ibm.com>
> ---
> 
> Changes from v2:
>      - Added Fixes: tag


Applied to ppc-next.

Thanks,

C.




> 
>   hw/ppc/pnv.c     | 6 ++++--
>   hw/ppc/pnv_i2c.c | 2 +-
>   2 files changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 645379d5bf..e82e9b30ec 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -1623,7 +1623,8 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>               return;
>           }
>           pnv_xscom_add_subregion(chip, PNV9_XSCOM_I2CM_BASE +
> -                               chip9->i2c[i].engine * PNV9_XSCOM_I2CM_SIZE,
> +                                (chip9->i2c[i].engine - 1) *
> +                                        PNV9_XSCOM_I2CM_SIZE,
>                                   &chip9->i2c[i].xscom_regs);
>           qdev_connect_gpio_out(DEVICE(&chip9->i2c[i]), 0,
>                                 qdev_get_gpio_in(DEVICE(&chip9->psi),
> @@ -1871,7 +1872,8 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
>               return;
>           }
>           pnv_xscom_add_subregion(chip, PNV10_XSCOM_I2CM_BASE +
> -                                chip10->i2c[i].engine * PNV10_XSCOM_I2CM_SIZE,
> +                                (chip10->i2c[i].engine - 1) *
> +                                        PNV10_XSCOM_I2CM_SIZE,
>                                   &chip10->i2c[i].xscom_regs);
>           qdev_connect_gpio_out(DEVICE(&chip10->i2c[i]), 0,
>                                 qdev_get_gpio_in(DEVICE(&chip10->psi),
> diff --git a/hw/ppc/pnv_i2c.c b/hw/ppc/pnv_i2c.c
> index f75e59e709..b2c738da50 100644
> --- a/hw/ppc/pnv_i2c.c
> +++ b/hw/ppc/pnv_i2c.c
> @@ -593,7 +593,7 @@ static int pnv_i2c_dt_xscom(PnvXScomInterface *dev, void *fdt,
>       int i2c_offset;
>       const char i2c_compat[] = "ibm,power8-i2cm\0ibm,power9-i2cm";
>       uint32_t i2c_pcba = PNV9_XSCOM_I2CM_BASE +
> -        i2c->engine * PNV9_XSCOM_I2CM_SIZE;
> +        (i2c->engine - 1) * PNV9_XSCOM_I2CM_SIZE;
>       uint32_t reg[2] = {
>           cpu_to_be32(i2c_pcba),
>           cpu_to_be32(PNV9_XSCOM_I2CM_SIZE)
diff mbox series

Patch

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 645379d5bf..e82e9b30ec 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1623,7 +1623,8 @@  static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
             return;
         }
         pnv_xscom_add_subregion(chip, PNV9_XSCOM_I2CM_BASE +
-                               chip9->i2c[i].engine * PNV9_XSCOM_I2CM_SIZE,
+                                (chip9->i2c[i].engine - 1) *
+                                        PNV9_XSCOM_I2CM_SIZE,
                                 &chip9->i2c[i].xscom_regs);
         qdev_connect_gpio_out(DEVICE(&chip9->i2c[i]), 0,
                               qdev_get_gpio_in(DEVICE(&chip9->psi),
@@ -1871,7 +1872,8 @@  static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
             return;
         }
         pnv_xscom_add_subregion(chip, PNV10_XSCOM_I2CM_BASE +
-                                chip10->i2c[i].engine * PNV10_XSCOM_I2CM_SIZE,
+                                (chip10->i2c[i].engine - 1) *
+                                        PNV10_XSCOM_I2CM_SIZE,
                                 &chip10->i2c[i].xscom_regs);
         qdev_connect_gpio_out(DEVICE(&chip10->i2c[i]), 0,
                               qdev_get_gpio_in(DEVICE(&chip10->psi),
diff --git a/hw/ppc/pnv_i2c.c b/hw/ppc/pnv_i2c.c
index f75e59e709..b2c738da50 100644
--- a/hw/ppc/pnv_i2c.c
+++ b/hw/ppc/pnv_i2c.c
@@ -593,7 +593,7 @@  static int pnv_i2c_dt_xscom(PnvXScomInterface *dev, void *fdt,
     int i2c_offset;
     const char i2c_compat[] = "ibm,power8-i2cm\0ibm,power9-i2cm";
     uint32_t i2c_pcba = PNV9_XSCOM_I2CM_BASE +
-        i2c->engine * PNV9_XSCOM_I2CM_SIZE;
+        (i2c->engine - 1) * PNV9_XSCOM_I2CM_SIZE;
     uint32_t reg[2] = {
         cpu_to_be32(i2c_pcba),
         cpu_to_be32(PNV9_XSCOM_I2CM_SIZE)