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]> --- 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
