On 10/9/26 11:40, Sunil Khatri wrote:
> Set the kernel and user-queue VMID pools for both hubs in one call.
> The caller now just hands over each hub's raw kernel-queue mask;
> vmid_uq_mask_gfxhub is derived here as its complement, and
> vmid_uq_mask_mmhub is the fixed pool set here too, with npa_vmid
> excluded from both MMHUB pools, instead of any of this being split
> across a separate post-hoc fix-up or a field the caller had to
> pre-compute itself.
> 
> Assisted-by: Claude:claude-sonnet-5
> Signed-off-by: Sunil Khatri <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 50 +++++++++++++------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h |  3 +-
>  drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c  | 13 ++-----
>  drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c  | 17 +++------
>  drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c  | 28 ++++++--------
>  drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c   | 14 +++----
>  drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c   | 14 +++----
>  drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c   | 14 +++----
>  drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c   | 24 +++++-------
>  9 files changed, 75 insertions(+), 102 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> index 55d6b2107d8f9..1c5bce0500ac9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> @@ -631,44 +631,48 @@ void amdgpu_vmid_reset_all(struct amdgpu_device *adev)
>  }
>  
>  /**
> - * amdgpu_vmid_mgr_set_vmid_mask - set the kernel-queue VMID pool for a
> - * hub, and the matching user-queue mask on MMHUB
> + * amdgpu_vmid_mgr_set_vmid_mask - set the kernel- and user-queue VMID
> + * pools for both hubs
>   *
>   * @adev: amdgpu device structure
> - * @vmid_mask: kernel-queue round-robin VMID mask for this hub
> - * @for_mmhub: true to target MMHUB instances, false for GFXHUB
> - *
> - * On MMHUB, also sets vmid_uq_mask_mmhub to the fixed pool of VMIDs
> - * MES/KFD use there, excluding npa_vmid (a VMID dedicated to a single
> - * fixed purpose) from both the kernel- and user-queue masks; the
> - * caller must already have set npa_vmid. vmid_uq_mask_gfxhub is set
> - * directly by each generation's sw_init(), since unlike MMHUB's it
> - * varies per generation.
> + * @gfx_vmid_mask: kernel-queue VMID pool mask for GFXHUB
> + * @mmhub_vmid_mask: kernel-queue VMID pool mask for MMHUB
> + *
> + * Sets both hubs' kernel-queue VMID pools (tracked least-recently-used
> + * via id_mgr[].ids_lru), and both hubs' KFD/MES user-queue masks.
> + * vmid_uq_mask_gfxhub is set to the
> + * complement of @gfx_vmid_mask, since unlike MMHUB's it is always a
> + * clean partition of the full VMID range; vmid_uq_mask_mmhub is the
> + * fixed pool set here instead, since MMHUB's kq and uq pools are
> + * allowed to overlap. A VMID dedicated to a single fixed purpose on
> + * MMHUB (npa_vmid) is excluded from both MMHUB pools; it is the
> + * caller's responsibility to have already set npa_vmid.
>   */
>  void amdgpu_vmid_mgr_set_vmid_mask(struct amdgpu_device *adev,
> -                                unsigned long vmid_mask, bool for_mmhub)
> +                                unsigned long gfx_vmid_mask,
> +                                unsigned long mmhub_vmid_mask)
>  {
>       unsigned int i;
>  
>       BUILD_BUG_ON(AMDGPU_NUM_VMID > BITS_PER_LONG);
>  
> -     if (for_mmhub && adev->vm_manager.npa_vmid)
> -             vmid_mask &= ~BIT(adev->vm_manager.npa_vmid);
> +     if (adev->vm_manager.npa_vmid)
> +             mmhub_vmid_mask &= ~BIT(adev->vm_manager.npa_vmid);
>  
>       for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) {
>               bool is_mmhub = AMDGPU_IS_MMHUB0(i) || AMDGPU_IS_MMHUB1(i);
>  
> -             if (is_mmhub == for_mmhub)
> -                     bitmap_copy(adev->vm_manager.id_mgr[i].vmid_mask,
> -                                 &vmid_mask, AMDGPU_NUM_VMID);
> +             bitmap_copy(adev->vm_manager.id_mgr[i].vmid_mask,
> +                         is_mmhub ? &mmhub_vmid_mask : &gfx_vmid_mask,
> +                         AMDGPU_NUM_VMID);
>       }
>  
> -     if (for_mmhub) {
> -             adev->vm_manager.vmid_uq_mask_mmhub = 0xFF00;
> -             if (adev->vm_manager.npa_vmid)
> -                     adev->vm_manager.vmid_uq_mask_mmhub &=
> -                             ~BIT(adev->vm_manager.npa_vmid);
> -     }
> +     adev->vm_manager.vmid_uq_mask_gfxhub =
> +             GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~gfx_vmid_mask;
> +
> +     adev->vm_manager.vmid_uq_mask_mmhub = 0xFF00;
> +     if (adev->vm_manager.npa_vmid)
> +             adev->vm_manager.vmid_uq_mask_mmhub &= 
> ~BIT(adev->vm_manager.npa_vmid);
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> index 73ac1b18e8487..4dfcec76afed7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> @@ -135,6 +135,7 @@ void amdgpu_vmid_reset_all(struct amdgpu_device *adev);
>  void amdgpu_vmid_mgr_init(struct amdgpu_device *adev);
>  void amdgpu_vmid_mgr_fini(struct amdgpu_device *adev);
>  void amdgpu_vmid_mgr_set_vmid_mask(struct amdgpu_device *adev,
> -                                unsigned long vmid_mask, bool for_mmhub);
> +                                unsigned long gfx_vmid_mask,
> +                                unsigned long mmhub_vmid_mask);
>  
>  #endif
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> index a95bfe22c640e..55d286275466d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> @@ -746,7 +746,6 @@ static int gmc_v10_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>  {
>       int r, vram_width = 0, vram_type = 0, vram_vendor = 0;
>       struct amdgpu_device *adev = ip_block->adev;
> -     unsigned long gfx_vmid_mask;
>  
>       adev->gfxhub.funcs->init(adev);
>  
> @@ -867,15 +866,11 @@ static int gmc_v10_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       /*
>        * number of VMs
>        * VMID 0 is reserved for System
> -      * amdgpu graphics/compute will use VMIDs 1-7
> -      * amdkfd will use VMIDs 8-15
> +      * amdgpu graphics/compute kernel queues will use VMIDs 1-7
> +      * amdkfd/MES user queues will use VMIDs 8-15
>        */
> -     gfx_vmid_mask = GENMASK(7, 1);
> -
> -     adev->vm_manager.vmid_uq_mask_gfxhub =
> -             GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~gfx_vmid_mask;
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, false);
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, GENMASK(AMDGPU_NUM_VMID - 1, 1), 
> true);
> +     amdgpu_vmid_mgr_set_vmid_mask(adev, GENMASK(7, 1),
> +                                   GENMASK(AMDGPU_NUM_VMID - 1, 1));
>  
>       amdgpu_vm_manager_init(adev);
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
> index 7b19c59a2f743..301ffb89c9672 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
> @@ -745,8 +745,7 @@ static int gmc_v11_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>  {
>       int r, vram_width = 0, vram_type = 0, vram_vendor = 0;
>       struct amdgpu_device *adev = ip_block->adev;
> -     unsigned int first_userq_vmid;
> -     unsigned long gfx_vmid_mask;
> +     unsigned int last_kq_vmid;
>  
>       adev->mmhub.funcs->init(adev);
>  
> @@ -853,16 +852,12 @@ static int gmc_v11_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       /*
>        * number of VMs
>        * VMID 0 is reserved for System
> -      * amdgpu graphics/compute will use VMIDs 1-7
> -      * amdkfd will use VMIDs 8-15
> +      * amdgpu graphics/compute kernel queues will use VMIDs 1-7
> +      * amdkfd/MES user queues will use VMIDs 8-15
>        */
> -     first_userq_vmid = adev->gfx.disable_kq ? 1 : 8;
> -     gfx_vmid_mask = GENMASK(first_userq_vmid - 1, 1);
> -
> -     adev->vm_manager.vmid_uq_mask_gfxhub =
> -             GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~gfx_vmid_mask;
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, false);
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, GENMASK(AMDGPU_NUM_VMID - 1, 1), 
> true);
> +     last_kq_vmid = adev->gfx.disable_kq ? 0 : 7;
> +     amdgpu_vmid_mgr_set_vmid_mask(adev, GENMASK(last_kq_vmid, 1),
> +                                   GENMASK(AMDGPU_NUM_VMID - 1, 1));
>  
>       amdgpu_vm_manager_init(adev);
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
> index 9194130c25f29..e4a74cd6574f4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
> @@ -848,9 +848,7 @@ static int gmc_v12_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       int r, vram_width = 0, vram_type = 0, vram_vendor = 0, dma_addr_bits;
>       struct amdgpu_device *adev = ip_block->adev;
>       uint64_t pte_addr_mask = 0;
> -     u32 mmhub_vmid_mask;
> -     unsigned int first_userq_vmid;
> -     unsigned long gfx_vmid_mask;
> +     unsigned int last_kq_vmid;
>       int i;
>  
>       adev->mmhub.funcs->init(adev);
> @@ -992,28 +990,24 @@ static int gmc_v12_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       /*
>        * number of VMs
>        * VMID 0 is reserved for System
> -      * amdgpu graphics/compute will use VMIDs 1-7
> -      * amdkfd will use VMIDs 8-15.
> -      * On GFX 12.1, amdkfd will use VMIDs 3-15, with VMID 15 reserved
> -      * for NPA and therefore excluded from the MMHUB VMID pool.
> +      * amdgpu graphics/compute kernel queues will use VMIDs 1-7
> +      * amdkfd/MES user queues will use VMIDs 8-15.
> +      * On GFX 12.1, amdkfd/MES user queues will use VMIDs 3-15, with
> +      * VMID 15 reserved for NPA and therefore excluded from the
> +      * MMHUB VMID pool.
>        */
> -     mmhub_vmid_mask = GENMASK(AMDGPU_NUM_VMID - 1, 1);
>       if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(12, 1, 0)) {
> -             first_userq_vmid = 3;
> +             last_kq_vmid = 2;
>               adev->vm_manager.npa_vmid = 15;
>       } else {
> -             first_userq_vmid = 8;
> +             last_kq_vmid = 7;
>       }
>  
>       if (adev->gfx.disable_kq)
> -             first_userq_vmid = 1;
> +             last_kq_vmid = 0;
>  
> -     gfx_vmid_mask = GENMASK(first_userq_vmid - 1, 1);
> -
> -     adev->vm_manager.vmid_uq_mask_gfxhub =
> -             GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~gfx_vmid_mask;
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, mmhub_vmid_mask, true);
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, false);
> +     amdgpu_vmid_mgr_set_vmid_mask(adev, GENMASK(last_kq_vmid, 1),
> +                                   GENMASK(AMDGPU_NUM_VMID - 1, 1));
>  
>       amdgpu_vm_manager_init(adev);
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> index 4e593e67221ff..a7c353d1ac09d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> @@ -768,7 +768,7 @@ static int gmc_v6_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>  {
>       int r;
>       struct amdgpu_device *adev = ip_block->adev;
> -     unsigned long gfx_vmid_mask;
> +     unsigned long vmid_mask;
>  
>       set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask);
>  
> @@ -822,15 +822,11 @@ static int gmc_v6_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       /*
>        * number of VMs
>        * VMID 0 is reserved for System
> -      * amdgpu graphics/compute will use VMIDs 1-7
> -      * amdkfd will use VMIDs 8-15
> +      * amdgpu graphics/compute kernel queues will use VMIDs 1-7
> +      * amdkfd/MES user queues will use VMIDs 8-15
>        */
> -     gfx_vmid_mask = GENMASK(7, 1);
> -
> -     adev->vm_manager.vmid_uq_mask_gfxhub =
> -             GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~gfx_vmid_mask;
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, false);
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, true);
> +     vmid_mask = GENMASK(7, 1);
> +     amdgpu_vmid_mgr_set_vmid_mask(adev, vmid_mask, vmid_mask);
>       amdgpu_vm_manager_init(adev);
>  
>       /* base offset of vram pages */
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> index bbb5c42b9d4ed..4199300eab177 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> @@ -941,7 +941,7 @@ static int gmc_v7_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>  {
>       int r;
>       struct amdgpu_device *adev = ip_block->adev;
> -     unsigned long gfx_vmid_mask;
> +     unsigned long vmid_mask;
>  
>       set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask);
>  
> @@ -1004,15 +1004,11 @@ static int gmc_v7_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       /*
>        * number of VMs
>        * VMID 0 is reserved for System
> -      * amdgpu graphics/compute will use VMIDs 1-7
> -      * amdkfd will use VMIDs 8-15
> +      * amdgpu graphics/compute kernel queues will use VMIDs 1-7
> +      * amdkfd/MES user queues will use VMIDs 8-15
>        */
> -     gfx_vmid_mask = GENMASK(7, 1);
> -
> -     adev->vm_manager.vmid_uq_mask_gfxhub =
> -             GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~gfx_vmid_mask;
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, false);
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, true);
> +     vmid_mask = GENMASK(7, 1);
> +     amdgpu_vmid_mgr_set_vmid_mask(adev, vmid_mask, vmid_mask);
>       amdgpu_vm_manager_init(adev);
>  
>       /* base offset of vram pages */
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> index 25d47d2c288dd..3f9ec7427319d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> @@ -1051,7 +1051,7 @@ static int gmc_v8_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>  {
>       int r;
>       struct amdgpu_device *adev = ip_block->adev;
> -     unsigned long gfx_vmid_mask;
> +     unsigned long vmid_mask;
>  
>       set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask);
>  
> @@ -1119,15 +1119,11 @@ static int gmc_v8_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       /*
>        * number of VMs
>        * VMID 0 is reserved for System
> -      * amdgpu graphics/compute will use VMIDs 1-7
> -      * amdkfd will use VMIDs 8-15
> +      * amdgpu graphics/compute kernel queues will use VMIDs 1-7
> +      * amdkfd/MES user queues will use VMIDs 8-15
>        */
> -     gfx_vmid_mask = GENMASK(7, 1);
> -
> -     adev->vm_manager.vmid_uq_mask_gfxhub =
> -             GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~gfx_vmid_mask;
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, false);
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, true);
> +     vmid_mask = GENMASK(7, 1);
> +     amdgpu_vmid_mgr_set_vmid_mask(adev, vmid_mask, vmid_mask);
>       amdgpu_vm_manager_init(adev);
>  
>       /* base offset of vram pages */
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> index 7ebf7b1299ff6..3a8dc15ef95b9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -1849,8 +1849,8 @@ static int gmc_v9_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       int r, vram_width = 0, vram_type = 0, vram_vendor = 0, dma_addr_bits;
>       struct amdgpu_device *adev = ip_block->adev;
>       unsigned long inst_mask = adev->aid_mask;
> -     unsigned int first_userq_vmid;
> -     unsigned long gfx_vmid_mask;
> +     unsigned int last_kq_vmid;
> +     unsigned long vmid_mask;
>  
>       adev->gfxhub.funcs->init(adev);
>  
> @@ -2019,8 +2019,8 @@ static int gmc_v9_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>       /*
>        * number of VMs
>        * VMID 0 is reserved for System
> -      * amdgpu graphics/compute will use VMIDs 1..n-1
> -      * amdkfd will use VMIDs n..15
> +      * amdgpu graphics/compute kernel queues will use VMIDs 1..n-1
> +      * amdkfd/MES user queues will use VMIDs n..15
>        *
>        * The first KFD VMID is 8 for GPUs with graphics, 3 for
>        * compute-only GPUs. On compute-only GPUs that leaves 2 VMIDs
> @@ -2032,21 +2032,17 @@ static int gmc_v9_0_sw_init(struct amdgpu_ip_block 
> *ip_block)
>           adev->jpeg.disable_kq &&
>           adev->vcn.disable_kq &&
>           adev->sdma.no_user_submission)
> -             first_userq_vmid = 1;
> +             last_kq_vmid = 0;
>       else
> -             first_userq_vmid =
> +             last_kq_vmid =
>                       (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 
> 4, 1) ||
>                        amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 
> 4, 2) ||
>                        amdgpu_is_multi_aid(adev)) ?
> -                     3 :
> -                     8;
> +                     2 :
> +                     7;
>  
> -     gfx_vmid_mask = GENMASK(first_userq_vmid - 1, 1);
> -
> -     adev->vm_manager.vmid_uq_mask_gfxhub =
> -             GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~gfx_vmid_mask;
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, false);
> -     amdgpu_vmid_mgr_set_vmid_mask(adev, gfx_vmid_mask, true);
> +     vmid_mask = GENMASK(last_kq_vmid, 1);
> +     amdgpu_vmid_mgr_set_vmid_mask(adev, vmid_mask, vmid_mask);
>       amdgpu_vm_manager_init(adev);
>  
>       gmc_v9_0_save_registers(adev);

Reply via email to