Lines Matching +full:bcm +full:- +full:voter

1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/interconnect-provider.h>
13 #include "bcm-voter.h"
14 #include "icc-rpmh.h"
17 * qcom_icc_pre_aggregate - cleans up stale values from prior icc_set
25 qn = node->data; in qcom_icc_pre_aggregate()
28 qn->sum_avg[i] = 0; in qcom_icc_pre_aggregate()
29 qn->max_peak[i] = 0; in qcom_icc_pre_aggregate()
35 * qcom_icc_aggregate - aggregate bw for buckets indicated by tag
50 qn = node->data; in qcom_icc_aggregate()
51 qp = to_qcom_provider(node->provider); in qcom_icc_aggregate()
58 qn->sum_avg[i] += avg_bw; in qcom_icc_aggregate()
59 qn->max_peak[i] = max_t(u32, qn->max_peak[i], peak_bw); in qcom_icc_aggregate()
62 if (node->init_avg || node->init_peak) { in qcom_icc_aggregate()
63 qn->sum_avg[i] = max_t(u64, qn->sum_avg[i], node->init_avg); in qcom_icc_aggregate()
64 qn->max_peak[i] = max_t(u64, qn->max_peak[i], node->init_peak); in qcom_icc_aggregate()
71 for (i = 0; i < qn->num_bcms; i++) in qcom_icc_aggregate()
72 qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]); in qcom_icc_aggregate()
79 * qcom_icc_set - set the constraints based on path
95 qp = to_qcom_provider(node->provider); in qcom_icc_set()
97 qcom_icc_bcm_voter_commit(qp->voter); in qcom_icc_set()
114 return ERR_PTR(-ENOMEM); in qcom_icc_xlate_extended()
116 ndata->node = node; in qcom_icc_xlate_extended()
118 if (spec->args_count == 2) in qcom_icc_xlate_extended()
119 ndata->tag = spec->args[1]; in qcom_icc_xlate_extended()
121 if (spec->args_count > 2) in qcom_icc_xlate_extended()
122 pr_warn("%pOF: Too many arguments, path tag is not parsed\n", spec->np); in qcom_icc_xlate_extended()
129 * qcom_icc_bcm_init - populates bcm aux data and connect qnodes
130 * @bcm: bcm to be initialized
135 int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev) in qcom_icc_bcm_init() argument
142 /* BCM is already initialised*/ in qcom_icc_bcm_init()
143 if (bcm->addr) in qcom_icc_bcm_init()
146 bcm->addr = cmd_db_read_addr(bcm->name); in qcom_icc_bcm_init()
147 if (!bcm->addr) { in qcom_icc_bcm_init()
149 bcm->name); in qcom_icc_bcm_init()
150 return -EINVAL; in qcom_icc_bcm_init()
153 data = cmd_db_read_aux_data(bcm->name, &data_count); in qcom_icc_bcm_init()
156 bcm->name, PTR_ERR(data)); in qcom_icc_bcm_init()
161 bcm->name); in qcom_icc_bcm_init()
162 return -EINVAL; in qcom_icc_bcm_init()
165 bcm->aux_data.unit = le32_to_cpu(data->unit); in qcom_icc_bcm_init()
166 bcm->aux_data.width = le16_to_cpu(data->width); in qcom_icc_bcm_init()
167 bcm->aux_data.vcd = data->vcd; in qcom_icc_bcm_init()
168 bcm->aux_data.reserved = data->reserved; in qcom_icc_bcm_init()
169 INIT_LIST_HEAD(&bcm->list); in qcom_icc_bcm_init()
170 INIT_LIST_HEAD(&bcm->ws_list); in qcom_icc_bcm_init()
172 if (!bcm->vote_scale) in qcom_icc_bcm_init()
173 bcm->vote_scale = 1000; in qcom_icc_bcm_init()
176 for (i = 0; i < bcm->num_nodes; i++) { in qcom_icc_bcm_init()
177 qn = bcm->nodes[i]; in qcom_icc_bcm_init()
178 qn->bcms[qn->num_bcms] = bcm; in qcom_icc_bcm_init()
179 qn->num_bcms++; in qcom_icc_bcm_init()
189 struct device *dev = &pdev->dev; in qcom_icc_rpmh_probe()
200 return -EINVAL; in qcom_icc_rpmh_probe()
202 qnodes = desc->nodes; in qcom_icc_rpmh_probe()
203 num_nodes = desc->num_nodes; in qcom_icc_rpmh_probe()
207 return -ENOMEM; in qcom_icc_rpmh_probe()
211 return -ENOMEM; in qcom_icc_rpmh_probe()
213 provider = &qp->provider; in qcom_icc_rpmh_probe()
214 provider->dev = dev; in qcom_icc_rpmh_probe()
215 provider->set = qcom_icc_set; in qcom_icc_rpmh_probe()
216 provider->pre_aggregate = qcom_icc_pre_aggregate; in qcom_icc_rpmh_probe()
217 provider->aggregate = qcom_icc_aggregate; in qcom_icc_rpmh_probe()
218 provider->xlate_extended = qcom_icc_xlate_extended; in qcom_icc_rpmh_probe()
219 INIT_LIST_HEAD(&provider->nodes); in qcom_icc_rpmh_probe()
220 provider->data = data; in qcom_icc_rpmh_probe()
222 qp->dev = dev; in qcom_icc_rpmh_probe()
223 qp->bcms = desc->bcms; in qcom_icc_rpmh_probe()
224 qp->num_bcms = desc->num_bcms; in qcom_icc_rpmh_probe()
226 qp->voter = of_bcm_voter_get(qp->dev, NULL); in qcom_icc_rpmh_probe()
227 if (IS_ERR(qp->voter)) in qcom_icc_rpmh_probe()
228 return PTR_ERR(qp->voter); in qcom_icc_rpmh_probe()
234 for (i = 0; i < qp->num_bcms; i++) in qcom_icc_rpmh_probe()
235 qcom_icc_bcm_init(qp->bcms[i], dev); in qcom_icc_rpmh_probe()
242 node = icc_node_create(qn->id); in qcom_icc_rpmh_probe()
248 node->name = qn->name; in qcom_icc_rpmh_probe()
249 node->data = qn; in qcom_icc_rpmh_probe()
252 for (j = 0; j < qn->num_links; j++) in qcom_icc_rpmh_probe()
253 icc_link_create(node, qn->links[j]); in qcom_icc_rpmh_probe()
255 data->nodes[i] = node; in qcom_icc_rpmh_probe()
258 data->num_nodes = num_nodes; in qcom_icc_rpmh_probe()
273 icc_nodes_remove(&qp->provider); in qcom_icc_rpmh_remove()
274 return icc_provider_del(&qp->provider); in qcom_icc_rpmh_remove()