Re: [PATCH v2] drm/amdgpu: set CP_HQD_PQ_DOORBELL_CONTROL.DOORBELL_MODE to 1 for sriov multiple vf.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2/6/2025 3:11 PM, Emily Deng wrote:
> In sriov multiple vf, Set CP_HQD_PQ_DOORBELL_CONTROL.DOORBELL_MODE to 1 to read WPTR from MQD.
> 
> v2: Add amdgpu_sriov_multi_vf_mode
> Signed-off-by: Emily Deng <Emily.Deng@xxxxxxx>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |  2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h      |  2 ++
>  drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c       |  2 +-
>  .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c   | 23 +++++++++++++++++--
>  drivers/gpu/drm/amd/pm/amdgpu_pm.c            |  4 ++--
>  drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c     |  8 +++----
>  6 files changed, 31 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> index 49ca8c814455..a1450f13d963 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> @@ -1990,7 +1990,7 @@ static int amdgpu_debugfs_sclk_set(void *data, u64 val)
>  	uint32_t max_freq, min_freq;
>  	struct amdgpu_device *adev = (struct amdgpu_device *)data;
>  
> -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))
> +	if (amdgpu_sriov_multi_vf_mode(adev))
>  		return -EINVAL;
>  
>  	ret = pm_runtime_get_sync(adev_to_drm(adev)->dev);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> index 5381b8d596e6..b28082084b3a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> @@ -352,6 +352,8 @@ static inline bool is_virtual_machine(void)
>  
>  #define amdgpu_sriov_is_pp_one_vf(adev) \
>  	((adev)->virt.gim_feature & AMDGIM_FEATURE_PP_ONE_VF)
> +#define amdgpu_sriov_multi_vf_mode(adev) \
> +	(amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))
>  #define amdgpu_sriov_is_debug(adev) \
>  	((!amdgpu_in_reset(adev)) && adev->virt.tdr_debug)
>  #define amdgpu_sriov_is_normal(adev) \
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
> index 2ba185875baa..42251f2b9741 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
> @@ -1857,7 +1857,7 @@ static int gfx_v9_4_3_xcc_mqd_init(struct amdgpu_ring *ring, int xcc_id)
>  				    DOORBELL_SOURCE, 0);
>  		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
>  				    DOORBELL_HIT, 0);
> -		if (amdgpu_sriov_vf(adev))
> +		if (amdgpu_sriov_multi_vf_mode(adev))
>  			tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
>  					    DOORBELL_MODE, 1);
>  	} else {
> 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 ff417d5361c4..9e08bcfa37d3 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> @@ -551,7 +551,7 @@ static void init_mqd_hiq_v9_4_3(struct mqd_manager *mm, void **mqd,
>  		m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK |
>  					1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT |
>  					1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT;
> -		if (amdgpu_sriov_vf(mm->dev->adev))
> +		if (amdgpu_sriov_multi_vf_mode(mm->dev->adev))
>  			m->cp_hqd_pq_doorbell_control |= 1 <<
>  				CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT;
>  		m->cp_mqd_stride_size = kfd_hiq_mqd_stride(mm->dev);
> @@ -724,6 +724,9 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
>  		m = get_mqd(mqd + size * xcc);
>  		update_mqd(mm, m, q, minfo);
>  
> +		if (amdgpu_sriov_multi_vf_mode(mm->dev->adev))
> +				m->cp_hqd_pq_doorbell_control |= 1 <<
> +					CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT;
>  		update_cu_mask(mm, m, minfo, xcc);
>  
>  		if (q->format == KFD_QUEUE_FORMAT_AQL) {
> @@ -746,6 +749,21 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
>  	}
>  }
>  
> +static void restore_mqd_v9_4_3(struct mqd_manager *mm, void **mqd,
> +			struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
> +			struct queue_properties *qp,
> +			const void *mqd_src,
> +			const void *ctl_stack_src, u32 ctl_stack_size)
> +{
> +	restore_mqd(mm, mqd, mqd_mem_obj, gart_addr, qp, mqd_src, ctl_stack_src, ctl_stack_size);
> +	if (amdgpu_sriov_multi_vf_mode(mm->dev->adev)) {
> +		struct v9_mqd *m;
> +
> +		m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr;
> +		m->cp_hqd_pq_doorbell_control |= 1 <<
> +				CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT;
> +	}
> +}
>  static int destroy_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
>  		   enum kfd_preempt_type type, unsigned int timeout,
>  		   uint32_t pipe_id, uint32_t queue_id)
> @@ -880,7 +898,6 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
>  		mqd->is_occupied = kfd_is_occupied_cp;
>  		mqd->get_checkpoint_info = get_checkpoint_info;
>  		mqd->checkpoint_mqd = checkpoint_mqd;
> -		mqd->restore_mqd = restore_mqd;
>  		mqd->mqd_size = sizeof(struct v9_mqd);
>  		mqd->mqd_stride = mqd_stride_v9;
>  #if defined(CONFIG_DEBUG_FS)
> @@ -892,12 +909,14 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
>  			mqd->init_mqd = init_mqd_v9_4_3;
>  			mqd->load_mqd = load_mqd_v9_4_3;
>  			mqd->update_mqd = update_mqd_v9_4_3;
> +			mqd->restore_mqd = restore_mqd_v9_4_3;
>  			mqd->destroy_mqd = destroy_mqd_v9_4_3;
>  			mqd->get_wave_state = get_wave_state_v9_4_3;
>  		} else {
>  			mqd->init_mqd = init_mqd;
>  			mqd->load_mqd = load_mqd;
>  			mqd->update_mqd = update_mqd;
> +			mqd->restore_mqd = restore_mqd;
>  			mqd->destroy_mqd = kfd_destroy_mqd_cp;
>  			mqd->get_wave_state = get_wave_state;
>  		}

