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);