diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 275df89721..3ba87d8474 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -465,12 +465,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_CSC_MATRIX, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, */ - {LOWLATENCY_MODE, ENC|DEC, H264|HEVC|VP9, + {LOWLATENCY_MODE, ENC, H264 | HEVC, + V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, + 1, V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST}, + + {LOWLATENCY_MODE, DEC, H264|HEVC|VP9, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 1, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST, HFI_PROP_STAGE, - CAP_FLAG_ROOT}, + CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + NULL, msm_vidc_set_stage}, {LTR_COUNT, ENC, H264|HEVC, 0, 2, 1, 0, @@ -1142,11 +1149,21 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {STAGE, DEC|ENC, CODECS_ALL, MSM_VIDC_STAGE_1, MSM_VIDC_STAGE_2, 1, - MSM_VIDC_STAGE_2}, + MSM_VIDC_STAGE_2, + 0, + HFI_PROP_STAGE, + CAP_FLAG_ROOT, + {0}, {0}, + NULL, msm_vidc_set_stage}, {PIPE, DEC|ENC, CODECS_ALL, MSM_VIDC_PIPE_1, MSM_VIDC_PIPE_4, 1, - MSM_VIDC_PIPE_4}, + MSM_VIDC_PIPE_4, + 0, + HFI_PROP_PIPE, + CAP_FLAG_ROOT, + {0}, {0}, + NULL, msm_vidc_set_pipe}, {POC, DEC, H264, 0, 18, 1, 1}, {QUALITY_MODE, ENC, CODECS_ALL, MSM_VIDC_MAX_QUALITY_MODE, diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index b92216695b..50ce7c2cb9 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -86,6 +86,10 @@ int msm_vidc_set_blur_type(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_blur_resolution(void *instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_stage(void *instance, + enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_pipe(void *instance, + enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_s32(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_q16(void *instance, diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 057c9f1e1c..6a8a3b2293 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -528,64 +528,6 @@ static int msm_vdec_set_colorformat(struct msm_vidc_inst *inst) return rc; } -static int msm_vdec_set_stage(struct msm_vidc_inst *inst) -{ - int rc = 0; - u32 stage = 0; - struct msm_vidc_core *core = inst->core; - struct msm_vidc_inst_capability *capability = inst->capabilities; - - rc = call_session_op(core, decide_work_mode, inst); - if (rc) { - i_vpr_e(inst, "%s: decide_work_mode failed %d\n", - __func__); - return -EINVAL; - } - - stage = capability->cap[STAGE].value; - i_vpr_h(inst, "%s: stage: %d", __func__, stage); - rc = venus_hfi_session_property(inst, - HFI_PROP_STAGE, - HFI_HOST_FLAGS_NONE, - HFI_PORT_NONE, - HFI_PAYLOAD_U32, - &stage, - sizeof(u32)); - if (rc) - i_vpr_e(inst, "%s: set property failed\n", __func__); - - return rc; -} - -static int msm_vdec_set_pipe(struct msm_vidc_inst *inst) -{ - int rc = 0; - u32 pipe; - struct msm_vidc_core *core = inst->core; - struct msm_vidc_inst_capability *capability = inst->capabilities; - - rc = call_session_op(core, decide_work_route, inst); - if (rc) { - i_vpr_e(inst, "%s: decide_work_route failed\n", - __func__); - return -EINVAL; - } - - pipe = capability->cap[PIPE].value; - i_vpr_h(inst, "%s: pipe: %d", __func__, pipe); - rc = venus_hfi_session_property(inst, - HFI_PROP_PIPE, - HFI_HOST_FLAGS_NONE, - HFI_PORT_NONE, - HFI_PAYLOAD_U32, - &pipe, - sizeof(u32)); - if (rc) - i_vpr_e(inst, "%s: set property failed\n", __func__); - - return rc; -} - static int msm_vdec_set_output_order(struct msm_vidc_inst *inst, enum msm_vidc_port_type port) { @@ -816,11 +758,11 @@ static int msm_vdec_set_output_properties(struct msm_vidc_inst *inst) if (rc) return rc; - rc = msm_vdec_set_stage(inst); + rc = msm_vidc_set_stage(inst, STAGE); if (rc) return rc; - rc = msm_vdec_set_pipe(inst); + rc = msm_vidc_set_pipe(inst, PIPE); if (rc) return rc; diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index a632c36714..c2f9d4fee8 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -399,62 +399,6 @@ static int msm_venc_set_csc(struct msm_vidc_inst* inst, return 0; } -static int msm_venc_set_stage(struct msm_vidc_inst *inst) -{ - int rc = 0; - struct msm_vidc_core *core = inst->core; - struct msm_vidc_inst_capability *capability = inst->capabilities; - u32 stage; - - rc = call_session_op(core, decide_work_mode, inst); - if (rc) { - i_vpr_e(inst, "%s: decide_work_mode failed\n", - __func__); - return -EINVAL; - } - - stage = capability->cap[STAGE].value; - i_vpr_h(inst, "%s: stage: %u\n", __func__, stage); - rc = venus_hfi_session_property(inst, - HFI_PROP_STAGE, - HFI_HOST_FLAGS_NONE, - HFI_PORT_NONE, - HFI_PAYLOAD_U32, - &stage, - sizeof(u32)); - if (rc) - return rc; - return 0; -} - -static int msm_venc_set_pipe(struct msm_vidc_inst *inst) -{ - int rc = 0; - struct msm_vidc_core *core = inst->core; - struct msm_vidc_inst_capability *capability = inst->capabilities; - u32 pipe; - - rc = call_session_op(core, decide_work_route, inst); - if (rc) { - i_vpr_e(inst, "%s: decide_work_route failed\n", - __func__); - return -EINVAL; - } - - pipe = capability->cap[PIPE].value; - i_vpr_h(inst, "%s: pipe: %u\n", __func__, pipe); - rc = venus_hfi_session_property(inst, - HFI_PROP_PIPE, - HFI_HOST_FLAGS_NONE, - HFI_PORT_NONE, - HFI_PAYLOAD_U32, - &pipe, - sizeof(u32)); - if (rc) - return rc; - return 0; -} - static int msm_venc_set_quality_mode(struct msm_vidc_inst *inst) { int rc = 0; @@ -568,15 +512,6 @@ static int msm_venc_set_internal_properties(struct msm_vidc_inst *inst) } i_vpr_h(inst, "%s()\n", __func__); - //TODO: set HFI_PORT_NONE properties at master port streamon. - rc = msm_venc_set_stage(inst); - if (rc) - return rc; - - rc = msm_venc_set_pipe(inst); - if (rc) - return rc; - rc = msm_venc_set_quality_mode(inst); if (rc) return rc; diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index f4e9f55710..f757379505 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -3113,3 +3113,63 @@ set_default: capability->cap[cap_id].v4l2_id, *value); return 0; } + +int msm_vidc_set_stage(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + u32 stage = 0; + struct msm_vidc_core *core; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + + if (!inst || !inst->capabilities || !inst->core) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + core = inst->core; + + rc = call_session_op(core, decide_work_mode, inst); + if (rc) { + i_vpr_e(inst, "%s: decide_work_mode failed\n", __func__); + return -EINVAL; + } + + stage = inst->capabilities->cap[STAGE].value; + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32, + &stage, sizeof(u32), __func__); + if (rc) + return rc; + + return rc; +} + +int msm_vidc_set_pipe(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + u32 pipe; + struct msm_vidc_core *core; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + + if (!inst || !inst->capabilities || !inst->core) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + core = inst->core; + + rc = call_session_op(core, decide_work_route, inst); + if (rc) { + i_vpr_e(inst, "%s: decide_work_route failed\n", + __func__); + return -EINVAL; + } + + pipe = inst->capabilities->cap[PIPE].value; + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32, + &pipe, sizeof(u32), __func__); + if (rc) + return rc; + + return rc; +} diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 9829bcf2dc..26d2df279f 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -1109,6 +1109,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id) switch (id) { case V4L2_CID_MPEG_VIDC_CODEC_CONFIG: case V4L2_CID_MPEG_VIDC_PRIORITY: + case V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST: allow = true; break; default: