On Fri, Apr 26, 2024 at 10:07 AM Shashank Sharma <shashank.sharma@xxxxxxx> wrote: > > This patch introduces amdgpu_userqueue_object and its helper > functions to creates and destroy this object. The helper > functions creates/destroys a base amdgpu_bo, kmap/unmap it and > save the respective GPU and CPU addresses in the encapsulating > userqueue object. > > These helpers will be used to create/destroy userqueue MQD, WPTR > and FW areas. > > V7: > - Forked out this new patch from V11-gfx-userqueue patch to prevent > that patch from growing very big. > - Using amdgpu_bo_create instead of amdgpu_bo_create_kernel in prep > for eviction fences (Christian) > > V9: > - Rebase > > Cc: Alex Deucher <alexander.deucher@xxxxxxx> > Cc: Christian Koenig <christian.koenig@xxxxxxx> > Signed-off-by: Shashank Sharma <shashank.sharma@xxxxxxx> Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c | 62 +++++++++++++++++++ > .../gpu/drm/amd/include/amdgpu_userqueue.h | 13 ++++ > 2 files changed, 75 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c > index df97b856f891..65cab0ad97a1 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c > @@ -32,6 +32,68 @@ amdgpu_userqueue_find(struct amdgpu_userq_mgr *uq_mgr, int qid) > return idr_find(&uq_mgr->userq_idr, qid); > } > > +int amdgpu_userqueue_create_object(struct amdgpu_userq_mgr *uq_mgr, > + struct amdgpu_userq_obj *userq_obj, > + int size) > +{ > + struct amdgpu_device *adev = uq_mgr->adev; > + struct amdgpu_bo_param bp; > + int r; > + > + memset(&bp, 0, sizeof(bp)); > + bp.byte_align = PAGE_SIZE; > + bp.domain = AMDGPU_GEM_DOMAIN_GTT; > + bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS | > + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; > + bp.type = ttm_bo_type_kernel; > + bp.size = size; > + bp.resv = NULL; > + bp.bo_ptr_size = sizeof(struct amdgpu_bo); > + > + r = amdgpu_bo_create(adev, &bp, &userq_obj->obj); > + if (r) { > + DRM_ERROR("Failed to allocate BO for userqueue (%d)", r); > + return r; > + } > + > + r = amdgpu_bo_reserve(userq_obj->obj, true); > + if (r) { > + DRM_ERROR("Failed to reserve BO to map (%d)", r); > + goto free_obj; > + } > + > + r = amdgpu_ttm_alloc_gart(&(userq_obj->obj)->tbo); > + if (r) { > + DRM_ERROR("Failed to alloc GART for userqueue object (%d)", r); > + goto unresv; > + } > + > + r = amdgpu_bo_kmap(userq_obj->obj, &userq_obj->cpu_ptr); > + if (r) { > + DRM_ERROR("Failed to map BO for userqueue (%d)", r); > + goto unresv; > + } > + > + userq_obj->gpu_addr = amdgpu_bo_gpu_offset(userq_obj->obj); > + amdgpu_bo_unreserve(userq_obj->obj); > + memset(userq_obj->cpu_ptr, 0, size); > + return 0; > + > +unresv: > + amdgpu_bo_unreserve(userq_obj->obj); > + > +free_obj: > + amdgpu_bo_unref(&userq_obj->obj); > + return r; > +} > + > +void amdgpu_userqueue_destroy_object(struct amdgpu_userq_mgr *uq_mgr, > + struct amdgpu_userq_obj *userq_obj) > +{ > + amdgpu_bo_kunmap(userq_obj->obj); > + amdgpu_bo_unref(&userq_obj->obj); > +} > + > static int > amdgpu_userqueue_destroy(struct drm_file *filp, int queue_id) > { > diff --git a/drivers/gpu/drm/amd/include/amdgpu_userqueue.h b/drivers/gpu/drm/amd/include/amdgpu_userqueue.h > index b739274c72e1..bbd29f68b8d4 100644 > --- a/drivers/gpu/drm/amd/include/amdgpu_userqueue.h > +++ b/drivers/gpu/drm/amd/include/amdgpu_userqueue.h > @@ -29,6 +29,12 @@ > > struct amdgpu_mqd_prop; > > +struct amdgpu_userq_obj { > + void *cpu_ptr; > + uint64_t gpu_addr; > + struct amdgpu_bo *obj; > +}; > + > struct amdgpu_usermode_queue { > int queue_type; > uint64_t doorbell_handle; > @@ -37,6 +43,7 @@ struct amdgpu_usermode_queue { > struct amdgpu_mqd_prop *userq_prop; > struct amdgpu_userq_mgr *userq_mgr; > struct amdgpu_vm *vm; > + struct amdgpu_userq_obj mqd; > }; > > struct amdgpu_userq_funcs { > @@ -60,4 +67,10 @@ int amdgpu_userq_mgr_init(struct amdgpu_userq_mgr *userq_mgr, struct amdgpu_devi > > void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr); > > +int amdgpu_userqueue_create_object(struct amdgpu_userq_mgr *uq_mgr, > + struct amdgpu_userq_obj *userq_obj, > + int size); > + > +void amdgpu_userqueue_destroy_object(struct amdgpu_userq_mgr *uq_mgr, > + struct amdgpu_userq_obj *userq_obj); > #endif > -- > 2.43.2 >