瀏覽代碼

video: driver: handle multiple read only buffers

when fw sends FBDs with read only flag for second time,
do not send vb2 buffer done on that buffer.

Change-Id: Iacf6fe87403664f2063b9d2e1859323506fa22a8
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil 4 年之前
父節點
當前提交
9c98bcf398
共有 2 個文件被更改,包括 20 次插入2 次删除
  1. 1 0
      driver/vidc/inc/msm_vidc_internal.h
  2. 19 2
      driver/vidc/src/venus_hfi_response.c

+ 1 - 0
driver/vidc/inc/msm_vidc_internal.h

@@ -160,6 +160,7 @@ enum msm_vidc_buffer_attributes {
 	MSM_VIDC_ATTR_PENDING_RELEASE           = BIT(2),
 	MSM_VIDC_ATTR_QUEUED                    = BIT(3),
 	MSM_VIDC_ATTR_DEQUEUED                  = BIT(4),
+	MSM_VIDC_ATTR_BUFFER_DONE               = BIT(5),
 };
 
 enum msm_vidc_buffer_region {

+ 19 - 2
driver/vidc/src/venus_hfi_response.c

@@ -462,7 +462,14 @@ static int handle_output_buffer(struct msm_vidc_inst *inst,
 
 	buf->attr &= ~MSM_VIDC_ATTR_QUEUED;
 	buf->attr |= MSM_VIDC_ATTR_DEQUEUED;
-	if (buffer->flags & HFI_BUF_FW_FLAG_READONLY)
+	/*
+	 * reset read only flag for a zero length
+	 * buffer (if marked read only)
+	 */
+	if (buffer->flags & HFI_BUF_FW_FLAG_READONLY &&
+			!buffer->data_size)
+		buf->attr &= ~MSM_VIDC_ATTR_READ_ONLY;
+	else if (buffer->flags & HFI_BUF_FW_FLAG_READONLY)
 		buf->attr |= MSM_VIDC_ATTR_READ_ONLY;
 	else
 		buf->attr &= ~MSM_VIDC_ATTR_READ_ONLY;
@@ -581,7 +588,17 @@ static int handle_dequeue_buffers(struct msm_vidc_inst* inst)
 		list_for_each_entry_safe(buf, dummy, &buffers->list, list) {
 			if (buf->attr & MSM_VIDC_ATTR_DEQUEUED) {
 				buf->attr &= ~MSM_VIDC_ATTR_DEQUEUED;
-				msm_vidc_vb2_buffer_done(inst, buf);
+				/*
+				 * do not send vb2_buffer_done when fw sends FBDs
+				 * with read only flag for second time
+				 */
+				if ((buf->attr & MSM_VIDC_ATTR_BUFFER_DONE) &&
+						buf->attr & MSM_VIDC_ATTR_READ_ONLY){
+					print_vidc_buffer(VIDC_HIGH, "vb2 done already", inst, buf);
+				} else {
+					buf->attr |= MSM_VIDC_ATTR_BUFFER_DONE;
+					msm_vidc_vb2_buffer_done(inst, buf);
+				}
 				/* do not unmap / delete read only buffer */
 				if (!(buf->attr & MSM_VIDC_ATTR_READ_ONLY))
 					msm_vidc_put_driver_buf(inst, buf);