Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion drivers/media/platform/qcom/iris/iris_vpu_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -423,11 +423,32 @@ void iris_vpu35_vpu4x_program_bootup_registers(struct iris_core *core)
writel(0x1, core->reg_base + WRAPPER_IRIS_VCODEC_VPU_WRAPPER_SPARE_0);
}

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;
Expand All @@ -454,7 +475,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);

Expand Down
Loading