interconnect: qcom: icc-rpm: Separate out clock rate calulcations
authorKonrad Dybcio <konrad.dybcio@linaro.org>
Fri, 25 Aug 2023 15:38:24 +0000 (17:38 +0200)
committerGeorgi Djakov <djakov@kernel.org>
Mon, 9 Oct 2023 12:07:34 +0000 (15:07 +0300)
In preparation for also setting per-node clock rates, separate out the
logic that computes it.

Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Link: https://lore.kernel.org/r/20230726-topic-icc_coeff-v4-2-c04b60caa467@linaro.org
Signed-off-by: Georgi Djakov <djakov@kernel.org>
drivers/interconnect/qcom/icc-rpm.c

index 8b02aa8aa96a7a5e91f06df6f3bbcd0cfa630c5e..8c1bfd65d774a193de0d2897a12ce7f238b1259a 100644 (file)
@@ -291,6 +291,32 @@ static int qcom_icc_bw_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
        return 0;
 }
 
+static u64 qcom_icc_calc_rate(struct qcom_icc_provider *qp, struct qcom_icc_node *qn, int ctx)
+{
+       u64 agg_avg_rate, agg_peak_rate, agg_rate;
+
+       if (qn->channels)
+               agg_avg_rate = div_u64(qn->sum_avg[ctx], qn->channels);
+       else
+               agg_avg_rate = qn->sum_avg[ctx];
+
+       if (qp->ab_coeff) {
+               agg_avg_rate = agg_avg_rate * qp->ab_coeff;
+               agg_avg_rate = div_u64(agg_avg_rate, 100);
+       }
+
+       if (qp->ib_coeff) {
+               agg_peak_rate = qn->max_peak[ctx] * 100;
+               agg_peak_rate = div_u64(qn->max_peak[ctx], qp->ib_coeff);
+       } else {
+               agg_peak_rate = qn->max_peak[ctx];
+       }
+
+       agg_rate = max_t(u64, agg_avg_rate, agg_peak_rate);
+
+       return div_u64(agg_rate, qn->buswidth);
+}
+
 /**
  * qcom_icc_bus_aggregate - calculate bus clock rates by traversing all nodes
  * @provider: generic interconnect provider
@@ -299,10 +325,9 @@ 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)
 {
        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;
+       int ctx;
 
        /*
         * Iterate nodes on the provider, aggregate bandwidth requests for
@@ -310,27 +335,9 @@ static void qcom_icc_bus_aggregate(struct icc_provider *provider, u64 *agg_clk_r
         */
        list_for_each_entry(node, &provider->nodes, node_list) {
                qn = node->data;
-               for (i = 0; i < QCOM_SMD_RPM_STATE_NUM; i++) {
-                       if (qn->channels)
-                               agg_avg_rate = div_u64(qn->sum_avg[i], qn->channels);
-                       else
-                               agg_avg_rate = qn->sum_avg[i];
-
-                       if (qp->ab_coeff) {
-                               agg_avg_rate = agg_avg_rate * qp->ab_coeff;
-                               agg_avg_rate = div_u64(agg_avg_rate, 100);
-                       }
-
-                       if (qp->ib_coeff) {
-                               agg_peak_rate = qn->max_peak[i] * 100;
-                               agg_peak_rate = div_u64(qn->max_peak[i], qp->ib_coeff);
-                       } else {
-                               agg_peak_rate = qn->max_peak[i];
-                       }
-
-                       agg_rate = max_t(u64, agg_avg_rate, agg_peak_rate);
-
-                       agg_clk_rate[i] = max_t(u64, agg_clk_rate[i], agg_rate);
+               for (ctx = 0; ctx < QCOM_SMD_RPM_STATE_NUM; ctx++) {
+                       agg_clk_rate[ctx] = max_t(u64, agg_clk_rate[ctx],
+                                                 qcom_icc_calc_rate(qp, qn, ctx));
                }
        }
 }