gpu: host1x: Skip reset assert on Tegra186
authorMikko Perttunen <mperttunen@nvidia.com>
Thu, 22 Feb 2024 01:05:16 +0000 (03:05 +0200)
committerThierry Reding <treding@nvidia.com>
Thu, 22 Feb 2024 17:48:06 +0000 (18:48 +0100)
On Tegra186, secure world applications may need to access host1x
during suspend/resume, and rely on the kernel to keep Host1x out
of reset during the suspend cycle. As such, as a quirk,
skip asserting Host1x's reset on Tegra186.

We don't need to keep the clocks enabled, as BPMP ensures the clock
stays on while Host1x is being used. On newer SoC's, the reset line
is inaccessible, so there is no need for the quirk.

Fixes: b7c00cdf6df5 ("gpu: host1x: Enable system suspend callbacks")
Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Tested-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240222010517.1573931-1-cyndis@kapsi.fi
drivers/gpu/host1x/dev.c
drivers/gpu/host1x/dev.h

index 42fd504abbcda248e67fd84a64e2f96a2609b4cb..89983d7d73ca1539c19ff4a511c0c179bd07ed91 100644 (file)
@@ -169,6 +169,7 @@ static const struct host1x_info host1x06_info = {
        .num_sid_entries = ARRAY_SIZE(tegra186_sid_table),
        .sid_table = tegra186_sid_table,
        .reserve_vblank_syncpts = false,
+       .skip_reset_assert = true,
 };
 
 static const struct host1x_sid_entry tegra194_sid_table[] = {
@@ -680,13 +681,15 @@ static int __maybe_unused host1x_runtime_suspend(struct device *dev)
        host1x_intr_stop(host);
        host1x_syncpt_save(host);
 
-       err = reset_control_bulk_assert(host->nresets, host->resets);
-       if (err) {
-               dev_err(dev, "failed to assert reset: %d\n", err);
-               goto resume_host1x;
-       }
+       if (!host->info->skip_reset_assert) {
+               err = reset_control_bulk_assert(host->nresets, host->resets);
+               if (err) {
+                       dev_err(dev, "failed to assert reset: %d\n", err);
+                       goto resume_host1x;
+               }
 
-       usleep_range(1000, 2000);
+               usleep_range(1000, 2000);
+       }
 
        clk_disable_unprepare(host->clk);
        reset_control_bulk_release(host->nresets, host->resets);
index c8e302de76257008aa3fb172da0c3acd4412c572..925a118db23f5751cbbe50db317e98fd4c543414 100644 (file)
@@ -116,6 +116,12 @@ struct host1x_info {
         * the display driver disables VBLANK increments.
         */
        bool reserve_vblank_syncpts;
+       /*
+        * On Tegra186, secure world applications may require access to
+        * host1x during suspend/resume. To allow this, we need to leave
+        * host1x not in reset.
+        */
+       bool skip_reset_assert;
 };
 
 struct host1x {