To reduce bot traffic you must login to view /lordwelch/jellyfin-plugin-oidc/commit/5b26808f0e46809d19a9f0d4a5a33a6a4c0a6962.
The GitHub login only links via username.
Files

1011 lines
35 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 27 Apr 2025 20:38:05 +0000
Subject: arm64: dts: rockchip: rk356x: use gpu 200mhz opp as opp-suspend
CLK_GPU is the main clock for the GPU on RK356x, it's typical source
pll can be one of mpll, gpll, cpll or npll. For higher clock rates it
is also possible to use the gpu pvtpll as pll source.
The logic to switch between a normal pll and the pvtpll depending on
rate is handled in TF-A firmware, and exposed to Linux as a scmi clock.
In the device tree this is modeled in the gpu node by using the scmi gpu
clk as the core gpu clk and the normal CLK_GPU as a bus clk.
TF-A will typically change to use normal pll for rates up to 400 MHz and
use pvtpll for 600 MHz or more.
Add opp-suspend to the 200 MHz opp to ensure a normal pll is used when
the gpu device is in PM runtime suspended state.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
arch/arm64/boot/dts/rockchip/rk3566.dtsi | 1 +
arch/arm64/boot/dts/rockchip/rk3566t.dtsi | 1 +
arch/arm64/boot/dts/rockchip/rk3568.dtsi | 1 +
3 files changed, 3 insertions(+)
diff --git a/arch/arm64/boot/dts/rockchip/rk3566.dtsi b/arch/arm64/boot/dts/rockchip/rk3566.dtsi
index 111111111111..222222222222 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566.dtsi
@@ -57,6 +57,7 @@ gpu_opp_table: opp-table-1 {
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <850000 850000 1000000>;
+ opp-suspend;
};
opp-300000000 {
diff --git a/arch/arm64/boot/dts/rockchip/rk3566t.dtsi b/arch/arm64/boot/dts/rockchip/rk3566t.dtsi
index 111111111111..222222222222 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566t.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566t.dtsi
@@ -45,6 +45,7 @@ gpu_opp_table: opp-table-1 {
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <850000 850000 1000000>;
+ opp-suspend;
};
opp-300000000 {
diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 111111111111..222222222222 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -68,6 +68,7 @@ gpu_opp_table: opp-table-1 {
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <850000 850000 1000000>;
+ opp-suspend;
};
opp-300000000 {
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 4 May 2025 09:58:29 +0000
Subject: arm64: dts: rockchip: rk3576: Fix gpu opp table
The Rockchip RK3576 datasheet v1.5 Recommended Operating Conditions
table list Max GPU frequency as 900 MHz.
The recommended Voltage for GPU is listed as min 0.675 and max 0.918,
with a typical voltage of 0.75.
Update the GPU OPP table to remove 950 MHz and adjust the voltages to
match the highest voltages used by vendor kernel to ensure stability.
Fixes: 57b1ce903966 ("arm64: dts: rockchip: Add rk3576 SoC base DT")
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
arch/arm64/boot/dts/rockchip/rk3576.dtsi | 19 ++++------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/arch/arm64/boot/dts/rockchip/rk3576.dtsi b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
index 111111111111..222222222222 100644
--- a/arch/arm64/boot/dts/rockchip/rk3576.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
@@ -349,42 +349,37 @@ gpu_opp_table: opp-table-gpu {
opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
- opp-microvolt = <700000 700000 850000>;
+ opp-microvolt = <712500 712500 875000>;
};
opp-400000000 {
opp-hz = /bits/ 64 <400000000>;
- opp-microvolt = <700000 700000 850000>;
+ opp-microvolt = <712500 712500 875000>;
};
opp-500000000 {
opp-hz = /bits/ 64 <500000000>;
- opp-microvolt = <700000 700000 850000>;
+ opp-microvolt = <712500 712500 875000>;
};
opp-600000000 {
opp-hz = /bits/ 64 <600000000>;
- opp-microvolt = <700000 700000 850000>;
+ opp-microvolt = <712500 712500 875000>;
};
opp-700000000 {
opp-hz = /bits/ 64 <700000000>;
- opp-microvolt = <725000 725000 850000>;
+ opp-microvolt = <750000 750000 875000>;
};
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
- opp-microvolt = <775000 775000 850000>;
+ opp-microvolt = <812500 812500 875000>;
};
opp-900000000 {
opp-hz = /bits/ 64 <900000000>;
- opp-microvolt = <825000 825000 850000>;
- };
-
- opp-950000000 {
- opp-hz = /bits/ 64 <950000000>;
- opp-microvolt = <850000 850000 850000>;
+ opp-microvolt = <875000 875000 875000>;
};
};
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 4 May 2025 09:56:19 +0000
Subject: clk: rockchip: rk3576: Mark pclk_gpu_root as critical
The pclk_gpu_root is required when PVTPLL is used for the GPU.
Mark it with CLK_IS_CRITICAL to ensure it is not disabled.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
Another options is to remove the clk, something that would match RK3588.
---
drivers/clk/rockchip/clk-rk3576.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/clk/rockchip/clk-rk3576.c b/drivers/clk/rockchip/clk-rk3576.c
index 111111111111..222222222222 100644
--- a/drivers/clk/rockchip/clk-rk3576.c
+++ b/drivers/clk/rockchip/clk-rk3576.c
@@ -912,7 +912,7 @@ static struct rockchip_clk_branch rk3576_clk_branches[] __initdata = {
RK3576_CLKGATE_CON(69), 1, GFLAGS),
GATE(CLK_GPU, "clk_gpu", "clk_gpu_src_pre", 0,
RK3576_CLKGATE_CON(69), 3, GFLAGS),
- COMPOSITE_NODIV(PCLK_GPU_ROOT, "pclk_gpu_root", mux_100m_50m_24m_p, 0,
+ COMPOSITE_NODIV(PCLK_GPU_ROOT, "pclk_gpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
RK3576_CLKSEL_CON(166), 10, 2, MFLAGS,
RK3576_CLKGATE_CON(69), 8, GFLAGS),
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 27 Apr 2025 20:38:47 +0000
Subject: arm64: dts: rockchip: rk3576: Use scmi gpu clk as main GPU clock
CLK_GPU is the main clock for the GPU on RK3576, it's typical source
pll can be one of gpll, cpll, aupll, spll or lpll. For higher clock
rates it is also possible to use the gpu pvtpll as pll source.
The logic to switch between a normal pll and the pvtpll depending on
rate is handled in TF-A firmware, and exposed to Linux as a scmi clock.
TF-A will typically change to use normal pll for rates up to 200 MHz and
use pvtpll for 300 MHz or more.
Change to use the SCMI_CLK_GPU as the main GPU clock and the normal
CLK_GPU as a bus clk to model this in a similar way as on RK356x.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
arch/arm64/boot/dts/rockchip/rk3576.dtsi | 14 +++++++---
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/arch/arm64/boot/dts/rockchip/rk3576.dtsi b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
index 111111111111..222222222222 100644
--- a/arch/arm64/boot/dts/rockchip/rk3576.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
@@ -347,6 +347,12 @@ opp-2208000000 {
gpu_opp_table: opp-table-gpu {
compatible = "operating-points-v2";
+ opp-200000000 {
+ opp-hz = /bits/ 64 <200000000>;
+ opp-microvolt = <712500 712500 875000>;
+ opp-suspend;
+ };
+
opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <712500 712500 875000>;
@@ -1285,10 +1291,10 @@ power-domain@RK3576_PD_VO1 {
gpu: gpu@27800000 {
compatible = "rockchip,rk3576-mali", "arm,mali-bifrost";
reg = <0x0 0x27800000 0x0 0x20000>;
- assigned-clocks = <&scmi_clk SCMI_CLK_GPU>;
- assigned-clock-rates = <198000000>;
- clocks = <&cru CLK_GPU>;
- clock-names = "core";
+ assigned-clocks = <&cru CLK_GPU>, <&scmi_clk SCMI_CLK_GPU>;
+ assigned-clock-rates = <198000000>, <200000000>;
+ clocks = <&scmi_clk SCMI_CLK_GPU>, <&cru CLK_GPU>;
+ clock-names = "gpu", "bus";
dynamic-power-coefficient = <1625>;
interrupts = <GIC_SPI 347 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 348 IRQ_TYPE_LEVEL_HIGH>,
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 27 Apr 2025 20:39:15 +0000
Subject: dt-bindings: gpu: mali-bifrost: fix rockchip,rk3576-mali binding
A scmi clk is used as the main GPU clock for RK3576, similar to RK356x.
Update the RK3576 binding to match the RK356x binding.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml b/Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml
index 111111111111..222222222222 100644
--- a/Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml
+++ b/Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml
@@ -269,6 +269,7 @@ allOf:
compatible:
contains:
const: rockchip,rk3568-mali
+ const: rockchip,rk3576-mali
then:
properties:
clocks:
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 10 May 2025 23:59:20 +0000
Subject: RFC: drm/lima: Do not set clk rate when device is suspended
On Rockchip RK3528 trying to change the SCMI_CLK_GPU rate when the GPU
device is PM runtime suspended may cause a freeze or kernel panic:
$ echo performance > /sys/class/devfreq/ff700000.gpu/governor
SError Interrupt on CPU1, code 0x00000000bf000000 -- SError
CPU: 1 UID: 0 PID: 190 Comm: sh Not tainted 6.15.0-rc6 #1 VOLUNTARY
Hardware name: Radxa E20C (DT)
pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : smc_send_message+0x140/0x148
lr : smc_send_message+0xd8/0x148
sp : ffff800082ebb880
x29: ffff800082ebb880 x28: ffff0000015a6000 x27: 0000000000000000
x26: 0000000000000000 x25: 00000000ffffffff x24: ffff800082ebbae8
x23: ffff000004adcc10 x22: ffff0000007d04a0 x21: ffff000004b93680
x20: ffff000000e51380 x19: ffff0000007d0480 x18: 0000000000000000
x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000008
x14: ffff0000015a6080 x13: 0000000000000000 x12: 0000000000000018
x11: 0000000000000040 x10: ffff000004ae2138 x9 : ffff000004ae2130
x8 : ffff000001fe1b88 x7 : 0000000000000000 x6 : 0000000000000000
x5 : 0000000000000000 x4 : 0000000000000000 x3 : 0000000000000000
x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000
Kernel panic - not syncing: Asynchronous SError Interrupt
CPU: 1 UID: 0 PID: 190 Comm: sh Not tainted 6.15.0-rc6 #1 VOLUNTARY
Hardware name: Radxa E20C (DT)
Call trace:
show_stack+0x28/0x78 (C)
dump_stack_lvl+0x58/0x74
dump_stack+0x14/0x1c
panic+0x14c/0x328
add_taint+0x0/0xc0
arm64_serror_panic+0x60/0x6c
do_serror+0x24/0x60
el1h_64_error_handler+0x2c/0x40
el1h_64_error+0x6c/0x70
smc_send_message+0x140/0x148 (P)
do_xfer+0xb0/0x200
scmi_clock_rate_set+0xc0/0x220
scmi_clk_set_rate+0x24/0x38
clk_change_rate+0x164/0x288
clk_core_set_rate_nolock+0x1dc/0x314
clk_set_rate+0x34/0x144
_opp_config_clk_single+0x2c/0x90
_set_opp+0x104/0x564
dev_pm_oppset_rate+0x110/0x260
lima_devfreq_target+0x30/0x40
devfre_set_target+0x84/0x180
devfreq_update_target+0xb4/0xcc
update_devfreq+0x10/0x18
devfreq_performance_handler+0x40/0x70
governor_store+0xe4/0x260
dev_attr_store+0x14/0x24
sysfs_kf_write+0x54/0x60
kernfs_fop_write_iter+0x118/0x1e0
vfs_write+0x224/0x390
ksys_write+0x68/0x100
__arm64_sys_write+0x18/0x20
invoke_syscall+0x44/0x100
el0_svc_common.constprop.0+0x3c/0xe0
do_el0_svc+0x18/0x20
el0_svc+0x2c/0xc0
el0t_64_sync_handler+0x104/0x130
el0t_64_sync+0x170/0x174
SMP: stopping secondary CPUs
Kernel Offset: disabled
CPU fetures: 0x0000,00001000,00000400,0200400b
Memory Limit: none
---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
This typically happen when CLK_GPU is disabled or when PD_GPU is down.
Add a config_clks ops that will not set core clk rate when the device is
PM runtime suspended.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
drivers/gpu/drm/lima/lima_devfreq.c | 43 +++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/lima/lima_devfreq.c b/drivers/gpu/drm/lima/lima_devfreq.c
index 111111111111..222222222222 100644
--- a/drivers/gpu/drm/lima/lima_devfreq.c
+++ b/drivers/gpu/drm/lima/lima_devfreq.c
@@ -11,6 +11,7 @@
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/pm_opp.h>
+#include <linux/pm_runtime.h>
#include <linux/property.h>
#include "lima_device.h"
@@ -87,6 +88,41 @@ static struct devfreq_dev_profile lima_devfreq_profile = {
.get_dev_status = lima_devfreq_get_dev_status,
};
+static int lima_devfreq_config_clks(struct device *dev,
+ struct opp_table *opp_table,
+ struct dev_pm_opp *opp,
+ void *data, bool scaling_down)
+{
+ struct lima_device *ldev = dev_get_drvdata(dev);
+ struct devfreq *devfreq = ldev->devfreq.devfreq;
+ unsigned long *target = data;
+ unsigned long freq;
+ int ret = 0;
+
+ /* One of target and opp must be available */
+ if (target) {
+ freq = *target;
+ } else if (opp) {
+ freq = dev_pm_opp_get_freq(opp);
+ } else {
+ WARN_ON(1);
+ return -EINVAL;
+ }
+
+ pm_runtime_get_noresume(dev);
+
+ if (!pm_runtime_suspended(dev) || !devfreq || !devfreq->suspend_freq) {
+ ret = clk_set_rate(ldev->clk_gpu, freq);
+ if (ret)
+ dev_err(dev, "failed to set clock rate %lu: %d\n",
+ freq, ret);
+ }
+
+ pm_runtime_put_noidle(dev);
+
+ return ret;
+}
+
void lima_devfreq_fini(struct lima_device *ldev)
{
struct lima_devfreq *devfreq = &ldev->devfreq;
@@ -112,6 +148,11 @@ int lima_devfreq_init(struct lima_device *ldev)
unsigned long cur_freq;
int ret;
const char *regulator_names[] = { "mali", NULL };
+ const char *clk_names[] = { "core", NULL };
+ struct dev_pm_opp_config config = {
+ .clk_names = clk_names,
+ .config_clks = lima_devfreq_config_clks,
+ };
if (!device_property_present(dev, "operating-points-v2"))
/* Optional, continue without devfreq */
@@ -123,7 +164,7 @@ int lima_devfreq_init(struct lima_device *ldev)
* clkname is set separately so it is not affected by the optional
* regulator setting which may return error.
*/
- ret = devm_pm_opp_set_clkname(dev, "core");
+ ret = devm_pm_opp_set_config(dev, &config);
if (ret)
return ret;
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 4 May 2025 10:00:16 +0000
Subject: RFC: drm/panfrost: Do not set clk rate when device is suspended
On Rockchip RK3576 trying to change the SCMI_CLK_GPU rate when the GPU
device is PM runtime suspended may cause a kernel panic:
$ echo 900000000 > /sys/class/devfreq/27800000.gpu/min_freq
SError Interrupt on CPU2, code 0x00000000bf000000 -- SError
CPU: 2 UID: 0 PID: 236 Comm: sh Not tainted 6.15.0-rc3 #1 VOLUNTARY
Hardware name: ArmSoM Sige5 (DT)
pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : smc_send_message+0x140/0x148
lr : smc_send_message+0xd8/0x148
sp : ffff8000823eb7a0
x29: ffff8000823eb7a0 x28: ffff0000c5283000 x27: 0000000000000000
x26: 0000000000000000 x25: 00000000ffffffff x24: ffff8000823eba08
x23: ffff0000c1dda810 x22: ffff0000c093a9a0 x21: ffff0000c0921280
x20: ffff0000c22af8c0 x19: ffff0000c093a980 x18: 0000000000000001
x17: 0000000000000001 x16: ffffffffffffffff x15: 0000000000000000
x14: ffff0000c5283080 x13: 0000000000000000 x12: 071c71c71c71c71c
x11: 0000000000000040 x10: ffff0000c091e138 x9 : ffff0000c091e130
x8 : ffff0000c07d8b90 x7 : 0000000000000000 x6 : 0000000000000000
x5 : 0000000000000000 x4 : 0000000000000000 x3 : 0000000000000000
x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000
Kernel panic - not syncing: Asynchronous SError Interrupt
CPU: 2 UID: 0 PID: 236 Comm: sh Not tainted 6.15.0-rc3 #1 VOLUNTARY
Hardware name: ArmSoM Sige5 (DT)
Call trace:
show_stack+0x28/0x78 (C)
dump_stack_lvl+0x58/0x74
dump_stack+0x14/0x1c
panic+0x14c/0x328
add_taint+0x0/0xc0
arm64_serror_panic+0x60/0x6c
do_serror+0x24/0x60
el1h_64_error_handler+0x2c/0x40
el1h_64_error+0x6c/0x70
smc_send_message+0x140/0x148 (P)
do_xfer+0xb0/0x1f8
scmi_clock_rate_set+0xc0/0x220
scmi_clk_set_rate+0x24/0x38
clk_change_rate+0x164/0x288
clk_core_set_rate_nolock+0x1dc/0x314
clk_set_rate+0x34/0x144
_opp_config_clk_single+0x2c/0x90
_set_opp+0x104/0x564
dev_pm_opp_set_rate+0x110/0x260
panfrost_devfreq_target+0x38/0x60
devfreq_set_target+0x84/0x180
devfreq_update_target+0xb4/0xcc
qos_min_notifier_call+0x2c/0x68
blocking_notifier_call_chain+0x68/0xa0
pm_qos_update_target+0xd8/0x150
freq_qos_apply+0x5c/0x64
apply_constraint+0x80/0x130
__dev_pm_qos_update_request+0x78/0xc4
dev_pm_qos_update_request+0x34/0x54
min_freq_store+0x74/0xbc
dev_attr_store+0x14/0x24
sysfs_kf_write+0x54/0x60
kernfs_fop_write_iter+0x118/0x1e0
vfs_write+0x224/0x390
ksys_write+0x68/0x100
__arm64_sys_write+0x18/0x20
invoke_syscall+0x44/0x100
el0_svc_common.constprop.0+0x3c/0xe0
do_el0_svc+0x18/0x20
el0_svc+0x2c/0xc0
el0t_64_sync_handler+0x104/0x130
el0t_64_sync+0x170/0x174
SMP: stopping secondary CPUs
Kernel Offset: disabled
CPU features: 0x0400,00041040,01000400,0200400b
Memory Limit: 3838 MB
---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
This typically happen when CLK_GPU is disabled or when PD_GPU is down.
Add a config_clks ops that will not set core clk rate when the device is
PM runtime suspended.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 47 ++++++++++
drivers/gpu/drm/panfrost/panfrost_device.h | 4 +
drivers/gpu/drm/panfrost/panfrost_drv.c | 13 +++
3 files changed, 64 insertions(+)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 111111111111..222222222222 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -7,6 +7,7 @@
#include <linux/nvmem-consumer.h>
#include <linux/platform_device.h>
#include <linux/pm_opp.h>
+#include <linux/pm_runtime.h>
#include <drm/drm_print.h>
@@ -91,6 +92,41 @@ static struct devfreq_dev_profile panfrost_devfreq_profile = {
.get_dev_status = panfrost_devfreq_get_dev_status,
};
+static int panfrost_devfreq_config_clks(struct device *dev,
+ struct opp_table *opp_table,
+ struct dev_pm_opp *opp,
+ void *data, bool scaling_down)
+{
+ struct panfrost_device *pfdev = dev_get_drvdata(dev);
+ struct devfreq *devfreq = pfdev->pfdevfreq.devfreq;
+ unsigned long *target = data;
+ unsigned long freq;
+ int ret = 0;
+
+ /* One of target and opp must be available */
+ if (target) {
+ freq = *target;
+ } else if (opp) {
+ freq = dev_pm_opp_get_freq(opp);
+ } else {
+ WARN_ON(1);
+ return -EINVAL;
+ }
+
+ pm_runtime_get_noresume(dev);
+
+ if (!pm_runtime_suspended(dev) || !devfreq || !devfreq->suspend_freq) {
+ ret = clk_set_rate(pfdev->clock, freq);
+ if (ret)
+ dev_err(dev, "failed to set clock rate %lu: %d\n",
+ freq, ret);
+ }
+
+ pm_runtime_put_noidle(dev);
+
+ return ret;
+}
+
static int panfrost_read_speedbin(struct device *dev)
{
u32 val;
@@ -140,6 +176,17 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
if (ret)
return ret;
+ if (pfdev->comp->opp_clk_names) {
+ struct dev_pm_opp_config config = {
+ .clk_names = pfdev->comp->opp_clk_names,
+ .config_clks = panfrost_devfreq_config_clks,
+ };
+
+ ret = devm_pm_opp_set_config(dev, &config);
+ if (ret)
+ return ret;
+ }
+
ret = devm_pm_opp_set_regulators(dev, pfdev->comp->supply_names);
if (ret) {
/* Continue if the optional regulator is missing */
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h
index 111111111111..222222222222 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.h
+++ b/drivers/gpu/drm/panfrost/panfrost_device.h
@@ -107,6 +107,10 @@ struct panfrost_compatible {
/* Only required if num_pm_domains > 1. */
const char * const *pm_domain_names;
+ /* OPP clock count and names. */
+ int num_opp_clocks;
+ const char * const *opp_clk_names;
+
/* Vendor implementation quirks callback */
void (*vendor_quirk)(struct panfrost_device *pfdev);
diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
index 111111111111..222222222222 100644
--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
+++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
@@ -1152,6 +1152,17 @@ static const struct panfrost_compatible mediatek_mt8370_data = {
.gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
};
+static const char * const rockchip_opp_clks[] = { "gpu", NULL };
+static const struct panfrost_compatible rockchip_data = {
+ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+ .supply_names = default_supplies,
+ .num_pm_domains = 1,
+ .pm_domain_names = NULL,
+ .num_opp_clocks = ARRAY_SIZE(rockchip_opp_clks) - 1,
+ .opp_clk_names = rockchip_opp_clks,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+};
+
static const struct of_device_id dt_match[] = {
/* Set first to probe before the generic compatibles */
{ .compatible = "amlogic,meson-gxm-mali",
@@ -1178,6 +1189,8 @@ static const struct of_device_id dt_match[] = {
{ .compatible = "mediatek,mt8192-mali", .data = &mediatek_mt8192_data },
{ .compatible = "mediatek,mt8370-mali", .data = &mediatek_mt8370_data },
{ .compatible = "allwinner,sun50i-h616-mali", .data = &default_pm_rt_data },
+ { .compatible = "rockchip,rk3568-mali", .data = &rockchip_data },
+ { .compatible = "rockchip,rk3576-mali", .data = &rockchip_data },
{}
};
MODULE_DEVICE_TABLE(of, dt_match);
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 27 Apr 2025 20:34:01 +0000
Subject: RFC: dt-bindings: gpu: mali-valhall-csf: Add bus clock for RK3588
Add support for a bus clock for rockchip,rk3588-mali compatible.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
Documentation/devicetree/bindings/gpu/arm,mali-valhall-csf.yaml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/gpu/arm,mali-valhall-csf.yaml b/Documentation/devicetree/bindings/gpu/arm,mali-valhall-csf.yaml
index 111111111111..222222222222 100644
--- a/Documentation/devicetree/bindings/gpu/arm,mali-valhall-csf.yaml
+++ b/Documentation/devicetree/bindings/gpu/arm,mali-valhall-csf.yaml
@@ -40,7 +40,7 @@ properties:
clocks:
minItems: 1
- maxItems: 3
+ maxItems: 4
clock-names:
minItems: 1
@@ -50,6 +50,7 @@ properties:
- coregroup
- stacks
- const: stacks
+ - const: bus
nvmem-cells:
items:
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 27 Apr 2025 20:34:24 +0000
Subject: RFC: drm/panthor: Add support for a bus clk
On RK3588 the GPU clk is exposed using a normal CLK_GPU and also as
SCMI_CLK_GPU. The main clock for the GPU is the SCMI_CLK_GPU, however,
the normal CLK_GPU also need to be enabled independently.
Add support for a bus clk to handle these two different clocks, similar
to panfrost.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
drivers/gpu/drm/panthor/panthor_device.c | 16 +++++++++-
drivers/gpu/drm/panthor/panthor_device.h | 3 ++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c
index 111111111111..222222222222 100644
--- a/drivers/gpu/drm/panthor/panthor_device.c
+++ b/drivers/gpu/drm/panthor/panthor_device.c
@@ -47,6 +47,12 @@ static int panthor_clk_init(struct panthor_device *ptdev)
PTR_ERR(ptdev->clks.coregroup),
"get 'coregroup' clock failed");
+ ptdev->clks.bus = devm_clk_get_optional(ptdev->base.dev, "bus");
+ if (IS_ERR(ptdev->clks.bus))
+ return dev_err_probe(ptdev->base.dev,
+ PTR_ERR(ptdev->clks.bus),
+ "get 'bus' clock failed");
+
drm_info(&ptdev->base, "clock rate = %lu\n", clk_get_rate(ptdev->clks.core));
return 0;
}
@@ -499,10 +505,14 @@ int panthor_device_resume(struct device *dev)
atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_RESUMING);
- ret = clk_prepare_enable(ptdev->clks.core);
+ ret = clk_prepare_enable(ptdev->clks.bus);
if (ret)
goto err_set_suspended;
+ ret = clk_prepare_enable(ptdev->clks.core);
+ if (ret)
+ goto err_disable_bus_clk;
+
ret = clk_prepare_enable(ptdev->clks.stacks);
if (ret)
goto err_disable_core_clk;
@@ -561,6 +571,9 @@ int panthor_device_resume(struct device *dev)
err_disable_core_clk:
clk_disable_unprepare(ptdev->clks.core);
+err_disable_bus_clk:
+ clk_disable_unprepare(ptdev->clks.bus);
+
err_set_suspended:
atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED);
atomic_set(&ptdev->pm.recovery_needed, 1);
@@ -608,6 +621,7 @@ int panthor_device_suspend(struct device *dev)
clk_disable_unprepare(ptdev->clks.coregroup);
clk_disable_unprepare(ptdev->clks.stacks);
clk_disable_unprepare(ptdev->clks.core);
+ clk_disable_unprepare(ptdev->clks.bus);
atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED);
return 0;
}
diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h
index 111111111111..222222222222 100644
--- a/drivers/gpu/drm/panthor/panthor_device.h
+++ b/drivers/gpu/drm/panthor/panthor_device.h
@@ -142,6 +142,9 @@ struct panthor_device {
/** @clks: GPU clocks. */
struct {
+ /** @bus: Bus clock. This clock is optional. */
+ struct clk *bus;
+
/** @core: Core clock. */
struct clk *core;
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 27 Apr 2025 20:34:55 +0000
Subject: RFC: arm64: dts: rockchip: rk3588: Use scmi gpu clk as main GPU clock
CLK_GPU is the main clock for the GPU on RK3588, it's typical source
pll can be one of gpll, cpll, aupll, npll or spll. For higher clock
rates it is also possible to use the gpu pvtpll as pll source.
The logic to switch between a normal pll and the pvtpll depending on
rate is handled in TF-A firmware, and exposed to Linux as a scmi clock.
TF-A will typically change to use normal pll for rates up to 200 MHz and
use pvtpll for 300 MHz or more.
Change to use the SCMI_CLK_GPU as the main GPU clock and add the normal
CLK_GPU as a bus clk to model this in a similar way as on RK356x.
Prior to this change the GPU clk rate was max 850 MHz:
$ glmark2-es2-gbm -b terrain
[...]
GL_VENDOR: Mesa
GL_RENDERER: Mali-G610 (Panfrost)
GL_VERSION: OpenGL ES 3.1 Mesa 25.0.4
Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=0 samples=0
Surface Size: 800x600 fullscreen
[...]
[terrain] <default>: FPS: 139 FrameTime: 7.231 ms
After this the GPU clk rate can use the 1 GHz rate with PVTPLL:
[terrain] <default>: FPS: 152 FrameTime: 6.579 ms
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 10 +++++-----
arch/arm64/boot/dts/rockchip/rk3588-opp.dtsi | 5 +++++
arch/arm64/boot/dts/rockchip/rk3588j.dtsi | 5 +++++
3 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
index 111111111111..222222222222 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
@@ -450,11 +450,11 @@ gpu: gpu@fb000000 {
compatible = "rockchip,rk3588-mali", "arm,mali-valhall-csf";
reg = <0x0 0xfb000000 0x0 0x200000>;
#cooling-cells = <2>;
- assigned-clocks = <&scmi_clk SCMI_CLK_GPU>;
- assigned-clock-rates = <200000000>;
- clocks = <&cru CLK_GPU>, <&cru CLK_GPU_COREGROUP>,
- <&cru CLK_GPU_STACKS>;
- clock-names = "core", "coregroup", "stacks";
+ assigned-clocks = <&cru CLK_GPU>, <&scmi_clk SCMI_CLK_GPU>;
+ assigned-clock-rates = <198000000>, <200000000>;
+ clocks = <&scmi_clk SCMI_CLK_GPU>, <&cru CLK_GPU_COREGROUP>,
+ <&cru CLK_GPU_STACKS>, <&cru CLK_GPU>;
+ clock-names = "core", "coregroup", "stacks", "bus";
dynamic-power-coefficient = <2982>;
interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH 0>,
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-opp.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-opp.dtsi
index 111111111111..222222222222 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-opp.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588-opp.dtsi
@@ -176,6 +176,11 @@ opp-2400000000 {
gpu_opp_table: opp-table-gpu {
compatible = "operating-points-v2";
+ opp-200000000 {
+ opp-hz = /bits/ 64 <200000000>;
+ opp-microvolt = <675000 675000 850000>;
+ opp-suspend;
+ };
opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <675000 675000 850000>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3588j.dtsi b/arch/arm64/boot/dts/rockchip/rk3588j.dtsi
index 111111111111..222222222222 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588j.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588j.dtsi
@@ -69,6 +69,11 @@ opp-1608000000 {
gpu_opp_table: opp-table-gpu {
compatible = "operating-points-v2";
+ opp-200000000 {
+ opp-hz = /bits/ 64 <200000000>;
+ opp-microvolt = <750000 750000 850000>;
+ opp-suspend;
+ };
opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <750000 750000 850000>;
--
Armbian
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 27 Apr 2025 21:20:00 +0000
Subject: RFC: drm/panthor: Do not set clk rate when device is suspended
On Rockchip RK3588 trying to change the SCMI_CLK_GPU rate when the GPU
device is PM runtime suspended may cause a kernel panic:
$ echo 1000000000 > /sys/class/devfreq/fb000000.gpu/min_freq
SError Interrupt on CPU4, code 0x00000000be000411 -- SError
CPU: 4 UID: 0 PID: 241 Comm: sh Not tainted 6.15.0-rc3 #1 VOLUNTARY
Hardware name: Radxa ROCK 5B (DT)
pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : smc_send_message+0x140/0x148
lr : smc_send_message+0xd8/0x148
sp : ffff8000827138c0
x29: ffff8000827138c0 x28: ffff000008764000 x27: 0000000000000000
x26: 0000000000000000 x25: 00000000ffffffff x24: ffff800082713b28
x23: ffff00000696b010 x22: ffff000003db4da0 x21: ffff000003fdae80
x20: ffff0000053f22c0 x19: ffff000003db4d80 x18: 0000000000000000
x17: 0000000000000000 x16: 0000000000000000 x15: 00000000245df550
x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
x11: 0000000000000040 x10: ffff000003fde138 x9 : ffff000003fde130
x8 : ffff000005e5c948 x7 : 0000000000000000 x6 : 0000000000000000
x5 : 0000000000000000 x4 : 0000000000000000 x3 : 0000000000000000
x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000
Kernel panic - not syncing: Asynchronous SError Interrupt
CPU: 4 UID: 0 PID: 241 Comm: sh Not tainted 6.15.0-rc3 #1 VOLUNTARY
Hardware name: Radxa ROCK 5B (DT)
Call trace:
show_stack+0x28/0x78 (C)
dump_stack_lvl+0x58/0x74
dump_stack+0x14/0x1c
panic+0x14c/0x328
add_taint+0x0/0xc0
arm64_serror_panic+0x60/0x6c
do_serror+0x24/0x60
el1h_64_error_handler+0x2c/0x40
el1h_64_error+0x6c/0x70
smc_send_message+0x140/0x148 (P)
do_xfer+0xb0/0x1f8
scmi_clock_rate_set+0xc0/0x220
scmi_clk_set_rate+0x24/0x38
clk_change_rate+0x164/0x288
clk_core_set_rate_nolock+0x1dc/0x314
clk_set_rate+0x34/0x144
_opp_config_clk_single+0x2c/0x90
_set_opp+0x104/0x564
dev_pm_opp_set_rate+0x110/0x260
panthor_devfreq_target+0x38/0x60 [panthor]
devfreq_set_target+0x84/0x180
devfreq_update_target+0xb4/0xcc
update_devfreq+0x10/0x18
set_freq_store+0x6c/0xb4
dev_attr_store+0x14/0x24
sysfs_kf_write+0x54/0x60
kernfs_fop_write_iter+0x118/0x1e0
vfs_write+0x224/0x390
ksys_write+0x68/0x100
__arm64_sys_write+0x18/0x20
invoke_syscall+0x44/0x100
el0_svc_common.constprop.0+0x3c/0xe0
do_el0_svc+0x18/0x20
el0_svc+0x2c/0xc0
el0t_64_sync_handler+0x104/0x130
el0t_64_sync+0x170/0x174
SMP: stopping secondary CPUs
Kernel Offset: disabled
CPU features: 0x0e00,000000e0,01202650,8201700b
Memory Limit: 3838 MB
---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
This typically happen when CLK_GPU is disabled or when PD_GPU is down.
Add a config_clks ops that will not set core clk rate when the device is
PM runtime suspended.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
This could possible be limited to the rockchip,rk3588-mali compaible.
---
drivers/gpu/drm/panthor/panthor_devfreq.c | 44 ++++++++++
1 file changed, 44 insertions(+)
diff --git a/drivers/gpu/drm/panthor/panthor_devfreq.c b/drivers/gpu/drm/panthor/panthor_devfreq.c
index 111111111111..222222222222 100644
--- a/drivers/gpu/drm/panthor/panthor_devfreq.c
+++ b/drivers/gpu/drm/panthor/panthor_devfreq.c
@@ -130,6 +130,41 @@ static struct devfreq_dev_profile panthor_devfreq_profile = {
.get_cur_freq = panthor_devfreq_get_cur_freq,
};
+static int panthor_devfreq_config_clks(struct device *dev,
+ struct opp_table *opp_table,
+ struct dev_pm_opp *opp,
+ void *data, bool scaling_down)
+{
+ struct panthor_device *ptdev = dev_get_drvdata(dev);
+ struct devfreq *devfreq = ptdev->devfreq->devfreq;
+ unsigned long *target = data;
+ unsigned long freq;
+ int ret = 0;
+
+ /* One of target and opp must be available */
+ if (target) {
+ freq = *target;
+ } else if (opp) {
+ freq = dev_pm_opp_get_freq(opp);
+ } else {
+ WARN_ON(1);
+ return -EINVAL;
+ }
+
+ pm_runtime_get_noresume(dev);
+
+ if (!pm_runtime_suspended(dev) || !devfreq || !devfreq->suspend_freq) {
+ ret = clk_set_rate(ptdev->clks.core, freq);
+ if (ret)
+ dev_err(dev, "failed to set clock rate %lu: %d\n",
+ freq, ret);
+ }
+
+ pm_runtime_put_noidle(dev);
+
+ return ret;
+}
+
int panthor_devfreq_init(struct panthor_device *ptdev)
{
/* There's actually 2 regulators (mali and sram), but the OPP core only
@@ -139,6 +174,11 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
* the coupling logic deal with voltage updates.
*/
static const char * const reg_names[] = { "mali", NULL };
+ static const char * const clk_names[] = { "core", NULL };
+ struct dev_pm_opp_config config = {
+ .clk_names = clk_names,
+ .config_clks = panthor_devfreq_config_clks,
+ };
struct thermal_cooling_device *cooling;
struct device *dev = ptdev->base.dev;
struct panthor_devfreq *pdevfreq;
@@ -164,6 +204,10 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
*/
table = dev_pm_opp_get_opp_table(dev);
if (IS_ERR_OR_NULL(table)) {
+ ret = devm_pm_opp_set_config(dev, &config);
+ if (ret)
+ return ret;
+
ret = devm_pm_opp_set_regulators(dev, reg_names);
if (ret && ret != -ENODEV) {
if (ret != -EPROBE_DEFER)
--
Armbian