diff mbox series

gpu: host1x: Fix boot regression for Tegra

Message ID 20240925160504.60221-1-jonathanh@nvidia.com
State Accepted
Headers show
Series gpu: host1x: Fix boot regression for Tegra | expand

Commit Message

Jon Hunter Sept. 25, 2024, 4:05 p.m. UTC
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>
---
 drivers/gpu/host1x/dev.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

Comments

Thierry Reding Sept. 25, 2024, 7:26 p.m. UTC | #1
On Wed, Sep 25, 2024 at 05:05:04PM GMT, Jon Hunter wrote:
> 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>
> ---
>  drivers/gpu/host1x/dev.c | 18 ++++++++----------
>  1 file changed, 8 insertions(+), 10 deletions(-)

Applied, thanks.

Thierry
diff mbox series

Patch

diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c
index b62e4f0e8130..e98528777faa 100644
--- a/drivers/gpu/host1x/dev.c
+++ b/drivers/gpu/host1x/dev.c
@@ -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 @@  static int host1x_probe(struct platform_device *pdev)
 	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);