Merge tag 'icc-5.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc into char-misc-linus

Georgi writes:

interconnect fixes for v5.14

This contains a few core and driver fixes that have been reported.
- core: Fix undersized devres_alloc allocation
- core: Zero initial BW after sync-state
- core: Always call pre_aggregate before aggregate
- qcom: rpmh: Ensure floor BW is enforced for all nodes
- qcom: rpmh: Add BCMs to commit list in pre_aggregate

Signed-off-by: Georgi Djakov <djakov@kernel.org>

* tag 'icc-5.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc:
interconnect: Fix undersized devress_alloc allocation
interconnect: qcom: icc-rpmh: Add BCMs to commit list in pre_aggregate
interconnect: qcom: icc-rpmh: Ensure floor BW is enforced for all nodes
interconnect: Always call pre_aggregate before aggregate
interconnect: Zero initial BW after sync-state

Changed files
+18 -13
drivers
interconnect
+8 -1
drivers/interconnect/core.c
··· 403 403 { 404 404 struct icc_path **ptr, *path; 405 405 406 - ptr = devres_alloc(devm_icc_release, sizeof(**ptr), GFP_KERNEL); 406 + ptr = devres_alloc(devm_icc_release, sizeof(*ptr), GFP_KERNEL); 407 407 if (!ptr) 408 408 return ERR_PTR(-ENOMEM); 409 409 ··· 973 973 } 974 974 node->avg_bw = node->init_avg; 975 975 node->peak_bw = node->init_peak; 976 + 977 + if (provider->pre_aggregate) 978 + provider->pre_aggregate(node); 979 + 976 980 if (provider->aggregate) 977 981 provider->aggregate(node, 0, node->init_avg, node->init_peak, 978 982 &node->avg_bw, &node->peak_bw); 983 + 979 984 provider->set(node, node); 980 985 node->avg_bw = 0; 981 986 node->peak_bw = 0; ··· 1111 1106 dev_dbg(p->dev, "interconnect provider is in synced state\n"); 1112 1107 list_for_each_entry(n, &p->nodes, node_list) { 1113 1108 if (n->init_avg || n->init_peak) { 1109 + n->init_avg = 0; 1110 + n->init_peak = 0; 1114 1111 aggregate_requests(n); 1115 1112 p->set(n, n); 1116 1113 }
+10 -12
drivers/interconnect/qcom/icc-rpmh.c
··· 20 20 { 21 21 size_t i; 22 22 struct qcom_icc_node *qn; 23 + struct qcom_icc_provider *qp; 23 24 24 25 qn = node->data; 26 + qp = to_qcom_provider(node->provider); 25 27 26 28 for (i = 0; i < QCOM_ICC_NUM_BUCKETS; i++) { 27 29 qn->sum_avg[i] = 0; 28 30 qn->max_peak[i] = 0; 29 31 } 32 + 33 + for (i = 0; i < qn->num_bcms; i++) 34 + qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]); 30 35 } 31 36 EXPORT_SYMBOL_GPL(qcom_icc_pre_aggregate); 32 37 ··· 49 44 { 50 45 size_t i; 51 46 struct qcom_icc_node *qn; 52 - struct qcom_icc_provider *qp; 53 47 54 48 qn = node->data; 55 - qp = to_qcom_provider(node->provider); 56 49 57 50 if (!tag) 58 51 tag = QCOM_ICC_TAG_ALWAYS; ··· 60 57 qn->sum_avg[i] += avg_bw; 61 58 qn->max_peak[i] = max_t(u32, qn->max_peak[i], peak_bw); 62 59 } 60 + 61 + if (node->init_avg || node->init_peak) { 62 + qn->sum_avg[i] = max_t(u64, qn->sum_avg[i], node->init_avg); 63 + qn->max_peak[i] = max_t(u64, qn->max_peak[i], node->init_peak); 64 + } 63 65 } 64 66 65 67 *agg_avg += avg_bw; 66 68 *agg_peak = max_t(u32, *agg_peak, peak_bw); 67 - 68 - for (i = 0; i < qn->num_bcms; i++) 69 - qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]); 70 69 71 70 return 0; 72 71 } ··· 84 79 int qcom_icc_set(struct icc_node *src, struct icc_node *dst) 85 80 { 86 81 struct qcom_icc_provider *qp; 87 - struct qcom_icc_node *qn; 88 82 struct icc_node *node; 89 83 90 84 if (!src) ··· 92 88 node = src; 93 89 94 90 qp = to_qcom_provider(node->provider); 95 - qn = node->data; 96 - 97 - qn->sum_avg[QCOM_ICC_BUCKET_AMC] = max_t(u64, qn->sum_avg[QCOM_ICC_BUCKET_AMC], 98 - node->avg_bw); 99 - qn->max_peak[QCOM_ICC_BUCKET_AMC] = max_t(u64, qn->max_peak[QCOM_ICC_BUCKET_AMC], 100 - node->peak_bw); 101 91 102 92 qcom_icc_bcm_voter_commit(qp->voter); 103 93