]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
gpu: host1x: Fix boot regression for Tegra
authorJon Hunter <jonathanh@nvidia.com>
Wed, 25 Sep 2024 16:05:04 +0000 (17:05 +0100)
committerThierry Reding <treding@nvidia.com>
Tue, 15 Oct 2024 13:49:06 +0000 (15:49 +0200)
Commit 4c27ac45e622 ("gpu: host1x: Request syncpoint IRQs only during
probe") caused a boot regression for the Tegra186 device. Following this
update the function host1x_intr_init() now calls
host1x_hw_intr_disable_all_syncpt_intrs() during probe. However,
host1x_intr_init() is called before runtime power-management is enabled
for Host1x and the function host1x_hw_intr_disable_all_syncpt_intrs() is
accessing hardware registers. So if the Host1x hardware is not enabled
prior to probing then the device will now hang on attempting to access
the registers. So far this is only observed on Tegra186, but potentially
could be seen on other devices.

Fix this by moving the call to the function host1x_intr_init() in probe
to after enabling the runtime power-management in the probe and update
the failure path in probe as necessary.

Fixes: 4c27ac45e622 ("gpu: host1x: Request syncpoint IRQs only during probe")
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240925160504.60221-1-jonathanh@nvidia.com
(cherry picked from commit dc56f8428e5f34418f3243a60cec13166efe4fdb)
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/host1x/dev.c

index b62e4f0e8130fb8276ffcf4b20eebc2ae7223028..e98528777faaec48faca72dc1a728f1150fb3c17 100644 (file)
@@ -625,12 +625,6 @@ static int host1x_probe(struct platform_device *pdev)
                goto free_contexts;
        }
 
-       err = host1x_intr_init(host);
-       if (err) {
-               dev_err(&pdev->dev, "failed to initialize interrupts\n");
-               goto deinit_syncpt;
-       }
-
        pm_runtime_enable(&pdev->dev);
 
        err = devm_tegra_core_dev_init_opp_table_common(&pdev->dev);
@@ -642,6 +636,12 @@ static int host1x_probe(struct platform_device *pdev)
        if (err)
                goto pm_disable;
 
+       err = host1x_intr_init(host);
+       if (err) {
+               dev_err(&pdev->dev, "failed to initialize interrupts\n");
+               goto pm_put;
+       }
+
        host1x_debug_init(host);
 
        err = host1x_register(host);
@@ -658,13 +658,11 @@ unregister:
        host1x_unregister(host);
 deinit_debugfs:
        host1x_debug_deinit(host);
-
+       host1x_intr_deinit(host);
+pm_put:
        pm_runtime_put_sync_suspend(&pdev->dev);
 pm_disable:
        pm_runtime_disable(&pdev->dev);
-
-       host1x_intr_deinit(host);
-deinit_syncpt:
        host1x_syncpt_deinit(host);
 free_contexts:
        host1x_memory_context_list_free(&host->context_list);