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 <darshana@codeaurora.org>
Dieser Commit ist enthalten in:

committet von
Maheshwar Ajja

Ursprung
081c9ad524
Commit
c9dec2599e
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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)
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren