interconnect: qcom: rpm: Set QoS registers only once
authorKonrad Dybcio <konrad.dybcio@linaro.org>
Fri, 7 Apr 2023 20:14:46 +0000 (22:14 +0200)
committerGeorgi Djakov <djakov@kernel.org>
Thu, 18 May 2023 11:25:54 +0000 (14:25 +0300)
The QoS registers are (or according to Qualcomm folks, on most
platforms) persistent until a full chip reboot. Move the QoS-setting
functions to the probe function so that we don't needlessly do it over
and over again.

Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Link: https://lore.kernel.org/r/20230228-topic-qos-v8-4-ee696a2c15a9@linaro.org
Signed-off-by: Georgi Djakov <djakov@kernel.org>
drivers/interconnect/qcom/icc-rpm.c

index 7d62c0bf272284885fd612b659bf929643301ce5..d79e508cb717742a86e745b7ec570f33fbddca68 100644 (file)
@@ -204,30 +204,33 @@ static int qcom_icc_qos_set(struct icc_node *node)
        }
 }
 
-static int qcom_icc_rpm_set(int mas_rpm_id, int slv_rpm_id, u64 sum_bw)
+static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 sum_bw)
 {
        int ret = 0;
 
-       if (mas_rpm_id != -1) {
+       if (qn->qos.ap_owned)
+               return 0;
+
+       if (qn->mas_rpm_id != -1) {
                ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE,
                                            RPM_BUS_MASTER_REQ,
-                                           mas_rpm_id,
+                                           qn->mas_rpm_id,
                                            sum_bw);
                if (ret) {
                        pr_err("qcom_icc_rpm_smd_send mas %d error %d\n",
-                              mas_rpm_id, ret);
+                              qn->mas_rpm_id, ret);
                        return ret;
                }
        }
 
-       if (slv_rpm_id != -1) {
+       if (qn->slv_rpm_id != -1) {
                ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE,
                                            RPM_BUS_SLAVE_REQ,
-                                           slv_rpm_id,
+                                           qn->slv_rpm_id,
                                            sum_bw);
                if (ret) {
                        pr_err("qcom_icc_rpm_smd_send slv %d error %d\n",
-                              slv_rpm_id, ret);
+                              qn->slv_rpm_id, ret);
                        return ret;
                }
        }
@@ -235,26 +238,6 @@ static int qcom_icc_rpm_set(int mas_rpm_id, int slv_rpm_id, u64 sum_bw)
        return ret;
 }
 
-static int __qcom_icc_set(struct icc_node *n, struct qcom_icc_node *qn,
-                         u64 sum_bw)
-{
-       int ret;
-
-       if (!qn->qos.ap_owned) {
-               /* send bandwidth request message to the RPM processor */
-               ret = qcom_icc_rpm_set(qn->mas_rpm_id, qn->slv_rpm_id, sum_bw);
-               if (ret)
-                       return ret;
-       } else if (qn->qos.qos_mode != NOC_QOS_MODE_INVALID) {
-               /* set bandwidth directly from the AP */
-               ret = qcom_icc_qos_set(n, sum_bw);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
-}
-
 /**
  * qcom_icc_pre_bw_aggregate - cleans up values before re-aggregate requests
  * @node: icc node to operate on
@@ -370,11 +353,12 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
 
        sum_bw = icc_units_to_bps(max_agg_avg);
 
-       ret = __qcom_icc_set(src, src_qn, sum_bw);
+       ret = qcom_icc_rpm_set(src_qn, sum_bw);
        if (ret)
                return ret;
+
        if (dst_qn) {
-               ret = __qcom_icc_set(dst, dst_qn, sum_bw);
+               ret = qcom_icc_rpm_set(dst_qn, sum_bw);
                if (ret)
                        return ret;
        }
@@ -528,6 +512,14 @@ regmap_done:
                for (j = 0; j < qnodes[i]->num_links; j++)
                        icc_link_create(node, qnodes[i]->links[j]);
 
+               /* Set QoS registers (we only need to do it once, generally) */
+               if (qnodes[i]->qos.ap_owned &&
+                   qnodes[i]->qos.qos_mode != NOC_QOS_MODE_INVALID) {
+                       ret = qcom_icc_qos_set(node);
+                       if (ret)
+                               return ret;
+               }
+
                data->nodes[i] = node;
        }
        data->num_nodes = num_nodes;