On 19-11-24, 18:56, Neil Armstrong wrote: > Add and implement the dev_pm_opp_get_bw() to retrieve > the OPP's bandwidth in the same way as the dev_pm_opp_get_voltage() > helper. > > Retrieving bandwidth is required in the case of the Adreno GPU > where the GPU Management Unit can handle the Bandwidth scaling. > > The helper can get the peak or average bandwidth for any of > the interconnect path. > > Signed-off-by: Neil Armstrong <neil.armstrong@xxxxxxxxxx> > --- > drivers/opp/core.c | 25 +++++++++++++++++++++++++ > include/linux/pm_opp.h | 7 +++++++ > 2 files changed, 32 insertions(+) > > diff --git a/drivers/opp/core.c b/drivers/opp/core.c > index 494f8860220d97fc690ebab5ed3b7f5f04f22d73..864b9b99b0129acaffaf45c584c5f34b8bababed 100644 > --- a/drivers/opp/core.c > +++ b/drivers/opp/core.c > @@ -106,6 +106,31 @@ static bool assert_single_clk(struct opp_table *opp_table) > return !WARN_ON(opp_table->clk_count > 1); > } > > +/** > + * dev_pm_opp_get_bw() - Gets the bandwidth corresponding to an opp > + * @opp: opp for which voltage has to be returned for bandwidth > + * @peak: select peak or average bandwidth > + * @index: bandwidth index > + * > + * Return: bandwidth in kBps, else return 0 > + */ > +unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index) > +{ > + if (IS_ERR_OR_NULL(opp)) { > + pr_err("%s: Invalid parameters\n", __func__); > + return 0; > + } > + > + if (index > opp->opp_table->path_count) > + return 0; > + > + if (!opp->bandwidth) > + return 0; > + > + return peak ? opp->bandwidth[index].peak : opp->bandwidth[index].avg; > +} > +EXPORT_SYMBOL_GPL(dev_pm_opp_get_bw); > + > /** > * dev_pm_opp_get_voltage() - Gets the voltage corresponding to an opp > * @opp: opp for which voltage has to be returned for > diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h > index 6424692c30b71fca471a1b7d63e018605dd9324b..cd9a257b8e7766d6c8631351a10a845c88414a74 100644 > --- a/include/linux/pm_opp.h > +++ b/include/linux/pm_opp.h > @@ -106,6 +106,8 @@ struct dev_pm_opp_data { > struct opp_table *dev_pm_opp_get_opp_table(struct device *dev); > void dev_pm_opp_put_opp_table(struct opp_table *opp_table); > > +unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index); > + > unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); > > int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies); > @@ -209,6 +211,11 @@ static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device * > > static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {} > > +static inline unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index) > +{ > + return 0; > +} > + > static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp) > { > return 0; Applied. Thanks. -- viresh