Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

media: imx-jpeg: Add support for encoder v1 descriptor configuration

Support the upgraded JPEG encoder v1 found on i.MX952 SoC.

Detect the encoder hardware version via the version register.

The v1 encoder uses an expanded descriptor format that allows all
encoding parameters, including JPEG quality, to be configured directly
in the descriptor.

This removes the manual register-based configuration step required by v0
and reduces the interrupt count from two to one per frame.

V0 encoding flow:
1. Write quality to registers -> trigger config interrupt
2. Start encoding -> trigger completion interrupt

V1 encoding flow:
1. Configure descriptor with all parameters including quality
2. Start encoding -> trigger completion interrupt

Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Ming Qian <ming.qian@oss.nxp.com>
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>

authored by

Ming Qian and committed by
Hans Verkuil
f1670645 03b5048a

+55 -2
+3
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
··· 5 5 * Copyright 2018-2019 NXP 6 6 */ 7 7 8 + #include <linux/bitfield.h> 9 + 8 10 #ifndef _MXC_JPEG_HW_H 9 11 #define _MXC_JPEG_HW_H 10 12 ··· 75 73 #define GLB_CTRL_DEC_GO (0x1 << 2) 76 74 #define GLB_CTRL_L_ENDIAN(le) ((le) << 3) 77 75 #define GLB_CTRL_SLOT_EN(slot) (0x1 << ((slot) + 4)) 76 + #define GLB_CTRL_CUR_VERSION(r) FIELD_GET(GENMASK_U32(19, 16), r) 78 77 79 78 /* COM_STAUS fields */ 80 79 #define COM_STATUS_DEC_ONGOING(r) (((r) & (1 << 31)) >> 31)
+41 -2
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
··· 1417 1417 mxc_jpeg_enc_mode_go(dev, reg, ctx->extseq); 1418 1418 } 1419 1419 1420 + static void mxc_jpeg_enc_configure_desc(struct mxc_jpeg_ctx *ctx) 1421 + { 1422 + struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg; 1423 + struct mxc_jpeg_desc *desc = jpeg->slot_data.desc; 1424 + struct mxc_jpeg_desc *cfg_desc = jpeg->slot_data.cfg_desc; 1425 + 1426 + ctx->enc_state = MXC_JPEG_ENCODING; 1427 + cfg_desc->mode = (ctx->extseq) ? 0xb0 : 0xa0; 1428 + cfg_desc->cfg_mode = 0x3ff; 1429 + 1430 + desc->mode = (ctx->extseq) ? 0x150 : 0x140; 1431 + desc->cfg_mode = 0x3ff; 1432 + desc->quality = ctx->jpeg_quality; 1433 + desc->lumth = 0xffff; 1434 + desc->chrth = 0xffff; 1435 + } 1436 + 1420 1437 static const struct mxc_jpeg_enc_ops mxc_jpeg_enc_cfg_ops_v0 = { 1421 1438 .enter_config_mode = mxc_jpeg_enc_start_config_manually, 1422 1439 .exit_config_mode = mxc_jpeg_enc_finish_config_manually 1440 + }; 1441 + 1442 + static const struct mxc_jpeg_enc_ops mxc_jpeg_enc_cfg_ops_v1 = { 1443 + .setup_desc = mxc_jpeg_enc_configure_desc 1423 1444 }; 1424 1445 1425 1446 static const struct mxc_jpeg_fmt *mxc_jpeg_get_sibling_format(const struct mxc_jpeg_fmt *fmt) ··· 2895 2874 return ret; 2896 2875 } 2897 2876 2877 + static int mxc_jpeg_get_version(void __iomem *reg) 2878 + { 2879 + u32 regval; 2880 + 2881 + regval = readl(reg + GLB_CTRL); 2882 + return GLB_CTRL_CUR_VERSION(regval); 2883 + } 2884 + 2898 2885 static int mxc_jpeg_probe(struct platform_device *pdev) 2899 2886 { 2900 2887 struct mxc_jpeg_dev *jpeg; ··· 3041 3012 goto err_pm; 3042 3013 } 3043 3014 3044 - if (mode == MXC_JPEG_ENCODE) 3045 - jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v0; 3015 + if (mode == MXC_JPEG_ENCODE) { 3016 + ret = pm_runtime_resume_and_get(dev); 3017 + if (ret < 0) 3018 + goto err_pm; 3019 + 3020 + if (mxc_jpeg_get_version(jpeg->base_reg) == 0) 3021 + jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v0; 3022 + else 3023 + jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v1; 3024 + 3025 + pm_runtime_put_sync(dev); 3026 + } 3046 3027 3047 3028 return 0; 3048 3029
+11
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
··· 81 81 u32 stm_bufsize; 82 82 u32 imgsize; 83 83 u32 stm_ctrl; 84 + /* below parameters are valid for v1 */ 85 + u32 mode; 86 + u32 cfg_mode; 87 + u32 quality; 88 + u32 rc_regs_sel; 89 + u32 lumth; 90 + u32 chrth; 91 + u32 nomfrsize_lo; 92 + u32 nomfrsize_hi; 93 + u32 ofbsize_lo; 94 + u32 ofbsize_hi; 84 95 } __packed; 85 96 86 97 struct mxc_jpeg_q_data {