Messages in this thread | | | Date | Tue, 16 Jul 2019 10:16:12 +0530 | From | amasule@codeauro ... | Subject | Re: [PATCH v4 3/4] media: venus: Update to bitrate based clock scaling |
| |
Hi,
On 2019-07-15 21:28, Stanimir Varbanov wrote: > Hi, > > On 7/2/19 5:46 PM, Aniket Masule wrote: >> Introduced clock scaling using bitrate, preavious >> calculations consider only the cycles per mb. >> Also, clock scaling is now triggered before every >> buffer being queued to the device. This helps in >> deciding precise clock cycles required. >> >> Signed-off-by: Aniket Masule <amasule@codeaurora.org> >> --- >> drivers/media/platform/qcom/venus/helpers.c | 31 >> +++++++++++++++++++++++++---- >> 1 file changed, 27 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/media/platform/qcom/venus/helpers.c >> b/drivers/media/platform/qcom/venus/helpers.c >> index 2c976e4..5726d86 100644 >> --- a/drivers/media/platform/qcom/venus/helpers.c >> +++ b/drivers/media/platform/qcom/venus/helpers.c >> @@ -399,17 +399,26 @@ static int scale_clocks(struct venus_inst *inst) >> return ret; >> } >> >> -static unsigned long calculate_vpp_freq(struct venus_inst *inst) >> +static unsigned long calculate_inst_freq(struct venus_inst *inst, >> + unsigned long filled_len) >> { >> - unsigned long vpp_freq = 0; >> + unsigned long vpp_freq = 0, vsp_freq = 0; >> + u64 fps = inst->fps; >> u32 mbs_per_sec; >> >> mbs_per_sec = load_per_instance(inst); >> vpp_freq = mbs_per_sec * inst->clk_data.codec_freq_data->vpp_freq; >> /* 21 / 20 is overhead factor */ >> vpp_freq += vpp_freq / 20; >> + vsp_freq = mbs_per_sec * inst->clk_data.codec_freq_data->vsp_freq; >> >> - return vpp_freq; >> + /* 10 / 7 is overhead factor */ >> + if (inst->session_type == VIDC_SESSION_TYPE_ENC) >> + vsp_freq += (inst->controls.enc.bitrate * 10) / 7; >> + else >> + vsp_freq += ((fps * filled_len * 8) * 10) / 7; >> + >> + return max(vpp_freq, vsp_freq); >> } >> >> static int scale_clocks_v4(struct venus_inst *inst) >> @@ -417,13 +426,27 @@ static int scale_clocks_v4(struct venus_inst >> *inst) >> struct venus_core *core = inst->core; >> const struct freq_tbl *table = core->res->freq_tbl; >> unsigned int num_rows = core->res->freq_tbl_size; >> + struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; >> struct clk *clk = core->clks[0]; >> struct device *dev = core->dev; >> unsigned int i; >> unsigned long freq = 0, freq_core1 = 0, freq_core2 = 0; >> + unsigned long filled_len = 0; >> + struct venus_buffer *buf, *n; >> + struct vb2_buffer *vb; >> int ret; >> >> - freq = calculate_vpp_freq(inst); >> + mutex_lock(&inst->lock); >> + v4l2_m2m_for_each_src_buf_safe(m2m_ctx, buf, n) { >> + vb = &buf->vb.vb2_buf; >> + filled_len = max(filled_len, vb2_get_plane_payload(vb, 0)); >> + } >> + mutex_unlock(&inst->lock); >> + >> + if (inst->session_type == VIDC_SESSION_TYPE_DEC && !filled_len) >> + return 0; >> + >> + freq = calculate_inst_freq(inst, filled_len); >> >> if (freq > table[0].freq) >> dev_warn(dev, "HW is overloaded, needed: %lu max: %lu\n", >> > > The original patch has a call to load_scale_clocks from > venus_helper_vb2_buf_queue, why it is not included here?
Yes, I need to include it for before every buffer being queued to the device to have accurate precise clock.
Regards, Aniket
| |