On Thu, Jan 22, 2026 at 4:17 AM Jesse.Zhang <[email protected]> wrote:
>
> - Extend amdgpu_mqd_prop with CU mask fields and debug WA flags
> - Implement GFX11 CU mask mapping (WGP mode) and MQD setters for CU 
> mask/priority
> - Integrate setters into gfx_v11_0_compute_mqd_update() to apply runtime 
> changes
>
> Signed-off-by: Jesse Zhang <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h    |  4 ++
>  drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 82 ++++++++++++++++++++++++++
>  2 files changed, 86 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 64e69f0f9a02..246d74205b48 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -809,6 +809,10 @@ struct amdgpu_mqd_prop {
>         uint64_t fence_address;
>         bool tmz_queue;
>         bool kernel_queue;
> +       uint32_t *cu_mask;
> +       uint32_t cu_mask_count;
> +       uint32_t cu_flags;
> +       bool is_user_cu_masked;
>  };
>
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> index a47c91d33846..d807d77c56b9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> @@ -4238,6 +4238,87 @@ static int gfx_v11_0_cp_async_gfx_ring_resume(struct 
> amdgpu_device *adev)
>         return gfx_v11_0_cp_gfx_start(adev);
>  }
>
> +static void gfx_v11_0_mqd_symmetrically_map_cu_mask(struct amdgpu_device 
> *adev,
> +                                                   const uint32_t *cu_mask,
> +                                                   uint32_t cu_mask_count,
> +                                                   uint32_t *se_mask)

This looks generic.  We could probably make this
amdgpu_gfx_mqd_symmetrically_map_cu_mask() and use it for both gfx11
and 12.

Alex

> +{
> +       struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
> +       struct amdgpu_gfx_config *gfx_info = &adev->gfx.config;
> +       uint32_t cu_per_sh[8][4] = {0};
> +       int i, se, sh, cu, cu_bitmap_sh_mul;
> +       int xcc_inst = ffs(adev->gfx.xcc_mask) - 1;
> +       int cu_inc = 2; /* WGP mode */
> +       int num_xcc, inc, inst = 0;
> +       uint32_t en_mask = 3;
> +
> +       if (xcc_inst < 0)
> +               xcc_inst = 0;
> +
> +       num_xcc = hweight16(adev->gfx.xcc_mask);
> +       if (!num_xcc)
> +               num_xcc = 1;
> +
> +       inc = cu_inc * num_xcc;
> +
> +       cu_bitmap_sh_mul = 2;
> +
> +       for (se = 0; se < gfx_info->max_shader_engines; se++)
> +               for (sh = 0; sh < gfx_info->max_sh_per_se; sh++)
> +                       cu_per_sh[se][sh] = hweight32(
> +                               cu_info->bitmap[xcc_inst][se % 4][sh + (se / 
> 4) *
> +                               cu_bitmap_sh_mul]);
> +
> +       for (i = 0; i < gfx_info->max_shader_engines; i++)
> +               se_mask[i] = 0;
> +
> +       i = inst;
> +       for (cu = 0; cu < 16; cu += cu_inc) {
> +               for (sh = 0; sh < gfx_info->max_sh_per_se; sh++) {
> +                       for (se = 0; se < gfx_info->max_shader_engines; se++) 
> {
> +                               if (cu_per_sh[se][sh] > cu) {
> +                                       if ((i / 32) < cu_mask_count && 
> (cu_mask[i / 32] & (1 << (i % 32))))
> +                                               se_mask[se] |= en_mask << (cu 
> + sh * 16);
> +                                       i += inc;
> +                                       if (i >= cu_mask_count * 32)
> +                                               return;
> +                               }
> +                       }
> +               }
> +       }
> +}
> +
> +static void gfx_v11_0_compute_mqd_set_cu_mask(struct amdgpu_device *adev,
> +                                             struct v11_compute_mqd *mqd,
> +                                             struct amdgpu_mqd_prop *prop)
> +{
> +       uint32_t se_mask[8] = {0};
> +       uint32_t wa_mask;
> +       bool has_wa_flag = prop->cu_flags & (AMDGPU_UPDATE_FLAG_DBG_WA_ENABLE 
> |
> +                                         AMDGPU_UPDATE_FLAG_DBG_WA_DISABLE);
> +
> +       if (!has_wa_flag && (!prop->cu_mask || !prop->cu_mask_count))
> +               return;
> +
> +       if (has_wa_flag) {
> +               wa_mask = (prop->cu_flags & AMDGPU_UPDATE_FLAG_DBG_WA_ENABLE) 
> ?
> +                         0xffff : 0xffffffff;
> +               mqd->compute_static_thread_mgmt_se0 = wa_mask;
> +               mqd->compute_static_thread_mgmt_se1 = wa_mask;
> +               mqd->compute_static_thread_mgmt_se2 = wa_mask;
> +               mqd->compute_static_thread_mgmt_se3 = wa_mask;
> +               return;
> +       }
> +
> +       gfx_v11_0_mqd_symmetrically_map_cu_mask(adev, prop->cu_mask,
> +                                               prop->cu_mask_count, se_mask);
> +
> +       mqd->compute_static_thread_mgmt_se0 = se_mask[0];
> +       mqd->compute_static_thread_mgmt_se1 = se_mask[1];
> +       mqd->compute_static_thread_mgmt_se2 = se_mask[2];
> +       mqd->compute_static_thread_mgmt_se3 = se_mask[3];
> +}
> +
>  /**
>   * gfx_v11_0_compute_update_queue - Update runtime-configurable queue 
> parameters
>   * @adev: amdgpu device pointer
> @@ -4278,6 +4359,7 @@ static int gfx_v11_0_compute_mqd_update(struct 
> amdgpu_device *adev, void *m,
>         mqd->cp_hqd_queue_priority = prop->hqd_queue_priority;
>
>         mqd->cp_hqd_active = prop->hqd_active;
> +       gfx_v11_0_compute_mqd_set_cu_mask(adev, mqd, prop);
>
>         return 0;
>  }
> --
> 2.49.0
>

Reply via email to