Skip to content

Commit 32882f6

Browse files
konradybcioGeorgi Djakov
authored andcommitted
interconnect: qcom: rpm: Set QoS registers only once
The QoS registers are (or according to Qualcomm folks, on most platforms) persistent until a full chip reboot. Move the QoS-setting functions to the probe function so that we don't needlessly do it over and over again. Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> Link: https://lore.kernel.org/r/20230228-topic-qos-v8-4-ee696a2c15a9@linaro.org Signed-off-by: Georgi Djakov <djakov@kernel.org>
1 parent ca54590 commit 32882f6

1 file changed

Lines changed: 21 additions & 29 deletions

File tree

drivers/interconnect/qcom/icc-rpm.c

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -204,57 +204,40 @@ static int qcom_icc_qos_set(struct icc_node *node)
204204
}
205205
}
206206

207-
static int qcom_icc_rpm_set(int mas_rpm_id, int slv_rpm_id, u64 sum_bw)
207+
static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 sum_bw)
208208
{
209209
int ret = 0;
210210

211-
if (mas_rpm_id != -1) {
211+
if (qn->qos.ap_owned)
212+
return 0;
213+
214+
if (qn->mas_rpm_id != -1) {
212215
ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE,
213216
RPM_BUS_MASTER_REQ,
214-
mas_rpm_id,
217+
qn->mas_rpm_id,
215218
sum_bw);
216219
if (ret) {
217220
pr_err("qcom_icc_rpm_smd_send mas %d error %d\n",
218-
mas_rpm_id, ret);
221+
qn->mas_rpm_id, ret);
219222
return ret;
220223
}
221224
}
222225

223-
if (slv_rpm_id != -1) {
226+
if (qn->slv_rpm_id != -1) {
224227
ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE,
225228
RPM_BUS_SLAVE_REQ,
226-
slv_rpm_id,
229+
qn->slv_rpm_id,
227230
sum_bw);
228231
if (ret) {
229232
pr_err("qcom_icc_rpm_smd_send slv %d error %d\n",
230-
slv_rpm_id, ret);
233+
qn->slv_rpm_id, ret);
231234
return ret;
232235
}
233236
}
234237

235238
return ret;
236239
}
237240

238-
static int __qcom_icc_set(struct icc_node *n, struct qcom_icc_node *qn,
239-
u64 sum_bw)
240-
{
241-
int ret;
242-
243-
if (!qn->qos.ap_owned) {
244-
/* send bandwidth request message to the RPM processor */
245-
ret = qcom_icc_rpm_set(qn->mas_rpm_id, qn->slv_rpm_id, sum_bw);
246-
if (ret)
247-
return ret;
248-
} else if (qn->qos.qos_mode != NOC_QOS_MODE_INVALID) {
249-
/* set bandwidth directly from the AP */
250-
ret = qcom_icc_qos_set(n, sum_bw);
251-
if (ret)
252-
return ret;
253-
}
254-
255-
return 0;
256-
}
257-
258241
/**
259242
* qcom_icc_pre_bw_aggregate - cleans up values before re-aggregate requests
260243
* @node: icc node to operate on
@@ -370,11 +353,12 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
370353

371354
sum_bw = icc_units_to_bps(max_agg_avg);
372355

373-
ret = __qcom_icc_set(src, src_qn, sum_bw);
356+
ret = qcom_icc_rpm_set(src_qn, sum_bw);
374357
if (ret)
375358
return ret;
359+
376360
if (dst_qn) {
377-
ret = __qcom_icc_set(dst, dst_qn, sum_bw);
361+
ret = qcom_icc_rpm_set(dst_qn, sum_bw);
378362
if (ret)
379363
return ret;
380364
}
@@ -528,6 +512,14 @@ int qnoc_probe(struct platform_device *pdev)
528512
for (j = 0; j < qnodes[i]->num_links; j++)
529513
icc_link_create(node, qnodes[i]->links[j]);
530514

515+
/* Set QoS registers (we only need to do it once, generally) */
516+
if (qnodes[i]->qos.ap_owned &&
517+
qnodes[i]->qos.qos_mode != NOC_QOS_MODE_INVALID) {
518+
ret = qcom_icc_qos_set(node);
519+
if (ret)
520+
return ret;
521+
}
522+
531523
data->nodes[i] = node;
532524
}
533525
data->num_nodes = num_nodes;

0 commit comments

Comments
 (0)