From 454e91b014526cf64e14dc3226451449ee905e70 Mon Sep 17 00:00:00 2001 From: Manikanta Kanamarlapudi Date: Tue, 31 Jan 2023 22:58:02 +0530 Subject: [PATCH] msm: vidc: enable DCVS for non realtime sessions - enable dcvs for non-realtime sessions (both encode/decode) - enable input queuing rate power scaling for non-realtime encoder Change-Id: Ie0fe2723837dbfc1cb63b693fc657f2d8df7c573 Signed-off-by: Manikanta Kanamarlapudi --- driver/vidc/src/msm_vidc_driver.c | 6 ------ driver/vidc/src/msm_vidc_power.c | 13 +++++++++++-- driver/vidc/src/msm_vidc_vb2.c | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 7b39fd855c..928a2f12a6 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -2844,12 +2844,6 @@ void msm_vidc_allow_dcvs(struct msm_vidc_inst *inst) goto exit; } - allow = is_realtime_session(inst); - if (!allow) { - i_vpr_h(inst, "%s: non-realtime session\n", __func__); - goto exit; - } - allow = !is_critical_priority_session(inst); if (!allow) { i_vpr_h(inst, "%s: critical priority session\n", __func__); diff --git a/driver/vidc/src/msm_vidc_power.c b/driver/vidc/src/msm_vidc_power.c index 824f13484c..48ad7bd53f 100644 --- a/driver/vidc/src/msm_vidc_power.c +++ b/driver/vidc/src/msm_vidc_power.c @@ -293,7 +293,7 @@ int msm_vidc_scale_buses(struct msm_vidc_inst *inst) /* scale bitrate if operating rate is larger than frame rate */ frame_rate = msm_vidc_get_frame_rate(inst); - operating_rate = msm_vidc_get_frame_rate(inst); + operating_rate = inst->max_rate; if (frame_rate && operating_rate && operating_rate > frame_rate) vote_data->bitrate = (vote_data->bitrate / frame_rate) * operating_rate; @@ -575,7 +575,16 @@ int msm_vidc_scale_power(struct msm_vidc_inst *inst, bool scale_buses) frame_rate = msm_vidc_get_frame_rate(inst); operating_rate = msm_vidc_get_operating_rate(inst); fps = max(frame_rate, operating_rate); - if (is_decode_session(inst)) { + /* + * Consider input queuing rate power scaling in below scenarios + * decoder: non-realtime and realtime as well because client + * may not set the frame rate / operating rate and + * we need to rely on input queue rate + * encoder: non-realtime only, for realtime client is expected to + * queue input buffers at the set frame rate / operating rate + */ + if (is_decode_session(inst) || + (is_encode_session(inst) && !is_realtime_session(inst))) { /* * when buffer detected fps is more than client set value by 12.5%, * utilize buffer detected fps to scale clock. diff --git a/driver/vidc/src/msm_vidc_vb2.c b/driver/vidc/src/msm_vidc_vb2.c index 4d5ac278f8..6a8ac1f09a 100644 --- a/driver/vidc/src/msm_vidc_vb2.c +++ b/driver/vidc/src/msm_vidc_vb2.c @@ -678,7 +678,7 @@ void msm_vb2_buf_queue(struct vb2_buffer *vb2) } inst->last_qbuf_time_ns = ktime_ns; - if (is_decode_session(inst) && vb2->type == INPUT_MPLANE) { + if (vb2->type == INPUT_MPLANE) { rc = msm_vidc_update_input_rate(inst, div_u64(ktime_ns, 1000)); if (rc) goto unlock;