Browse Source

driver: vidc: add support for open, close, set codec

add support for session open, close and set codec.

Change-Id: Ic2f7a953a0d90215fab0a0d141957c3eb1a8cc78
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil 4 years ago
parent
commit
c9dec2599e

+ 2 - 0
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,

+ 1 - 1
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;

+ 1 - 0
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);

+ 6 - 1
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);

+ 43 - 2
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)

+ 2 - 2
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;
 	}

+ 15 - 8
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)