Skip to content
Open
Show file tree
Hide file tree
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
9 changes: 9 additions & 0 deletions drivers/media/platform/qcom/iris/iris_platform_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,20 @@ struct iris_inst;
#define VIDEO_REGION_SECURE_FW_REGION_ID 0
#define VIDEO_REGION_VM0_SECURE_NP_ID 1
#define VIDEO_REGION_VM0_NONSECURE_NP_ID 5
#define PIXEL_COUNT(width, height, fps) ((u64)(width) * (height) * (fps))

enum stage_type {
STAGE_1 = 1,
STAGE_2 = 2,
};

struct iris_vsp_freq_tbl {
const u32 *min_freq;
const u64 *pixel_count;
u32 pixel_count_size;
const u32 * const *ref_bitrate;
};

enum pipe_type {
PIPE_1 = 1,
PIPE_2 = 2,
Expand Down Expand Up @@ -326,6 +334,7 @@ struct iris_platform_data {
const struct platform_inst_slice_caps *slice_caps;
const struct tz_cp_config *tz_cp_config_data;
u32 tz_cp_config_data_size;
const struct iris_vsp_freq_tbl *vsp_freq_tbl;
u32 num_vpp_pipe;
bool no_aon;
bool no_rpmh;
Expand Down
23 changes: 23 additions & 0 deletions drivers/media/platform/qcom/iris/iris_platform_sm8550.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,27 @@ static struct platform_inst_caps platform_inst_cap_sm8550 = {
.max_operating_rate = MAXIMUM_FPS,
};

static const struct iris_vsp_freq_tbl iris_vsp_freq_tbl = {
.min_freq = (const u32[]) {444, 444, 444, 533},
.pixel_count = (const u64[]) {
PIXEL_COUNT(3840, 2160, 240),
PIXEL_COUNT(3840, 2160, 240),
PIXEL_COUNT(3840, 2160, 180),
PIXEL_COUNT(3840, 2160, 120),
PIXEL_COUNT(3840, 2160, 90),
PIXEL_COUNT(3840, 2160, 60),
PIXEL_COUNT(3840, 2160, 30),
PIXEL_COUNT(1920, 1080, 60),
PIXEL_COUNT(1920, 1080, 30),
PIXEL_COUNT(1280, 720, 30),
},
.pixel_count_size = 10,
.ref_bitrate = (const u32 * const[]) {
(const u32[]) {10, 140, 150, 160, 175, 190, 190, 190, 190, 190}, /* AVC */
(const u32[]) {90, 140, 160, 180, 190, 200, 200, 200, 200, 200}, /* HEVC */
(const u32[]) {90, 90, 90, 90, 90, 90, 90, 90, 90, 90}, /* VP9 */
(const u32[]) {130, 130, 120, 120, 120, 120, 120, 120, 120, 120}, /* AV1 */
},
};

#endif
6 changes: 6 additions & 0 deletions drivers/media/platform/qcom/iris/iris_platform_vpu3x.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ const struct iris_platform_data glymur_data = {
.slice_caps = &iris_vpu2_vpu3x_slice_caps,
.tz_cp_config_data = iris_glymur_tz_cp_config,
.tz_cp_config_data_size = ARRAY_SIZE(iris_glymur_tz_cp_config),
.vsp_freq_tbl = &iris_vsp_freq_tbl,
.num_vpp_pipe = 4,
.max_session_count = 16,
.num_cores = 2,
Expand Down Expand Up @@ -147,6 +148,7 @@ const struct iris_platform_data qcs8300_data = {
.slice_caps = &iris_vpu2_vpu3x_slice_caps,
.tz_cp_config_data = tz_cp_config_vpu3,
.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_vpu3),
.vsp_freq_tbl = &iris_vsp_freq_tbl,
.num_vpp_pipe = 2,
.wd_intr_mask = WRAPPER_INTR_STATUS_A2HWD_BMSK,
.icc_ib_multiplier = 1,
Expand Down Expand Up @@ -177,6 +179,7 @@ const struct iris_platform_data sm8550_data = {
.slice_caps = &iris_vpu2_vpu3x_slice_caps,
.tz_cp_config_data = tz_cp_config_vpu3,
.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_vpu3),
.vsp_freq_tbl = &iris_vsp_freq_tbl,
.num_vpp_pipe = 4,
.wd_intr_mask = WRAPPER_INTR_STATUS_A2HWD_BMSK,
.icc_ib_multiplier = 1,
Expand Down Expand Up @@ -215,6 +218,7 @@ const struct iris_platform_data sm8650_data = {
.slice_caps = &iris_vpu2_vpu3x_slice_caps,
.tz_cp_config_data = tz_cp_config_vpu3,
.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_vpu3),
.vsp_freq_tbl = &iris_vsp_freq_tbl,
.num_vpp_pipe = 4,
.wd_intr_mask = WRAPPER_INTR_STATUS_A2HWD_BMSK,
.icc_ib_multiplier = 1,
Expand Down Expand Up @@ -245,6 +249,7 @@ const struct iris_platform_data sm8750_data = {
.slice_caps = &iris_vpu2_vpu3x_slice_caps,
.tz_cp_config_data = tz_cp_config_vpu3,
.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_vpu3),
.vsp_freq_tbl = &iris_vsp_freq_tbl,
.num_vpp_pipe = 4,
.wd_intr_mask = WRAPPER_INTR_STATUS_A2HWD_BMSK,
.icc_ib_multiplier = 1,
Expand Down Expand Up @@ -281,6 +286,7 @@ const struct iris_platform_data x1p42100_data = {
.slice_caps = &iris_vpu2_vpu3x_slice_caps,
.tz_cp_config_data = tz_cp_config_vpu3,
.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_vpu3),
.vsp_freq_tbl = &iris_vsp_freq_tbl,
.num_vpp_pipe = 1,
.wd_intr_mask = WRAPPER_INTR_STATUS_A2HWD_BMSK,
.icc_ib_multiplier = 1,
Expand Down
49 changes: 48 additions & 1 deletion drivers/media/platform/qcom/iris/iris_vpu_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -369,11 +369,51 @@ u64 iris_vpu2_calculate_frequency(struct iris_inst *inst, size_t data_size)
return max(vpp_freq, vsp_freq);
}

static u32 iris_vsp_codec_index(struct iris_inst *inst)
{
const u32 *fmts = inst->core->iris_platform_data->inst_iris_fmts;
u32 size = inst->core->iris_platform_data->inst_iris_fmts_size;
u32 idx;

for (idx = 0; idx < size; idx++) {
if (inst->codec == fmts[idx])
return idx;
}

return 0;
}

static u32 iris_vsp_bitrate_index(struct iris_inst *inst)
{
const struct iris_vsp_freq_tbl *vsp_tbl = inst->core->iris_platform_data->vsp_freq_tbl;
u32 height = max(inst->fmt_src->fmt.pix_mp.height, inst->crop.height);
u32 width = max(inst->fmt_src->fmt.pix_mp.width, inst->crop.width);
u32 max_idx = vsp_tbl->pixel_count_size;
u32 fps = inst->frame_rate;
u64 pixel_count;
u32 idx = 0;

pixel_count = (u64)width * height * fps;

if (pixel_count >= vsp_tbl->pixel_count[idx++] &&
inst->fw_caps[B_FRAME].value)
return 0;

for (; idx < max_idx; idx++) {
if (pixel_count >= vsp_tbl->pixel_count[idx])
return idx;
}

return max_idx - 1;
}

u64 iris_vpu3x_vpu4x_calculate_frequency(struct iris_inst *inst, size_t data_size)
{
const struct iris_vsp_freq_tbl *vsp_tbl = inst->core->iris_platform_data->vsp_freq_tbl;
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;
u32 codec_idx, bitrate_idx;
u64 fw_cycles, fw_vpp_cycles;
u64 vsp_cycles, vpp_cycles;
u32 fps = inst->frame_rate;
Expand All @@ -400,7 +440,14 @@ 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);
codec_idx = iris_vsp_codec_index(inst);
bitrate_idx = iris_vsp_bitrate_index(inst);
vsp_cycles = div_u64(vsp_tbl->min_freq[codec_idx] * vsp_cycles,
vsp_tbl->ref_bitrate[codec_idx][bitrate_idx]);

/* Apply fw_sw_vsp_offset (÷1.055) */
vsp_cycles = div_u64(vsp_cycles * 1000, 1055);

/* VSP FW overhead 1.05 */
vsp_cycles = div_u64(vsp_cycles * 21, 20);

Expand Down
Loading