Re: [PATCH 18/74] media: qcom: camss: vfe: Add helper vfe_bus_v3_packer_fmt()
From: Gjorgji Rosikopulos (Consultant)
Date: Wed Oct 07 2026 - 07:34:24 EST
Hi Bryan,
On 10/5/2026 8:13 PM, Bryan O'Donoghue wrote:
> vfe_bus_v3_packer_fmt()'s job in life is to translate a given v4l2 pixel
> format and plane into the appropriate bus packing format for v3 class
> hardware.
>
> Other versions are currently not covered.
>
> Signed-off-by: Bryan O'Donoghue <bod@xxxxxxxxxx>
> ---
> drivers/media/platform/qcom/camss/camss-vfe.c | 53 +++++++++++++++++++++++++++
> drivers/media/platform/qcom/camss/camss-vfe.h | 32 ++++++++++++++++
> 2 files changed, 85 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c
> index 5b5201b55a485..c95fe5b0b05fc 100644
> --- a/drivers/media/platform/qcom/camss/camss-vfe.c
> +++ b/drivers/media/platform/qcom/camss/camss-vfe.c
> @@ -370,6 +370,59 @@ const struct camss_formats vfe_formats_pix_845 = {
> .formats = formats_pix_845
> };
>
> +u32 vfe_bus_v3_packer_fmt(u32 v4l2_fmt, u8 plane, u8 align_shift)
> +{
> + switch (v4l2_fmt) {
> + case V4L2_PIX_FMT_NV12:
> + case V4L2_PIX_FMT_NV12M:
> + case V4L2_PIX_FMT_NV16:
> + return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10;
> + case V4L2_PIX_FMT_NV21:
> + case V4L2_PIX_FMT_NV21M:
> + case V4L2_PIX_FMT_NV61:
> + return plane ? VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10_ODD_EVEN
> + : VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10;
> +
> + case V4L2_PIX_FMT_SRGGB10P:
> + case V4L2_PIX_FMT_SGRBG10P:
> + case V4L2_PIX_FMT_SGBRG10P:
> + case V4L2_PIX_FMT_SBGGR10P:
> + return VFE_BUS_WM_PACKER_FMT_V3_MIPI10;
> + case V4L2_PIX_FMT_SRGGB12P:
> + case V4L2_PIX_FMT_SGRBG12P:
> + case V4L2_PIX_FMT_SGBRG12P:
> + case V4L2_PIX_FMT_SBGGR12P:
> + return VFE_BUS_WM_PACKER_FMT_V3_MIPI12;
> + case V4L2_PIX_FMT_SRGGB14P:
> + case V4L2_PIX_FMT_SGRBG14P:
> + case V4L2_PIX_FMT_SGBRG14P:
> + case V4L2_PIX_FMT_SBGGR14P:
> + return VFE_BUS_WM_PACKER_FMT_V3_MIPI14;
> +
> + case V4L2_PIX_FMT_SRGGB10:
> + case V4L2_PIX_FMT_SGRBG10:
> + case V4L2_PIX_FMT_SGBRG10:
> + case V4L2_PIX_FMT_SBGGR10:
> + return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_10BPP |
> + BIT(align_shift);
> + case V4L2_PIX_FMT_SRGGB12:
> + case V4L2_PIX_FMT_SGRBG12:
> + case V4L2_PIX_FMT_SGBRG12:
> + case V4L2_PIX_FMT_SBGGR12:
> + return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_12BPP |
> + BIT(align_shift);
> +
> + case V4L2_PIX_FMT_SRGGB8:
> + case V4L2_PIX_FMT_SGRBG8:
> + case V4L2_PIX_FMT_SGBRG8:
> + case V4L2_PIX_FMT_SBGGR8:
> + return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8;
> + }
> +
> + WARN_ONCE(1, "no packer format for 0x%08x\n", v4l2_fmt);
> + return VFE_BUS_WM_PACKER_FMT_V3_PLAIN_128;
> +}
> +
> static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
> unsigned int index, u32 src_req_code)
> {
> diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/platform/qcom/camss/camss-vfe.h
> index 089f525b98cf5..98d403a71cf95 100644
> --- a/drivers/media/platform/qcom/camss/camss-vfe.h
> +++ b/drivers/media/platform/qcom/camss/camss-vfe.h
> @@ -56,6 +56,27 @@ enum vfe_line_id {
> VFE_LINE_NUM_MAX = 4
> };
>
> +enum vfe_packer_format_v3 {
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_128 = 0,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_ODD_EVEN,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_8_LSB_MSB_10_ODD_EVEN,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_10BPP,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_12BPP,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_14BPP,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_16_16BPP,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_32,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN_64,
> + VFE_BUS_WM_PACKER_FMT_V3_TP_10,
> + VFE_BUS_WM_PACKER_FMT_V3_MIPI10,
> + VFE_BUS_WM_PACKER_FMT_V3_MIPI12,
> + VFE_BUS_WM_PACKER_FMT_V3_MIPI14,
> + VFE_BUS_WM_PACKER_FMT_V3_MIPI20,
> + VFE_BUS_WM_PACKER_FMT_V3_PLAIN32_20BPP,
> + VFE_BUS_WM_PACKER_FMT_V3_MAX,
> +};
I think all wm configurations should be separated in separate bus or wm
abstraction and move those per version of the wm/bus.
> +
> struct vfe_output {
> u8 wm_num;
> u8 wm_idx[3];
> @@ -315,4 +336,15 @@ int vfe_enable_output_v2(struct vfe_line *line);
> int vfe_queue_buffer_v2(struct camss_video *vid,
> struct camss_buffer *buf);
>
> +/*
> + * vfe_bus_v3_packer_fmt
> + *
> + * @v4l2_fmt: v4l2 format
> + * @plane: plane for the given format
> + * @align_shift: bit position of the PLAIN16 LSB alignment flag
> + *
> + * Return: the bus packer format for the register
> + */
> +u32 vfe_bus_v3_packer_fmt(u32 v4l2_fmt, u8 plane, u8 align_shift);
> +
> #endif /* QC_MSM_CAMSS_VFE_H */
>