On Fri, Jan 30, 2026 at 4:22 AM Lijo Lazar <[email protected]> wrote: > > Add an interface to validate user provided save area parameters. Address > validation is not done and expected to be done outside. > > Signed-off-by: Lijo Lazar <[email protected]>
Reviewed-by: Alex Deucher <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c | 39 ++++++++++++++++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.h | 10 ++++++ > 2 files changed, 49 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c > index 80020fd33ce6..f4907172ebeb 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c > @@ -64,6 +64,15 @@ static inline bool amdgpu_cwsr_is_supported(struct > amdgpu_device *adev) > return true; > } > > +uint32_t amdgpu_cwsr_size_needed(struct amdgpu_device *adev, int num_xcc) > +{ > + if (!amdgpu_cwsr_is_enabled(adev)) > + return 0; > + > + return num_xcc * > + (adev->cwsr_info->xcc_cwsr_sz + > adev->cwsr_info->xcc_dbg_mem_sz); > +} > + > static void amdgpu_cwsr_init_isa_details(struct amdgpu_device *adev, > struct amdgpu_cwsr_info *cwsr_info) > { > @@ -425,6 +434,36 @@ int amdgpu_cwsr_alloc(struct amdgpu_device *adev, struct > amdgpu_vm *vm, > return r; > } > > +int amdgpu_cwsr_validate_params(struct amdgpu_device *adev, > + struct amdgpu_cwsr_params *cwsr_params, > + int num_xcc) > +{ > + uint32_t min_size, max_size; > + > + if (!amdgpu_cwsr_is_enabled(adev)) > + return -EOPNOTSUPP; > + > + if (!cwsr_params) > + return -EINVAL; > + > + min_size = amdgpu_cwsr_size_needed(adev, num_xcc); > + max_size = 2 * min_size; > + /* > + * Only save area size details checked. Address validation needs to be > + * carried out separately. User is expected to pass a cwsr buffer area > + * with size >= ctl stack size + wg data size + debug memory size > + */ > + if (cwsr_params->cwsr_sz < min_size || > + cwsr_params->cwsr_sz > max_size) { > + dev_dbg(adev->dev, > + "queue cwsr size 0x%x should be within min %u : max > %u\n", > + cwsr_params->cwsr_sz, min_size, max_size); > + return -EINVAL; > + } > + > + return 0; > +} > + > void amdgpu_cwsr_free(struct amdgpu_device *adev, struct amdgpu_vm *vm, > struct amdgpu_cwsr_trap_obj **trap_obj) > { > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.h > index 3c80d057bbed..7f922559e297 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.h > @@ -56,6 +56,12 @@ struct amdgpu_cwsr_info { > uint32_t xcc_cwsr_sz; > }; > > +struct amdgpu_cwsr_params { > + uint64_t ctx_save_area_address; > + /* cwsr size info */ > + uint32_t cwsr_sz; > +}; > + > int amdgpu_cwsr_init(struct amdgpu_device *adev); > void amdgpu_cwsr_fini(struct amdgpu_device *adev); > > @@ -68,4 +74,8 @@ static inline bool amdgpu_cwsr_is_enabled(struct > amdgpu_device *adev) > return adev->cwsr_info != NULL; > } > > +uint32_t amdgpu_cwsr_size_needed(struct amdgpu_device *adev, int num_xcc); > +int amdgpu_cwsr_validate_params(struct amdgpu_device *adev, > + struct amdgpu_cwsr_params *cwsr_params, > + int num_xcc); > #endif > -- > 2.49.0 >
