Re: [PATCH 1/7] PM / OPP: Introduce a power estimation helper
From: Quentin Perret <hidden>
Date: 2019-01-29 09:09:57
Also in:
linux-devicetree, linux-pm, lkml
Hi Viresh, On Tuesday 29 Jan 2019 at 10:40:30 (+0530), Viresh Kumar wrote:
quoted
+int of_dev_pm_opp_get_cpu_power(unsigned long *mW, unsigned long *KHz, int cpu)I would suggest to change the return type to unsigned long and return 0 for errors and positive values for mW.
Well, I can't really do that -- this must match the API of PM_EM: https://elixir.bootlin.com/linux/v5.0-rc4/source/include/linux/energy_model.h#L62 I'll make sure to make that explicit in the commit message for v2.
quoted
+{ + unsigned long mV, Hz, MHz;MHz is used only once, I think you can get rid of it just open code the division by 1000000. Maybe remove Hz as well and directly use kHz.
I would expect/hope the compiler will optimize things like that for me but yes, I can try to reduce a bit the temp variables if you prefer.
quoted
+ struct device *cpu_dev; + struct dev_pm_opp *opp; + struct device_node *np; + u32 cap; + u64 tmp;Name this mW with the above changes.
So that doesn't really work given what I mentioned above.
quoted
+ int ret; + + cpu_dev = get_cpu_device(cpu); + if (!cpu_dev) + return -ENODEV; + + np = of_node_get(cpu_dev->of_node); + if (!np) + return -EINVAL; + + ret = of_property_read_u32(np, "dynamic-power-coefficient", &cap); + of_node_put(np); + if (ret) + return -EINVAL; + + Hz = *KHz * 1000; + opp = dev_pm_opp_find_freq_ceil(cpu_dev, &Hz); + if (IS_ERR(opp)) + return -EINVAL; + + mV = dev_pm_opp_get_voltage(opp) / 1000; + dev_pm_opp_put(opp); + if (!mV) + return -EINVAL; + + MHz = Hz / 1000000; + tmp = (u64)cap * mV * mV * MHz; + do_div(tmp, 1000000000); + + *mW = (unsigned long)tmp; + *KHz = Hz / 1000; + + return 0; +} +EXPORT_SYMBOL_GPL(of_dev_pm_opp_get_cpu_power);diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index 0a2a88e5a383..fedde14f5187 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h@@ -322,6 +322,7 @@ int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpuma struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev); struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp); int of_get_required_opp_performance_state(struct device_node *np, int index); +int of_dev_pm_opp_get_cpu_power(unsigned long *mW, unsigned long *KHz, int cpu); #else static inline int dev_pm_opp_of_add_table(struct device *dev) {@@ -364,6 +365,10 @@ static inline int of_get_required_opp_performance_state(struct device_node *np, { return -ENOTSUPP; }Add a blank line here. We missed adding the same before of_get_required_opp_performance_state() earlier, maybe add the new routine before of_get_required_opp_performance_state() and add blank line before and after it :)
Sounds good !
quoted
+static inline int of_dev_pm_opp_get_cpu_power(unsigned long *mW, unsigned long *KHz, int cpu) +{ + return -ENOTSUPP; +} #endif #endif /* __LINUX_OPP_H__ */ -- 2.20.1-- viresh
Thanks, Quentin _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel