Re: [PATCH V2 2/2] cpufreq: dt: Refactor initialization to handle probe deferral properly

From: Viresh Kumar
Date: Fri Oct 16 2020 - 04:07:39 EST


On 16-10-20, 08:44, Geert Uytterhoeven wrote:
> On Fri, Oct 16, 2020 at 7:03 AM Viresh Kumar <viresh.kumar@xxxxxxxxxx> wrote:
> > On 14-10-20, 18:40, Geert Uytterhoeven wrote:
> > > On this platform (r8a7791-koelsch.dts), there is no opp table in DT.
>
> I think you missed the clue above:

I read it earlier as well.

> this DTS does not have an opp-table
> with operating-points-v2, but cpu0 does have the operating-points (v1)
> property (note the latter is something I missed before).

This is different than having no OPP table in DT.

> > >
> > > Before:
> >
> > I assume this means before this patchset came in..
>
> Indeed.
>
> > > boot:
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:362
> > > cpu cpu0: resources_available:95
> > > cpu cpu0: resources_available:102: clk_get() returned z
> > > cpu cpu0: resources_available:120:
> > > dev_pm_opp_of_find_icc_paths() returned 0
> > > cpu cpu0: resources_available:125: find_supply_name() returned cpu0
> > > cpu cpu0: resources_available:132: regulator_get_optional()
> > > returned -EPROBE_DEFER
> > > cpu cpu0: cpu0 regulator not ready, retry
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:371:
> > > resources_available() returned -517
> >
> > we deferred probe once.
> >
> > > ...
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:362
> > > cpu cpu0: resources_available:95
> > > cpu cpu0: resources_available:102: clk_get() returned z
> > > cpu cpu0: resources_available:120:
> > > dev_pm_opp_of_find_icc_paths() returned 0
> > > cpu cpu0: resources_available:125: find_supply_name() returned cpu0
> > > cpu cpu0: resources_available:132: regulator_get_optional()
> > > returned (ptrval)
> >
> > found regulator next time.
> >
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:371:
> > > resources_available() returned 0
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:375
> > > cpufreq_dt: cpufreq_init:162
> > > cpu cpu0: cpufreq_init:170: clk_get() returned z
> > > cpu cpu0: cpufreq_init:179: dev_pm_opp_of_get_sharing_cpus() returned -2
> > > cpu cpu0: cpufreq_init:198: find_supply_name() returned cpu0
> > > <i2c comm>
> > > cpu cpu0: cpufreq_init:201: dev_pm_opp_set_regulators() returned (ptrval)
> > > <i2c comm>
> > > cpu cpu0: cpufreq_init:230: dev_pm_opp_of_cpumask_add_table() returned 0
> > > cpu cpu0: cpufreq_init:239: dev_pm_opp_get_opp_count() returned 0
> > > cpu cpu0: OPP table is not ready, deferring probe
> >
> > This failed, as we couldn't have deferred probe from cpufreq_init.
> > Which means that cpufreq didn't work here.
>
> No opp-table in DT.

V1 is also an OPP table.

> Shouldn't it use operating-points v1 instead?

Both v1 and v2 are considered as OPP tables. When we say that the
opp-count is 0, it means that it failed to find any of them.

> > > cpufreq_dt: cpufreq_init:162
> > > cpu cpu1: cpufreq_init:170: clk_get() returned z
> > > cpu cpu1: cpufreq_init:179: dev_pm_opp_of_get_sharing_cpus() returned -2
> > > cpu cpu1: no regulator for cpu1
> > > cpu cpu1: cpufreq_init:198: find_supply_name() returned (null)
> > > cpu cpu1: cpufreq_init:230: dev_pm_opp_of_cpumask_add_table() returned 0
> > > cpu cpu1: cpufreq_init:239: dev_pm_opp_get_opp_count() returned 0
> > > cpu cpu1: OPP table is not ready, deferring probe
> >
> > Same for CPU1.
>
> Note that only CPU0 has operating-points v1.

Both should have it ideally, though it works if CPU0 gets probed
first. But if CPU0 is hotplugged out and we try to probe CPU1, then it
will fail.

The fact that cpufreq core tried to probe CPU1 means that it failed
for CPU0. And this is before the patchset in question came in.

I don't think cpufreq was working earlier for your platform, please
check why.

