Message ID | 20241113-topic-sm8x50-gpu-bw-vote-v1-0-3b8d39737a9b@linaro.org |
---|---|
Headers | show |
Series | drm/msm: adreno: add support for DDR bandwidth scaling via GMU | expand |
On 13-11-24, 16:48, Neil Armstrong wrote: > Add and implement the dev_pm_opp_get_bandwidth() to retrieve > the OPP's bandwidth in the same was as the dev_pm_opp_get_voltage() way > 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 everage bandwidth for any of average > the interconnect path. > > Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> > --- > 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..19fb82033de26b74e9604c33b9781689df2fe80a 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_bandwidth() - Gets the peak bandwidth corresponding to an opp s/peak bandwidth/bandwidth/ > + * @opp: opp for which voltage has to be returned for > + * @peak: select peak or average bandwidth > + * @index: bandwidth index > + * > + * Return: peak bandwidth in kBps, else return 0 s/peak bandwidth/bandwidth/ > + */ > +unsigned long dev_pm_opp_get_bandwidth(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_bandwidth); All other bandwidth APIs are named as _bw, maybe do same here too ?
Hi, On 14/11/2024 05:10, Viresh Kumar wrote: > On 13-11-24, 16:48, Neil Armstrong wrote: >> Add and implement the dev_pm_opp_get_bandwidth() to retrieve >> the OPP's bandwidth in the same was as the dev_pm_opp_get_voltage() > > way > >> 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 everage bandwidth for any of > > average Aww, good catch, thanks > >> the interconnect path. >> >> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> >> --- >> 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..19fb82033de26b74e9604c33b9781689df2fe80a 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_bandwidth() - Gets the peak bandwidth corresponding to an opp > > s/peak bandwidth/bandwidth/ Ack > >> + * @opp: opp for which voltage has to be returned for >> + * @peak: select peak or average bandwidth >> + * @index: bandwidth index >> + * >> + * Return: peak bandwidth in kBps, else return 0 > > s/peak bandwidth/bandwidth/ Ack > >> + */ >> +unsigned long dev_pm_opp_get_bandwidth(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_bandwidth); > > All other bandwidth APIs are named as _bw, maybe do same here too ? > Sure, I wasn't sure about that, will switch to _bw. Neil
The Adreno GMU Management Unit (GMU) can also vote for DDR Bandwidth along the Frequency and Power Domain level, but by default we leave the OPP core scale the interconnect ddr path. While scaling the interconnect path was sufficient, newer GPUs like the A750 requires specific vote parameters and bandwidth to achieve full functionnality. In order to get the vote values to be used by the GPU Management Unit (GMU), we need to parse all the possible OPP Bandwidths and create a vote value to be send to the appropriate Bus Control Modules (BCMs) declared in the GPU info struct. The added dev_pm_opp_get_bandwidth() is used in this case. The vote array will then be used to dynamically generate the GMU bw_table sent during the GMU power-up. Those entries will then be used by passing the appropriate bandwidth level when voting for a GPU frequency. This will make sure all resources are equally voted for a same OPP, whatever decision is done by the GMU, it will ensure all resources votes are synchronized. Tested on SM8650 and SM8550 platforms. Any feedback is welcome. Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- Neil Armstrong (8): opp: core: implement dev_pm_opp_get_bandwidth drm/msm: adreno: add GMU_BW_VOTE quirk drm/msm: adreno: add plumbing to generate bandwidth vote table for GMU drm/msm: adreno: dynamically generate GMU bw table drm/msm: adreno: find bandwidth index of OPP and set it along freq index drm/msm: adreno: enable GMU bandwidth for A740 and A750 arm64: qcom: dts: sm8550: add interconnect and opp-peak-kBps for GPU arm64: qcom: dts: sm8650: add interconnect and opp-peak-kBps for GPU arch/arm64/boot/dts/qcom/sm8550.dtsi | 11 ++ arch/arm64/boot/dts/qcom/sm8650.dtsi | 14 +++ drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 26 ++++- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 180 +++++++++++++++++++++++++++++- drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 14 ++- drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 1 + drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 54 ++++++--- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 1 + drivers/opp/core.c | 25 +++++ include/linux/pm_opp.h | 7 ++ 10 files changed, 314 insertions(+), 19 deletions(-) --- base-commit: 86313a9cd152330c634b25d826a281c6a002eb77 change-id: 20241113-topic-sm8x50-gpu-bw-vote-f5e022fe7a47 Best regards,