[V8,3/3] OPP: Allow "opp-hz" and "opp-microvolt" to contain magic values

Message ID 476d7ae69184d787ccc6d99f8df6069007fd0a91.1513591822.git.viresh.kumar@linaro.org
State New
Headers show
Series
  • [V8,1/3] OPP: Allow OPP table to be used for power-domains
Related show

Commit Message

Viresh Kumar Dec. 18, 2017, 10:21 a.m.
On some platforms the exact frequency or voltage may be hidden from the
OS by the firmware. Allow such configurations to pass magic values in
the "opp-hz" or the "opp-microvolt" properties, which should be
interpreted in a platform dependent way.

Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

---
 Documentation/devicetree/bindings/opp/opp.txt | 6 ++++++
 1 file changed, 6 insertions(+)

-- 
2.15.0.194.g9af6a3dea062

Comments

Rob Herring Dec. 27, 2017, 9:54 p.m. | #1
On Wed, Dec 27, 2017 at 2:56 AM, Viresh Kumar <viresh.kumar@linaro.org> wrote:
> On 26-12-17, 14:29, Rob Herring wrote:

>> On Mon, Dec 18, 2017 at 03:51:30PM +0530, Viresh Kumar wrote:

>

>> > +On some platforms the exact frequency or voltage may be hidden from the OS by

>> > +the firmware and the "opp-hz" or the "opp-microvolt" properties may contain

>> > +magic values that represent the frequency or voltage in a firmware dependent

>> > +way, for example an index of an array in the firmware.

>>

>> I'm still not convinced this is a good idea.

>

> You were kind-of a few days back :)

>

> lkml.kernel.org/r/CAL_JsqK-qtAaM_Ou5NtxcWR3F_q=8rMPJUm-VqGtKhbtWe5SAQ@mail.gmail.com


Yeah, well that was before Stephen said anything.

> So here is the deal:

>

> - I proposed "domain-performance-state" property for this stuff

>   initially.

> - But Kevin didn't like that and proposed reusing "opp-hz" and

>   "opp-microvolt", which we all agreed to multiple times..

> - And we are back to the same discussion now and its painful and time

>   killing for all of us.


There's bigger issues than where we put magic values as I raised in
the other patch.

> TBH, I don't have too strong preferences about any of the suggestions

> you guys have and I need you guys to tell me what binding changes to

> do here and I will do that.

>

>> If you have firmware

>> partially managing things, then I think we should have platform specific

>> bindings or drivers.

>

> What about the initial idea then, like "performance-state" for the

> power domains ? All platforms will anyway replicate that binding only.


I don't really know. I don't really care either. I'll probably go
along with what everyone agrees to, but the only one I see any
agreement from is Ulf. Also, it is pretty vague as to what platforms
will use this. You claimed you can support QCom scenarios, but there's
really no evidence that that is true. What I don't want to see is this
merged and then we need something more yet again in a few months for
another platform.

Rob
Viresh Kumar Dec. 28, 2017, 4:37 a.m. | #2
On 27-12-17, 15:54, Rob Herring wrote:
> On Wed, Dec 27, 2017 at 2:56 AM, Viresh Kumar <viresh.kumar@linaro.org> wrote:

> > On 26-12-17, 14:29, Rob Herring wrote:

> >> On Mon, Dec 18, 2017 at 03:51:30PM +0530, Viresh Kumar wrote:

> >

> >> > +On some platforms the exact frequency or voltage may be hidden from the OS by

> >> > +the firmware and the "opp-hz" or the "opp-microvolt" properties may contain

> >> > +magic values that represent the frequency or voltage in a firmware dependent

> >> > +way, for example an index of an array in the firmware.

> >>

> >> I'm still not convinced this is a good idea.

> >

> > You were kind-of a few days back :)

> >

> > lkml.kernel.org/r/CAL_JsqK-qtAaM_Ou5NtxcWR3F_q=8rMPJUm-VqGtKhbtWe5SAQ@mail.gmail.com

> 

> Yeah, well that was before Stephen said anything.

> 

> > So here is the deal:

> >

> > - I proposed "domain-performance-state" property for this stuff

> >   initially.

> > - But Kevin didn't like that and proposed reusing "opp-hz" and

> >   "opp-microvolt", which we all agreed to multiple times..

> > - And we are back to the same discussion now and its painful and time

> >   killing for all of us.

> 

> There's bigger issues than where we put magic values as I raised in

