Эх сурвалжийг харах

video: driver: request api fixes for v4l2-compliance

- add support for prepare_buf
- check if client has configured invalid fd for metadata
  buffer fd control.

Change-Id: I576d02be05e4692a5ab45286895c34284f08651c
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil 3 жил өмнө
parent
commit
eef358cf9c

+ 1 - 1
driver/platform/kalama/src/msm_vidc_kalama.c

@@ -1616,7 +1616,7 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		msm_vidc_adjust_all_intra, NULL},
 
 	{INPUT_METADATA_FD, ENC|DEC, CODECS_ALL,
-		-1, INT_MAX, 1, -1,
+		INVALID_FD, INT_MAX, 1, INVALID_FD,
 		V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD,
 		0,
 		CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,

+ 1 - 1
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -1474,7 +1474,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		msm_vidc_adjust_all_intra, NULL},
 
 	{INPUT_METADATA_FD, ENC|DEC, CODECS_ALL,
-		-1, INT_MAX, 1, -1,
+		INVALID_FD, INT_MAX, 1, INVALID_FD,
 		V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD,
 		0,
 		CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,

+ 2 - 0
driver/vidc/inc/msm_vidc.h

@@ -28,6 +28,8 @@ int msm_vidc_g_param(void *instance, struct v4l2_streamparm *sp);
 int msm_vidc_reqbufs(void *instance, struct v4l2_requestbuffers *b);
 int msm_vidc_querybuf(void *instance, struct v4l2_buffer *b);
 int msm_vidc_create_bufs(void *instance, struct v4l2_create_buffers *b);
+int msm_vidc_prepare_buf(void *instance, struct media_device *mdev,
+	struct v4l2_buffer *b);
 int msm_vidc_release_buffer(void *instance, int buffer_type,
 		unsigned int buffer_index);
 int msm_vidc_qbuf(void *instance, struct media_device *mdev,

+ 1 - 1
driver/vidc/inc/msm_vidc_driver.h

@@ -450,7 +450,7 @@ bool res_is_less_than(u32 width, u32 height,
 bool res_is_less_than_or_equal_to(u32 width, u32 height,
 	u32 ref_width, u32 ref_height);
 int msm_vidc_get_properties(struct msm_vidc_inst *inst);
-int msm_vidc_create_input_metadata_buffer(struct msm_vidc_inst *inst, u32 buf_fd);
+int msm_vidc_create_input_metadata_buffer(struct msm_vidc_inst *inst, int buf_fd);
 int msm_vidc_update_input_meta_buffer_index(struct msm_vidc_inst *inst, struct vb2_buffer *vb2);
 #endif // _MSM_VIDC_DRIVER_H_
 

+ 2 - 0
driver/vidc/inc/msm_vidc_v4l2.h

@@ -38,6 +38,8 @@ int msm_v4l2_querybuf(struct file *file, void *fh,
 		struct v4l2_buffer *b);
 int msm_v4l2_create_bufs(struct file *filp, void *fh,
 		struct v4l2_create_buffers *b);
+int msm_v4l2_prepare_buf(struct file *filp, void *fh,
+		struct v4l2_buffer *b);
 int msm_v4l2_qbuf(struct file *file, void *fh,
 		struct v4l2_buffer *b);
 int msm_v4l2_dqbuf(struct file *file, void *fh,

+ 29 - 0
driver/vidc/src/msm_vidc.c

@@ -474,6 +474,35 @@ exit:
 }
 EXPORT_SYMBOL(msm_vidc_create_bufs);
 
+int msm_vidc_prepare_buf(void *instance, struct media_device *mdev,
+	struct v4l2_buffer *b)
+{
+	int rc = 0;
+	struct msm_vidc_inst *inst = instance;
+	struct vb2_queue *q;
+
+	if (!inst || !inst->core || !b || !valid_v4l2_buffer(b, inst)) {
+		d_vpr_e("%s: invalid params %pK %pK\n", __func__, inst, b);
+		return -EINVAL;
+	}
+
+	q = msm_vidc_get_vb2q(inst, b->type, __func__);
+	if (!q) {
+		rc = -EINVAL;
+		goto exit;
+	}
+
+	rc = vb2_prepare_buf(q, mdev, b);
+	if (rc) {
+		i_vpr_e(inst, "%s: failed with %d\n", __func__, rc);
+		goto exit;
+	}
+
+exit:
+	return rc;
+}
+EXPORT_SYMBOL(msm_vidc_prepare_buf);
+
 int msm_vidc_qbuf(void *instance, struct media_device *mdev,
 		struct v4l2_buffer *b)
 {

+ 6 - 0
driver/vidc/src/msm_vidc_control.c

@@ -1102,6 +1102,12 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
 	}
 
 	if (ctrl->id == V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD) {
+		if (ctrl->val == INVALID_FD || ctrl->val == INT_MAX) {
+			i_vpr_e(inst,
+				"%s: client configured invalid input metadata fd %d\n",
+				__func__, ctrl->val);
+			return 0;
+		}
 		if (!capability->cap[INPUT_META_VIA_REQUEST].value) {
 			i_vpr_e(inst,
 				"%s: input metadata not enabled via request\n", __func__);

+ 2 - 2
driver/vidc/src/msm_vidc_driver.c

@@ -6270,7 +6270,7 @@ int msm_vidc_get_properties(struct msm_vidc_inst *inst)
 	return 0;
 }
 
-int msm_vidc_create_input_metadata_buffer(struct msm_vidc_inst *inst, u32 fd)
+int msm_vidc_create_input_metadata_buffer(struct msm_vidc_inst *inst, int fd)
 {
 	int rc = 0;
 	struct msm_vidc_buffer *buf = NULL;
@@ -6282,7 +6282,7 @@ int msm_vidc_create_input_metadata_buffer(struct msm_vidc_inst *inst, u32 fd)
 		return -EINVAL;
 	}
 
-	if (fd <= 0) {
+	if (fd < 0) {
 		i_vpr_e(inst, "%s: invalid input metadata buffer fd %d\n",
 			__func__, fd);
 		return -EINVAL;

+ 2 - 0
driver/vidc/src/msm_vidc_platform.c

@@ -62,6 +62,7 @@ static struct v4l2_ioctl_ops msm_v4l2_ioctl_ops_enc = {
 	.vidioc_reqbufs                 = msm_v4l2_reqbufs,
 	.vidioc_querybuf                = msm_v4l2_querybuf,
 	.vidioc_create_bufs             = msm_v4l2_create_bufs,
+	.vidioc_prepare_buf             = msm_v4l2_prepare_buf,
 	.vidioc_qbuf                    = msm_v4l2_qbuf,
 	.vidioc_dqbuf                   = msm_v4l2_dqbuf,
 	.vidioc_streamon                = msm_v4l2_streamon,
@@ -101,6 +102,7 @@ static struct v4l2_ioctl_ops msm_v4l2_ioctl_ops_dec = {
 	.vidioc_reqbufs                 = msm_v4l2_reqbufs,
 	.vidioc_querybuf                = msm_v4l2_querybuf,
 	.vidioc_create_bufs             = msm_v4l2_create_bufs,
+	.vidioc_prepare_buf             = msm_v4l2_prepare_buf,
 	.vidioc_qbuf                    = msm_v4l2_qbuf,
 	.vidioc_dqbuf                   = msm_v4l2_dqbuf,
 	.vidioc_streamon                = msm_v4l2_streamon,

+ 28 - 1
driver/vidc/src/msm_vidc_v4l2.c

@@ -371,6 +371,31 @@ unlock:
 	return rc;
 }
 
+int msm_v4l2_prepare_buf(struct file *filp, void *fh,
+				struct v4l2_buffer *b)
+{
+	struct msm_vidc_inst *inst = get_vidc_inst(filp, fh);
+	struct video_device *vdev = video_devdata(filp);
+	int rc = 0;
+
+	inst = get_inst_ref(g_core, inst);
+	if (!inst) {
+		d_vpr_e("%s: invalid instance\n", __func__);
+		return -EINVAL;
+	}
+
+	inst_lock(inst, __func__);
+	rc = msm_vidc_prepare_buf((void *)inst, vdev->v4l2_dev->mdev, b);
+	if (rc)
+		goto unlock;
+
+unlock:
+	inst_unlock(inst, __func__);
+	put_inst(inst);
+
+	return rc;
+}
+
 int msm_v4l2_qbuf(struct file *filp, void *fh,
 				struct v4l2_buffer *b)
 {
@@ -748,17 +773,19 @@ unlock:
 
 int msm_v4l2_request_validate(struct media_request *req)
 {
+	d_vpr_l("%s()\n", __func__);
 	return vb2_request_validate(req);
 }
 
 void msm_v4l2_request_queue(struct media_request *req)
 {
+	d_vpr_l("%s()\n", __func__);
 	v4l2_m2m_request_queue(req);
 }
 
 void msm_v4l2_m2m_device_run(void *priv)
 {
-	d_vpr_l("%s: \n", __func__);
+	d_vpr_l("%s()\n", __func__);
 }
 
 void msm_v4l2_m2m_job_abort(void *priv)