On Thu, Aug 27, 2026 at 03:33:06PM -0500, Rob Herring (Arm) wrote:
> Move the repeated command-stream buffer range validation into a
> helper in preparation for validating all weight and scale streams.
>
> Cc: [email protected]
> Assisted-by: LLM
> Signed-off-by: Rob Herring (Arm) <[email protected]>
> ---

Reviewed-by: Frank Li <[email protected]>

>  drivers/accel/ethosu/ethosu_gem.c | 28 ++++++++++++++++++----------
>  1 file changed, 18 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/accel/ethosu/ethosu_gem.c 
> b/drivers/accel/ethosu/ethosu_gem.c
> index eda9f42239be..9fce7caeeb9a 100644
> --- a/drivers/accel/ethosu/ethosu_gem.c
> +++ b/drivers/accel/ethosu/ethosu_gem.c
> @@ -259,6 +259,22 @@ static u64 feat_matrix_length(struct ethosu_device *edev,
>       return addr;
>  }
>
> +static int buffer_size(struct ethosu_validated_cmdstream_info *info,
> +                    struct buffer *buf, s8 region)
> +{
> +     u64 end;
> +
> +     if (region < 0 || buf->base == U64_MAX || buf->length == U32_MAX)
> +             return -EINVAL;
> +
> +     if (check_add_overflow(buf->base, (u64)buf->length, &end))
> +             return -EINVAL;
> +
> +     info->region_size[region] = max(info->region_size[region], end);
> +
> +     return 0;
> +}
> +
>  static int calc_sizes(struct drm_device *ddev,
>                     struct ethosu_validated_cmdstream_info *info,
>                     u16 op, struct cmd_state *st,
> @@ -303,24 +319,16 @@ static int calc_sizes(struct drm_device *ddev,
>               dev_dbg(ddev->dev, "op %d: W:%d:0x%llx-0x%llx\n",
>                       op, st->weight[0].region, st->weight[0].base,
>                       st->weight[0].base + st->weight[0].length - 1);
> -             if (st->weight[0].region < 0 || st->weight[0].base == U64_MAX ||
> -                 st->weight[0].length == U32_MAX)
> +             if (buffer_size(info, &st->weight[0], st->weight[0].region))
>                       return -EINVAL;
> -             info->region_size[st->weight[0].region] =
> -                     max(info->region_size[st->weight[0].region],
> -                         st->weight[0].base + st->weight[0].length);
>       }
>
>       if (scale) {
>               dev_dbg(ddev->dev, "op %d: S:%d:0x%llx-0x%llx\n",
>                       op, st->scale[0].region, st->scale[0].base,
>                       st->scale[0].base + st->scale[0].length - 1);
> -             if (st->scale[0].region < 0 || st->scale[0].base == U64_MAX ||
> -                 st->scale[0].length == U32_MAX)
> +             if (buffer_size(info, &st->scale[0], st->scale[0].region))
>                       return -EINVAL;
> -             info->region_size[st->scale[0].region] =
> -                     max(info->region_size[st->scale[0].region],
> -                         st->scale[0].base + st->scale[0].length);
>       }
>
>       len = feat_matrix_length(edev, info, &st->ofm, st->ofm.width,
>
> --
> 2.53.0
>

Reply via email to