diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 3a79df5afc..91f257e4ba 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -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}, diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 8b4f158170..739755b98f 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -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 diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 87c90d409e..47ee38256e 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -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; } diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index ab1fe5a309..6c1b94f645 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -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; } diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index ec3df2714d..9cd5814ab4 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -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; }