On Mon Jun 16 15:29:14 2025 +0000, Ricardo Ribalda wrote:
> The driver uses "whole" fps in all its calculations (e.g. in
> load_per_instance()). Those calculation expect an fps bigger than 1, and
> not big enough to overflow.
> 
> Clamp the value if the user provides a param that will result in an invalid
> fps.
> 
> Reported-by: Hans Verkuil <hverk...@xs4all.nl>
> Closes: 
> https://lore.kernel.org/linux-media/f11653a7-bc49-48cd-9cdb-165914745...@xs4all.nl/T/#m91cd962ac942834654f94c92206e2f85ff7d97f0
> Fixes: 7472c1c69138 ("[media] media: venus: vdec: add video decoder files")
> Cc: sta...@vger.kernel.org
> Tested-by: Bryan O'Donoghue <bryan.odonog...@linaro.org> # qrb5615-rb5
> Reviewed-by: Bryan O'Donoghue <bryan.odonog...@linaro.org>
> Signed-off-by: Ricardo Ribalda <riba...@chromium.org>
> [bod: Change "parm" to "param"]
> Signed-off-by: Bryan O'Donoghue <b...@kernel.org>
> Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/platform/qcom/venus/core.h | 2 ++
 drivers/media/platform/qcom/venus/vdec.c | 5 ++---
 2 files changed, 4 insertions(+), 3 deletions(-)

---

diff --git a/drivers/media/platform/qcom/venus/core.h 
b/drivers/media/platform/qcom/venus/core.h
index b412e0c5515a..5b1ba1c69adb 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -28,6 +28,8 @@
 #define VIDC_RESETS_NUM_MAX            2
 #define VIDC_MAX_HIER_CODING_LAYER 6
 
+#define VENUS_MAX_FPS                  240
+
 extern int venus_fw_debug;
 
 struct freq_tbl {
diff --git a/drivers/media/platform/qcom/venus/vdec.c 
b/drivers/media/platform/qcom/venus/vdec.c
index 99ce5fd41577..fca27be61f4b 100644
--- a/drivers/media/platform/qcom/venus/vdec.c
+++ b/drivers/media/platform/qcom/venus/vdec.c
@@ -481,11 +481,10 @@ static int vdec_s_parm(struct file *file, void *fh, 
struct v4l2_streamparm *a)
        us_per_frame = timeperframe->numerator * (u64)USEC_PER_SEC;
        do_div(us_per_frame, timeperframe->denominator);
 
-       if (!us_per_frame)
-               return -EINVAL;
-
+       us_per_frame = clamp(us_per_frame, 1, USEC_PER_SEC);
        fps = (u64)USEC_PER_SEC;
        do_div(fps, us_per_frame);
+       fps = min(VENUS_MAX_FPS, fps);
 
        inst->fps = fps;
        inst->timeperframe = *timeperframe;

Reply via email to