mirror of
https://github.com/armbian/build.git
synced 2025-08-12 14:16:57 +02:00
112 lines
3.4 KiB
Diff
112 lines
3.4 KiB
Diff
From ce56f3f385e0830a1e242f9fca9a82c3067ba03f Mon Sep 17 00:00:00 2001
|
|
From: Philippe Simons <simons.philippe@gmail.com>
|
|
Date: Thu, 13 Mar 2025 00:23:18 +0100
|
|
Subject: drm/panfrost: Add PM runtime flags
|
|
|
|
Allwinner H616 has a dedicated power domain for its Mali G31.
|
|
|
|
Currently after probe, the GPU is put in runtime suspend which
|
|
disable the power domain.
|
|
On first usage of GPU, the power domain enable hangs the system.
|
|
|
|
This series adds the necessary calls to enable the clocks and
|
|
deasserting the reset line after the power domain enabling and
|
|
asserting the reset line and disabling the clocks prior to the
|
|
power domain disabling.
|
|
|
|
This allows to use the Mali GPU on all Allwinner H616
|
|
boards and devices.
|
|
|
|
When the GPU is the only device attached to a single power domain,
|
|
core genpd disable and enable it when gpu enter and leave runtime suspend.
|
|
|
|
Some power-domain requires a sequence before disabled,
|
|
and the reverse when enabled.
|
|
|
|
Add GPU_PM_RT flag, and implement in
|
|
panfrost_device_runtime_suspend/resume.
|
|
|
|
Signed-off-by: Philippe Simons <simons.philippe@gmail.com>
|
|
---
|
|
drivers/gpu/drm/panfrost/panfrost_device.c | 33 ++++++++++++++++++++++
|
|
drivers/gpu/drm/panfrost/panfrost_device.h | 3 ++
|
|
2 files changed, 36 insertions(+)
|
|
|
|
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
index a45e4addcc19..93d48e97ce10 100644
|
|
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
@@ -406,11 +406,36 @@ void panfrost_device_reset(struct panfrost_device *pfdev)
|
|
static int panfrost_device_runtime_resume(struct device *dev)
|
|
{
|
|
struct panfrost_device *pfdev = dev_get_drvdata(dev);
|
|
+ int ret;
|
|
+
|
|
+ if (pfdev->comp->pm_features & BIT(GPU_PM_RT)) {
|
|
+ ret = reset_control_deassert(pfdev->rstc);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ ret = clk_enable(pfdev->clock);
|
|
+ if (ret)
|
|
+ goto err_clk;
|
|
+
|
|
+ if (pfdev->bus_clock) {
|
|
+ ret = clk_enable(pfdev->bus_clock);
|
|
+ if (ret)
|
|
+ goto err_bus_clk;
|
|
+ }
|
|
+ }
|
|
|
|
panfrost_device_reset(pfdev);
|
|
panfrost_devfreq_resume(pfdev);
|
|
|
|
return 0;
|
|
+
|
|
+err_bus_clk:
|
|
+ if (pfdev->comp->pm_features & BIT(GPU_PM_RT))
|
|
+ clk_disable(pfdev->clock);
|
|
+err_clk:
|
|
+ if (pfdev->comp->pm_features & BIT(GPU_PM_RT))
|
|
+ reset_control_assert(pfdev->rstc);
|
|
+ return ret;
|
|
}
|
|
|
|
static int panfrost_device_runtime_suspend(struct device *dev)
|
|
@@ -426,6 +451,14 @@ static int panfrost_device_runtime_suspend(struct device *dev)
|
|
panfrost_gpu_suspend_irq(pfdev);
|
|
panfrost_gpu_power_off(pfdev);
|
|
|
|
+ if (pfdev->comp->pm_features & BIT(GPU_PM_RT)) {
|
|
+ if (pfdev->bus_clock)
|
|
+ clk_disable(pfdev->bus_clock);
|
|
+
|
|
+ clk_disable(pfdev->clock);
|
|
+ reset_control_assert(pfdev->rstc);
|
|
+ }
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h
|
|
index cffcb0ac7c11..861555ceea65 100644
|
|
--- a/drivers/gpu/drm/panfrost/panfrost_device.h
|
|
+++ b/drivers/gpu/drm/panfrost/panfrost_device.h
|
|
@@ -36,10 +36,13 @@ enum panfrost_drv_comp_bits {
|
|
* enum panfrost_gpu_pm - Supported kernel power management features
|
|
* @GPU_PM_CLK_DIS: Allow disabling clocks during system suspend
|
|
* @GPU_PM_VREG_OFF: Allow turning off regulators during system suspend
|
|
+ * @GPU_PM_RT: Allow disabling clocks and asserting the reset control during
|
|
+ * system runtime suspend
|
|
*/
|
|
enum panfrost_gpu_pm {
|
|
GPU_PM_CLK_DIS,
|
|
GPU_PM_VREG_OFF,
|
|
+ GPU_PM_RT
|
|
};
|
|
|
|
struct panfrost_features {
|
|
--
|
|
2.35.3
|
|
|