On Mon, Jul 31, 2023 at 12:52:17PM +0200, Konrad Dybcio wrote: > Presumably due to the hardware being so complex, some nodes (or busses) > have different (usually higher) requirements for bandwidth than what > the usual calculations would suggest. > > Looking at the available downstream files, it seems like AB values are > adjusted per-bus and IB values are adjusted per-node. > With that in mind, introduce percentage-based coefficient struct members > and use them in the calculations. > > One thing to note is that the IB coefficient is inverse (100/ib_percent) > which feels a bit backwards, but it's necessary for precision.. > > Signed-off-by: Konrad Dybcio <konrad.dybcio@xxxxxxxxxx> > --- > drivers/interconnect/qcom/icc-rpm.c | 14 +++++++++++--- > drivers/interconnect/qcom/icc-rpm.h | 6 ++++++ > 2 files changed, 17 insertions(+), 3 deletions(-) > > diff --git a/drivers/interconnect/qcom/icc-rpm.c b/drivers/interconnect/qcom/icc-rpm.c > index 2c16917ba1fd..a837d20af79e 100644 > --- a/drivers/interconnect/qcom/icc-rpm.c > +++ b/drivers/interconnect/qcom/icc-rpm.c > @@ -298,7 +298,8 @@ static int qcom_icc_bw_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, > */ > static void qcom_icc_bus_aggregate(struct icc_provider *provider, u64 *agg_clk_rate) > { > - u64 agg_avg_rate, agg_rate; > + struct qcom_icc_provider *qp = to_qcom_provider(provider); > + u64 agg_avg_rate, agg_peak_rate, agg_rate; > struct qcom_icc_node *qn; > struct icc_node *node; > int i; > @@ -315,8 +316,15 @@ static void qcom_icc_bus_aggregate(struct icc_provider *provider, u64 *agg_clk_r > else > agg_avg_rate = qn->sum_avg[i]; > > - agg_rate = max_t(u64, agg_avg_rate, qn->max_peak[i]); > - do_div(agg_rate, qn->buswidth); > + if (qp->ab_coeff) > + agg_avg_rate = mult_frac(qp->ab_coeff, agg_avg_rate, 100); agg_avg_rate * (qp->ab_coeff / 100) would feel more logical to me (even if it should be the same), i.e. agg_avg_rate = mult_frac(agg_avg_rate, qp->ab_coeff, 100); Not sure why you swapped them. > + > + if (qp->ib_coeff) > + agg_peak_rate = mult_frac(100, qn->max_peak[i], qp->ib_coeff); agg_peak_rate = mult_frac(qn->max_peak[i], 100, qp->ib_coeff); Anyway, looks like you need to avoid mult_frac anyway for ARM32 compat :/ arm-none-eabi-ld: drivers/interconnect/qcom/icc-rpm.o: in function `qcom_icc_calc_rate': drivers/interconnect/qcom/icc-rpm.c:310: undefined reference to `__aeabi_uldivmod' arm-none-eabi-ld: drivers/interconnect/qcom/icc-rpm.c:312: undefined reference to `__aeabi_uldivmod' Thanks, Stephan