2024-01-10 14:25:29

by Nícolas F. R. A. Prado

[permalink] [raw]
Subject: [PATCH v2 0/2] Fixes for hang on MT8195-Tomato during mediatek-cpufreq-hw init


These two patches fix an issue observed on MT8195-Tomato where if the
mediatek-cpufreq-hw driver enabled the hardware (by writing to
REG_FREQ_ENABLE) before the SPMI controller driver (spmi-mtk-pmif),
behind which lies the big CPU supply, probed the platform would hang
shortly after with "rcu: INFO: rcu_preempt detected stalls on
CPUs/tasks" being printed in the log.

Changes in v2:
- Moved supply phandles to CPU nodes in DT
- Added fixes tags
- Added patch to verify CPU supplies are available before proceeding in
the mediatek-cpufreq-hw driver

Nícolas F. R. A. Prado (2):
arm64: dts: mediatek: cherry: Describe CPU supplies
cpufreq: mediatek-hw: Wait for CPU supplies before probing

.../boot/dts/mediatek/mt8195-cherry.dtsi | 32 +++++++++++++++++++
drivers/cpufreq/mediatek-cpufreq-hw.c | 19 ++++++++++-
2 files changed, 50 insertions(+), 1 deletion(-)

--
2.43.0



2024-01-10 14:25:43

by Nícolas F. R. A. Prado

[permalink] [raw]
Subject: [PATCH v2 1/2] arm64: dts: mediatek: cherry: Describe CPU supplies

Describe in each CPU node the regulator supplying it.

Fixes: 260c04d425eb ("arm64: dts: mediatek: cherry: Enable MT6315 regulators on SPMI bus")
Signed-off-by: Nícolas F. R. A. Prado <[email protected]>

---

Changes in v2:
- Moved supplies to CPU nodes
- Added fixes tag

.../boot/dts/mediatek/mt8195-cherry.dtsi | 32 +++++++++++++++++++
1 file changed, 32 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi b/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi
index 3c6079edda19..1f3a6755f155 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi
@@ -264,6 +264,38 @@ &auxadc {
status = "okay";
};

+&cpu0 {
+ cpu-supply = <&mt6359_vcore_buck_reg>;
+};
+
+&cpu1 {
+ cpu-supply = <&mt6359_vcore_buck_reg>;
+};
+
+&cpu2 {
+ cpu-supply = <&mt6359_vcore_buck_reg>;
+};
+
+&cpu3 {
+ cpu-supply = <&mt6359_vcore_buck_reg>;
+};
+
+&cpu4 {
+ cpu-supply = <&mt6315_6_vbuck1>;
+};
+
+&cpu5 {
+ cpu-supply = <&mt6315_6_vbuck1>;
+};
+
+&cpu6 {
+ cpu-supply = <&mt6315_6_vbuck1>;
+};
+
+&cpu7 {
+ cpu-supply = <&mt6315_6_vbuck1>;
+};
+
&dp_intf0 {
status = "okay";

--
2.43.0


Subject: Re: [PATCH v2 1/2] arm64: dts: mediatek: cherry: Describe CPU supplies

Il 10/01/24 15:23, Nícolas F. R. A. Prado ha scritto:
> Describe in each CPU node the regulator supplying it.
>
> Fixes: 260c04d425eb ("arm64: dts: mediatek: cherry: Enable MT6315 regulators on SPMI bus")
> Signed-off-by: Nícolas F. R. A. Prado <[email protected]>
>

Reviewed-by: AngeloGioacchino Del Regno <[email protected]>



2024-01-10 14:37:05

by Nícolas F. R. A. Prado

[permalink] [raw]
Subject: [PATCH v2 2/2] cpufreq: mediatek-hw: Wait for CPU supplies before probing

Before proceeding with the probe and enabling frequency scaling for the
CPUs, make sure that all supplies feeding the CPUs have probed.

This fixes an issue observed on MT8195-Tomato where if the
mediatek-cpufreq-hw driver enabled the hardware (by writing to
REG_FREQ_ENABLE) before the SPMI controller driver (spmi-mtk-pmif),
behind which lies the big CPU supply, probed the platform would hang
shortly after with "rcu: INFO: rcu_preempt detected stalls on
CPUs/tasks" being printed in the log.

Fixes: 4855e26bcf4d ("cpufreq: mediatek-hw: Add support for CPUFREQ HW")
Signed-off-by: Nícolas F. R. A. Prado <[email protected]>

---

Changes in v2:
- Added this commit

drivers/cpufreq/mediatek-cpufreq-hw.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/cpufreq/mediatek-cpufreq-hw.c b/drivers/cpufreq/mediatek-cpufreq-hw.c
index d46afb3c0092..a1aa9385980a 100644
--- a/drivers/cpufreq/mediatek-cpufreq-hw.c
+++ b/drivers/cpufreq/mediatek-cpufreq-hw.c
@@ -13,6 +13,7 @@
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
+#include <linux/regulator/consumer.h>
#include <linux/slab.h>

#define LUT_MAX_ENTRIES 32U
@@ -300,7 +301,23 @@ static struct cpufreq_driver cpufreq_mtk_hw_driver = {
static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev)
{
const void *data;
- int ret;
+ int ret, cpu;
+ struct device *cpu_dev;
+ struct regulator *cpu_reg;
+
+ /* Make sure that all CPU supplies are available before proceeding. */
+ for_each_possible_cpu(cpu) {
+ cpu_dev = get_cpu_device(cpu);
+ if (!cpu_dev)
+ return dev_err_probe(&pdev->dev, -EPROBE_DEFER,
+ "Failed to get cpu%d device\n", cpu);
+
+ cpu_reg = devm_regulator_get_optional(cpu_dev, "cpu");
+ if (IS_ERR(cpu_reg))
+ return dev_err_probe(&pdev->dev, PTR_ERR(cpu_reg),
+ "CPU%d regulator get failed\n", cpu);
+ }
+

data = of_device_get_match_data(&pdev->dev);
if (!data)
--
2.43.0


2024-01-22 08:54:56

by Matthias Brugger

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] cpufreq: mediatek-hw: Wait for CPU supplies before probing



On 10/01/2024 15:23, Nícolas F. R. A. Prado wrote:
> Before proceeding with the probe and enabling frequency scaling for the
> CPUs, make sure that all supplies feeding the CPUs have probed.
>
> This fixes an issue observed on MT8195-Tomato where if the
> mediatek-cpufreq-hw driver enabled the hardware (by writing to
> REG_FREQ_ENABLE) before the SPMI controller driver (spmi-mtk-pmif),
> behind which lies the big CPU supply, probed the platform would hang
> shortly after with "rcu: INFO: rcu_preempt detected stalls on
> CPUs/tasks" being printed in the log.
>
> Fixes: 4855e26bcf4d ("cpufreq: mediatek-hw: Add support for CPUFREQ HW")
> Signed-off-by: Nícolas F. R. A. Prado <[email protected]>

Reviewed-by: Matthias Brugger <[email protected]>

>
> ---
>
> Changes in v2:
> - Added this commit
>
> drivers/cpufreq/mediatek-cpufreq-hw.c | 19 ++++++++++++++++++-
> 1 file changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cpufreq/mediatek-cpufreq-hw.c b/drivers/cpufreq/mediatek-cpufreq-hw.c
> index d46afb3c0092..a1aa9385980a 100644
> --- a/drivers/cpufreq/mediatek-cpufreq-hw.c
> +++ b/drivers/cpufreq/mediatek-cpufreq-hw.c
> @@ -13,6 +13,7 @@
> #include <linux/of.h>
> #include <linux/of_platform.h>
> #include <linux/platform_device.h>
> +#include <linux/regulator/consumer.h>
> #include <linux/slab.h>
>
> #define LUT_MAX_ENTRIES 32U
> @@ -300,7 +301,23 @@ static struct cpufreq_driver cpufreq_mtk_hw_driver = {
> static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev)
> {
> const void *data;
> - int ret;
> + int ret, cpu;
> + struct device *cpu_dev;
> + struct regulator *cpu_reg;
> +
> + /* Make sure that all CPU supplies are available before proceeding. */
> + for_each_possible_cpu(cpu) {
> + cpu_dev = get_cpu_device(cpu);
> + if (!cpu_dev)
> + return dev_err_probe(&pdev->dev, -EPROBE_DEFER,
> + "Failed to get cpu%d device\n", cpu);
> +
> + cpu_reg = devm_regulator_get_optional(cpu_dev, "cpu");
> + if (IS_ERR(cpu_reg))
> + return dev_err_probe(&pdev->dev, PTR_ERR(cpu_reg),
> + "CPU%d regulator get failed\n", cpu);
> + }
> +
>
> data = of_device_get_match_data(&pdev->dev);
> if (!data)

2024-01-23 06:10:06

by Viresh Kumar

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] cpufreq: mediatek-hw: Wait for CPU supplies before probing

On 10-01-24, 11:23, N?colas F. R. A. Prado wrote:
> Before proceeding with the probe and enabling frequency scaling for the
> CPUs, make sure that all supplies feeding the CPUs have probed.
>
> This fixes an issue observed on MT8195-Tomato where if the
> mediatek-cpufreq-hw driver enabled the hardware (by writing to
> REG_FREQ_ENABLE) before the SPMI controller driver (spmi-mtk-pmif),
> behind which lies the big CPU supply, probed the platform would hang
> shortly after with "rcu: INFO: rcu_preempt detected stalls on
> CPUs/tasks" being printed in the log.
>
> Fixes: 4855e26bcf4d ("cpufreq: mediatek-hw: Add support for CPUFREQ HW")
> Signed-off-by: N?colas F. R. A. Prado <[email protected]>

Applied 2/2. Thanks.

--
viresh

2024-02-29 20:23:46

by Nícolas F. R. A. Prado

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] arm64: dts: mediatek: cherry: Describe CPU supplies

