Lines Matching +full:bcm +full:- +full:voter
1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/interconnect-provider.h>
16 #include "bcm-voter.h"
17 #include "icc-common.h"
18 #include "icc-rpmh.h"
21 #define QOSGEN_MAINCTL_LO(p, qp) (0x8 + (p->port_offsets[qp]))
27 * qcom_icc_set_qos - initialize static QoS configurations
34 const struct qcom_icc_qosbox *qos = node->qosbox; in qcom_icc_set_qos()
37 for (port = 0; port < qos->num_ports; port++) { in qcom_icc_set_qos()
38 regmap_update_bits(qp->regmap, QOSGEN_MAINCTL_LO(qos, port), in qcom_icc_set_qos()
40 FIELD_PREP(QOS_DISABLE_MASK, qos->prio_fwd_disable)); in qcom_icc_set_qos()
42 regmap_update_bits(qp->regmap, QOSGEN_MAINCTL_LO(qos, port), in qcom_icc_set_qos()
44 FIELD_PREP(QOS_DFLT_PRIO_MASK, qos->prio)); in qcom_icc_set_qos()
46 regmap_update_bits(qp->regmap, QOSGEN_MAINCTL_LO(qos, port), in qcom_icc_set_qos()
48 FIELD_PREP(QOS_SLV_URG_MSG_EN_MASK, qos->urg_fwd)); in qcom_icc_set_qos()
53 * qcom_icc_pre_aggregate - cleans up stale values from prior icc_set
62 qn = node->data; in qcom_icc_pre_aggregate()
63 qp = to_qcom_provider(node->provider); in qcom_icc_pre_aggregate()
66 qn->sum_avg[i] = 0; in qcom_icc_pre_aggregate()
67 qn->max_peak[i] = 0; in qcom_icc_pre_aggregate()
70 for (i = 0; i < qn->num_bcms; i++) in qcom_icc_pre_aggregate()
71 qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]); in qcom_icc_pre_aggregate()
76 * qcom_icc_aggregate - aggregate bw for buckets indicated by tag
90 qn = node->data; in qcom_icc_aggregate()
97 qn->sum_avg[i] += avg_bw; in qcom_icc_aggregate()
98 qn->max_peak[i] = max_t(u32, qn->max_peak[i], peak_bw); in qcom_icc_aggregate()
101 if (node->init_avg || node->init_peak) { in qcom_icc_aggregate()
102 qn->sum_avg[i] = max_t(u64, qn->sum_avg[i], node->init_avg); in qcom_icc_aggregate()
103 qn->max_peak[i] = max_t(u64, qn->max_peak[i], node->init_peak); in qcom_icc_aggregate()
115 * qcom_icc_set - set the constraints based on path
131 qp = to_qcom_provider(node->provider); in qcom_icc_set()
133 qcom_icc_bcm_voter_commit(qp->voter); in qcom_icc_set()
140 * qcom_icc_bcm_init - populates bcm aux data and connect qnodes
141 * @bcm: bcm to be initialized
146 int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev) in qcom_icc_bcm_init() argument
153 /* BCM is already initialised*/ in qcom_icc_bcm_init()
154 if (bcm->addr) in qcom_icc_bcm_init()
157 bcm->addr = cmd_db_read_addr(bcm->name); in qcom_icc_bcm_init()
158 if (!bcm->addr) { in qcom_icc_bcm_init()
160 bcm->name); in qcom_icc_bcm_init()
161 return -EINVAL; in qcom_icc_bcm_init()
164 data = cmd_db_read_aux_data(bcm->name, &data_count); in qcom_icc_bcm_init()
167 bcm->name, PTR_ERR(data)); in qcom_icc_bcm_init()
172 bcm->name); in qcom_icc_bcm_init()
173 return -EINVAL; in qcom_icc_bcm_init()
176 bcm->aux_data.unit = le32_to_cpu(data->unit); in qcom_icc_bcm_init()
177 bcm->aux_data.width = le16_to_cpu(data->width); in qcom_icc_bcm_init()
178 bcm->aux_data.vcd = data->vcd; in qcom_icc_bcm_init()
179 bcm->aux_data.reserved = data->reserved; in qcom_icc_bcm_init()
180 INIT_LIST_HEAD(&bcm->list); in qcom_icc_bcm_init()
181 INIT_LIST_HEAD(&bcm->ws_list); in qcom_icc_bcm_init()
183 if (!bcm->vote_scale) in qcom_icc_bcm_init()
184 bcm->vote_scale = 1000; in qcom_icc_bcm_init()
187 for (i = 0; i < bcm->num_nodes; i++) { in qcom_icc_bcm_init()
188 qn = bcm->nodes[i]; in qcom_icc_bcm_init()
189 qn->bcms[qn->num_bcms] = bcm; in qcom_icc_bcm_init()
190 qn->num_bcms++; in qcom_icc_bcm_init()
198 * qcom_icc_rpmh_configure_qos - configure QoS parameters
209 ret = clk_bulk_prepare_enable(qp->num_clks, qp->clks); in qcom_icc_rpmh_configure_qos()
213 for (i = 0; i < qp->num_nodes; i++) { in qcom_icc_rpmh_configure_qos()
214 qnode = qp->nodes[i]; in qcom_icc_rpmh_configure_qos()
218 if (qnode->qosbox) in qcom_icc_rpmh_configure_qos()
222 clk_bulk_disable_unprepare(qp->num_clks, qp->clks); in qcom_icc_rpmh_configure_qos()
230 struct device *dev = &pdev->dev; in qcom_icc_rpmh_probe()
241 return -EINVAL; in qcom_icc_rpmh_probe()
243 qnodes = desc->nodes; in qcom_icc_rpmh_probe()
244 num_nodes = desc->num_nodes; in qcom_icc_rpmh_probe()
248 return -ENOMEM; in qcom_icc_rpmh_probe()
252 return -ENOMEM; in qcom_icc_rpmh_probe()
253 data->num_nodes = num_nodes; in qcom_icc_rpmh_probe()
255 provider = &qp->provider; in qcom_icc_rpmh_probe()
256 provider->dev = dev; in qcom_icc_rpmh_probe()
257 provider->set = qcom_icc_set; in qcom_icc_rpmh_probe()
258 provider->pre_aggregate = qcom_icc_pre_aggregate; in qcom_icc_rpmh_probe()
259 provider->aggregate = qcom_icc_aggregate; in qcom_icc_rpmh_probe()
260 provider->xlate_extended = qcom_icc_xlate_extended; in qcom_icc_rpmh_probe()
261 provider->data = data; in qcom_icc_rpmh_probe()
265 qp->dev = dev; in qcom_icc_rpmh_probe()
266 qp->bcms = desc->bcms; in qcom_icc_rpmh_probe()
267 qp->nodes = desc->nodes; in qcom_icc_rpmh_probe()
268 qp->num_bcms = desc->num_bcms; in qcom_icc_rpmh_probe()
269 qp->num_nodes = desc->num_nodes; in qcom_icc_rpmh_probe()
271 qp->voter = of_bcm_voter_get(qp->dev, NULL); in qcom_icc_rpmh_probe()
272 if (IS_ERR(qp->voter)) in qcom_icc_rpmh_probe()
273 return PTR_ERR(qp->voter); in qcom_icc_rpmh_probe()
275 for (i = 0; i < qp->num_bcms; i++) in qcom_icc_rpmh_probe()
276 qcom_icc_bcm_init(qp->bcms[i], dev); in qcom_icc_rpmh_probe()
283 node = icc_node_create(qn->id); in qcom_icc_rpmh_probe()
289 node->name = qn->name; in qcom_icc_rpmh_probe()
290 node->data = qn; in qcom_icc_rpmh_probe()
293 for (j = 0; j < qn->num_links; j++) in qcom_icc_rpmh_probe()
294 icc_link_create(node, qn->links[j]); in qcom_icc_rpmh_probe()
296 data->nodes[i] = node; in qcom_icc_rpmh_probe()
299 if (desc->config) { in qcom_icc_rpmh_probe()
307 qp->regmap = devm_regmap_init_mmio(dev, base, desc->config); in qcom_icc_rpmh_probe()
308 if (IS_ERR(qp->regmap)) { in qcom_icc_rpmh_probe()
309 dev_info(dev, "Skipping QoS, regmap failed; %ld\n", PTR_ERR(qp->regmap)); in qcom_icc_rpmh_probe()
313 qp->num_clks = devm_clk_bulk_get_all(qp->dev, &qp->clks); in qcom_icc_rpmh_probe()
314 if (qp->num_clks == -EPROBE_DEFER) in qcom_icc_rpmh_probe()
315 return dev_err_probe(dev, qp->num_clks, "Failed to get QoS clocks\n"); in qcom_icc_rpmh_probe()
317 if (qp->num_clks < 0 || (!qp->num_clks && desc->qos_requires_clocks)) { in qcom_icc_rpmh_probe()
318 dev_info(dev, "Skipping QoS, failed to get clk: %d\n", qp->num_clks); in qcom_icc_rpmh_probe()
335 if (of_get_child_count(dev->of_node) > 0) { in qcom_icc_rpmh_probe()
336 ret = of_platform_populate(dev->of_node, NULL, NULL, dev); in qcom_icc_rpmh_probe()
356 icc_provider_deregister(&qp->provider); in qcom_icc_rpmh_remove()
357 icc_nodes_remove(&qp->provider); in qcom_icc_rpmh_remove()