> >
> > >
> > > s2ram:
> > > cpufreq_dt: cpufreq_init:162
> > > cpu cpu1: cpufreq_init:170: clk_get() returned z
> > > cpu cpu1: cpufreq_init:179: dev_pm_opp_of_get_sharing_cpus() returned -2
> > > cpu cpu1: no regulator for cpu1
> > > cpu cpu1: cpufreq_init:198: find_supply_name() returned (null)
> > > cpu cpu1: cpufreq_init:230: dev_pm_opp_of_cpumask_add_table() returned 0
> > > cpu cpu1: cpufreq_init:239: dev_pm_opp_get_opp_count() returned 0
> > > cpu cpu1: OPP table is not ready, deferring probe
> >
> > And same here.
> >
> > > CPU1 is up
> > >
> > > After:
> > > boot:
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:356
> > > cpufreq_dt: dt_cpufreq_early_init:251
> > > cpu cpu0: dt_cpufreq_early_init:256
> > > cpu cpu0: dt_cpufreq_early_init:271: dev_pm_opp_get_opp_table()
> > > returned (ptrval)
> > > cpu cpu0: dt_cpufreq_early_init:284: find_supply_name() returned cpu0
> > > cpu cpu0: dt_cpufreq_early_init:288: dev_pm_opp_set_regulators()
> > > returned -EPROBE_DEFER
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:360:
> > > dt_cpufreq_early_init() returned -517
> > > ...
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:356
> > > cpufreq_dt: dt_cpufreq_early_init:251
> > > cpu cpu0: dt_cpufreq_early_init:256
> > > cpu cpu0: dt_cpufreq_early_init:271: dev_pm_opp_get_opp_table()
> > > returned (ptrval)
> > > cpu cpu0: dt_cpufreq_early_init:284: find_supply_name() returned cpu0
> > > cpu cpu0: dt_cpufreq_early_init:288: dev_pm_opp_set_regulators()
> > > returned (ptrval)
> > > cpu cpu0: dt_cpufreq_early_init:301:
> > > dev_pm_opp_of_get_sharing_cpus() returned -2
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:360:
> > > dt_cpufreq_early_init() returned 0
> > > cpufreq_dt: dt_cpufreq_early_init:251
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:360:
> > > dt_cpufreq_early_init() returned 0
> > > cpufreq-dt cpufreq-dt: dt_cpufreq_probe:365
> > > cpufreq_dt: cpufreq_init:114
> > > cpu cpu0: cpufreq_init:124: clk_get() returned z
> > > cpu cpu0: cpufreq_init:142: dev_pm_opp_of_cpumask_add_table() returned 0
> > > cpu cpu0: cpufreq_init:151: dev_pm_opp_get_opp_count() returned 0
> > > cpu cpu0: OPP table can't be empty
> >
> > Same issue here.
> >
> > > cpufreq_dt: cpufreq_init:114
> > > cpu cpu0: cpufreq_init:124: clk_get() returned z
> > > <i2c comm>
> > > cpu cpu0: cpufreq_init:142: dev_pm_opp_of_cpumask_add_table() returned 0
> > > cpu cpu0: cpufreq_init:151: dev_pm_opp_get_opp_count() returned 0
> > >
> > > s2ram:
> > >
> > > cpufreq_dt: cpufreq_init:114
> > > cpu cpu0: cpufreq_init:124: clk_get() returned z
> > > WARNING: CPU: 1 PID: 14 at drivers/i2c/i2c-core.h:54
> > > __i2c_transfer+0x2d8/0x310
> > > i2c i2c-6: Transfer while suspended
> > > cpu cpu0: cpufreq_init:142: dev_pm_opp_of_cpumask_add_table() returned 0
> > > cpu cpu0: cpufreq_init:151: dev_pm_opp_get_opp_count() returned 0
> > > cpu cpu0: OPP table can't be empty
> > > CPU1 is up
> > >
> > > I hope this helps.
> >
> > Unfortunately it raised more questions than what it answered :(
>
> Before, it bailed out before talking to the regulator during s2ram,
> After, it talks to the regulator before bailing out, triggering the WARN().

It wasn't working before and it isn't working now. Though I do see a
problem with cpufreq core where it tries suspend/resume even though
->init() failed for all CPUs earlier. I will fix that separately.

I think someone needs to see why it wasn't working earlier and then we
can see if we have pending issues.

--
viresh