On Wed, Jan 10, 2024 at 03:32:02PM +0100, AngeloGioacchino Del Regno wrote:
> Il 10/01/24 15:23, N?colas F. R. A. Prado ha scritto:
> > Describe in each CPU node the regulator supplying it.
> >
> > Fixes: 260c04d425eb ("arm64: dts: mediatek: cherry: Enable MT6315 regulators on SPMI bus")
> > Signed-off-by: N?colas F. R. A. Prado <[email protected]>
> >
>
> Reviewed-by: AngeloGioacchino Del Regno <[email protected]>

Hello,

looks like this patch was never picked up, while the cpufreq part has been
merged for a while, so I'm still getting the mentioned hangs on linux-next.
Could this be queued? :)

Thanks,
N?colas

Subject: Re: [PATCH v2 1/2] arm64: dts: mediatek: cherry: Describe CPU supplies

Il 29/02/24 21:23, Nícolas F. R. A. Prado ha scritto:
> On Wed, Jan 10, 2024 at 03:32:02PM +0100, AngeloGioacchino Del Regno wrote:
>> Il 10/01/24 15:23, Nícolas F. R. A. Prado ha scritto:
>>> Describe in each CPU node the regulator supplying it.
>>>
>>> Fixes: 260c04d425eb ("arm64: dts: mediatek: cherry: Enable MT6315 regulators on SPMI bus")
>>> Signed-off-by: Nícolas F. R. A. Prado <[email protected]>
>>>
>>
>> Reviewed-by: AngeloGioacchino Del Regno <[email protected]>
>
> Hello,
>
> looks like this patch was never picked up, while the cpufreq part has been
> merged for a while, so I'm still getting the mentioned hangs on linux-next.
> Could this be queued? :)
>
> Thanks,
> Nícolas

Will send that on the next -fixes round.

Thanks for the reminder.

2024-03-01 14:30:31

by Nícolas F. R. A. Prado

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] arm64: dts: mediatek: cherry: Describe CPU supplies

+CC Nicolas Dufresne <[email protected]>

As he told me he was experiencing the hangs fixed in this series too.

On Wed, Jan 10, 2024 at 11:23:01AM -0300, N?colas F. R. A. Prado wrote:
> Describe in each CPU node the regulator supplying it.
>
> Fixes: 260c04d425eb ("arm64: dts: mediatek: cherry: Enable MT6315 regulators on SPMI bus")
> Signed-off-by: N?colas F. R. A. Prado <[email protected]>
>
> ---
>
> Changes in v2:
> - Moved supplies to CPU nodes
> - Added fixes tag
>
> .../boot/dts/mediatek/mt8195-cherry.dtsi | 32 +++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi b/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi
> index 3c6079edda19..1f3a6755f155 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi
> @@ -264,6 +264,38 @@ &auxadc {
> status = "okay";
> };
>
> +&cpu0 {
> + cpu-supply = <&mt6359_vcore_buck_reg>;
> +};
> +
> +&cpu1 {
> + cpu-supply = <&mt6359_vcore_buck_reg>;
> +};
> +
> +&cpu2 {
> + cpu-supply = <&mt6359_vcore_buck_reg>;
> +};
> +
> +&cpu3 {
> + cpu-supply = <&mt6359_vcore_buck_reg>;
> +};
> +
> +&cpu4 {
> + cpu-supply = <&mt6315_6_vbuck1>;
> +};
> +
> +&cpu5 {
> + cpu-supply = <&mt6315_6_vbuck1>;
> +};
> +
> +&cpu6 {
> + cpu-supply = <&mt6315_6_vbuck1>;
> +};
> +
> +&cpu7 {
> + cpu-supply = <&mt6315_6_vbuck1>;
> +};
> +
> &dp_intf0 {
> status = "okay";
>
> --
> 2.43.0
>