Re: [PATCH v6 1/2] PM / Domains: Add support for 'required-opps' to set default perf state
flat view
From: Rajendra Nayak <hidden>
Date: 2021-08-11 09:45:48
Also in:
linux-arm-msm, linux-devicetree, lkml
On 8/10/2021 5:16 AM, Dmitry Osipenko wrote:
10.08.2021 01:44, Dmitry Osipenko пишет:quoted
10.08.2021 01:26, Dmitry Osipenko пишет:quoted
04.08.2021 13:58, Rajendra Nayak пишет:quoted
@@ -2637,6 +2643,8 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev, { struct of_phandle_args pd_args; struct generic_pm_domain *pd; + struct device_node *np; + int pstate; int ret; ret = of_parse_phandle_with_args(dev->of_node, "power-domains",@@ -2675,10 +2683,26 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev, genpd_unlock(pd); } - if (ret) + if (ret) { genpd_remove_device(pd, dev); + return -EPROBE_DEFER; + } + + /* Set the default performance state */ + np = dev->of_node; + if (of_parse_phandle(np, "required-opps", index)) {The OF node returned by of_parse_phandle() must be put.
Thanks for spotting that, I will fix it, though I might just drop the use of of_parse_phandle() and call of_get_required_opp_performance_state() unconditionally as suggested by Ulf.
quoted
quoted
quoted
+ pstate = of_get_required_opp_performance_state(np, index);If you have more than one power domain, then this will override the pstate which was set for a previous domain. This code doesn't feel solid to me, at least a clarifying comment is needed about how it's supposed to work.
I don't quite understand the concern here, this should work with devices having multiple power-domains as well. __genpd_dev_pm_attach gets called once per power-domain, and we use the index above to identify the power-domain.
quoted
quoted
quoted
+ if (pstate < 0) { + ret = pstate; + dev_err(dev, "failed to set required performance state for power-domain %s: %d\n", + pd->name, ret); + } else { + dev_pm_genpd_set_performance_state(dev, pstate);Where is error handling?
Sure, I'll fix that.
quoted
quoted
quoted
+ dev_gpd_data(dev)->default_pstate = pstate; + } + }Why performance state is set after genpd_power_on()?
The requirement is that the domain is operating at a given performance state before the device becomes operational. The driver should ideally wait for the attach to complete before expecting the device to be functional. So the order here should really not matter, or rather the small amount of time while the power-domain is on but not at the right performance state should not matter if that's the concern.
Should set_performance_state() be invoked when power_on=false?
I assume it should be:
if (power_on) {
dev_pm_genpd_set_performance_state(dev, pstate);
dev_gpd_data(dev)->default_pstate = pstate;
} else {
dev_gpd_data(dev)->rpm_pstate = pstate;
}-- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation