]> git.baikalelectronics.ru Git - kernel.git/commitdiff
interconnect: qcom: icc-rpmh: Add BCMs to commit list in pre_aggregate
authorMike Tipton <mdtipton@codeaurora.org>
Thu, 25 Nov 2021 17:47:51 +0000 (19:47 +0200)
committerGeorgi Djakov <djakov@kernel.org>
Tue, 30 Nov 2021 12:14:19 +0000 (14:14 +0200)
We're only adding BCMs to the commit list in aggregate(), but there are
cases where pre_aggregate() is called without subsequently calling
aggregate(). In particular, in icc_sync_state() when a node with initial
BW has zero requests. Since BCMs aren't added to the commit list in
these cases, we don't actually send the zero BW request to HW. So the
resources remain on unnecessarily.

Add BCMs to the commit list in pre_aggregate() instead, which is always
called even when there are no requests.

Signed-off-by: Mike Tipton <mdtipton@codeaurora.org>
[georgi: remove icc_sync_state for platforms with incomplete support]
Link: https://lore.kernel.org/r/20211125174751.25317-1-djakov@kernel.org
Signed-off-by: Georgi Djakov <djakov@kernel.org>
drivers/interconnect/qcom/icc-rpmh.c
drivers/interconnect/qcom/sm8150.c
drivers/interconnect/qcom/sm8250.c
drivers/interconnect/qcom/sm8350.c

index 3eb7936d2cf6062f2d9c263cdb3692dd3793092c..2c8e12549804bc145c599d01082a086ba612f532 100644 (file)
@@ -21,13 +21,18 @@ void qcom_icc_pre_aggregate(struct icc_node *node)
 {
        size_t i;
        struct qcom_icc_node *qn;
+       struct qcom_icc_provider *qp;
 
        qn = node->data;
+       qp = to_qcom_provider(node->provider);
 
        for (i = 0; i < QCOM_ICC_NUM_BUCKETS; i++) {
                qn->sum_avg[i] = 0;
                qn->max_peak[i] = 0;
        }
+
+       for (i = 0; i < qn->num_bcms; i++)
+               qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]);
 }
 EXPORT_SYMBOL_GPL(qcom_icc_pre_aggregate);
 
@@ -45,10 +50,8 @@ int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
 {
        size_t i;
        struct qcom_icc_node *qn;
-       struct qcom_icc_provider *qp;
 
        qn = node->data;
-       qp = to_qcom_provider(node->provider);
 
        if (!tag)
                tag = QCOM_ICC_TAG_ALWAYS;
@@ -68,9 +71,6 @@ int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
        *agg_avg += avg_bw;
        *agg_peak = max_t(u32, *agg_peak, peak_bw);
 
-       for (i = 0; i < qn->num_bcms; i++)
-               qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]);
-
        return 0;
 }
 EXPORT_SYMBOL_GPL(qcom_icc_aggregate);
index 2a85f53802b5f0425a7172ab22e8605c584766c6..745e3c36a61afc09826edd2e8475dadfac9e7d9c 100644 (file)
@@ -535,7 +535,6 @@ static struct platform_driver qnoc_driver = {
        .driver = {
                .name = "qnoc-sm8150",
                .of_match_table = qnoc_of_match,
-               .sync_state = icc_sync_state,
        },
 };
 module_platform_driver(qnoc_driver);
index 8dfb5dea562a33dff7deaae2e48da0314614bef6..aa707582ea016a7de39f106cebdf967de6bc4bb3 100644 (file)
@@ -551,7 +551,6 @@ static struct platform_driver qnoc_driver = {
        .driver = {
                .name = "qnoc-sm8250",
                .of_match_table = qnoc_of_match,
-               .sync_state = icc_sync_state,
        },
 };
 module_platform_driver(qnoc_driver);
index 3e26a2175b28f8d2e66dc9372ddaa89133cd7e3e..c79f93a1ac73cce7e65371750c2c23cbc2057e3f 100644 (file)
@@ -531,7 +531,6 @@ static struct platform_driver qnoc_driver = {
        .driver = {
                .name = "qnoc-sm8350",
                .of_match_table = qnoc_of_match,
-               .sync_state = icc_sync_state,
        },
 };
 module_platform_driver(qnoc_driver);