From: Vicente Bergas vicencb@gmail.com
commit b8f9d7f37b6af829c34c49d1a4f73ce6ed58e403 upstream.
As explained by Robin Murphy:
the IOMMU shutdown disables paging, so if the VOP is still scanning out then that will result in whatever IOVAs it was using now going straight out onto the bus as physical addresses.
We had a more radical approach before in commit 7f3ef5dedb14 ("drm/rockchip: Allow driver to be shutdown on reboot/kexec") but that resulted in new warnings and oopses on shutdown on rk3399 chromeos devices.
So second try is resurrecting Vicentes shutdown change which should achieve the same result but in a less drastic way.
Fixes: 63238173b2fa ("Revert "drm/rockchip: Allow driver to be shutdown on reboot/kexec"") Cc: Jeffy Chen jeffy.chen@rock-chips.com Cc: Robin Murphy robin.murphy@arm.com Cc: Marc Zyngier marc.zyngier@arm.com Cc: Brian Norris briannorris@chromium.org Cc: Doug Anderson dianders@chromium.org Cc: stable@vger.kernel.org Suggested-by: JeffyChen jeffy.chen@rock-chips.com Suggested-by: Robin Murphy robin.murphy@arm.com Signed-off-by: Vicente Bergas vicencb@gmail.com [adapted commit message to explain the history] Signed-off-by: Heiko Stuebner heiko@sntech.de Tested-by: Brian Norris briannorris@chromium.org Tested-by: Douglas Anderson dianders@chromium.org Acked-by: Marc Zyngier marc.zyngier@arm.com Link: https://patchwork.freedesktop.org/patch/msgid/20190402113753.10118-1-heiko@s... Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org
--- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 9 +++++++++ 1 file changed, 9 insertions(+)
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -425,6 +425,14 @@ static int rockchip_drm_platform_remove( return 0; }
+static void rockchip_drm_platform_shutdown(struct platform_device *pdev) +{ + struct drm_device *drm = platform_get_drvdata(pdev); + + if (drm) + drm_atomic_helper_shutdown(drm); +} + static const struct of_device_id rockchip_drm_dt_ids[] = { { .compatible = "rockchip,display-subsystem", }, { /* sentinel */ }, @@ -434,6 +442,7 @@ MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ static struct platform_driver rockchip_drm_platform_driver = { .probe = rockchip_drm_platform_probe, .remove = rockchip_drm_platform_remove, + .shutdown = rockchip_drm_platform_shutdown, .driver = { .name = "rockchip-drm", .of_match_table = rockchip_drm_dt_ids,