From e0a95560412efa534ae9d93aa648489087bfecb4 Mon Sep 17 00:00:00 2001 From: Louis Kuo Date: Thu, 24 Jun 2021 12:35:35 +0800 Subject: [PATCH] ANDROID: media: v4l2-core: extend the v4l2 subdev ioctl to support request This patch is based on 1699785. It uses to extend the related interface to support the request-based operations. We use extension fields in the parameters of VIDIOC_SUBDEV_S_SELECTION, VIDIOC_SUBDEV_S_FMT and VIDIOC_SUBDEV_S_FRAME_INTERVAL as request fd. The driver uses media_request_get_by_fd() to retrieve the media request and save the pending change in it, so that we can apply the pending change in req_queue() callback then. Bug: 191903073 CR-Id: Signed-off-by: Louis Kuo Change-Id: Idb7921724cf8febc44b01880a4ad8b7c9272ba6a --- drivers/android/vendor_hooks.c | 3 +++ drivers/media/v4l2-core/v4l2-subdev.c | 20 ++++++++++++++++++++ include/trace/hooks/v4l2core.h | 20 ++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 416938977b4e..7b17248f3431 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -316,6 +316,9 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_media_device_setup_link); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_reserved_fmt_fields); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_fill_ext_fmtdesc); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_mask_adjust); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_selection); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_fmt); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_frame_interval); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_scmi_timeout_sync); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_new_ilb); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_force_compatible_pre); diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index a7d508e74d6b..da491fd1baf8 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -22,6 +22,9 @@ #include #include #include +#ifndef __GENKSYMS__ +#include +#endif #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) static int subdev_fh_init(struct v4l2_subdev_fh *fh, struct v4l2_subdev *sd) @@ -511,10 +514,16 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg) case VIDIOC_SUBDEV_S_FMT: { struct v4l2_subdev_format *format = arg; + int ret = 0; if (format->which != V4L2_SUBDEV_FORMAT_TRY && ro_subdev) return -EPERM; + trace_android_vh_v4l2subdev_set_fmt(sd, subdev_fh->pad, + format, &ret); + if (ret) + return ret; + memset(format->reserved, 0, sizeof(format->reserved)); memset(format->format.reserved, 0, sizeof(format->format.reserved)); return v4l2_subdev_call(sd, pad, set_fmt, subdev_fh->pad, format); @@ -585,10 +594,15 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg) case VIDIOC_SUBDEV_S_FRAME_INTERVAL: { struct v4l2_subdev_frame_interval *fi = arg; + int ret = 0; if (ro_subdev) return -EPERM; + trace_android_vh_v4l2subdev_set_frame_interval(sd, fi, &ret); + if (ret) + return ret; + memset(fi->reserved, 0, sizeof(fi->reserved)); return v4l2_subdev_call(sd, video, s_frame_interval, arg); } @@ -611,10 +625,16 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg) case VIDIOC_SUBDEV_S_SELECTION: { struct v4l2_subdev_selection *sel = arg; + int ret = 0; if (sel->which != V4L2_SUBDEV_FORMAT_TRY && ro_subdev) return -EPERM; + trace_android_vh_v4l2subdev_set_selection(sd, subdev_fh->pad, + sel, &ret); + if (ret) + return ret; + memset(sel->reserved, 0, sizeof(sel->reserved)); return v4l2_subdev_call( sd, pad, set_selection, subdev_fh->pad, sel); diff --git a/include/trace/hooks/v4l2core.h b/include/trace/hooks/v4l2core.h index 26b49d69f13d..32b6e96ba627 100644 --- a/include/trace/hooks/v4l2core.h +++ b/include/trace/hooks/v4l2core.h @@ -24,6 +24,26 @@ DECLARE_HOOK(android_vh_clear_mask_adjust, TP_PROTO(unsigned int ctrl, int *n), TP_ARGS(ctrl, n)); +struct v4l2_subdev; +struct v4l2_subdev_pad_config; +struct v4l2_subdev_selection; +DECLARE_HOOK(android_vh_v4l2subdev_set_selection, + TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *pad, + struct v4l2_subdev_selection *sel, int *ret), + TP_ARGS(sd, pad, sel, ret)); + +struct v4l2_subdev_format; +DECLARE_HOOK(android_vh_v4l2subdev_set_fmt, + TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *pad, + struct v4l2_subdev_format *format, int *ret), + TP_ARGS(sd, pad, format, ret)); + +struct v4l2_subdev_frame_interval; +DECLARE_HOOK(android_vh_v4l2subdev_set_frame_interval, + TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_frame_interval *fi, + int *ret), + TP_ARGS(sd, fi, ret)); + #endif /* _TRACE_HOOK_V4L2CORE_H */ /* This part must be outside protection */ #include