Applied to drm-misc-fixes On 24.10.2023 18:53, Stanislaw Gruszka wrote: > From: Jacek Lawrynowicz <jacek.lawrynowicz@xxxxxxxxxxxxxxx> > > IP reset has to followed by ivpu_pll_disable() to properly enter > reset state. > > Fixes: 828d63042aec ("accel/ivpu: Don't enter d0i3 during FLR") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@xxxxxxxxxxxxxxx> > Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@xxxxxxxxxxxxxxx> > Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@xxxxxxxxxxxxxxx> > --- > v2: use ivpu_hw_37xx_ip_reset() in ivpu_hw_37xx_power_up() > > drivers/accel/ivpu/ivpu_hw_37xx.c | 23 ++++++++++++++++++++--- > drivers/accel/ivpu/ivpu_hw_40xx.c | 23 ++++++++++++++++++++--- > 2 files changed, 40 insertions(+), 6 deletions(-) > > diff --git a/drivers/accel/ivpu/ivpu_hw_37xx.c b/drivers/accel/ivpu/ivpu_hw_37xx.c > index 5c0246b9e522..56b53833ede2 100644 > --- a/drivers/accel/ivpu/ivpu_hw_37xx.c > +++ b/drivers/accel/ivpu/ivpu_hw_37xx.c > @@ -598,7 +598,7 @@ static int ivpu_hw_37xx_info_init(struct ivpu_device *vdev) > return 0; > } > > -static int ivpu_hw_37xx_reset(struct ivpu_device *vdev) > +static int ivpu_hw_37xx_ip_reset(struct ivpu_device *vdev) > { > int ret; > u32 val; > @@ -623,6 +623,23 @@ static int ivpu_hw_37xx_reset(struct ivpu_device *vdev) > return ret; > } > > +static int ivpu_hw_37xx_reset(struct ivpu_device *vdev) > +{ > + int ret = 0; > + > + if (ivpu_hw_37xx_ip_reset(vdev)) { > + ivpu_err(vdev, "Failed to reset VPU IP\n"); > + ret = -EIO; > + } > + > + if (ivpu_pll_disable(vdev)) { > + ivpu_err(vdev, "Failed to disable PLL\n"); > + ret = -EIO; > + } > + > + return ret; > +} > + > static int ivpu_hw_37xx_d0i3_enable(struct ivpu_device *vdev) > { > int ret; > @@ -651,7 +668,7 @@ static int ivpu_hw_37xx_power_up(struct ivpu_device *vdev) > { > int ret; > > - ret = ivpu_hw_37xx_reset(vdev); > + ret = ivpu_hw_37xx_ip_reset(vdev); > if (ret) > ivpu_warn(vdev, "Failed to reset HW: %d\n", ret); > > @@ -722,7 +739,7 @@ static int ivpu_hw_37xx_power_down(struct ivpu_device *vdev) > { > int ret = 0; > > - if (!ivpu_hw_37xx_is_idle(vdev) && ivpu_hw_37xx_reset(vdev)) > + if (!ivpu_hw_37xx_is_idle(vdev) && ivpu_hw_37xx_ip_reset(vdev)) > ivpu_err(vdev, "Failed to reset the VPU\n"); > > if (ivpu_pll_disable(vdev)) { > diff --git a/drivers/accel/ivpu/ivpu_hw_40xx.c b/drivers/accel/ivpu/ivpu_hw_40xx.c > index e691c49c9841..b25d02dc541b 100644 > --- a/drivers/accel/ivpu/ivpu_hw_40xx.c > +++ b/drivers/accel/ivpu/ivpu_hw_40xx.c > @@ -742,7 +742,7 @@ static int ivpu_hw_40xx_info_init(struct ivpu_device *vdev) > return 0; > } > > -static int ivpu_hw_40xx_reset(struct ivpu_device *vdev) > +static int ivpu_hw_40xx_ip_reset(struct ivpu_device *vdev) > { > int ret; > u32 val; > @@ -764,6 +764,23 @@ static int ivpu_hw_40xx_reset(struct ivpu_device *vdev) > return ret; > } > > +static int ivpu_hw_40xx_reset(struct ivpu_device *vdev) > +{ > + int ret = 0; > + > + if (ivpu_hw_40xx_ip_reset(vdev)) { > + ivpu_err(vdev, "Failed to reset VPU IP\n"); > + ret = -EIO; > + } > + > + if (ivpu_pll_disable(vdev)) { > + ivpu_err(vdev, "Failed to disable PLL\n"); > + ret = -EIO; > + } > + > + return ret; > +} > + > static int ivpu_hw_40xx_d0i3_enable(struct ivpu_device *vdev) > { > int ret; > @@ -824,7 +841,7 @@ static int ivpu_hw_40xx_power_up(struct ivpu_device *vdev) > { > int ret; > > - ret = ivpu_hw_40xx_reset(vdev); > + ret = ivpu_hw_40xx_ip_reset(vdev); > if (ret) { > ivpu_err(vdev, "Failed to reset HW: %d\n", ret); > return ret; > @@ -902,7 +919,7 @@ static int ivpu_hw_40xx_power_down(struct ivpu_device *vdev) > { > int ret = 0; > > - if (!ivpu_hw_40xx_is_idle(vdev) && ivpu_hw_40xx_reset(vdev)) > + if (!ivpu_hw_40xx_is_idle(vdev) && ivpu_hw_40xx_ip_reset(vdev)) > ivpu_warn(vdev, "Failed to reset the VPU\n"); > > if (ivpu_pll_disable(vdev)) {