Message ID | 20231024165353.761507-1-stanislaw.gruszka@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] accel/ivpu: Disable PLL after VPU IP reset during FLR | expand |
Applied to drm-misc-fixes On 24.10.2023 18:53, Stanislaw Gruszka wrote: > From: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com> > > 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@vger.kernel.org > Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com> > Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> > Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> > --- > 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)) {
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)) {