Re: [PATCH v9 7/7] media: nuvoton: Add driver for NPCM video capture and encode engine

From: Kun-Fa Lin
Date: Wed Dec 21 2022 - 21:23:49 EST


Hi Andrzej,

Thanks for the review.

> > +static void npcm_video_ece_set_fb_addr(struct npcm_video *video, u32 buffer)
>
> static inline void?
>

> > +static void npcm_video_ece_set_enc_dba(struct npcm_video *video, u32 addr)
>
> ditto

> > +static void npcm_video_ece_clear_rect_offset(struct npcm_video *video)
>
> ditto

> > +static int npcm_video_ece_init(struct npcm_video *video)
>
> static inline int? But...
>
> > +{
> > + npcm_video_ece_ip_reset(video);
> > + npcm_video_ece_ctrl_reset(video);
> > +
> > + return 0;
>
> ...the return value is not inspected by the only caller anyway, so why not
>
> static inline void?

OK, I'll declare these functions as static inline void.

> > +static int npcm_video_ece_stop(struct npcm_video *video)
> > +{
> > + struct regmap *ece = video->ece.regmap;
> > +
> > + regmap_update_bits(ece, ECE_DDA_CTRL, ECE_DDA_CTRL_ECEEN, 0);
> > + regmap_update_bits(ece, ECE_DDA_CTRL, ECE_DDA_CTRL_INTEN, 0);
> > + regmap_update_bits(ece, ECE_HEX_CTRL, ECE_HEX_CTRL_ENCDIS,
> > + ECE_HEX_CTRL_ENCDIS);
> > + npcm_video_ece_clear_rect_offset(video);
> > +
> > + return 0;
>
> Nobody inspects this return value. Either void, or check the return value
> at call site and handle a non-zero failure.

OK, will change to void.

> > +static unsigned int npcm_video_get_rect_count(struct npcm_video *video)
> > +{
> > + struct list_head *head, *pos, *nx;
> > + struct rect_list *tmp;
> > + unsigned int count;
>
> unsigned int count = 0;
>
> otherwise if the below condition is not met, ...
> > +
> > + if (video->list && video->rect) {
> > + count = video->rect[video->vb_index];
> > + head = &video->list[video->vb_index];
> > +
> > + list_for_each_safe(pos, nx, head) {
> > + tmp = list_entry(pos, struct rect_list, list);
> > + list_del(&tmp->list);
> > + kfree(tmp);
> > + }
>
> why does a function whose name implies merely getting a number actually
> remove all elements from some list? count equals video->rect[video->vb_index];
> and everthing else looks like a(n indented?) side effect. This should be
> somehow commented in the code.
>
> > + }
> > +
> > + return count;
>
> ... an undefined number is returned
>
> Which makes me wonder if the compiler is not warning about using a possibly
> uninitialized value.

You are right, this is not the right place to remove the rect_list.
It makes more sense to remove the list right after the associated
video buffer gets dequeued.
I'll do that change.

> > +static int npcm_video_capres(struct npcm_video *video, u32 hor_res,
> > + u32 vert_res)
> > +{
> > + struct regmap *vcd = video->vcd_regmap;
> > + u32 res, cap_res;
> > +
> > + if (hor_res > MAX_WIDTH || vert_res > MAX_HEIGHT)
> > + return -EINVAL;
> > +
> > + res = FIELD_PREP(VCD_CAP_RES_VERT_RES, vert_res) |
> > + FIELD_PREP(VCD_CAP_RES_HOR_RES, hor_res);
> > +
> > + regmap_write(vcd, VCD_CAP_RES, res);
> > + regmap_read(vcd, VCD_CAP_RES, &cap_res);
> > +
> > + if (cap_res != res)
> > + return -EINVAL;
> > +
> > + return 0;
>
> The return value is not handled by the caller

> > +static int npcm_video_gfx_reset(struct npcm_video *video)
> > +{
> > + struct regmap *gcr = video->gcr_regmap;
> > +
> > + regmap_update_bits(gcr, INTCR2, INTCR2_GIRST2, INTCR2_GIRST2);
> > +
> > + npcm_video_vcd_state_machine_reset(video);
> > +
> > + regmap_update_bits(gcr, INTCR2, INTCR2_GIRST2, 0);
> > +
> > + return 0;
>
> Never inspected by callers

> > +static int npcm_video_command(struct npcm_video *video, u32 value)
> > +{
> > + struct regmap *vcd = video->vcd_regmap;
> > + u32 cmd;
> > +
> > + regmap_write(vcd, VCD_STAT, VCD_STAT_CLEAR);
> > +
> > + regmap_read(vcd, VCD_CMD, &cmd);
> > + cmd |= FIELD_PREP(VCD_CMD_OPERATION, value);
> > +
> > + regmap_write(vcd, VCD_CMD, cmd);
> > + regmap_update_bits(vcd, VCD_CMD, VCD_CMD_GO, VCD_CMD_GO);
> > + video->op_cmd = value;
> > +
> > + return 0;
>
> Never inspected by caller

> > +static int npcm_video_start_frame(struct npcm_video *video)
> > +{
>
> One of the callers ignores the return value, but not the other. Why?

These problems will be addressed in the next patch. Thank you.

Regards,
Marvin