[PATCH 3/3] drm/amdkfd: Consolidate MQD manager functions
Joshi, Mukul
Mukul.Joshi at amd.com
Mon Feb 7 17:50:19 UTC 2022
[AMD Official Use Only]
> -----Original Message-----
> From: Kuehling, Felix <Felix.Kuehling at amd.com>
> Sent: Monday, February 7, 2022 10:43 AM
> To: Joshi, Mukul <Mukul.Joshi at amd.com>; amd-gfx at lists.freedesktop.org
> Subject: Re: [PATCH 3/3] drm/amdkfd: Consolidate MQD manager functions
>
>
> Am 2022-02-04 um 18:45 schrieb Mukul Joshi:
> > A few MQD manager functions are duplicated for all versions of MQD
> > manager. Remove this duplication by moving the common functions into
> > kfd_mqd_manager.c file.
> >
> > Signed-off-by: Mukul Joshi <mukul.joshi at amd.com>
> > ---
> > drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c | 63
> +++++++++++++++++
> > drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h | 27 ++++++++
> > .../gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c | 54 ---------------
> > .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c | 61 -----------------
> > .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c | 68 -------------------
> > .../gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 53 ---------------
> > 6 files changed, 90 insertions(+), 236 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
> > b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
> > index e2825ad4d699..f4a6af98db2d 100644
> > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
> > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
> > @@ -173,3 +173,66 @@ void mqd_symmetrically_map_cu_mask(struct
> mqd_manager *mm,
> > }
> > }
> > }
> > +
> > +int hiq_load_mqd_kiq(struct mqd_manager *mm, void *mqd,
> > + uint32_t pipe_id, uint32_t queue_id,
> > + struct queue_properties *p, struct mm_struct *mms)
>
> Since these functions are no longer static, they should get an appropriate name
> prefix to avoid future namespace collisions. Just a kfd_ prefix will do.
>
> I think there are existing functions in this file that could use the same treatment
> (in a separate patch).
>
>
> > +{
> > + return mm->dev->kfd2kgd->hiq_mqd_load(mm->dev->adev, mqd,
> pipe_id,
> > + queue_id, p->doorbell_off);
> > +}
> > +
> > +int destroy_mqd(struct mqd_manager *mm, void *mqd,
> > + enum kfd_preempt_type type, unsigned int timeout,
> > + uint32_t pipe_id,uint32_t queue_id)
>
> This function is only applicable to CP queues. Therefore I'd give it a
> more specific name, e.g. kfd_destroy_cp_mqd. Similar for the other
> non-SDMA functions below.
>
We define destroy_hqd for HIQ (and DIQ ) also. Same for free_mqd and other functions.
I guess that’s why we have _sdma for SDMA queues, and the rest use a generic name.
Maybe leaving it without '_cp' is better here. What do you think?
Regards,
Mukul
> Regards,
> Felix
>
>
> > +{
> > + return mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, mqd, type,
> timeout,
> > + pipe_id, queue_id);
> > +}
> > +
> > +void free_mqd(struct mqd_manager *mm, void *mqd,
> > + struct kfd_mem_obj *mqd_mem_obj)
> > +{
> > + if (mqd_mem_obj->gtt_mem) {
> > + amdgpu_amdkfd_free_gtt_mem(mm->dev->adev,
> mqd_mem_obj->gtt_mem);
> > + kfree(mqd_mem_obj);
> > + } else {
> > + kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
> > + }
> > +}
> > +
> > +bool is_occupied(struct mqd_manager *mm, void *mqd,
> > + uint64_t queue_address, uint32_t pipe_id,
> > + uint32_t queue_id)
> > +{
> > + return mm->dev->kfd2kgd->hqd_is_occupied(mm->dev->adev,
> queue_address,
> > + pipe_id, queue_id);
> > +}
> > +
> > +int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > + uint32_t pipe_id, uint32_t queue_id,
> > + struct queue_properties *p, struct mm_struct *mms)
> > +{
> > + return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->adev, mqd,
> > + (uint32_t __user *)p-
> >write_ptr,
> > + mms);
> > +}
> > +
> > +/*
> > + * preempt type here is ignored because there is only one way
> > + * to preempt sdma queue
> > + */
> > +int destroy_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > + enum kfd_preempt_type type,
> > + unsigned int timeout, uint32_t pipe_id,
> > + uint32_t queue_id)
> > +{
> > + return mm->dev->kfd2kgd->hqd_sdma_destroy(mm->dev->adev, mqd,
> timeout);
> > +}
> > +
> > +bool is_occupied_sdma(struct mqd_manager *mm, void *mqd,
> > + uint64_t queue_address, uint32_t pipe_id,
> > + uint32_t queue_id)
> > +{
> > + return mm->dev->kfd2kgd->hqd_sdma_is_occupied(mm->dev->adev,
> mqd);
> > +}
> > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
> b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
> > index 23486a23df84..76f20637b938 100644
> > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
> > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
> > @@ -136,4 +136,31 @@ void mqd_symmetrically_map_cu_mask(struct
> mqd_manager *mm,
> > const uint32_t *cu_mask, uint32_t cu_mask_count,
> > uint32_t *se_mask);
> >
> > +int hiq_load_mqd_kiq(struct mqd_manager *mm, void *mqd,
> > + uint32_t pipe_id, uint32_t queue_id,
> > + struct queue_properties *p, struct mm_struct *mms);
> > +
> > +int destroy_mqd(struct mqd_manager *mm, void *mqd,
> > + enum kfd_preempt_type type, unsigned int timeout,
> > + uint32_t pipe_id,uint32_t queue_id);
> > +
> > +void free_mqd(struct mqd_manager *mm, void *mqd,
> > + struct kfd_mem_obj *mqd_mem_obj);
> > +
> > +bool is_occupied(struct mqd_manager *mm, void *mqd,
> > + uint64_t queue_address, uint32_t pipe_id,
> > + uint32_t queue_id);
> > +
> > +int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > + uint32_t pipe_id, uint32_t queue_id,
> > + struct queue_properties *p, struct mm_struct *mms);
> > +
> > +int destroy_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > + enum kfd_preempt_type type,unsigned int timeout,
> > + uint32_t pipe_id, uint32_t queue_id);
> > +
> > +bool is_occupied_sdma(struct mqd_manager *mm, void *mqd,
> > + uint64_t queue_address, uint32_t pipe_id,
> > + uint32_t queue_id);
> > +
> > #endif /* KFD_MQD_MANAGER_H_ */
> > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
> b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
> > index 96e3303fa27c..81b6b3d5f2e7 100644
> > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
> > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
> > @@ -156,13 +156,6 @@ static void init_mqd_sdma(struct mqd_manager
> *mm, void **mqd,
> > mm->update_mqd(mm, m, q, NULL);
> > }
> >
> > -static void free_mqd(struct mqd_manager *mm, void *mqd,
> > - struct kfd_mem_obj *mqd_mem_obj)
> > -{
> > - kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
> > -}
> > -
> > -
> > static int load_mqd(struct mqd_manager *mm, void *mqd, uint32_t pipe_id,
> > uint32_t queue_id, struct queue_properties *p,
> > struct mm_struct *mms)
> > @@ -176,15 +169,6 @@ static int load_mqd(struct mqd_manager *mm, void
> *mqd, uint32_t pipe_id,
> > wptr_shift, wptr_mask, mms);
> > }
> >
> > -static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > - uint32_t pipe_id, uint32_t queue_id,
> > - struct queue_properties *p, struct mm_struct *mms)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->adev, mqd,
> > - (uint32_t __user *)p->write_ptr,
> > - mms);
> > -}
> > -
> > static void __update_mqd(struct mqd_manager *mm, void *mqd,
> > struct queue_properties *q, struct mqd_update_info
> *minfo,
> > unsigned int atc_bit)
> > @@ -271,15 +255,6 @@ static void update_mqd_sdma(struct mqd_manager
> *mm, void *mqd,
> > q->is_active = QUEUE_IS_ACTIVE(*q);
> > }
> >
> > -static int destroy_mqd(struct mqd_manager *mm, void *mqd,
> > - enum kfd_preempt_type type,
> > - unsigned int timeout, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, mqd, type,
> timeout,
> > - pipe_id, queue_id);
> > -}
> > -
> > static void checkpoint_mqd(struct mqd_manager *mm, void *mqd, void
> *mqd_dst, void *ctl_stack_dst)
> > {
> > struct cik_mqd *m;
> > @@ -351,35 +326,6 @@ static void restore_mqd_sdma(struct mqd_manager
> *mm, void **mqd,
> > qp->is_active = 0;
> > }
> >
> > -/*
> > - * preempt type here is ignored because there is only one way
> > - * to preempt sdma queue
> > - */
> > -static int destroy_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > - enum kfd_preempt_type type,
> > - unsigned int timeout, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_destroy(mm->dev->adev, mqd,
> timeout);
> > -}
> > -
> > -static bool is_occupied(struct mqd_manager *mm, void *mqd,
> > - uint64_t queue_address, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > -
> > - return mm->dev->kfd2kgd->hqd_is_occupied(mm->dev->adev,
> queue_address,
> > - pipe_id, queue_id);
> > -
> > -}
> > -
> > -static bool is_occupied_sdma(struct mqd_manager *mm, void *mqd,
> > - uint64_t queue_address, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_is_occupied(mm->dev->adev,
> mqd);
> > -}
> > -
> > /*
> > * HIQ MQD Implementation, concrete implementation for HIQ MQD
> implementation.
> > * The HIQ queue in Kaveri is using the same MQD structure as all the user
> mode
> > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
> b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
> > index 0cc8679c24fa..8324757a1cf5 100644
> > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
> > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
> > @@ -154,14 +154,6 @@ static int load_mqd(struct mqd_manager *mm, void
> *mqd,
> > return r;
> > }
> >
> > -static int hiq_load_mqd_kiq(struct mqd_manager *mm, void *mqd,
> > - uint32_t pipe_id, uint32_t queue_id,
> > - struct queue_properties *p, struct mm_struct *mms)
> > -{
> > - return mm->dev->kfd2kgd->hiq_mqd_load(mm->dev->adev, mqd,
> pipe_id,
> > - queue_id, p->doorbell_off);
> > -}
> > -
> > static void update_mqd(struct mqd_manager *mm, void *mqd,
> > struct queue_properties *q,
> > struct mqd_update_info *minfo)
> > @@ -233,31 +225,6 @@ static uint32_t read_doorbell_id(void *mqd)
> > return m->queue_doorbell_id0;
> > }
> >
> > -static int destroy_mqd(struct mqd_manager *mm, void *mqd,
> > - enum kfd_preempt_type type,
> > - unsigned int timeout, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_destroy
> > - (mm->dev->adev, mqd, type, timeout,
> > - pipe_id, queue_id);
> > -}
> > -
> > -static void free_mqd(struct mqd_manager *mm, void *mqd,
> > - struct kfd_mem_obj *mqd_mem_obj)
> > -{
> > - kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
> > -}
> > -
> > -static bool is_occupied(struct mqd_manager *mm, void *mqd,
> > - uint64_t queue_address, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_is_occupied(
> > - mm->dev->adev, queue_address,
> > - pipe_id, queue_id);
> > -}
> > -
> > static int get_wave_state(struct mqd_manager *mm, void *mqd,
> > void __user *ctl_stack,
> > u32 *ctl_stack_used_size,
> > @@ -352,15 +319,6 @@ static void init_mqd_sdma(struct mqd_manager
> *mm, void **mqd,
> > mm->update_mqd(mm, m, q, NULL);
> > }
> >
> > -static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > - uint32_t pipe_id, uint32_t queue_id,
> > - struct queue_properties *p, struct mm_struct *mms)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->adev, mqd,
> > - (uint32_t __user *)p->write_ptr,
> > - mms);
> > -}
> > -
> > #define SDMA_RLC_DUMMY_DEFAULT 0xf
> >
> > static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > @@ -390,25 +348,6 @@ static void update_mqd_sdma(struct mqd_manager
> *mm, void *mqd,
> > q->is_active = QUEUE_IS_ACTIVE(*q);
> > }
> >
> > -/*
> > - * * preempt type here is ignored because there is only one way
> > - * * to preempt sdma queue
> > - */
> > -static int destroy_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > - enum kfd_preempt_type type,
> > - unsigned int timeout, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_destroy(mm->dev->adev, mqd,
> timeout);
> > -}
> > -
> > -static bool is_occupied_sdma(struct mqd_manager *mm, void *mqd,
> > - uint64_t queue_address, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_is_occupied(mm->dev->adev,
> mqd);
> > -}
> > -
> > static void checkpoint_mqd_sdma(struct mqd_manager *mm,
> > void *mqd,
> > void *mqd_dst,
> > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> > index 87da4329dbf2..007886b2961e 100644
> > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> > @@ -204,14 +204,6 @@ static int load_mqd(struct mqd_manager *mm, void
> *mqd,
> > wptr_shift, 0, mms);
> > }
> >
> > -static int hiq_load_mqd_kiq(struct mqd_manager *mm, void *mqd,
> > - uint32_t pipe_id, uint32_t queue_id,
> > - struct queue_properties *p, struct mm_struct *mms)
> > -{
> > - return mm->dev->kfd2kgd->hiq_mqd_load(mm->dev->adev, mqd,
> pipe_id,
> > - queue_id, p->doorbell_off);
> > -}
> > -
> > static void update_mqd(struct mqd_manager *mm, void *mqd,
> > struct queue_properties *q,
> > struct mqd_update_info *minfo)
> > @@ -285,38 +277,6 @@ static uint32_t read_doorbell_id(void *mqd)
> > return m->queue_doorbell_id0;
> > }
> >
> > -static int destroy_mqd(struct mqd_manager *mm, void *mqd,
> > - enum kfd_preempt_type type,
> > - unsigned int timeout, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_destroy
> > - (mm->dev->adev, mqd, type, timeout,
> > - pipe_id, queue_id);
> > -}
> > -
> > -static void free_mqd(struct mqd_manager *mm, void *mqd,
> > - struct kfd_mem_obj *mqd_mem_obj)
> > -{
> > - struct kfd_dev *kfd = mm->dev;
> > -
> > - if (mqd_mem_obj->gtt_mem) {
> > - amdgpu_amdkfd_free_gtt_mem(kfd->adev, mqd_mem_obj-
> >gtt_mem);
> > - kfree(mqd_mem_obj);
> > - } else {
> > - kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
> > - }
> > -}
> > -
> > -static bool is_occupied(struct mqd_manager *mm, void *mqd,
> > - uint64_t queue_address, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_is_occupied(
> > - mm->dev->adev, queue_address,
> > - pipe_id, queue_id);
> > -}
> > -
> > static int get_wave_state(struct mqd_manager *mm, void *mqd,
> > void __user *ctl_stack,
> > u32 *ctl_stack_used_size,
> > @@ -422,15 +382,6 @@ static void init_mqd_sdma(struct mqd_manager
> *mm, void **mqd,
> > mm->update_mqd(mm, m, q, NULL);
> > }
> >
> > -static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > - uint32_t pipe_id, uint32_t queue_id,
> > - struct queue_properties *p, struct mm_struct *mms)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->adev, mqd,
> > - (uint32_t __user *)p->write_ptr,
> > - mms);
> > -}
> > -
> > #define SDMA_RLC_DUMMY_DEFAULT 0xf
> >
> > static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > @@ -460,25 +411,6 @@ static void update_mqd_sdma(struct mqd_manager
> *mm, void *mqd,
> > q->is_active = QUEUE_IS_ACTIVE(*q);
> > }
> >
> > -/*
> > - * * preempt type here is ignored because there is only one way
> > - * * to preempt sdma queue
> > - */
> > -static int destroy_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > - enum kfd_preempt_type type,
> > - unsigned int timeout, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_destroy(mm->dev->adev, mqd,
> timeout);
> > -}
> > -
> > -static bool is_occupied_sdma(struct mqd_manager *mm, void *mqd,
> > - uint64_t queue_address, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_is_occupied(mm->dev->adev,
> mqd);
> > -}
> > -
> > static void checkpoint_mqd_sdma(struct mqd_manager *mm,
> > void *mqd,
> > void *mqd_dst,
> > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
> b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
> > index 137b208135a0..c0405bbe8e36 100644
> > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
> > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
> > @@ -259,31 +259,6 @@ static void update_mqd_tonga(struct mqd_manager
> *mm, void *mqd,
> > __update_mqd(mm, mqd, q, minfo, MTYPE_UC, 0);
> > }
> >
> > -static int destroy_mqd(struct mqd_manager *mm, void *mqd,
> > - enum kfd_preempt_type type,
> > - unsigned int timeout, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_destroy
> > - (mm->dev->adev, mqd, type, timeout,
> > - pipe_id, queue_id);
> > -}
> > -
> > -static void free_mqd(struct mqd_manager *mm, void *mqd,
> > - struct kfd_mem_obj *mqd_mem_obj)
> > -{
> > - kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
> > -}
> > -
> > -static bool is_occupied(struct mqd_manager *mm, void *mqd,
> > - uint64_t queue_address, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_is_occupied(
> > - mm->dev->adev, queue_address,
> > - pipe_id, queue_id);
> > -}
> > -
> > static int get_wave_state(struct mqd_manager *mm, void *mqd,
> > void __user *ctl_stack,
> > u32 *ctl_stack_used_size,
> > @@ -385,15 +360,6 @@ static void init_mqd_sdma(struct mqd_manager
> *mm, void **mqd,
> > mm->update_mqd(mm, m, q, NULL);
> > }
> >
> > -static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > - uint32_t pipe_id, uint32_t queue_id,
> > - struct queue_properties *p, struct mm_struct *mms)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->adev, mqd,
> > - (uint32_t __user *)p->write_ptr,
> > - mms);
> > -}
> > -
> > static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > struct queue_properties *q,
> > struct mqd_update_info *minfo)
> > @@ -422,25 +388,6 @@ static void update_mqd_sdma(struct mqd_manager
> *mm, void *mqd,
> > q->is_active = QUEUE_IS_ACTIVE(*q);
> > }
> >
> > -/*
> > - * * preempt type here is ignored because there is only one way
> > - * * to preempt sdma queue
> > - */
> > -static int destroy_mqd_sdma(struct mqd_manager *mm, void *mqd,
> > - enum kfd_preempt_type type,
> > - unsigned int timeout, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_destroy(mm->dev->adev, mqd,
> timeout);
> > -}
> > -
> > -static bool is_occupied_sdma(struct mqd_manager *mm, void *mqd,
> > - uint64_t queue_address, uint32_t pipe_id,
> > - uint32_t queue_id)
> > -{
> > - return mm->dev->kfd2kgd->hqd_sdma_is_occupied(mm->dev->adev,
> mqd);
> > -}
> > -
> > static void checkpoint_mqd_sdma(struct mqd_manager *mm,
> > void *mqd,
> > void *mqd_dst,
More information about the amd-gfx
mailing list