Add V4L2 ISP parameter buffer validation helpers for CAMSS ISP drivers.
Provides buffer size validation and per-block type validation for the
extensible V4L2 ISP parameters buffer format.

Signed-off-by: Loic Poulain <[email protected]>
---
 drivers/media/platform/qcom/camss/Makefile       |  1 +
 drivers/media/platform/qcom/camss/camss-params.c | 67 ++++++++++++++++++++++++
 drivers/media/platform/qcom/camss/camss-params.h | 62 ++++++++++++++++++++++
 3 files changed, 130 insertions(+)

diff --git a/drivers/media/platform/qcom/camss/Makefile 
b/drivers/media/platform/qcom/camss/Makefile
index 
0d133ddc08be088678994820c0ac64e761884611..5678621efb6780b67a043ec8a2e914cce02d9b98
 100644
--- a/drivers/media/platform/qcom/camss/Makefile
+++ b/drivers/media/platform/qcom/camss/Makefile
@@ -28,5 +28,6 @@ qcom-camss-objs += \
                camss-video.o \
                camss-format.o \
                camss-pipeline.o \
+               camss-params.o \
 
 obj-$(CONFIG_VIDEO_QCOM_CAMSS) += qcom-camss.o
diff --git a/drivers/media/platform/qcom/camss/camss-params.c 
b/drivers/media/platform/qcom/camss/camss-params.c
new file mode 100644
index 
0000000000000000000000000000000000000000..ebb75a191d37551b4616a048ed39408f219d7daa
--- /dev/null
+++ b/drivers/media/platform/qcom/camss/camss-params.c
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * camss-params.c
+ *
+ * CAMSS ISP parameter buffer parser.
+ *
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#include <linux/device.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <media/videobuf2-core.h>
+#include <media/v4l2-isp.h>
+
+#include "camss-params.h"
+
+int camss_isp_params_apply(struct device *dev,
+                          struct vb2_buffer *vb,
+                          const struct v4l2_isp_params_block_type_info 
*type_info,
+                          const camss_isp_params_handler_fn *handlers,
+                          unsigned int num_handlers,
+                          void *priv)
+{
+       const struct v4l2_isp_params_buffer *buf;
+       unsigned int remaining;
+       unsigned int offset = 0;
+       int ret;
+
+       ret = v4l2_isp_params_validate_buffer_size(dev, vb,
+                                       
v4l2_isp_params_buffer_size(CAMSS_PARAMS_MAX_PAYLOAD));
+       if (ret)
+               return ret;
+
+       buf = vb2_plane_vaddr(vb, 0);
+
+       ret = v4l2_isp_params_validate_buffer(dev, vb, buf, type_info, 
num_handlers);
+       if (ret)
+               return ret;
+
+       dev_dbg(dev, "params: version=%u data_size=%u\n", buf->version, 
buf->data_size);
+
+       remaining = buf->data_size;
+
+       while (remaining >= sizeof(struct v4l2_isp_params_block_header)) {
+               const union camss_isp_params_block *block =
+                       (const union camss_isp_params_block 
*)&buf->data[offset];
+               u16 type  = block->header.type;
+               u32 bsize = block->header.size;
+
+               if (type < num_handlers && handlers[type])
+                       handlers[type](priv, block);
+               else
+                       dev_dbg(dev, "params: no handler for block type %u\n", 
type);
+
+               offset += bsize;
+               remaining -= bsize;
+       }
+
+       dev_dbg(dev, "params: buffer parsed successfully\n");
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(camss_isp_params_apply);
+
+MODULE_DESCRIPTION("CAMSS ISP parameter buffer parser");
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/platform/qcom/camss/camss-params.h 
b/drivers/media/platform/qcom/camss/camss-params.h
new file mode 100644
index 
0000000000000000000000000000000000000000..058e3f158b42d39512301d412a983fb2f34dab21
--- /dev/null
+++ b/drivers/media/platform/qcom/camss/camss-params.h
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * camss-params.h
+ *
+ * CAMSS ISP parameter buffer parser.
+ *
+ * Wraps the upstream v4l2_isp_params_validate_buffer() validation and adds
+ * a dispatch layer: after validation each block is forwarded to a
+ * driver-supplied handler.
+ *
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#ifndef CAMSS_PARAMS_H
+#define CAMSS_PARAMS_H
+
+#include <linux/types.h>
+#include <media/v4l2-isp.h>
+#include <uapi/linux/camss-config.h>
+
+#define CAMSS_ISP_PARAMS_FMT_INIT \
+       { .fourcc = V4L2_META_FMT_QCOM_ISP_PARAMS, .depth = 8, .align = 0, 
.num_planes = 1 }
+
+#define CAMSS_ISP_PARAMS_FL_BLOCK_DIRTY   (1U << 
V4L2_ISP_PARAMS_FL_DRIVER_FLAGS(0))
+
+struct device;
+struct vb2_buffer;
+struct camss_isp_fmt;
+
+union camss_isp_params_block {
+       struct v4l2_isp_params_block_header header;
+       struct camss_params_wb_gain         wb_gain;
+       struct camss_params_chroma_enhan   chroma_enhan;
+       struct camss_params_color_correct  color_correct;
+};
+
+typedef void (*camss_isp_params_handler_fn)(void *priv, const union 
camss_isp_params_block *block);
+
+/**
+ * camss_isp_params_apply - validate and dispatch a params buffer
+ *
+ * @dev:          device for error logging
+ * @vb:           the vb2 buffer (used for size validation)
+ * @type_info:    per-block-type validation info, indexed by block type
+ * @handlers:     per-block-type handlers, indexed by block type
+ * @num_handlers: number of entries in @type_info and @handlers
+ * @priv:         opaque pointer forwarded to each handler
+ *
+ * Calls v4l2_isp_params_validate_buffer_size(), then
+ * v4l2_isp_params_validate_buffer(), then walks the validated block stream
+ * dispatching each block to its handler.
+ *
+ * Returns 0 on success, negative errno on validation failure.
+ */
+int camss_isp_params_apply(struct device *dev,
+                          struct vb2_buffer *vb,
+                          const struct v4l2_isp_params_block_type_info 
*type_info,
+                          const camss_isp_params_handler_fn *handlers,
+                          unsigned int num_handlers,
+                          void *priv);
+
+#endif /* CAMSS_PARAMS_H */

-- 
2.34.1


Reply via email to