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-common.h"
15 #include "icc-rpmh.h"
18 * qcom_icc_pre_aggregate - cleans up stale values from prior icc_set
27 qn = node->data; in qcom_icc_pre_aggregate()
28 qp = to_qcom_provider(node->provider); in qcom_icc_pre_aggregate()
31 qn->sum_avg[i] = 0; in qcom_icc_pre_aggregate()
32 qn->max_peak[i] = 0; in qcom_icc_pre_aggregate()
35 for (i = 0; i < qn->num_bcms; i++) in qcom_icc_pre_aggregate()
36 qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]); in qcom_icc_pre_aggregate()
41 * qcom_icc_aggregate - aggregate bw for buckets indicated by tag
55 qn = node->data; in qcom_icc_aggregate()
62 qn->sum_avg[i] += avg_bw; in qcom_icc_aggregate()
63 qn->max_peak[i] = max_t(u32, qn->max_peak[i], peak_bw); in qcom_icc_aggregate()
66 if (node->init_avg || node->init_peak) { in qcom_icc_aggregate()
67 qn->sum_avg[i] = max_t(u64, qn->sum_avg[i], node->init_avg); in qcom_icc_aggregate()
68 qn->max_peak[i] = max_t(u64, qn->max_peak[i], node->init_peak); in qcom_icc_aggregate()
80 * qcom_icc_set - set the constraints based on path
96 qp = to_qcom_provider(node->provider); in qcom_icc_set()
98 qcom_icc_bcm_voter_commit(qp->voter); in qcom_icc_set()
105 * qcom_icc_bcm_init - populates bcm aux data and connect qnodes
106 * @bcm: bcm to be initialized
111 int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev) in qcom_icc_bcm_init() argument
118 /* BCM is already initialised*/ in qcom_icc_bcm_init()
119 if (bcm->addr) in qcom_icc_bcm_init()
122 bcm->addr = cmd_db_read_addr(bcm->name); in qcom_icc_bcm_init()
123 if (!bcm->addr) { in qcom_icc_bcm_init()
125 bcm->name); in qcom_icc_bcm_init()
126 return -EINVAL; in qcom_icc_bcm_init()
129 data = cmd_db_read_aux_data(bcm->name, &data_count); in qcom_icc_bcm_init()
132 bcm->name, PTR_ERR(data)); in qcom_icc_bcm_init()
137 bcm->name); in qcom_icc_bcm_init()
138 return -EINVAL; in qcom_icc_bcm_init()
141 bcm->aux_data.unit = le32_to_cpu(data->unit); in qcom_icc_bcm_init()
142 bcm->aux_data.width = le16_to_cpu(data->width); in qcom_icc_bcm_init()
143 bcm->aux_data.vcd = data->vcd; in qcom_icc_bcm_init()
144 bcm->aux_data.reserved = data->reserved; in qcom_icc_bcm_init()
145 INIT_LIST_HEAD(&bcm->list); in qcom_icc_bcm_init()
146 INIT_LIST_HEAD(&bcm->ws_list); in qcom_icc_bcm_init()
148 if (!bcm->vote_scale) in qcom_icc_bcm_init()
149 bcm->vote_scale = 1000; in qcom_icc_bcm_init()
152 for (i = 0; i < bcm->num_nodes; i++) { in qcom_icc_bcm_init()
153 qn = bcm->nodes[i]; in qcom_icc_bcm_init()
154 qn->bcms[qn->num_bcms] = bcm; in qcom_icc_bcm_init()
155 qn->num_bcms++; in qcom_icc_bcm_init()
165 struct device *dev = &pdev->dev; in qcom_icc_rpmh_probe()
176 return -EINVAL; in qcom_icc_rpmh_probe()
178 qnodes = desc->nodes; in qcom_icc_rpmh_probe()
179 num_nodes = desc->num_nodes; in qcom_icc_rpmh_probe()
183 return -ENOMEM; in qcom_icc_rpmh_probe()
187 return -ENOMEM; in qcom_icc_rpmh_probe()
188 data->num_nodes = num_nodes; in qcom_icc_rpmh_probe()
190 provider = &qp->provider; in qcom_icc_rpmh_probe()
191 provider->dev = dev; in qcom_icc_rpmh_probe()
192 provider->set = qcom_icc_set; in qcom_icc_rpmh_probe()
193 provider->pre_aggregate = qcom_icc_pre_aggregate; in qcom_icc_rpmh_probe()
194 provider->aggregate = qcom_icc_aggregate; in qcom_icc_rpmh_probe()
195 provider->xlate_extended = qcom_icc_xlate_extended; in qcom_icc_rpmh_probe()
196 provider->data = data; in qcom_icc_rpmh_probe()
200 qp->dev = dev; in qcom_icc_rpmh_probe()
201 qp->bcms = desc->bcms; in qcom_icc_rpmh_probe()
202 qp->num_bcms = desc->num_bcms; in qcom_icc_rpmh_probe()
204 qp->voter = of_bcm_voter_get(qp->dev, NULL); in qcom_icc_rpmh_probe()
205 if (IS_ERR(qp->voter)) in qcom_icc_rpmh_probe()
206 return PTR_ERR(qp->voter); in qcom_icc_rpmh_probe()
208 for (i = 0; i < qp->num_bcms; i++) in qcom_icc_rpmh_probe()
209 qcom_icc_bcm_init(qp->bcms[i], dev); in qcom_icc_rpmh_probe()
216 node = icc_node_create(qn->id); in qcom_icc_rpmh_probe()
222 node->name = qn->name; in qcom_icc_rpmh_probe()
223 node->data = qn; in qcom_icc_rpmh_probe()
226 for (j = 0; j < qn->num_links; j++) in qcom_icc_rpmh_probe()
227 icc_link_create(node, qn->links[j]); in qcom_icc_rpmh_probe()
229 data->nodes[i] = node; in qcom_icc_rpmh_probe()
239 if (of_get_child_count(dev->of_node) > 0) { in qcom_icc_rpmh_probe()
240 ret = of_platform_populate(dev->of_node, NULL, NULL, dev); in qcom_icc_rpmh_probe()
260 icc_provider_deregister(&qp->provider); in qcom_icc_rpmh_remove()
261 icc_nodes_remove(&qp->provider); in qcom_icc_rpmh_remove()