[RFC PATCH 7/7] drm/amdgpu: Return Handle to MMIO_REMAP Singleton for GEM Create

Christian König christian.koenig at amd.com
Mon Aug 25 14:57:32 UTC 2025


On 20.08.25 13:32, Srinivasan Shanmugam wrote:
> When userspace requests a GEM in AMDGPU_GEM_DOMAIN_MMIO_REMAP, return a
> handle to the kernel-owned singleton BO instead of allocating a new one.
> 
> Validate inputs (exact PAGE_SIZE, alignment PAGE_SIZE, no extra flags)
> and zero the ioctl out-struct on success for a clean echo.
> 
> This puts the userspace-visible behavior last, after all internal kernel
> plumbing and initialization are in place.
> 
> Cc: Christian König <christian.koenig at amd.com>
> Cc: Alex Deucher <alexander.deucher at amd.com>
> Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 56 +++++++++++++++++++++++++
>  1 file changed, 56 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index e3f65977eeee..1345e81214e8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -424,6 +424,26 @@ const struct drm_gem_object_funcs amdgpu_gem_object_funcs = {
>  	.vm_ops = &amdgpu_gem_vm_ops,
>  };
>  
> +/* ========= MMIO remap (HDP flush) GEM handle helper ========= */
> +static int amdgpu_gem_get_mmio_remap_handle(struct drm_file *file_priv,
> +					    struct amdgpu_device *adev,
> +					    u32 *handle)
> +{
> +	struct amdgpu_bo *bo = adev->mmio_remap_bo;
> +	struct drm_gem_object *gobj;
> +	int r;
> +
> +	if (!bo)
> +		return -ENODEV;
> +
> +	/* Take a temporary ref; the handle creation will hold its own ref. */
> +	bo = amdgpu_bo_ref(bo);

That is superflous, you can just call drm_gem_handle_create().

> +	gobj = &bo->tbo.base;
> +	r = drm_gem_handle_create(file_priv, gobj, handle);
> +	amdgpu_bo_unref(&bo);  /* drops our temporary ref */
> +	return r;
> +}
> +
>  /*
>   * GEM ioctls.
>   */
> @@ -465,6 +485,42 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>  	/* always clear VRAM */
>  	flags |= AMDGPU_GEM_CREATE_VRAM_CLEARED;
>  
> +	/*
> +	 * === MMIO remap (HDP flush) fast-path ===
> +	 * If userspace asks for the MMIO_REMAP domain, don't allocate a new BO.
> +	 * Return a handle to the singleton BO created at device init.
> +	 */
> +	if (args->in.domains & AMDGPU_GEM_DOMAIN_MMIO_REMAP) {
> +		u32 mmio_handle;
> +		/* Enforce fixed size & alignment (exactly one page). */
> +		if (size && size != PAGE_SIZE)
> +			return -EINVAL;
> +		if (args->in.alignment && args->in.alignment != PAGE_SIZE)
> +			return -EINVAL;
> +		/* No extra domain flags for this special object. */
> +		if (args->in.domain_flags)
> +			return -EINVAL;
> +		/* Disallow flags that don't make sense for a fixed I/O page. */
> +		if (flags & (AMDGPU_GEM_CREATE_CPU_GTT_USWC |
> +			     AMDGPU_GEM_CREATE_ENCRYPTED |
> +			     AMDGPU_GEM_CREATE_DISCARDABLE))
> +			return -EINVAL;
> +
> +		/* Normalize inputs (optional, for user-visible echo/debug). */

> +		args->in.bo_size     = PAGE_SIZE;
> +		args->in.alignment   = PAGE_SIZE;
> +		args->in.domains     = AMDGPU_GEM_DOMAIN_MMIO_REMAP;
> +		args->in.domain_flags = 0;
> +

That makes not much sense, the in parameters are meaningless at this point.

Regards,
Christian.

> +		r = amdgpu_gem_get_mmio_remap_handle(filp, adev, &mmio_handle);
> +		if (r)
> +			return r;
> +
> +		memset(args, 0, sizeof(*args));
> +		args->out.handle = mmio_handle;
> +		return 0;
> +	}
> +
>  	/* create a gem object to contain this object in */
>  	if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
>  	    AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {



More information about the amd-gfx mailing list