diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index 73cc625857..a508f419a3 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -87,6 +87,8 @@ int msm_vidc_release_internal_buffers(struct msm_vidc_inst *inst, enum msm_vidc_buffer_type buffer_type); int msm_vidc_add_session(struct msm_vidc_inst *inst); int msm_vidc_session_open(struct msm_vidc_inst *inst); +int msm_vidc_session_set_codec(struct msm_vidc_inst *inst); +int msm_vidc_session_close(struct msm_vidc_inst *inst); int msm_vidc_get_inst_capability(struct msm_vidc_inst *inst); int msm_vidc_core_init(struct msm_vidc_core *core); int msm_vidc_smmu_fault_handler(struct iommu_domain *domain, diff --git a/driver/vidc/inc/msm_vidc_inst.h b/driver/vidc/inc/msm_vidc_inst.h index 86a2996c63..b548a7bb3d 100644 --- a/driver/vidc/inc/msm_vidc_inst.h +++ b/driver/vidc/inc/msm_vidc_inst.h @@ -111,7 +111,7 @@ struct msm_vidc_inst { struct list_head input_ts; struct list_head enc_input_crs; struct list_head decode_bitrate_data; - bool session_created; + bool codec_set; struct dentry *debugfs_root; struct msm_vidc_debug debug; struct msm_vidc_inst_capability *capabilities; diff --git a/driver/vidc/inc/venus_hfi.h b/driver/vidc/inc/venus_hfi.h index 5a816236ac..d50e8baf51 100644 --- a/driver/vidc/inc/venus_hfi.h +++ b/driver/vidc/inc/venus_hfi.h @@ -54,6 +54,7 @@ int venus_hfi_start(struct msm_vidc_inst *inst, enum msm_vidc_port_type port); int venus_hfi_stop(struct msm_vidc_inst *inst, enum msm_vidc_port_type port); int venus_hfi_session_close(struct msm_vidc_inst *inst); int venus_hfi_session_open(struct msm_vidc_inst *inst); +int venus_hfi_session_set_codec(struct msm_vidc_inst *inst); int venus_hfi_core_init(struct msm_vidc_core *core); int venus_hfi_core_release(struct msm_vidc_core *core); int venus_hfi_suspend(struct msm_vidc_core *core); diff --git a/driver/vidc/src/msm_vidc.c b/driver/vidc/src/msm_vidc.c index 2834b705ab..30e48e026e 100644 --- a/driver/vidc/src/msm_vidc.c +++ b/driver/vidc/src/msm_vidc.c @@ -810,6 +810,9 @@ void *msm_vidc_open(void *vidc_core, u32 session_type) //msm_power_setup(inst); // send cmd to firmware here + rc = msm_vidc_session_open(inst); + if (rc) + goto error; return inst; @@ -821,6 +824,7 @@ EXPORT_SYMBOL(msm_vidc_open); int msm_vidc_close(void *instance) { + int rc = 0; struct msm_vidc_inst *inst = instance; if (!inst) { @@ -828,7 +832,8 @@ int msm_vidc_close(void *instance) return -EINVAL; } s_vpr_h(inst->sid, "%s()\n", __func__); + rc = msm_vidc_session_close(inst); - return 0; + return rc; } EXPORT_SYMBOL(msm_vidc_close); diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index bea74766f7..d98e4f1dc5 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -1051,11 +1051,52 @@ int msm_vidc_session_open(struct msm_vidc_inst *inst) } rc = venus_hfi_session_open(inst); + + return rc; +} + +int msm_vidc_session_set_codec(struct msm_vidc_inst *inst) +{ + int rc = 0; + + if (!inst) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + rc = venus_hfi_session_set_codec(inst); + + return rc; +} + +int msm_vidc_session_close(struct msm_vidc_inst *inst) +{ + int rc = 0; + struct msm_vidc_core *core; + + if (!inst || !inst->core) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + rc = venus_hfi_session_close(inst); if (rc) return rc; - inst->session_created = true; - return 0; + core = inst->core; + rc = wait_for_completion_timeout( + &inst->completions[SIGNAL_CMD_CLOSE], + msecs_to_jiffies( + core->platform->data.core_data[HW_RESPONSE_TIMEOUT].value)); + if (!rc) { + s_vpr_e(inst->sid, "%s: session close timed out\n", __func__); + //msm_comm_kill_session(inst); + rc = -EIO; + } else { + rc = 0; + } + + return rc; } int msm_vidc_get_inst_capability(struct msm_vidc_inst *inst) diff --git a/driver/vidc/src/msm_vidc_vb2.c b/driver/vidc/src/msm_vidc_vb2.c index 3830346d80..62555f9acd 100644 --- a/driver/vidc/src/msm_vidc_vb2.c +++ b/driver/vidc/src/msm_vidc_vb2.c @@ -107,8 +107,8 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count) } s_vpr_h(inst->sid, "Streamon: %d\n", q->type); - if (!inst->session_created) { - rc = msm_vidc_session_open(inst); + if (!inst->codec_set) { + rc = msm_vidc_session_set_codec(inst); if (rc) return -EINVAL; } diff --git a/driver/vidc/src/venus_hfi.c b/driver/vidc/src/venus_hfi.c index a33dbca30e..4530986833 100644 --- a/driver/vidc/src/venus_hfi.c +++ b/driver/vidc/src/venus_hfi.c @@ -569,7 +569,6 @@ static int __write_queue(struct msm_vidc_iface_q_info *qinfo, u8 *packet, d_vpr_e("skip writing packet\n"); return 0; - packet_size_in_words = (*(u32 *)packet) >> 2; if (!packet_size_in_words || packet_size_in_words > qinfo->q_array.mem_size>>2) { @@ -2463,9 +2462,6 @@ int venus_hfi_suspend(struct msm_vidc_core *core) int venus_hfi_session_open(struct msm_vidc_inst *inst) { int rc = 0; - u32 codec; - - d_vpr_h("%s(): inst %p %p\n", __func__, inst); if (!inst) { d_vpr_e("%s: invalid params\n", __func__); @@ -2493,6 +2489,19 @@ int venus_hfi_session_open(struct msm_vidc_inst *inst) rc = __iface_cmdq_write(inst->core, inst->packet); if (rc) goto error; +error: + return rc; +} + +int venus_hfi_session_set_codec(struct msm_vidc_inst *inst) +{ + int rc = 0; + u32 codec; + + if (!inst || !inst->packet) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } codec = get_hfi_codec(inst); rc = hfi_packet_session_property(inst, @@ -2509,7 +2518,7 @@ int venus_hfi_session_open(struct msm_vidc_inst *inst) if (rc) goto error; - inst->session_created = true; + inst->codec_set = true; error: return rc; } @@ -2518,8 +2527,6 @@ int venus_hfi_session_close(struct msm_vidc_inst *inst) { int rc = 0; - d_vpr_h("%s(): inst %p\n", __func__, inst); - if (!inst || !inst->packet) { d_vpr_e("%s: invalid params\n", __func__); return -EINVAL; @@ -2540,7 +2547,7 @@ int venus_hfi_session_close(struct msm_vidc_inst *inst) kfree(inst->packet); - return rc; + return rc; } int venus_hfi_start(struct msm_vidc_inst *inst, enum msm_vidc_port_type port)