video: driver: limit vp9 max spec to 4K@60

Added change to limit VP9 decode max spec is upto 4K@60.

Change-Id: I5939a8cf6cd227d2cced5adb3628b36493b7b1fc
Signed-off-by: Govindaraj Rajagopal <grajagop@codeaurora.org>
This commit is contained in:
Govindaraj Rajagopal
2021-06-08 13:17:24 +05:30
parent 16a8c42091
commit 2c0d2faefa
5 changed files with 101 additions and 64 deletions

View File

@@ -107,11 +107,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
*/
{FRAME_WIDTH, DEC, CODECS_ALL, 96, 8192, 1, 1920},
{FRAME_WIDTH, DEC, VP9, 96, 4096, 1, 1920},
{FRAME_WIDTH, ENC, CODECS_ALL, 128, 8192, 1, 1920},
{LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920},
{SECURE_FRAME_WIDTH, DEC, H264|HEVC|VP9, 96, 4096, 1, 1920},
{SECURE_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920},
{FRAME_HEIGHT, DEC, CODECS_ALL, 96, 8192, 1, 1080},
{FRAME_HEIGHT, DEC, VP9, 96, 4096, 1, 1080},
{FRAME_HEIGHT, ENC, CODECS_ALL, 128, 8192, 1, 1080},
{LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 1, 1080},
{SECURE_FRAME_HEIGHT, DEC, H264|HEVC|VP9, 96, 4096, 1, 1080},
@@ -175,6 +177,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
{MBPF, ENC, CODECS_ALL, 64, 138240, 1, 138240},
{MBPF, DEC, CODECS_ALL, 36, 138240, 1, 138240},
/* (4096 * 2304) / 256 */
{MBPF, DEC, VP9, 36, 36864, 1, 36864},
/* (4096 * 2304) / 256 */
{LOSSLESS_MBPF, ENC, H264|HEVC, 64, 36864, 1, 36864},
/* Batch Mode Decode */
/* TODO: update with new values based on updated voltage corner */
@@ -186,6 +190,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
{MBPS, ENC, CODECS_ALL, 64, 3916800, 1, 3916800},
/* ((1920 * 1088) / 256) * 960 fps */
{MBPS, DEC, CODECS_ALL, 64, 7833600, 1, 7833600},
/* ((4096 * 2304) / 256) * 60 */
{MBPS, DEC, VP9, 36, 2211840, 1, 2211840},
/* ((4096 * 2304) / 256) * 60 fps */
{POWER_SAVE_MBPS, ENC, CODECS_ALL, 0, 2211840, 1, 2211840},
@@ -202,8 +208,17 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
1, (DEFAULT_FPS << 16)},
{FRAME_RATE, DEC, VP9,
(MINIMUM_FPS << 16), (MAXIMUM_VP9_FPS << 16),
1, (DEFAULT_FPS << 16)},
{OPERATING_RATE, ENC|DEC, CODECS_ALL,
1, INT_MAX, 1, (DEFAULT_FPS << 16)},
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
1, (DEFAULT_FPS << 16)},
{OPERATING_RATE, DEC, VP9,
(MINIMUM_FPS << 16), (MAXIMUM_VP9_FPS << 16),
1, (DEFAULT_FPS << 16)},
{SCALE_FACTOR, ENC, H264|HEVC, 1, 8, 1, 8},

View File

@@ -32,6 +32,7 @@
#define DEFAULT_FPS 30
#define MINIMUM_FPS 1
#define MAXIMUM_FPS 960
#define MAXIMUM_VP9_FPS 60
#define SINGLE_INPUT_BUFFER 1
#define SINGLE_OUTPUT_BUFFER 1
#define MAX_NUM_INPUT_BUFFERS VIDEO_MAX_FRAME // same as VB2_MAX_FRAME

View File

@@ -2296,14 +2296,13 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
is_frame_rate = true;
} else {
timeperframe = &s_parm->parm.capture.timeperframe;
max_rate = capability->cap[OPERATING_RATE].max;
max_rate = capability->cap[OPERATING_RATE].max >> 16;
default_rate = capability->cap[OPERATING_RATE].value >> 16;
}
if (!timeperframe->denominator || !timeperframe->numerator) {
i_vpr_e(inst,
"%s: invalid rate for type %u\n",
__func__, s_parm->type);
i_vpr_e(inst, "%s: type %s, invalid rate\n", __func__,
v4l2_type_name(s_parm->type));
input_rate = default_rate;
goto set_default;
}
@@ -2312,8 +2311,7 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
do_div(us_per_frame, timeperframe->denominator);
if (!us_per_frame) {
i_vpr_e(inst, "%s: us_per_frame is zero\n",
__func__);
i_vpr_e(inst, "%s: us_per_frame is zero\n", __func__);
rc = -EINVAL;
goto exit;
}
@@ -2322,29 +2320,29 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
do_div(input_rate, us_per_frame);
set_default:
i_vpr_h(inst, "%s: type %s, %s value %d\n",
__func__, v4l2_type_name(s_parm->type),
is_frame_rate ? "frame rate" : "operating rate", input_rate);
q16_rate = (u32)input_rate << 16;
i_vpr_h(inst, "%s: %s value %d\n",
__func__, is_frame_rate ? "frame rate" : "operating rate", input_rate);
msm_vidc_update_cap_value(inst,
is_frame_rate ? FRAME_RATE : OPERATING_RATE,
msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
q16_rate, __func__);
if ((s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
inst->vb2q[INPUT_PORT].streaming) ||
(s_parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
inst->vb2q[OUTPUT_PORT].streaming)) {
if (msm_vidc_check_core_mbps(inst)) {
i_vpr_e(inst,
"%s: Unsupported load with rate %d, setting default rate %d\n",
__func__, input_rate, default_rate);
msm_vidc_update_cap_value(inst,
is_frame_rate ? FRAME_RATE : OPERATING_RATE,
default_rate << 16, __func__);
return -ENOMEM;
if (is_realtime_session(inst) &&
((s_parm->type == INPUT_MPLANE && inst->vb2q[INPUT_PORT].streaming) ||
(s_parm->type == OUTPUT_MPLANE && inst->vb2q[OUTPUT_PORT].streaming))) {
rc = msm_vidc_check_core_mbps(inst);
if (rc) {
i_vpr_e(inst, "%s: unsupported load\n", __func__);
goto reset_rate;
}
rc = input_rate > max_rate;
if (rc) {
i_vpr_e(inst, "%s: unsupported rate %u, max %u\n", __func__,
input_rate, max_rate);
rc = -ENOMEM;
goto reset_rate;
}
}
inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
if (is_frame_rate)
@@ -2352,6 +2350,15 @@ set_default:
else
capability->cap[OPERATING_RATE].flags |= CAP_FLAG_CLIENT_SET;
return 0;
reset_rate:
if (rc) {
i_vpr_e(inst, "%s: setting rate %u failed, reset to %u\n", __func__,
input_rate, default_rate);
msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
default_rate << 16, __func__);
}
exit:
return rc;
}

View File

