On Wed, Sep 3, 2025 at 7:54 AM SRINIVASAN SHANMUGAM
<srinivasan.shanmu...@amd.com> wrote:
>
>
> On 9/3/2025 1:07 PM, Christian König wrote:
>
> On 02.09.25 16:52, Srinivasan Shanmugam wrote:
>
> Enable userspace to obtain a handle to the kernel-owned MMIO_REMAP
> singleton when AMDGPU_GEM_DOMAIN_MMIO_REMAP is requested via
> amdgpu_gem_create_ioctl().
>
> Validate the fixed 4K constraint: if PAGE_SIZE > AMDGPU_GPU_PAGE_SIZE
> return -EINVAL; when provided, size and alignment must equal
> AMDGPU_GPU_PAGE_SIZE.
>
> If the singleton BO is not available, return -ENODEV.
>
> v2:
> - Drop READ_ONCE() on adev->mmio_remap.bo (use a plain pointer load).
>   The pointer is set `bo = adev->mmio_remap.bo;` ie., The pointer is
>   written once during init and not changed while IOCTLs run. There’s no
>   concurrent writer in this execution path, so a normal read is safe.
>   (Alex)
>
> v3:
> - Drop early -EINVAL for AMDGPU_GEM_DOMAIN_MMIO_REMAP; let the
>   MMIO_REMAP fast-path (For MMIO_REMAP, if asked, we don’t allocate a
>   new BO — we just check size/alignment, grab the one pre-made BO,
>   return a handle) handle it and return the singleton handle.
>
> v4:
>  - Return -EOPNOTSUPP if the singleton isn’t available; drop PAGE_SIZE
>    check from IOCTL; inline the MMIO_REMAP fast-path and keep
>    size/alignment validation there. (Christian)
>
> v5:
>  - Reword comments (no “===”), explain why the singleton is returned.
>  - Pass &args->in to amdgpu_gem_get_mmio_remap_handle() (drop local
>    ‘size’) (Christian)
>
> Cc: Christian König <christian.koe...@amd.com>
> Suggested-by: Alex Deucher <alexander.deuc...@amd.com>
> Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmu...@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 58 ++++++++++++++++++++++++-
>  1 file changed, 56 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index d3c369742124..7676eafbedbf 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -424,6 +424,47 @@ const struct drm_gem_object_funcs 
> amdgpu_gem_object_funcs = {
>   .vm_ops = &amdgpu_gem_vm_ops,
>  };
>
> +/**
> + * amdgpu_gem_get_mmio_remap_handle - Create a GEM handle for the MMIO_REMAP 
> BO
> + * @file_priv: DRM file of the caller
> + * @adev: amdgpu device
> + * @in: GEM create input parameters from userspace (size/alignment fields 
> may be unset (0))
> + * @handle: returned GEM handle for userspace (output)
> + *
> + * Creates a GEM handle to the kernel-owned singleton MMIO_REMAP buffer 
> object
> + * (adev->rmmio_remap.bo). The BO is expected to be allocated during TTM init
> + * when the hardware exposes a remap base and PAGE_SIZE <= 4K.
> + *
> + * Although @in can specify size or alignment, this BO is fixed and unique;
> + * those fields are only validated, not used for allocation.
> + *
> + * drm_gem_handle_create() acquires the handle reference, which will be 
> dropped
> + * by GEM_CLOSE in userspace.
> + *
> + * Returns 0 on success,
> + *         -EOPNOTSUPP if the singleton BO is not available on this system,
> + *         or a negative errno from drm_gem_handle_create() / validation.
> + */
> +static int amdgpu_gem_get_mmio_remap_handle(struct drm_file *file_priv,
> +    struct amdgpu_device *adev,
> +    const struct drm_amdgpu_gem_create_in *in,
> +    u32 *handle)
> +{
> + struct amdgpu_bo *bo = adev->rmmio_remap.bo;
> +
> + if (!bo)
> + return -EOPNOTSUPP;
> +
> + /* MMIO_REMAP is a fixed 4K page; enforce only if userspace specified them. 
> */
> + if (in->bo_size != AMDGPU_GPU_PAGE_SIZE)
> + return -EINVAL;
>
> + if (in->alignment != AMDGPU_GPU_PAGE_SIZE)
> + return -EINVAL;
>
> You misunderstood me on teams :(
>
> Only the size must be exactly AMDGPU_GPU_PAGE_SIZE. The alignment can also be 
> smaller than that, just not larger.
>
> In other words the check here is probably best written as "if (in->alignment 
> <= AMDGPU_GPU_PAGE_SIZE)".
>
> Hi Christian,
>
> Thanks a lot for all your quick reviews and feedback's onto this series.
>
> Just to double check "if (in->alignment <= AMDGPU_GPU_PAGE_SIZE)". " <=" is 
> rejecting for buffer alignment "#define BUFFER_ALIGN (4*1024)" in IGT, so is 
> that is that this check should be lesser than 4K
>
> if (in->alignment < AMDGPU_GPU_PAGE_SIZE) atleast for this MMIO_REMAP BO case?

if (alignment > AMDGPU_GPU_PAGE_SIZE)
   return -EINVAL;

Alex

>
> Best regards,
> Srini

Reply via email to