From 58478b0ab6d3f0434040996f709c4f37df6bbdf9 Mon Sep 17 00:00:00 2001 From: Petri Niemela Date: Tue, 11 Mar 2025 08:02:20 +0000 Subject: [PATCH] rtcpu: Halt RTCPU using HSP_BYE before reset Calling tegra_camrtc_reboot() can cause a memory fabric timeout error by asserting reset when the RTCPU is in the middle of a memory transaction. As a solution (similar to tegra_camrtc_halt), before asserting the hardware reset, signaling the RTCPU to suspend its operations using CAMRTC_HSP_BYE and waiting for RTCPU to enter WFI. Bug 5051748 Change-Id: Iba8e4e837ee0983ffe9629e7627e0056ce1c2341 Signed-off-by: Petri Niemela Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3317142 Reviewed-by: Semi Malinen Tested-by: Semi Malinen Reviewed-by: svcacv GVS: buildbot_gerritrpt Reviewed-by: Sudhir Vyas --- .../tegra/rtcpu/tegra-camera-rtcpu-base.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/platform/tegra/rtcpu/tegra-camera-rtcpu-base.c b/drivers/platform/tegra/rtcpu/tegra-camera-rtcpu-base.c index cb31e6f1..2c1a4876 100644 --- a/drivers/platform/tegra/rtcpu/tegra-camera-rtcpu-base.c +++ b/drivers/platform/tegra/rtcpu/tegra-camera-rtcpu-base.c @@ -952,6 +952,7 @@ fail: int tegra_camrtc_reboot(struct device *dev) { struct tegra_cam_rtcpu *rtcpu = dev_get_drvdata(dev); + int err = 0; int ret; if (pm_runtime_suspended(dev)) { @@ -974,6 +975,20 @@ int tegra_camrtc_reboot(struct device *dev) tegra_camrtc_set_online(dev, false); + /* Signal CAMRTC to suspend its operations. + * Incompleted memory operations by CAMRTC can cause a memory fabric + * error if the reset signal is asserted in middle of shared memory + * transaction. + */ + if (rtcpu->hsp) + err = camrtc_hsp_bye(rtcpu->hsp); + + /* Wait for the core to enter WFI before asserting the reset. + * Don't bother if the core was unresponsive. + */ + if (err == 0) + tegra_camrtc_wait_for_idle(dev); + tegra_camrtc_assert_resets(dev); rtcpu->powered = false;