@@ -1527,7 +1527,7 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
if (s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
timeperframe = &s_parm->parm.output.timeperframe;
max_rate = capability->cap[OPERATING_RATE].max;
max_rate = capability->cap[OPERATING_RATE].max >> 16;
default_rate = capability->cap[OPERATING_RATE].value >> 16;
} else {
timeperframe = &s_parm->parm.capture.timeperframe;
@@ -1537,9 +1537,8 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
}
if (!timeperframe->denominator || !timeperframe->numerator) {
i_vpr_e(inst,
"%s: invalid rate for type %u\n",
__func__, s_parm->type);
i_vpr_e(inst, "%s: type %s, invalid rate\n", __func__,
v4l2_type_name(s_parm->type));
input_rate = default_rate;
goto set_default;
}
@@ -1548,8 +1547,7 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
do_div(us_per_frame, timeperframe->denominator);
if (!us_per_frame) {
i_vpr_e(inst, "%s: us_per_frame is zero\n",
__func__);
i_vpr_e(inst, "%s: us_per_frame is zero\n", __func__);
rc = -EINVAL;
goto exit;
}
@@ -1557,39 +1555,30 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
input_rate = (u64)USEC_PER_SEC;
do_div(input_rate, us_per_frame);
/* Check max allowed rate */
if (input_rate > max_rate) {
i_vpr_e(inst,
"%s: Unsupported rate %llu, max_fps %u, type: %u\n",
__func__, input_rate, max_rate, s_parm->type);
rc = -ENOTSUPP;
goto exit;
}
set_default:
i_vpr_h(inst, "%s: type %s, %s value %d\n",
__func__, v4l2_type_name(s_parm->type),
is_frame_rate ? "frame rate" : "operating rate", input_rate);
q16_rate = (u32)input_rate << 16;
i_vpr_h(inst, "%s: type %s, value %#x\n",
__func__, v4l2_type_name(s_parm->type), q16_rate);
msm_vidc_update_cap_value(inst,
is_frame_rate ? FRAME_RATE : OPERATING_RATE,
msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
q16_rate, __func__);
if ((s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
inst->vb2q[INPUT_PORT].streaming) ||
(s_parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
inst->vb2q[OUTPUT_PORT].streaming)) {
if (msm_vidc_check_core_mbps(inst)) {
i_vpr_e(inst,
"%s: Unsupported load with rate %d, setting default rate %d\n",
__func__, input_rate, default_rate);
msm_vidc_update_cap_value(inst,
is_frame_rate ? FRAME_RATE : OPERATING_RATE,
default_rate << 16, __func__);
return -ENOMEM;
if (is_realtime_session(inst) &&
((s_parm->type == INPUT_MPLANE && inst->vb2q[INPUT_PORT].streaming) ||
(s_parm->type == OUTPUT_MPLANE && inst->vb2q[OUTPUT_PORT].streaming))) {
rc = msm_vidc_check_core_mbps(inst);
if (rc) {
i_vpr_e(inst, "%s: unsupported load\n", __func__);
goto reset_rate;
}
rc = input_rate > max_rate;
if (rc) {
i_vpr_e(inst, "%s: unsupported rate %u, max %u\n", __func__,
input_rate, max_rate);
rc = -ENOMEM;
goto reset_rate;
}
}
inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
if (is_frame_rate)
@@ -1612,12 +1601,20 @@ set_default:
sizeof(u32));
if (rc) {
i_vpr_e(inst,
"%s: failed to set frame rate to fw\n",
__func__);
"%s: failed to set frame rate to fw\n", __func__);
goto exit;
}
}
return 0;
reset_rate:
if (rc) {
i_vpr_e(inst, "%s: setting rate %u failed, reset to %u\n", __func__,
input_rate, default_rate);
msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
default_rate << 16, __func__);
}
exit:
return rc;
}

View File

@@ -1924,8 +1924,24 @@ int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
if (adjusted_value == 0 && rate_by_client) {
rc = msm_vidc_check_core_mbps(inst);
if (rc) {
d_vpr_e("%s: priority 0 not feasible due to resource\n", __func__);
return rc;
i_vpr_e(inst, "%s: unsupported load\n", __func__);
goto exit;
}
rc = capability->cap[FRAME_RATE].value > capability->cap[FRAME_RATE].max;
if (rc) {
i_vpr_e(inst, "%s: unsupported FRAME_RATE %u, max %u\n", __func__,
capability->cap[FRAME_RATE].value >> 16,
capability->cap[FRAME_RATE].max >> 16);
rc = -ENOMEM;
goto exit;
}
rc = capability->cap[OPERATING_RATE].value > capability->cap[OPERATING_RATE].max;
if (rc) {
i_vpr_e(inst, "%s: unsupported OPERATING_RATE %u, max %u\n", __func__,
capability->cap[OPERATING_RATE].value >> 16,
capability->cap[OPERATING_RATE].max >> 16);
rc = -ENOMEM;
goto exit;
}
}
@@ -1934,6 +1950,7 @@ int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
msm_vidc_update_cap_value(inst, PRIORITY, adjusted_value, __func__);
exit:
return rc;
}