[PATCH 46/74] media: qcom: camss: vfe: Add helper methods to enumerate output descriptors

From: Bryan O'Donoghue

Date: Mon Oct 05 2026 - 13:46:25 EST


Signed-off-by: Bryan O'Donoghue <bod@xxxxxxxxxx>
---
drivers/media/platform/qcom/camss/camss-vfe-780.c | 50 +++++++++--------------
drivers/media/platform/qcom/camss/camss-vfe.c | 49 ++++++++++++++++++++++
drivers/media/platform/qcom/camss/camss-vfe.h | 17 ++++++++
3 files changed, 85 insertions(+), 31 deletions(-)

diff --git a/drivers/media/platform/qcom/camss/camss-vfe-780.c b/drivers/media/platform/qcom/camss/camss-vfe-780.c
index 9c20bb8d2e45f..88d74323fe276 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-780.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-780.c
@@ -148,47 +148,35 @@ static const struct camss_video_ops vfe_video_ops_780 = {
.queue_buffer = vfe_queue_buffer_v2,
.flush_buffers = vfe_flush_buffers,
};
-
-static void vfe_add_rdi(struct vfe_line *line, int bus_client, int comp_group)
-{
- line->output[0].wm_num = 1;
- line->output[0].wm[0].bus_client = bus_client;
- line->output[0].wm[0].plane = 0;
- line->output[0].comp_group = comp_group;
-}
-
static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe)
{
+ struct vfe_line *pix = &vfe->line[VFE_LINE_PIX];
+
vfe->video_ops = vfe_video_ops_780;

+ /* RDI lite */
if (vfe_is_lite(vfe)) {
- vfe_add_rdi(&vfe->line[VFE_LINE_RDI0], VFE_LITE_WM_RDI0, VFE_V3_COMP_GRP_1);
- vfe_add_rdi(&vfe->line[VFE_LINE_RDI1], VFE_LITE_WM_RDI1, VFE_V3_COMP_GRP_2);
- vfe_add_rdi(&vfe->line[VFE_LINE_RDI2], VFE_LITE_WM_RDI2, VFE_V3_COMP_GRP_3);
- vfe_add_rdi(&vfe->line[VFE_LINE_PIX], VFE_LITE_WM_RDI3, VFE_V3_COMP_GRP_4);
+ vfe_add_rdi(&vfe->line[VFE_LINE_RDI0].output[0], VFE_LITE_WM_RDI0, VFE_V3_COMP_GRP_1);
+ vfe_add_rdi(&vfe->line[VFE_LINE_RDI1].output[0], VFE_LITE_WM_RDI1, VFE_V3_COMP_GRP_2);
+ vfe_add_rdi(&vfe->line[VFE_LINE_RDI2].output[0], VFE_LITE_WM_RDI2, VFE_V3_COMP_GRP_3);
+ vfe_add_rdi(&pix->output[0], VFE_LITE_WM_RDI3, VFE_V3_COMP_GRP_4);
return;
}

- /* RDI0 */
- vfe_add_rdi(&vfe->line[VFE_LINE_RDI0], VFE_WM_RDI0, VFE_V3_COMP_GRP_14);
-
- /* RDI1 */
- vfe_add_rdi(&vfe->line[VFE_LINE_RDI1], VFE_WM_RDI1, VFE_V3_COMP_GRP_15);
-
- /* RDI2 */
- vfe_add_rdi(&vfe->line[VFE_LINE_RDI2], VFE_WM_RDI2, VFE_V3_COMP_GRP_16);
+ /* RDI */
+ vfe_add_rdi(&vfe->line[VFE_LINE_RDI0].output[0], VFE_WM_RDI0, VFE_V3_COMP_GRP_14);
+ vfe_add_rdi(&vfe->line[VFE_LINE_RDI1].output[0], VFE_WM_RDI1, VFE_V3_COMP_GRP_15);
+ vfe_add_rdi(&vfe->line[VFE_LINE_RDI2].output[0], VFE_WM_RDI2, VFE_V3_COMP_GRP_16);

- /* PIX YUV: FULL Y + C, one plane each, group 0 */
- vfe->line[VFE_LINE_PIX].is_pix = true;
- vfe->line[VFE_LINE_PIX].output[0].wm_num = 2;
- vfe->line[VFE_LINE_PIX].output[0].wm[0].bus_client = VFE_WM_VIDEO_FULL_Y;
- vfe->line[VFE_LINE_PIX].output[0].wm[0].plane = 0;
- vfe->line[VFE_LINE_PIX].output[0].wm[1].bus_client = VFE_WM_VIDEO_FULL_C;
- vfe->line[VFE_LINE_PIX].output[0].wm[1].plane = 1;
- vfe->line[VFE_LINE_PIX].output[0].comp_group = VFE_V3_COMP_GRP_0;
- vfe->line[VFE_LINE_PIX].output[0].type = VFE_OUTPUT_TYPE_PIXEL_YUV;
+ /* Add YUV, DS4, DS16, stats and params descriptors */
+ vfe_add_yuv(&pix->output[0], VFE_WM_VIDEO_FULL_Y, VFE_WM_VIDEO_FULL_C, VFE_V3_COMP_GRP_0);
+ vfe_add_ds(&pix->output[1], MSM_VFE_PAD_SRC_DS4, VFE_WM_VIDEO_DS_4, VFE_V3_COMP_GRP_0);
+ vfe_add_ds(&pix->output[2], MSM_VFE_PAD_SRC_DS16, VFE_WM_VIDEO_DS_16, VFE_V3_COMP_GRP_0);
+ vfe_add_stats(&pix->output[3], VFE_WM_STATS_AEC_BHIST, VFE_V3_COMP_GRP_4);
+ vfe_add_params(&pix->output[4], VFE_V3_COMP_GRP_0);

- return;
+ /* PIX mode */
+ vfe_set_pix(pix, 5);
}

