Re: [PATCH 25/35] media: venus: Use the correct div_ function

From: Dan Carpenter
Date: Wed Apr 17 2024 - 04:36:40 EST


On Mon, Apr 15, 2024 at 07:34:42PM +0000, Ricardo Ribalda wrote:
> us_per_frame does not fit in u32
>

drivers/media/platform/qcom/venus/venc.c
391 static int venc_s_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
392 {
393 struct venus_inst *inst = to_inst(file);
394 struct v4l2_outputparm *out = &a->parm.output;
395 struct v4l2_fract *timeperframe = &out->timeperframe;
396 u64 us_per_frame, fps;
397
398 if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
399 a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
400 return -EINVAL;
401
402 memset(out->reserved, 0, sizeof(out->reserved));
403
404 if (!timeperframe->denominator)
405 timeperframe->denominator = inst->timeperframe.denominator;
406 if (!timeperframe->numerator)
407 timeperframe->numerator = inst->timeperframe.numerator;
408
409 out->capability = V4L2_CAP_TIMEPERFRAME;
410
411 us_per_frame = timeperframe->numerator * (u64)USEC_PER_SEC;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
It looks like in some drivers this multiply can go over U32_MAX.

412 do_div(us_per_frame, timeperframe->denominator);
^^^^^^^^^^^^
But after this divide, then we're under 1,000,000 again. Otherwise the
FPS is zero. So maybe the right thing to do is:

inst->fps = USEC_PER_SEC / (u32)us_per_frame;

413
414 if (!us_per_frame)
415 return -EINVAL;
416
417 fps = (u64)USEC_PER_SEC;
418 do_div(fps, us_per_frame);
419
420 inst->timeperframe = *timeperframe;
421 inst->fps = fps;
422
423 return 0;
424 }

regards,
dan carpenter