> the other patch.

> 

> > TBH, I don't have too strong preferences about any of the suggestions

> > you guys have and I need you guys to tell me what binding changes to

> > do here and I will do that.

> >

> >> If you have firmware

> >> partially managing things, then I think we should have platform specific

> >> bindings or drivers.

> >

> > What about the initial idea then, like "performance-state" for the

> > power domains ? All platforms will anyway replicate that binding only.

> 

> I don't really know. I don't really care either. I'll probably go

> along with what everyone agrees to, but the only one I see any

> agreement from is Ulf. Also, it is pretty vague as to what platforms

> will use this. You claimed you can support QCom scenarios, but there's

> really no evidence that that is true.


Well, I sent out the code few days back based on these bindings and everyone can
see how these bindings will get used now.

> What I don't want to see is this

> merged and then we need something more yet again in a few months for

> another platform.


Sure, I get your concerns.

So what we need now is:

- Stephen to start responding and clarify all the doubts he had as being silent
  isn't helping.

- Or Rajendra to post patches which can prove that this is usable. The last time
  I had a chat with him, he confirmed that he will post patches after 4.15-rc1
  and he should have posted them by now, but he didn't :(

-- 
viresh
Stephen Boyd Jan. 5, 2018, 10:19 p.m. | #3
On 12/29, Viresh Kumar wrote:
> On 28-12-17, 16:32, Stephen Boyd wrote:

> > On 12/28, Viresh Kumar wrote:

> 

> > > So what we need now is:

> > > 

> > > - Stephen to start responding and clarify all the doubts he had as being silent

> > >   isn't helping.

> > 

> > What can I reply to specifically?

> 

> I explained in detail how this stuff is going to get used last time you replied.

> Did you get a chance to look at that ? What am I supposed to do when you don't

> reply back to the clarifications I provide ?

> 

> https://marc.info/?l=linux-kernel&m=151202516128980&w=2

> 

> > From what I can tell, the

> > patches have changed to this 'opp-required' thing in the past

> > week and the position of 'generic OPP layer interprets magic

> > values' doesn't look to have changed. Is that the summary? I can

> > look deeply at the patches tomorrow.

> 

> Kind of yeah, because you didn't reply to my explanation on how the magic values

> are going to get used and so they never changed. Again, I don't have problems

> adding new property for performance-state thing or leave it for the platform,

> but I was sticking around the magic values because Kevin was strongly in favor

> of that earlier.


Could you please point to Kevin's comments and also include the
reasoning behind magic values in the commit text for the patch?
It would be very helpful to know why something is done a certain
way. The two to three line commit text in this patch is not
helpful right now.

> 

> > > - Or Rajendra to post patches which can prove that this is usable. The last time

> > >   I had a chat with him, he confirmed that he will post patches after 4.15-rc1

> > >   and he should have posted them by now, but he didn't :(

> > > 

> > 

> > I'd prefer either that, or some tree here that we can look at.

> 

> I am quite sure Rajendra can help here, he had been testing this stuff on *real*

> hardware for ages now with me. This is what he shared with me earlier, based on

> what we have merged in the kernel today..

> 

> https://github.com/rrnayak/linux/commits/genpd-performance-state


Thanks for the pointer. That whole matching devices with
of_match_device() is not looking good.

I don't see how we're going to convince each driver to move to
using the OPP framework to set a performance state + clk
frequency when they're going to want/need to have certain clks
and regulators in hand to do something besides set the frequency
or voltage. Probably we're going to have a hybrid approach, where
some drivers can just set rate and voltage through OPP because
it's fairly well fixed (think CPU or GPU frequency scaling),
while other drivers are going to set frequency and
voltage/performance state based on some calculation of their
required frequency (think of display panels or even the uart baud
rate or i2c bus frequency requirements).

For these other drivers, I don't really want to see the OPP
framework proxy all the clk and regulator calls into the
appropriate framework by wrapping clk_round_rate(),
regulator_set_load(), etc. with opp_*() APIs. This becomes
especially annoying if OPP framework is grabbing and holding
these clk and regulator references in the core, instead of
letting the driver figure that out and tell the OPP framework
what resources it should operate on.

