diff --git a/drivers/media/platform/qcom/iris/iris_vpu_common.c b/drivers/media/platform/qcom/iris/iris_vpu_common.c index 22d394851ef1b..1d2692de57786 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu_common.c +++ b/drivers/media/platform/qcom/iris/iris_vpu_common.c @@ -369,11 +369,32 @@ u64 iris_vpu2_calculate_frequency(struct iris_inst *inst, size_t data_size) return max(vpp_freq, vsp_freq); } +static u64 iris_get_vsp_ref_bitrate(struct iris_inst *inst) +{ + struct device *dev = inst->core->dev; + u32 codec = inst->codec; + + switch (codec) { + case V4L2_PIX_FMT_H264: + return 150; + case V4L2_PIX_FMT_HEVC: + return 140; + case V4L2_PIX_FMT_VP9: + return 70; + case V4L2_PIX_FMT_AV1: + return 100; + default: + dev_err(dev, "Unsupported codec\n"); + return 1; + } +} + u64 iris_vpu3x_vpu4x_calculate_frequency(struct iris_inst *inst, size_t data_size) { struct platform_inst_caps *caps = inst->core->iris_platform_data->inst_caps; struct v4l2_format *inp_f = inst->fmt_src; u32 height, width, mbs_per_second, mbpf; + u64 vsp_ref_bitrate, vsp_ref_freq; u64 fw_cycles, fw_vpp_cycles; u64 vsp_cycles, vpp_cycles; u32 fps = inst->frame_rate; @@ -400,7 +421,13 @@ u64 iris_vpu3x_vpu4x_calculate_frequency(struct iris_inst *inst, size_t data_siz vpp_cycles += div_u64(vpp_cycles * 5, 100); vsp_cycles = fps * data_size * 8; - vsp_cycles = div_u64(vsp_cycles, 2); + vsp_ref_bitrate = iris_get_vsp_ref_bitrate(inst); + vsp_ref_freq = inst->codec == V4L2_PIX_FMT_AV1 ? 533 : 444; + vsp_cycles = div_u64(vsp_ref_freq * vsp_cycles, vsp_ref_bitrate); + + /* VSP FW SW offset */ + vsp_cycles = div_u64(vsp_cycles * 1000, 1055); + /* VSP FW overhead 1.05 */ vsp_cycles = div_u64(vsp_cycles * 21, 20);