Skip to content

Commit 32846c4

Browse files
konradybcioandersson
authored andcommitted
interconnect: qcom: icc-rpm: Set bandwidth on both contexts
Up until now, for some reason we've only been setting bandwidth values on the active-only context. That pretty much meant that RPM could lift all votes when entering sleep mode. Or never sleep at all. That in turn could potentially break things like USB wakeup, as the connection between APSS and SNoC/PNoC would simply be dead. Set the values appropriately. Fixes: 30c8fa3 ("interconnect: qcom: Add MSM8916 interconnect provider driver") Reviewed-by: Stephan Gerhold <stephan@gerhold.net> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> Acked-by: Georgi Djakov <djakov@kernel.org> Link: https://lore.kernel.org/r/20230526-topic-smd_icc-v7-20-09c78c175546@linaro.org Signed-off-by: Bjorn Andersson <andersson@kernel.org>
1 parent 6ed0e5e commit 32846c4

1 file changed

Lines changed: 28 additions & 26 deletions

File tree

drivers/interconnect/qcom/icc-rpm.c

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -204,34 +204,39 @@ static int qcom_icc_qos_set(struct icc_node *node)
204204
}
205205
}
206206

207-
static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 sum_bw)
207+
static int qcom_icc_rpm_set(struct qcom_icc_node *qn, u64 *bw)
208208
{
209-
int ret = 0;
209+
int ret, rpm_ctx = 0;
210+
u64 bw_bps;
210211

211212
if (qn->qos.ap_owned)
212213
return 0;
213214

214-
if (qn->mas_rpm_id != -1) {
215-
ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE,
216-
RPM_BUS_MASTER_REQ,
217-
qn->mas_rpm_id,
218-
sum_bw);
219-
if (ret) {
220-
pr_err("qcom_icc_rpm_smd_send mas %d error %d\n",
221-
qn->mas_rpm_id, ret);
222-
return ret;
215+
for (rpm_ctx = 0; rpm_ctx < QCOM_SMD_RPM_STATE_NUM; rpm_ctx++) {
216+
bw_bps = icc_units_to_bps(bw[rpm_ctx]);
217+
218+
if (qn->mas_rpm_id != -1) {
219+
ret = qcom_icc_rpm_smd_send(rpm_ctx,
220+
RPM_BUS_MASTER_REQ,
221+
qn->mas_rpm_id,
222+
bw_bps);
223+
if (ret) {
224+
pr_err("qcom_icc_rpm_smd_send mas %d error %d\n",
225+
qn->mas_rpm_id, ret);
226+
return ret;
227+
}
223228
}
224-
}
225229

226-
if (qn->slv_rpm_id != -1) {
227-
ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE,
228-
RPM_BUS_SLAVE_REQ,
229-
qn->slv_rpm_id,
230-
sum_bw);
231-
if (ret) {
232-
pr_err("qcom_icc_rpm_smd_send slv %d error %d\n",
233-
qn->slv_rpm_id, ret);
234-
return ret;
230+
if (qn->slv_rpm_id != -1) {
231+
ret = qcom_icc_rpm_smd_send(rpm_ctx,
232+
RPM_BUS_SLAVE_REQ,
233+
qn->slv_rpm_id,
234+
bw_bps);
235+
if (ret) {
236+
pr_err("qcom_icc_rpm_smd_send slv %d error %d\n",
237+
qn->slv_rpm_id, ret);
238+
return ret;
239+
}
235240
}
236241
}
237242

@@ -336,7 +341,6 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
336341
struct qcom_icc_provider *qp;
337342
struct qcom_icc_node *src_qn = NULL, *dst_qn = NULL;
338343
struct icc_provider *provider;
339-
u64 sum_bw;
340344
u64 active_rate, sleep_rate;
341345
u64 agg_avg[QCOM_SMD_RPM_STATE_NUM], agg_peak[QCOM_SMD_RPM_STATE_NUM];
342346
u64 max_agg_avg;
@@ -350,14 +354,12 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
350354

351355
qcom_icc_bus_aggregate(provider, agg_avg, agg_peak, &max_agg_avg);
352356

353-
sum_bw = icc_units_to_bps(max_agg_avg);
354-
355-
ret = qcom_icc_rpm_set(src_qn, sum_bw);
357+
ret = qcom_icc_rpm_set(src_qn, agg_avg);
356358
if (ret)
357359
return ret;
358360

359361
if (dst_qn) {
360-
ret = qcom_icc_rpm_set(dst_qn, sum_bw);
362+
ret = qcom_icc_rpm_set(dst_qn, agg_avg);
361363
if (ret)
362364
return ret;
363365
}

0 commit comments

Comments
 (0)