Better to keep below replacements + addition of new API as a separate
patch (1/2). In 2/2, you may take care of MQD related changes.

Thanks,
Lijo

> diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> index e8ae7681bf0a..9d8119d91f1f 100644
> --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> @@ -2009,7 +2009,7 @@ static int pp_od_clk_voltage_attr_update(struct amdgpu_device *adev, struct amdg
>  	/* Enable pp_od_clk_voltage node for gc 9.4.3 SRIOV/BM support */
>  	if (gc_ver == IP_VERSION(9, 4, 3) ||
>  	    gc_ver == IP_VERSION(9, 4, 4)) {
> -		if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))
> +		if (amdgpu_sriov_multi_vf_mode(adev))
>  			*states = ATTR_STATE_UNSUPPORTED;
>  		return 0;
>  	}
> @@ -2044,7 +2044,7 @@ static int pp_dpm_dcefclk_attr_update(struct amdgpu_device *adev, struct amdgpu_
>  	 * setting should not be allowed from VF if not in one VF mode.
>  	 */
>  	if (gc_ver >= IP_VERSION(10, 0, 0) ||
> -	    (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))) {
> +	    (amdgpu_sriov_multi_vf_mode(adev))) {
>  		dev_attr->attr.mode &= ~S_IWUGO;
>  		dev_attr->store = NULL;
>  	}
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> index 8ca793c222ff..b4bdad79221e 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> @@ -1825,7 +1825,7 @@ static int smu_hw_init(struct amdgpu_ip_block *ip_block)
>  	struct amdgpu_device *adev = ip_block->adev;
>  	struct smu_context *smu = adev->powerplay.pp_handle;
>  
> -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) {
> +	if (amdgpu_sriov_multi_vf_mode(adev)) {
>  		smu->pm_enabled = false;
>  		return 0;
>  	}
> @@ -2048,7 +2048,7 @@ static int smu_hw_fini(struct amdgpu_ip_block *ip_block)
>  	struct smu_context *smu = adev->powerplay.pp_handle;
>  	int i, ret;
>  
> -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))
> +	if (amdgpu_sriov_multi_vf_mode(adev))
>  		return 0;
>  
>  	for (i = 0; i < adev->vcn.num_vcn_inst; i++)
> @@ -2116,7 +2116,7 @@ static int smu_suspend(struct amdgpu_ip_block *ip_block)
>  	int ret;
>  	uint64_t count;
>  
> -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))
> +	if (amdgpu_sriov_multi_vf_mode(adev))
>  		return 0;
>  
>  	if (!smu->pm_enabled)
> @@ -2152,7 +2152,7 @@ static int smu_resume(struct amdgpu_ip_block *ip_block)
>  	struct amdgpu_device *adev = ip_block->adev;
>  	struct smu_context *smu = adev->powerplay.pp_handle;
>  
> -	if (amdgpu_sriov_vf(adev)&& !amdgpu_sriov_is_pp_one_vf(adev))
> +	if (amdgpu_sriov_multi_vf_mode(adev))
>  		return 0;
>  
>  	if (!smu->pm_enabled)




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux