Merge "video: driver: check whether meta buffers dequeued from FW"
Este cometimento está contido em:

cometido por
Gerrit - the friendly Code Review server

cometimento
dde62fecf8
@@ -1024,6 +1024,64 @@ static int handle_output_metadata_buffer(struct msm_vidc_inst *inst,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static bool is_metabuffer_dequeued(struct msm_vidc_inst *inst,
|
||||
struct msm_vidc_buffer *buf)
|
||||
{
|
||||
bool found = false;
|
||||
struct msm_vidc_buffers *buffers;
|
||||
struct msm_vidc_buffer *buffer;
|
||||
enum msm_vidc_buffer_type buffer_type;
|
||||
|
||||
if (is_input_buffer(buf->type) && is_input_meta_enabled(inst))
|
||||
buffer_type = MSM_VIDC_BUF_INPUT_META;
|
||||
else if (is_output_buffer(buf->type) && is_output_meta_enabled(inst))
|
||||
buffer_type = MSM_VIDC_BUF_OUTPUT_META;
|
||||
else
|
||||
return true;
|
||||
|
||||
buffers = msm_vidc_get_buffers(inst, buffer_type, __func__);
|
||||
if (!buffers)
|
||||
return false;
|
||||
|
||||
list_for_each_entry(buffer, &buffers->list, list) {
|
||||
if (buffer->index == buf->index &&
|
||||
buffer->attr & MSM_VIDC_ATTR_DEQUEUED) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
static int msm_vidc_check_meta_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
int i;
|
||||
struct msm_vidc_buffers *buffers;
|
||||
struct msm_vidc_buffer *buf;
|
||||
const enum msm_vidc_buffer_type buffer_type[] = {
|
||||
MSM_VIDC_BUF_INPUT,
|
||||
MSM_VIDC_BUF_OUTPUT,
|
||||
};
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(buffer_type); i++) {
|
||||
buffers = msm_vidc_get_buffers(inst, buffer_type[i], __func__);
|
||||
if (!buffers)
|
||||
return -EINVAL;
|
||||
|
||||
list_for_each_entry(buf, &buffers->list, list) {
|
||||
if (buf->attr & MSM_VIDC_ATTR_DEQUEUED) {
|
||||
if (!is_metabuffer_dequeued(inst, buf)) {
|
||||
print_vidc_buffer(VIDC_ERR, "err ",
|
||||
"meta not dequeued", inst, buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int handle_dequeue_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
@@ -1031,13 +1089,18 @@ static int handle_dequeue_buffers(struct msm_vidc_inst *inst)
|
||||
struct msm_vidc_buffers *buffers;
|
||||
struct msm_vidc_buffer *buf;
|
||||
struct msm_vidc_buffer *dummy;
|
||||
static const enum msm_vidc_buffer_type buffer_type[] = {
|
||||
const enum msm_vidc_buffer_type buffer_type[] = {
|
||||
MSM_VIDC_BUF_INPUT_META,
|
||||
MSM_VIDC_BUF_INPUT,
|
||||
MSM_VIDC_BUF_OUTPUT_META,
|
||||
MSM_VIDC_BUF_OUTPUT,
|
||||
};
|
||||
|
||||
/* check metabuffers dequeued before sending vb2_buffer_done() */
|
||||
rc = msm_vidc_check_meta_buffers(inst);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(buffer_type); i++) {
|
||||
buffers = msm_vidc_get_buffers(inst, buffer_type[i], __func__);
|
||||
if (!buffers)
|
||||
@@ -1134,12 +1197,12 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
|
||||
struct hfi_buffer *buffer;
|
||||
u32 hfi_handle_size = 0;
|
||||
const struct msm_vidc_hfi_buffer_handle *hfi_handle_arr = NULL;
|
||||
static const struct msm_vidc_hfi_buffer_handle enc_input_hfi_handle[] = {
|
||||
const struct msm_vidc_hfi_buffer_handle enc_input_hfi_handle[] = {
|
||||
{HFI_BUFFER_METADATA, handle_input_metadata_buffer },
|
||||
{HFI_BUFFER_RAW, handle_input_buffer },
|
||||
{HFI_BUFFER_VPSS, handle_release_internal_buffer },
|
||||
};
|
||||
static const struct msm_vidc_hfi_buffer_handle enc_output_hfi_handle[] = {
|
||||
const struct msm_vidc_hfi_buffer_handle enc_output_hfi_handle[] = {
|
||||
{HFI_BUFFER_METADATA, handle_output_metadata_buffer },
|
||||
{HFI_BUFFER_BITSTREAM, handle_output_buffer },
|
||||
{HFI_BUFFER_BIN, handle_release_internal_buffer },
|
||||
@@ -1149,7 +1212,7 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
|
||||
{HFI_BUFFER_ARP, handle_release_internal_buffer },
|
||||
{HFI_BUFFER_DPB, handle_release_internal_buffer },
|
||||
};
|
||||
static const struct msm_vidc_hfi_buffer_handle dec_input_hfi_handle[] = {
|
||||
const struct msm_vidc_hfi_buffer_handle dec_input_hfi_handle[] = {
|
||||
{HFI_BUFFER_METADATA, handle_input_metadata_buffer },
|
||||
{HFI_BUFFER_BITSTREAM, handle_input_buffer },
|
||||
{HFI_BUFFER_BIN, handle_release_internal_buffer },
|
||||
@@ -1158,7 +1221,7 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
|
||||
{HFI_BUFFER_LINE, handle_release_internal_buffer },
|
||||
{HFI_BUFFER_PERSIST, handle_release_internal_buffer },
|
||||
};
|
||||
static const struct msm_vidc_hfi_buffer_handle dec_output_hfi_handle[] = {
|
||||
const struct msm_vidc_hfi_buffer_handle dec_output_hfi_handle[] = {
|
||||
{HFI_BUFFER_METADATA, handle_output_metadata_buffer },
|
||||
{HFI_BUFFER_RAW, handle_output_buffer },
|
||||
{HFI_BUFFER_DPB, handle_release_internal_buffer },
|
||||
@@ -1292,7 +1355,7 @@ static int handle_session_command(struct msm_vidc_inst *inst,
|
||||
struct hfi_packet *pkt)
|
||||
{
|
||||
int i, rc;
|
||||
static const struct msm_vidc_hfi_packet_handle hfi_pkt_handle[] = {
|
||||
const struct msm_vidc_hfi_packet_handle hfi_pkt_handle[] = {
|
||||
{HFI_CMD_OPEN, handle_session_open },
|
||||
{HFI_CMD_CLOSE, handle_session_close },
|
||||
{HFI_CMD_START, handle_session_start },
|
||||
@@ -1558,7 +1621,7 @@ static int handle_system_response(struct msm_vidc_core *core,
|
||||
struct hfi_packet *packet;
|
||||
u8 *pkt, *start_pkt;
|
||||
int i, j;
|
||||
static const struct msm_vidc_core_hfi_range be[] = {
|
||||
const struct msm_vidc_core_hfi_range be[] = {
|
||||
{HFI_SYSTEM_ERROR_BEGIN, HFI_SYSTEM_ERROR_END, handle_system_error },
|
||||
{HFI_PROP_BEGIN, HFI_PROP_END, handle_system_property },
|
||||
{HFI_CMD_BEGIN, HFI_CMD_END, handle_system_init },
|
||||
@@ -1605,7 +1668,7 @@ static int __handle_session_response(struct msm_vidc_inst *inst,
|
||||
u8 *pkt, *start_pkt;
|
||||
bool dequeue = false;
|
||||
int i, j;
|
||||
static const struct msm_vidc_inst_hfi_range be[] = {
|
||||
const struct msm_vidc_inst_hfi_range be[] = {
|
||||
{HFI_SESSION_ERROR_BEGIN, HFI_SESSION_ERROR_END, handle_session_error },
|
||||
{HFI_INFORMATION_BEGIN, HFI_INFORMATION_END, handle_session_info },
|
||||
{HFI_PROP_BEGIN, HFI_PROP_END, handle_session_property },
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador