summaryrefslogtreecommitdiff
path: root/include/soc
diff options
context:
space:
mode:
authorSumit Gupta <sumitg@nvidia.com>2023-10-09 15:35:56 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-11-20 11:59:16 +0100
commit9c9312fccdc9b8e1d217c8dba488b8071faa61ed (patch)
tree9b1630b8ed5efd2cac2a4a180dd1d31f8f42380b /include/soc
parent78d42ed5cdd32adba3afcfbdb0a2b5222cabcf70 (diff)
downloadlinux-riscv-9c9312fccdc9b8e1d217c8dba488b8071faa61ed.tar.gz
linux-riscv-9c9312fccdc9b8e1d217c8dba488b8071faa61ed.tar.bz2
linux-riscv-9c9312fccdc9b8e1d217c8dba488b8071faa61ed.zip
firmware: tegra: Add suspend hook and reset BPMP IPC early on resume
[ Upstream commit ea608a01d4ee66f8b51070e623f9adb8684c0dd4 ] Add suspend hook and a 'suspended' field in the 'struct tegra_bpmp' to mark if BPMP is suspended. Also, add a 'flags' field in the 'struct tegra_bpmp_message' whose 'TEGRA_BPMP_MESSAGE_RESET' bit can be set from the Tegra MC driver to signal that the reset of BPMP IPC channels is required before sending MRQ to the BPMP FW. Together both the fields allow us to handle any requests that might be sent too soon as they can cause hang during system resume. One case where we see BPMP requests being sent before the BPMP driver has resumed is the memory bandwidth requests which are triggered by onlining the CPUs during system resume. The CPUs are onlined before the BPMP has resumed and we need to reset the BPMP IPC channels to handle these requests. The additional check for 'flags' is done to avoid any un-intended BPMP IPC reset if the tegra_bpmp_transfer*() API gets called during suspend sequence after the BPMP driver is suspended. Fixes: f41e1442ac5b ("cpufreq: tegra194: add OPP support and set bandwidth") Co-developed-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Sumit Gupta <sumitg@nvidia.com> Acked-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'include/soc')
-rw-r--r--include/soc/tegra/bpmp.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/include/soc/tegra/bpmp.h b/include/soc/tegra/bpmp.h
index 5842e38bb288..f5e4ac5b8cce 100644
--- a/include/soc/tegra/bpmp.h
+++ b/include/soc/tegra/bpmp.h
@@ -102,8 +102,12 @@ struct tegra_bpmp {
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_mirror;
#endif
+
+ bool suspended;
};
+#define TEGRA_BPMP_MESSAGE_RESET BIT(0)
+
struct tegra_bpmp_message {
unsigned int mrq;
@@ -117,6 +121,8 @@ struct tegra_bpmp_message {
size_t size;
int ret;
} rx;
+
+ unsigned long flags;
};
#if IS_ENABLED(CONFIG_TEGRA_BPMP)