On 11/21/23 00:51, Glenn Miles wrote:
> The QEMU I2C buses and devices use the resettable
> interface for resetting while the PNV I2C controller
> and parent buses and devices have not yet transitioned
> to this new interface and use the old reset strategy.
> This was preventing the I2C buses and devices wired
> to the PNV I2C controller from being reset.
>
> The short term fix for this is to have the PNV I2C
> Controller's reset function explicitly call the resettable
> interface function, bus_cold_reset(), on all child
> I2C buses.
>
> The long term fix should be to transition all PNV parent
> devices and buses to use the resettable interface so that
> all child buses and devices are automatically reset.
>
> Signed-off-by: Glenn Miles <milesg@linux.vnet.ibm.com>
> ---
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Thanks,
C.
>
> No changes from previous version
>
> hw/ppc/pnv_i2c.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/hw/ppc/pnv_i2c.c b/hw/ppc/pnv_i2c.c
> index f80589157b..9ced596b98 100644
> --- a/hw/ppc/pnv_i2c.c
> +++ b/hw/ppc/pnv_i2c.c
> @@ -628,6 +628,19 @@ static int pnv_i2c_dt_xscom(PnvXScomInterface *dev, void *fdt,
> return 0;
> }
>
> +static void pnv_i2c_sys_reset(void *dev)
> +{
> + int port;
> + PnvI2C *i2c = PNV_I2C(dev);
> +
> + pnv_i2c_reset(dev);
> +
> + /* reset all buses connected to this i2c controller */
> + for (port = 0; port < i2c->num_busses; port++) {
> + bus_cold_reset(BUS(i2c->busses[port]));
> + }
> +}
> +
> static void pnv_i2c_realize(DeviceState *dev, Error **errp)
> {
> PnvI2C *i2c = PNV_I2C(dev);
> @@ -648,7 +661,7 @@ static void pnv_i2c_realize(DeviceState *dev, Error **errp)
>
> fifo8_create(&i2c->fifo, PNV_I2C_FIFO_SIZE);
>
> - qemu_register_reset(pnv_i2c_reset, dev);
> + qemu_register_reset(pnv_i2c_sys_reset, dev);
>
> qdev_init_gpio_out(DEVICE(dev), &i2c->psi_irq, 1);
> }