linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Eduardo Valentin <edubezval@gmail.com>
To: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Rafael Wysocki <rjw@rjwysocki.net>,
	Lists linaro-kernel <linaro-kernel@lists.linaro.org>,
	"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
	Lukasz Majewski <l.majewski@samsung.com>
Subject: Re: [PATCH] cpufreq-dt: register cooling device after validating cpufreq table
Date: Mon, 24 Nov 2014 21:44:37 -0400	[thread overview]
Message-ID: <20141125014435.GA28906@developer> (raw)
In-Reply-To: <CAKohpokF8qFUz-bmKT61L879L60GYzsc3X3BRHofLYWAdHa3rg@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 3213 bytes --]


Viresh,

On Tue, Nov 25, 2014 at 04:27:44PM +0530, Viresh Kumar wrote:
> On 24 November 2014 at 23:40, Eduardo Valentin <edubezval@gmail.com> wrote:
> > Is it possible to have this registration only when we have a
> > cpufreq driver up and running? The reasoning is that only after we have
> > a way to control cpu frequencies, it makes sense to have the cpu_cooling
> > device.
> >
> > I am planing to have the following check in the cpu cooling code:
> >         if (!cpufreq_get_current_driver()) {
> >                 dev_dbg(bgp->dev, "no cpufreq driver yet\n");
> >                 return -EPROBE_DEFER;
> >         }
> >
> > that is the way I think of checking if the cpufreq layer is ready to
> > have a cpu cooling on top of it. Currently, thermal drivers check this
> > before calling cpu cooling registration. But instead of having this
> > check in every driver, I would like to move it to cpu cooling.
> >
> > However, for cpufreq-dt, the registration currently happens in the
> > init phase, not in probe, so cpufreq driver is not registered, and thus
> > the check won't work.
> 
> This is how the phases are present in cpufreq drivers:
> -> platform_init
>     -> probe()
>         ->cpufreq_driver->init()

You are right! I got confused because even with your patch, the
sequencing is not working. Looking to that behavior I, somehow, thought
the _init function in cpufreq-dt was about init() calls. But in fact, it
is driver initialization callback.


> 
> And the cooling device is registered in cpufreq_driver->init() and by
> the time ->init() is called, cpufreq_driver is valid.

However, by the time of ->init() the cpufreq_driver is not really ready.
Or at least, the cpufreq layer is not ready. A call to

cpufreq_frequency_get_table()

for instance, it is not working. The reasoning is because
cpufreq_add_dev() is still not finalized by the time driver->init() is
called. Meaning, the policy cannot be fetch because the cpu masks have
not been set by that time. More important, in order to fetch the cpufreq
table we would need to have the cpufreq_cpu_data properly initialized
per cpu. In other words, when we call driver->init() that happens
before the following code:
	cpumask_and(policy->cpus, policy->cpus, cpu_online_mask);

	if (!recover_policy) {
		policy->user_policy.min = policy->min;
		policy->user_policy.max =
		policy->max;
	}

	down_write(&policy->rwsem);
	write_lock_irqsave(&cpufreq_driver_lock, flags);
	for_each_cpu(j, policy->cpus)
		per_cpu(cpufreq_cpu_data, j) = policy;
	write_unlock_irqrestore(&cpufreq_driver_lock, flags);

The thing is, with current code:
cpufreq_add_dev()
	-> cpufreq-dt->init() 
		-> of_cpufreq_cooling_register()
			-> cpufreq_frequency_get_table()
				-> returns NULL;

Returns invalid data because it is not initialized yet.

The cpufreq-dt would need to add the of based cpufreq cooling only when
cpufreq layer is ready. Any other better cpufreq driver callback to add
the cpu cooling?

We could sort this out by polling in thermal layer for the cpufreq table
until it gets ready, but I believe that would be a dirty hack.

Cheers,

Eduardo Valentin

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

  reply	other threads:[~2014-11-25 13:46 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-24 10:59 [PATCH] cpufreq-dt: register cooling device after validating cpufreq table Viresh Kumar
2014-11-24 18:10 ` Eduardo Valentin
2014-11-25 10:57   ` Viresh Kumar
2014-11-25  1:44     ` Eduardo Valentin [this message]
2014-11-25 15:26       ` Viresh Kumar
2014-11-25 20:47         ` Rafael J. Wysocki
2014-11-26  3:28           ` Viresh Kumar
2014-11-25 10:56 ` Lukasz Majewski
2014-11-25 21:49 ` Rafael J. Wysocki
2014-11-25 22:05   ` Rafael J. Wysocki
2014-11-26  5:57     ` Viresh Kumar
2014-11-26  6:02       ` Viresh Kumar
2014-11-26 15:10       ` Eduardo Valentin
2014-11-26 22:57         ` Rafael J. Wysocki
2014-11-26  3:30   ` Viresh Kumar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141125014435.GA28906@developer \
    --to=edubezval@gmail.com \
    --cc=l.majewski@samsung.com \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    --cc=viresh.kumar@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).