So really, I'm hoping that OPP framework "stays away" and acts as
a data hole, sometimes, where we can look up the performance
state for a particular frequency, but also have it do everything
to set some particular performance state and frequency, etc. if
the user wants that. And also OPP framework hopefully doesn't
force a rigid set of frequencies that a particular clk can be set
to, so that we can calculate frequencies for things like display
panels based on height and width of the panel, or uart baud rate
which is entirely use-case driven, and then ask OPP framework to
tell us what the performance state of a particular domain would
be if we are within some frequency range. Because sometimes we
really can't determine every possible frequency that a clk can be
running at, but we can figure out the maximum frequency that a
clk can be running at for a particular voltage/performance state
to support it.

> 

> > I said this last time, I'm having a really hard time seeing how

> > everything is going to work. The little drip of code, then DT

> > binding, then maybe a small change in dts files, then maybe some

> > code that uses the new APIs, etc. is pretty annoying. From my

> > perspective you've chopped the problem up into pieces that don't

> > stand on their own and then started sending patches for some

> > parts without showing the overall result. It's like we're being

> > taken on a ride in your development workflow, and we don't get to

> > see what's coming around the corner, and the only assumption I

> > can make is that you don't know either.

> > 

> > I'm actually confused how any of the code is even tested or used.

> > It looks like things are getting merged without any users, for

> > what exactly I'm not sure. Please, please, get an end-to-end

> > solution going and actually use the code from day one on a real

> > device that can use it.

> 

> There is just too much code, specially Qcom specific, and I can't fit all that

> in a single series really. Its going to be more annoying for people to see that.

> I used to keep some Qcom test code in the earlier series which got merged and

> was told by Rajendra that the Qcom stuff will get posted after 4.15-rc1, but

> that didn't happen. I can't post final code for that as it touches lots of

> things and its Qcom who needs to upstream it. Now how much test code can I keep

> supplying every time ?


I'm not asking for test code. A git tree pointer in cover letter
is sufficient, with the full and complete solution to the
problem. Then only a few patches out of the tree sent to the list
is fine if you want to chunk it up into sub-topics. That way the
list and reviewers aren't overloaded, but if someone wants to
review the full picture they can do that easily.

> 

> I have already posted the code that will use these bindings few days back:

> 

> https://lkml.kernel.org/r/cover.1513926033.git.viresh.kumar@linaro.org

> 

> The only missing part left now (after bindings and above series) is, again,

> platform specific Qcom code to use it. Below is some dummy code to complete the

> story for you:

> 

> DT changes that shows two devices, mmc and dsp, using the performances states of

> domain:

> 

> 		foo: foo-power-domain@09000000 {

> 			compatible = "foo,genpd";

> 			#power-domain-cells = <0>;

> 			operating-points-v2 = <&domain_opp_table>;

> 		};

> 

> 	        domain_opp_table: domain_opp_table {

> 	        	compatible = "operating-points-v2";

> 

> 	        	domain_opp_1: opp00 {

> 	        		opp-hz = /bits/ 64 <1>; //This is performances state

> 	        	};

> 	        	domain_opp_2: opp01 {

> 	        		opp-hz = /bits/ 64 <2>;

> 	        	};

> 	        	domain_opp_3: opp02 {

> 	        		opp-hz = /bits/ 64 <3>;

> 	        	};

> 	        };

> 

> 		mmc@f7112000 {

> 			compatible = "***";

> 

>                         ***

> 

> 

>                         power-domains = <&foo>;

> 			operating-points-v2 = <&mmc_opp_table>;

> 		};

> 

> 

>         	mmc_opp_table: mmc-opp-table {

>         		compatible = "operating-points-v2";

>         		opp-shared;

>         

>         		opp00 {

>         			opp-hz = /bits/ 64 <208000000>;

>         			required-opp = <&domain_opp_1>;


It can have multiple phandles though, right? Makes me think it
should have been called 'required-opps' instead.

>         		};

>         		opp01 {

>         			opp-hz = /bits/ 64 <432000000>;

>         			required-opp = <&domain_opp_2>;

>         		};

>         		opp02 {

>         			opp-hz = /bits/ 64 <729000000>;

>         			required-opp = <&domain_opp_2>;

>         		};

>         		opp03 {

>         			opp-hz = /bits/ 64 <960000000>;

>         			required-opp = <&domain_opp_3>;

>         		};

>         	};

> 

> 		dsp@f8152000 {

> 			compatible = "***";

> 

>                         ***

> 

> 

>                         power-domains = <&foo>;

>                         required-opp = <&domain_opp_2>;

> 		};

> 

