Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

interconnect: qcom: icc-rpm: Separate out clock rate calulcations

In preparation for also setting per-node clock rates, separate out the
logic that computes it.

Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Link: https://lore.kernel.org/r/20230726-topic-icc_coeff-v4-2-c04b60caa467@linaro.org
Signed-off-by: Georgi Djakov <djakov@kernel.org>

authored by

Konrad Dybcio and committed by
Georgi Djakov
db8fc100 dd014803

+30 -23
+30 -23
drivers/interconnect/qcom/icc-rpm.c
··· 291 291 return 0; 292 292 } 293 293 294 + static u64 qcom_icc_calc_rate(struct qcom_icc_provider *qp, struct qcom_icc_node *qn, int ctx) 295 + { 296 + u64 agg_avg_rate, agg_peak_rate, agg_rate; 297 + 298 + if (qn->channels) 299 + agg_avg_rate = div_u64(qn->sum_avg[ctx], qn->channels); 300 + else 301 + agg_avg_rate = qn->sum_avg[ctx]; 302 + 303 + if (qp->ab_coeff) { 304 + agg_avg_rate = agg_avg_rate * qp->ab_coeff; 305 + agg_avg_rate = div_u64(agg_avg_rate, 100); 306 + } 307 + 308 + if (qp->ib_coeff) { 309 + agg_peak_rate = qn->max_peak[ctx] * 100; 310 + agg_peak_rate = div_u64(qn->max_peak[ctx], qp->ib_coeff); 311 + } else { 312 + agg_peak_rate = qn->max_peak[ctx]; 313 + } 314 + 315 + agg_rate = max_t(u64, agg_avg_rate, agg_peak_rate); 316 + 317 + return div_u64(agg_rate, qn->buswidth); 318 + } 319 + 294 320 /** 295 321 * qcom_icc_bus_aggregate - calculate bus clock rates by traversing all nodes 296 322 * @provider: generic interconnect provider ··· 325 299 static void qcom_icc_bus_aggregate(struct icc_provider *provider, u64 *agg_clk_rate) 326 300 { 327 301 struct qcom_icc_provider *qp = to_qcom_provider(provider); 328 - u64 agg_avg_rate, agg_peak_rate, agg_rate; 329 302 struct qcom_icc_node *qn; 330 303 struct icc_node *node; 331 - int i; 304 + int ctx; 332 305 333 306 /* 334 307 * Iterate nodes on the provider, aggregate bandwidth requests for ··· 335 310 */ 336 311 list_for_each_entry(node, &provider->nodes, node_list) { 337 312 qn = node->data; 338 - for (i = 0; i < QCOM_SMD_RPM_STATE_NUM; i++) { 339 - if (qn->channels) 340 - agg_avg_rate = div_u64(qn->sum_avg[i], qn->channels); 341 - else 342 - agg_avg_rate = qn->sum_avg[i]; 343 - 344 - if (qp->ab_coeff) { 345 - agg_avg_rate = agg_avg_rate * qp->ab_coeff; 346 - agg_avg_rate = div_u64(agg_avg_rate, 100); 347 - } 348 - 349 - if (qp->ib_coeff) { 350 - agg_peak_rate = qn->max_peak[i] * 100; 351 - agg_peak_rate = div_u64(qn->max_peak[i], qp->ib_coeff); 352 - } else { 353 - agg_peak_rate = qn->max_peak[i]; 354 - } 355 - 356 - agg_rate = max_t(u64, agg_avg_rate, agg_peak_rate); 357 - 358 - agg_clk_rate[i] = max_t(u64, agg_clk_rate[i], agg_rate); 313 + for (ctx = 0; ctx < QCOM_SMD_RPM_STATE_NUM; ctx++) { 314 + agg_clk_rate[ctx] = max_t(u64, agg_clk_rate[ctx], 315 + qcom_icc_calc_rate(qp, qn, ctx)); 359 316 } 360 317 } 361 318 }