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:
Darshana Patil
2020-09-04 15:47:10 -07:00
committet von Maheshwar Ajja
Ursprung 081c9ad524
Commit c9dec2599e
7 geänderte Dateien mit 70 neuen und 14 gelöschten Zeilen

Datei anzeigen

@@ -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,

Datei anzeigen

@@ -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;

Datei anzeigen

@@ -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);

Datei anzeigen

@@ -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);

Datei anzeigen

@@ -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)

Datei anzeigen

@@ -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;
}

Datei anzeigen

@@ -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)