diff --git a/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-Add-PM-runtime-flags.patch b/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-Add-PM-runtime-flags.patch index 1b38912c6..7284fe0e0 100644 --- a/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-Add-PM-runtime-flags.patch +++ b/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-Add-PM-runtime-flags.patch @@ -1,4 +1,4 @@ -From 278eb0c7c55813efa78f8d32afd559c1121bc9d4 Mon Sep 17 00:00:00 2001 +From ce56f3f385e0830a1e242f9fca9a82c3067ba03f Mon Sep 17 00:00:00 2001 From: Philippe Simons Date: Thu, 13 Mar 2025 00:23:18 +0100 Subject: drm/panfrost: Add PM runtime flags @@ -23,32 +23,30 @@ 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 PM flags for CLK and RST, and implement in +Add GPU_PM_RT flag, and implement in panfrost_device_runtime_suspend/resume. Signed-off-by: Philippe Simons --- - drivers/gpu/drm/panfrost/panfrost_device.c | 37 ++++++++++++++++++++++ - drivers/gpu/drm/panfrost/panfrost_device.h | 4 +++ - 2 files changed, 41 insertions(+) + 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..189ad2ad2b32 100644 +index a45e4addcc19..93d48e97ce10 100644 --- a/drivers/gpu/drm/panfrost/panfrost_device.c +++ b/drivers/gpu/drm/panfrost/panfrost_device.c -@@ -406,11 +406,38 @@ void panfrost_device_reset(struct panfrost_device *pfdev) +@@ -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_RST_ASRT)) { ++ if (pfdev->comp->pm_features & BIT(GPU_PM_RT)) { + ret = reset_control_deassert(pfdev->rstc); + if (ret) + return ret; -+ } + -+ if (pfdev->comp->pm_features & BIT(GPU_PM_RT_CLK_DIS)) { + ret = clk_enable(pfdev->clock); + if (ret) + goto err_clk; @@ -66,48 +64,45 @@ index a45e4addcc19..189ad2ad2b32 100644 return 0; + +err_bus_clk: -+ if (pfdev->comp->pm_features & BIT(GPU_PM_RT_CLK_DIS)) ++ if (pfdev->comp->pm_features & BIT(GPU_PM_RT)) + clk_disable(pfdev->clock); +err_clk: -+ if (pfdev->comp->pm_features & BIT(GPU_PM_RT_RST_ASRT)) ++ 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 +453,16 @@ 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_CLK_DIS)) { ++ if (pfdev->comp->pm_features & BIT(GPU_PM_RT)) { + if (pfdev->bus_clock) + clk_disable(pfdev->bus_clock); + + clk_disable(pfdev->clock); -+ } -+ -+ if (pfdev->comp->pm_features & BIT(GPU_PM_RT_RST_ASRT)) + 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..f372d4819262 100644 +index cffcb0ac7c11..861555ceea65 100644 --- a/drivers/gpu/drm/panfrost/panfrost_device.h +++ b/drivers/gpu/drm/panfrost/panfrost_device.h -@@ -36,10 +36,14 @@ enum panfrost_drv_comp_bits { +@@ -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_CLK_DIS: Allow disabling clocks during system runtime suspend -+ * @GPU_PM_RST_ASRT: Allow asserting the reset control during runtime 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_CLK_DIS, -+ GPU_PM_RT_RST_ASRT ++ GPU_PM_RT }; struct panfrost_features { diff --git a/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-add-h616-compatible-string.patch b/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-add-h616-compatible-string.patch index 3c2ff521c..82cdaf0d1 100644 --- a/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-add-h616-compatible-string.patch +++ b/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-add-h616-compatible-string.patch @@ -1,9 +1,9 @@ -From b4b55cd1e58bc396b011f747116db0cfef38f27b Mon Sep 17 00:00:00 2001 +From 2e800a8620fb78ed4422e8ef8c3741a3ce474bea Mon Sep 17 00:00:00 2001 From: Philippe Simons Date: Thu, 13 Mar 2025 00:23:19 +0100 Subject: drm/panfrost: add h616 compatible string -Tie the Allwinner compatible string to the two features bits that will +Tie the Allwinner compatible string to the GPU_PM_RT feature bits that will toggle the clocks and the reset line whenever the power domain is changing state. @@ -13,7 +13,7 @@ Signed-off-by: Philippe Simons 1 file changed, 8 insertions(+) diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c -index ee3864476eb9..a511edc3c045 100644 +index ee3864476eb9..ecb081e497f0 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -777,6 +777,13 @@ static const struct panfrost_compatible default_data = { @@ -24,7 +24,7 @@ index ee3864476eb9..a511edc3c045 100644 + .num_supplies = ARRAY_SIZE(default_supplies) - 1, + .supply_names = default_supplies, + .num_pm_domains = 1, -+ .pm_features = BIT(GPU_PM_RT_CLK_DIS) | BIT(GPU_PM_RT_RST_ASRT), ++ .pm_features = BIT(GPU_PM_RT), +}; + static const struct panfrost_compatible amlogic_data = { diff --git a/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-reorder-pd-clk-rst-sequence.patch b/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-reorder-pd-clk-rst-sequence.patch new file mode 100644 index 000000000..a63c07fef --- /dev/null +++ b/patch/kernel/archive/sunxi-6.13/patches.drm/drm-panfrost-reorder-pd-clk-rst-sequence.patch @@ -0,0 +1,106 @@ +From 37f8be7eaca786f85cf2a17dfd33227e2ff45780 Mon Sep 17 00:00:00 2001 +From: Philippe Simons +Date: Thu, 3 Apr 2025 07:52:10 +0200 +Subject: drm/panfrost: reorder pd/clk/rst sequence + +According to Mali manuals, the powerup sequence should be +enable pd, asserting the reset then enabling the clock and +the reverse for powerdown. + +Signed-off-by: Philippe Simons +--- + drivers/gpu/drm/panfrost/panfrost_device.c | 38 +++++++++++----------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c +index 93d48e97ce10..5d35076b2e6d 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_device.c ++++ b/drivers/gpu/drm/panfrost/panfrost_device.c +@@ -209,10 +209,20 @@ int panfrost_device_init(struct panfrost_device *pfdev) + + spin_lock_init(&pfdev->cycle_counter.lock); + ++ err = panfrost_pm_domain_init(pfdev); ++ if (err) ++ return err; ++ ++ err = panfrost_reset_init(pfdev); ++ if (err) { ++ dev_err(pfdev->dev, "reset init failed %d\n", err); ++ goto out_pm_domain; ++ } ++ + err = panfrost_clk_init(pfdev); + if (err) { + dev_err(pfdev->dev, "clk init failed %d\n", err); +- return err; ++ goto out_reset; + } + + err = panfrost_devfreq_init(pfdev); +@@ -229,25 +239,15 @@ int panfrost_device_init(struct panfrost_device *pfdev) + goto out_devfreq; + } + +- err = panfrost_reset_init(pfdev); +- if (err) { +- dev_err(pfdev->dev, "reset init failed %d\n", err); +- goto out_regulator; +- } +- +- err = panfrost_pm_domain_init(pfdev); +- if (err) +- goto out_reset; +- + pfdev->iomem = devm_platform_ioremap_resource(pfdev->pdev, 0); + if (IS_ERR(pfdev->iomem)) { + err = PTR_ERR(pfdev->iomem); +- goto out_pm_domain; ++ goto out_regulator; + } + + err = panfrost_gpu_init(pfdev); + if (err) +- goto out_pm_domain; ++ goto out_regulator; + + err = panfrost_mmu_init(pfdev); + if (err) +@@ -268,16 +268,16 @@ int panfrost_device_init(struct panfrost_device *pfdev) + panfrost_mmu_fini(pfdev); + out_gpu: + panfrost_gpu_fini(pfdev); +-out_pm_domain: +- panfrost_pm_domain_fini(pfdev); +-out_reset: +- panfrost_reset_fini(pfdev); + out_regulator: + panfrost_regulator_fini(pfdev); + out_devfreq: + panfrost_devfreq_fini(pfdev); + out_clk: + panfrost_clk_fini(pfdev); ++out_reset: ++ panfrost_reset_fini(pfdev); ++out_pm_domain: ++ panfrost_pm_domain_fini(pfdev); + return err; + } + +@@ -287,11 +287,11 @@ void panfrost_device_fini(struct panfrost_device *pfdev) + panfrost_job_fini(pfdev); + panfrost_mmu_fini(pfdev); + panfrost_gpu_fini(pfdev); +- panfrost_pm_domain_fini(pfdev); +- panfrost_reset_fini(pfdev); + panfrost_devfreq_fini(pfdev); + panfrost_regulator_fini(pfdev); + panfrost_clk_fini(pfdev); ++ panfrost_reset_fini(pfdev); ++ panfrost_pm_domain_fini(pfdev); + } + + #define PANFROST_EXCEPTION(id) \ +-- +2.35.3 + diff --git a/patch/kernel/archive/sunxi-6.13/patches.megous/usb-serial-option-add-reset_resume-callback-for-WWAN-devices.patch b/patch/kernel/archive/sunxi-6.13/patches.megous/usb-serial-option-add-reset_resume-callback-for-WWAN-devices.patch index efe25cc7d..80dafc640 100644 --- a/patch/kernel/archive/sunxi-6.13/patches.megous/usb-serial-option-add-reset_resume-callback-for-WWAN-devices.patch +++ b/patch/kernel/archive/sunxi-6.13/patches.megous/usb-serial-option-add-reset_resume-callback-for-WWAN-devices.patch @@ -1,4 +1,4 @@ -From a0484e86baba6a57768a5161bcf85c1b8f916cae Mon Sep 17 00:00:00 2001 +From 8f5892bd7362c8654d19055ba9f2e32171627713 Mon Sep 17 00:00:00 2001 From: Thomas Thorne Date: Tue, 20 Sep 2022 20:34:57 -0400 Subject: usb: serial: option: add 'reset_resume' callback for WWAN devices @@ -17,10 +17,10 @@ However the rest of the patch is not needed/already upstreamed. 1 file changed, 1 insertion(+) diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c -index 58bd54e8c483..09b9c19a5178 100644 +index 5cd26dac2069..f65c1d78a2cc 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c -@@ -2455,6 +2455,7 @@ static struct usb_serial_driver option_1port_device = { +@@ -2471,6 +2471,7 @@ static struct usb_serial_driver option_1port_device = { #ifdef CONFIG_PM .suspend = usb_wwan_suspend, .resume = usb_wwan_resume, diff --git a/patch/kernel/archive/sunxi-6.13/series.conf b/patch/kernel/archive/sunxi-6.13/series.conf index cef9802b1..3b8b4c208 100644 --- a/patch/kernel/archive/sunxi-6.13/series.conf +++ b/patch/kernel/archive/sunxi-6.13/series.conf @@ -290,6 +290,7 @@ patches.drm/arm64-dts-allwinner-h616-Add-Mali-GPU-node.patch patches.drm/drm-panfrost-Add-PM-runtime-flags.patch patches.drm/drm-panfrost-add-h616-compatible-string.patch + patches.drm/drm-panfrost-reorder-pd-clk-rst-sequence ################################################################################ # diff --git a/patch/kernel/archive/sunxi-6.13/series.drm b/patch/kernel/archive/sunxi-6.13/series.drm index c6d84f754..f6693deba 100644 --- a/patch/kernel/archive/sunxi-6.13/series.drm +++ b/patch/kernel/archive/sunxi-6.13/series.drm @@ -37,3 +37,4 @@ patches.drm/arm64-dts-allwinner-h616-Add-Mali-GPU-node.patch patches.drm/drm-panfrost-Add-PM-runtime-flags.patch patches.drm/drm-panfrost-add-h616-compatible-string.patch + patches.drm/drm-panfrost-reorder-pd-clk-rst-sequence.patch