static void vfe_global_reset(struct vfe_device *vfe)
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c
index 8726353b52d3d..6ee9b5024447d 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe.c
@@ -2449,3 +2449,52 @@ bool vfe_is_lite(struct vfe_device *vfe)
{
return vfe->camss->res->vfe_res[vfe->id].vfe.is_lite;
}
+
+void vfe_add_output(struct vfe_output *output, u8 pad, u8 comp_group,
+ unsigned int wm_num, const u8 *bus_client)
+{
+ unsigned int i;
+
+ output->comp_group = comp_group;
+ output->wm_num = wm_num;
+ for (i = 0; i < wm_num; i++) {
+ output->wm[i].bus_client = bus_client[i];
+ output->wm[i].plane = i;
+ }
+}
+
+void vfe_add_rdi(struct vfe_output *output, u8 bus_client, u8 comp_group)
+{
+ vfe_add_output(output, MSM_VFE_PAD_SRC, comp_group, 1, &bus_client);
+}
+
+void vfe_add_yuv(struct vfe_output *output, u8 bus_client_y,
+ u8 bus_client_c, u8 comp_group)
+{
+ const u8 wm[] = { bus_client_y, bus_client_c };
+
+ vfe_add_output(output, MSM_VFE_PAD_SRC, comp_group, ARRAY_SIZE(wm), wm);
+}
+
+void vfe_add_ds(struct vfe_output *output, u8 pad, u8 bus_client,
+ u8 comp_group)
+{
+ vfe_add_output(output, pad, comp_group, 1, &bus_client);
+}
+
+void vfe_add_stats(struct vfe_output *output, u8 bus_client, u8 comp_group)
+{
+ vfe_add_output(output, MSM_VFE_PAD_SRC_STATS, comp_group, 1, &bus_client);
+}
+
+void vfe_add_params(struct vfe_output *output, u8 comp_group)
+{
+ vfe_add_output(output, MSM_VFE_PAD_SINK_PARAMS, comp_group, 0, NULL);
+}
+
+void vfe_set_pix(struct vfe_line *line, int num_outputs)
+{
+ line->num_pads = MSM_VFE_PAD_NUM_PIX;
+ line->num_outputs = num_outputs;
+ line->is_pix = true;
+}
diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/platform/qcom/camss/camss-vfe.h
index 18403bf46178c..06bdc337f4d83 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe.h
+++ b/drivers/media/platform/qcom/camss/camss-vfe.h
@@ -399,4 +399,21 @@ int vfe_queue_buffer_v2(struct camss_video *vid,
*/
u32 vfe_bus_v3_packer_fmt(u32 v4l2_fmt, u8 plane, u8 align_shift);

+void vfe_add_output(struct vfe_output *output, u8 pad, u8 comp_group,
+ unsigned int wm_num, const u8 *bus_client);
+
+void vfe_add_rdi(struct vfe_output *output, u8 bus_client, u8 comp_group);
+
+void vfe_add_yuv(struct vfe_output *output, u8 bus_client_y,
+ u8 bus_client_c, u8 comp_group);
+
+void vfe_add_ds(struct vfe_output *output, u8 pad, u8 bus_client,
+ u8 comp_group);
+
+void vfe_add_stats(struct vfe_output *output, u8 bus_client, u8 comp_group);
+
+void vfe_add_params(struct vfe_output *output, u8 comp_group);
+
+void vfe_set_pix(struct vfe_line *line, int num_outputs);
+
#endif /* QC_MSM_CAMSS_VFE_H */

--
2.55.0