[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <f9f29a44-5125-463f-9d2d-0ed6e3a54e64@oss.nxp.com>
Date: Tue, 3 Feb 2026 09:30:21 +0800
From: "Ming Qian(OSS)" <ming.qian@....nxp.com>
To: Frank Li <Frank.li@....com>
Cc: mchehab@...nel.org, hverkuil-cisco@...all.nl, mirela.rabulea@....nxp.com,
nicolas@...fresne.ca, shawnguo@...nel.org, s.hauer@...gutronix.de,
kernel@...gutronix.de, festevam@...il.com, xiahong.bao@....com,
eagle.zhou@....com, linux-imx@....com, imx@...ts.linux.dev,
linux-media@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org
Subject: Re: [PATCH v3 3/3] media: mxc-jpeg: Add support for encoder v1
descriptor configuration
Hi Frank,
On 2/2/2026 11:55 PM, Frank Li wrote:
> On Mon, Feb 02, 2026 at 05:58:36PM +0800, ming.qian@....nxp.com wrote:
>> From: Ming Qian <ming.qian@....nxp.com>
>>
>> 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
>>
>> Signed-off-by: Ming Qian <ming.qian@....nxp.com>
>> ---
>> .../media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h | 1 +
>> .../media/platform/nxp/imx-jpeg/mxc-jpeg.c | 45 ++++++++++++++++++-
>> .../media/platform/nxp/imx-jpeg/mxc-jpeg.h | 11 +++++
>> 3 files changed, 55 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
>> index adb93e977be9..0d78443cb270 100644
>> --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
>> +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
>> @@ -73,6 +73,7 @@
>> #define GLB_CTRL_DEC_GO (0x1 << 2)
>> #define GLB_CTRL_L_ENDIAN(le) ((le) << 3)
>> #define GLB_CTRL_SLOT_EN(slot) (0x1 << ((slot) + 4))
>> +#define GLB_CTRL_CUR_VERSION(r) FIELD_GET(GENMASK_U32(19, 16), r)
>>
>> /* COM_STAUS fields */
>> #define COM_STATUS_DEC_ONGOING(r) (((r) & (1 << 31)) >> 31)
>> diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
>> index ede422364f9b..71f4a1d292ac 100644
>> --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
>> +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
>> @@ -1417,11 +1417,32 @@ static void mxc_jpeg_enc_finish_config_manually(struct mxc_jpeg_ctx *ctx)
>> mxc_jpeg_enc_mode_go(dev, reg, ctx->extseq);
>> }
>>
>> +static void mxc_jpeg_enc_configure_desc(struct mxc_jpeg_ctx *ctx)
>> +{
>> + struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
>> + struct mxc_jpeg_desc *desc = jpeg->slot_data.desc;
>> + struct mxc_jpeg_desc *cfg_desc = jpeg->slot_data.cfg_desc;
>> +
>> + ctx->enc_state = MXC_JPEG_ENCODING;
>> + cfg_desc->mode = (ctx->extseq) ? 0xb0 : 0xa0;
>> + cfg_desc->cfg_mode = 0x3ff;
>> +
>> + desc->mode = (ctx->extseq) ? 0x150 : 0x140;
>> + desc->cfg_mode = 0x3ff;
>> + desc->quality = ctx->jpeg_quality;
>> + desc->lumth = 0xffff;
>> + desc->chrth = 0xffff;
>> +}
>> +
>> static const struct mxc_jpeg_enc_ops mxc_jpeg_enc_cfg_ops_v0 = {
>> .enter_config_mode = mxc_jpeg_enc_start_config_manually,
>> .exit_config_mode = mxc_jpeg_enc_finish_config_manually
>> };
>>
>> +static const struct mxc_jpeg_enc_ops mxc_jpeg_enc_cfg_ops_v1 = {
>> + .setup_desc = mxc_jpeg_enc_configure_desc
>> +};
>> +
>> static const struct mxc_jpeg_fmt *mxc_jpeg_get_sibling_format(const struct mxc_jpeg_fmt *fmt)
>> {
>> int i;
>> @@ -2874,6 +2895,14 @@ static int mxc_jpeg_attach_pm_domains(struct mxc_jpeg_dev *jpeg)
>> return ret;
>> }
>>
>> +static int mxc_jpeg_get_version(void __iomem *reg)
>> +{
>> + u32 regval;
>> +
>> + regval = readl(reg + GLB_CTRL);
>> + return GLB_CTRL_CUR_VERSION(regval);
>> +}
>> +
>> static int mxc_jpeg_probe(struct platform_device *pdev)
>> {
>> struct mxc_jpeg_dev *jpeg;
>> @@ -3008,11 +3037,23 @@ static int mxc_jpeg_probe(struct platform_device *pdev)
>> platform_set_drvdata(pdev, jpeg);
>> pm_runtime_enable(dev);
>
> Not related this patch. If have time, you change pm_runtime_enable() to
> devm_pm_runtime_enable().
Sure, I'll handle it.
I noticed a typo in the title where I mistakenly wrote “imx-jpeg” as
“mxc-jpeg”. I will fix it with V4.
Regards,
Ming
>
> Reviewed-by: Frank Li <Frank.Li@....com>
>>
>> - if (mode == MXC_JPEG_ENCODE)
>> - jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v0;
>> + if (mode == MXC_JPEG_ENCODE) {
>> + ret = pm_runtime_resume_and_get(dev);
>> + if (ret < 0)
>> + goto err_check_version;
>> +
>> + if (mxc_jpeg_get_version(jpeg->base_reg) == 0)
>> + jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v0;
>> + else
>> + jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v1;
>> +
>> + pm_runtime_put_sync(dev);
>> + }
>>
>> return 0;
>>
>> +err_check_version:
>> + pm_runtime_disable(&pdev->dev);
>> err_vdev_register:
>> video_device_release(jpeg->dec_vdev);
>>
>> diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
>> index cdfefb68346a..c00c13549746 100644
>> --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
>> +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
>> @@ -81,6 +81,17 @@ struct mxc_jpeg_desc {
>> u32 stm_bufsize;
>> u32 imgsize;
>> u32 stm_ctrl;
>> + /* below parameters are valid for v1 */
>> + u32 mode;
>> + u32 cfg_mode;
>> + u32 quality;
>> + u32 rc_regs_sel;
>> + u32 lumth;
>> + u32 chrth;
>> + u32 nomfrsize_lo;
>> + u32 nomfrsize_hi;
>> + u32 ofbsize_lo;
>> + u32 ofbsize_hi;
>> } __packed;
>>
>> struct mxc_jpeg_q_data {
>> --
>> 2.52.0
>>
Powered by blists - more mailing lists