> 

> 

> 

> Platform specific power domain driver:

> 

> static int foo_set_performance(struct generic_pm_domain *genpd,

>                                unsigned int state)

> {

>         /* Set the state here */

> 

> 	return 0;

> }

> 

> static unsigned int foo_get_performance(struct generic_pm_domain *genpd,

> 			                struct dev_pm_opp *opp)

> {

>         /*

>          * Simply return freq value as we passed the state in opp-hz.

>          *

>          * If we choose to use platform-specific bindings instead of opp-hz,

>          * then only this routine requires to change to read the DT and provide

>          * the value from platform specific binding.


If we wanted to change this function to do a platform specific
thing, will we somehow get a way to access the DT node of the opp
passed into this function? I don't see another way to do it.

Also, I don't see how the foo_get_performance function will use
the genpd pointer passed here. Maybe that's never used?

Finally, I would think that a "getter" like this function would
be informing the framework about what the current performance
state is, not translating an OPP into a performance state. So the
whole thing looks like a misnomer, and probably should be called
something like xlate_opp_performance.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
Viresh Kumar Jan. 8, 2018, 4:16 a.m. | #4
On 05-01-18, 14:19, Stephen Boyd wrote:
> On 12/29, Viresh Kumar wrote:


> Could you please point to Kevin's comments and also include the


https://lkml.kernel.org/r/m2r30i4w35.fsf@baylibre.com

> reasoning behind magic values in the commit text for the patch?

> It would be very helpful to know why something is done a certain

> way. The two to three line commit text in this patch is not

> helpful right now.


Sure.

> > https://github.com/rrnayak/linux/commits/genpd-performance-state

> 

> Thanks for the pointer. That whole matching devices with

> of_match_device() is not looking good.


Yeah, I agree, but that was done because we didn't had these bindings
then. Once these bindings are in place, we wouldn't require the
of_match_device() thingy.

> I don't see how we're going to convince each driver to move to

> using the OPP framework to set a performance state + clk

> frequency when they're going to want/need to have certain clks

> and regulators in hand to do something besides set the frequency

> or voltage. Probably we're going to have a hybrid approach, where

> some drivers can just set rate and voltage through OPP because

> it's fairly well fixed (think CPU or GPU frequency scaling),

> while other drivers are going to set frequency and

> voltage/performance state based on some calculation of their

> required frequency (think of display panels or even the uart baud

> rate or i2c bus frequency requirements).


The OPP framework doesn't (and shouldn't) force drivers to move to the
dev_pm_opp_set_rate() API. That is optional and is provided to make
user code simpler.

So, if a driver wants to handle everything by itself, it will just use
the OPP core as "provider" for the data it needs and do everything by
itself.

> For these other drivers, I don't really want to see the OPP

> framework proxy all the clk and regulator calls into the

> appropriate framework by wrapping clk_round_rate(),

> regulator_set_load(), etc. with opp_*() APIs. This becomes

> especially annoying if OPP framework is grabbing and holding

> these clk and regulator references in the core, instead of

> letting the driver figure that out and tell the OPP framework

> what resources it should operate on.


Sure.

> So really, I'm hoping that OPP framework "stays away" and acts as

> a data hole, sometimes, where we can look up the performance

> state for a particular frequency, but also have it do everything

> to set some particular performance state and frequency, etc. if

> the user wants that.


That's how I see it as well.

> And also OPP framework hopefully doesn't

> force a rigid set of frequencies that a particular clk can be set

> to, so that we can calculate frequencies for things like display

> panels based on height and width of the panel, or uart baud rate

> which is entirely use-case driven, and then ask OPP framework to

> tell us what the performance state of a particular domain would

> be if we are within some frequency range. Because sometimes we

> really can't determine every possible frequency that a clk can be

> running at, but we can figure out the maximum frequency that a

> clk can be running at for a particular voltage/performance state

> to support it.


That makes sense to me. We can do that once we have someone who wants
to use OPP core for such devices.

> I'm not asking for test code. A git tree pointer in cover letter

> is sufficient, with the full and complete solution to the

> problem. Then only a few patches out of the tree sent to the list

> is fine if you want to chunk it up into sub-topics. That way the

> list and reviewers aren't overloaded, but if someone wants to

> review the full picture they can do that easily.


That's fine.

> >         	mmc_opp_table: mmc-opp-table {

> >         		compatible = "operating-points-v2";

> >         		opp-shared;

> >         

> >         		opp00 {

> >         			opp-hz = /bits/ 64 <208000000>;

> >         			required-opp = <&domain_opp_1>;

> 

> It can have multiple phandles though, right? Makes me think it

> should have been called 'required-opps' instead.


Okay.

> > static unsigned int foo_get_performance(struct generic_pm_domain *genpd,

> > 			                struct dev_pm_opp *opp)

> > {

> >         /*

> >          * Simply return freq value as we passed the state in opp-hz.

> >          *

> >          * If we choose to use platform-specific bindings instead of opp-hz,

> >          * then only this routine requires to change to read the DT and provide

> >          * the value from platform specific binding.

> 

> If we wanted to change this function to do a platform specific

> thing, will we somehow get a way to access the DT node of the opp

> passed into this function?


Yes, we can do that. The OPP core already stores pointer to the node
in the OPP structure, we will just need another API to expose that.

> Also, I don't see how the foo_get_performance function will use

> the genpd pointer passed here. Maybe that's never used?


It depends actually and I think its better to pass it anyway. What if
a single driver is handling multiple genpds and wants to do things
differently for them? It should know which genpd it is called for,
looks like  basic requirement to me.

> Finally, I would think that a "getter" like this function would

> be informing the framework about what the current performance

> state is, not translating an OPP into a performance state. So the

> whole thing looks like a misnomer, and probably should be called

> something like xlate_opp_performance.


Sure, I can name it anything.

So the question still stands, are we all okay for using magic values
or we want platform specific properties ?

-- 
viresh
Stephen Boyd Jan. 13, 2018, 12:46 a.m. | #5
On 01/10, Viresh Kumar wrote:
> On 09-01-18, 18:54, Stephen Boyd wrote:

> > My read of Kevin's comments lead me to think he's saying that a

> > generic 'domain-performance-state' property is worse than putting

> > the numbers directly inside of the opp table with a comment above

> > it. Now that's all fine, but now that we have required-opps

> > binding we sort of have the domain-performance-state property

> > again, but it's a phandle instead of a raw state number.

> > 

> > So we have

> > 

> > 	required-opps = <&perf_state>;

> > 

> > but what was proposed before was

> > 

> > 	domain-performance-state = <1>;

> > 

> > or Kevin's 

> > 

> > 	opp-table = <100000 1>;

> 

> His concern was also on what will we do if "frequency" or other OPP

> properties aren't known tomorrow by the kernel but the firmware? In

> Qcom case, its just the voltage (corner) today, but it can very well

> be other properties tomorrow. Are we going to add more platform

> specific bindings then ?


Yes, we would add more bindings.

> And this is the main reason why I have been

> aligned towards using something like this patch.


Once we exceed the number of properties that can fit into the
existing voltage and frequency properties we'll only be able to
make it work by adding a platform specific property. That's one
concern, but it's a future concern so it's not a real problem
yet.

If you can clearly describe in the commit text why we shouldn't
use platform specific properties it would be helpful.

> 

> If we drop the magic-values idea and hence this patch, then we can

> either add a "domain-performance-state" property, which will only be

> used by the power domains or leave it for the platforms to add

> something like "qcom,corner".

> 

> All we are doing here is putting a voltage (corner) value, unknown to

> the kernel, in a new property instead of "opp-microvolt". But the

> above question still remains, what about other properties that may

> need magic values in future.

> 

> Honestly speaking, I am not sure what's the right thing to do here. I

> will do whatever you and Rob incline for.

> 


Hopefully Rob and Kevin can reply here.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project

Patch

diff --git a/Documentation/devicetree/bindings/opp/opp.txt b/Documentation/devicetree/bindings/opp/opp.txt
index 4e4f30288c8b..00a3bdbd0f1f 100644
--- a/Documentation/devicetree/bindings/opp/opp.txt
+++ b/Documentation/devicetree/bindings/opp/opp.txt
@@ -167,6 +167,12 @@  properties.
   functioning of the current device at the current OPP (where this property is
   present).
 
+
+On some platforms the exact frequency or voltage may be hidden from the OS by
+the firmware and the "opp-hz" or the "opp-microvolt" properties may contain
+magic values that represent the frequency or voltage in a firmware dependent
+way, for example an index of an array in the firmware.
+
 Example 1: Single cluster Dual-core ARM cortex A9, switch DVFS states together.
 
 / {