RE: [PATCH 2/8] drm/amd/pm: refine the checks for sysfs interfaces support

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

 



[AMD Official Use Only - General]



> -----Original Message-----
> From: Lazar, Lijo <Lijo.Lazar@xxxxxxx>
> Sent: Friday, January 6, 2023 6:01 PM
> To: Quan, Evan <Evan.Quan@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx
> Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>
> Subject: Re: [PATCH 2/8] drm/amd/pm: refine the checks for sysfs interfaces
> support
> 
> 
> 
> On 1/6/2023 2:14 PM, Quan, Evan wrote:
> > [AMD Official Use Only - General]
> >
> >
> >
> >> -----Original Message-----
> >> From: Lazar, Lijo <Lijo.Lazar@xxxxxxx>
> >> Sent: Friday, January 6, 2023 11:55 AM
> >> To: Quan, Evan <Evan.Quan@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx
> >> Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>
> >> Subject: Re: [PATCH 2/8] drm/amd/pm: refine the checks for sysfs
> >> interfaces support
> >>
> >>
> >>
> >> On 1/6/2023 7:34 AM, Quan, Evan wrote:
> >>> [AMD Official Use Only - General]
> >>>
> >>>
> >>>
> >>>> -----Original Message-----
> >>>> From: Lazar, Lijo <Lijo.Lazar@xxxxxxx>
> >>>> Sent: Thursday, January 5, 2023 9:58 PM
> >>>> To: Quan, Evan <Evan.Quan@xxxxxxx>; amd-
> gfx@xxxxxxxxxxxxxxxxxxxxx
> >>>> Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>
> >>>> Subject: Re: [PATCH 2/8] drm/amd/pm: refine the checks for sysfs
> >>>> interfaces support
> >>>>
> >>>>
> >>>>
> >>>> On 1/5/2023 8:52 AM, Evan Quan wrote:
> >>>>> Make the code more clean and readable with no real logics change.
> >>>>>
> >>>>> Signed-off-by: Evan Quan <evan.quan@xxxxxxx>
> >>>>> Change-Id: I21c879fa9abad9f6da3b5289adf3124950d2f4eb
> >>>>> ---
> >>>>>     drivers/gpu/drm/amd/pm/amdgpu_pm.c | 200 ++++++++++++++--
> ----
> >> ---
> >>>> ------
> >>>>>     1 file changed, 98 insertions(+), 102 deletions(-)
> >>>>>
> >>>>> diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> >>>>> b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> >>>>> index fb6a7d45693a..c69db29eea24 100644
> >>>>> --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> >>>>> +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> >>>>> @@ -2006,9 +2006,6 @@ static int default_attr_update(struct
> >>>> amdgpu_device *adev, struct amdgpu_device_
> >>>>>     			       uint32_t mask, enum
> amdgpu_device_attr_states
> >>>> *states)
> >>>>>     {
> >>>>>     	struct device_attribute *dev_attr = &attr->dev_attr;
> >>>>> -	uint32_t mp1_ver = adev->ip_versions[MP1_HWIP][0];
> >>>>> -	uint32_t gc_ver = adev->ip_versions[GC_HWIP][0];
> >>>>> -	const char *attr_name = dev_attr->attr.name;
> >>>>>
> >>>>>     	if (!(attr->flags & mask) ||
> >>>>>     	      !(AMD_SYSFS_IF_BITMASK(attr->if_bit) &
> >>>>> adev->pm.sysfs_if_supported))  { @@ -2016,112 +2013,14 @@ static
> >>>>> adev->int
> >>>> default_attr_update(struct amdgpu_device *adev, struct
> >> amdgpu_device_
> >>>>>     		return 0;
> >>>>>     	}
> >>>>>
> >>>>> -#define DEVICE_ATTR_IS(_name)	(!strcmp(attr_name,
> #_name))
> >>>>> -
> >>>>> -	if (DEVICE_ATTR_IS(pp_dpm_socclk)) {
> >>>>> -		if (gc_ver < IP_VERSION(9, 0, 0))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(pp_dpm_dcefclk)) {
> >>>>> -		if (gc_ver < IP_VERSION(9, 0, 0) ||
> >>>>> -		    gc_ver == IP_VERSION(9, 4, 1) ||
> >>>>> -		    gc_ver == IP_VERSION(9, 4, 2))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(pp_dpm_fclk)) {
> >>>>> -		if (mp1_ver < IP_VERSION(10, 0, 0))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(pp_od_clk_voltage)) {
> >>>>> -		*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -		if (amdgpu_dpm_is_overdrive_supported(adev))
> >>>>> -			*states = ATTR_STATE_SUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(mem_busy_percent)) {
> >>>>> -		if (adev->flags & AMD_IS_APU || gc_ver ==
> IP_VERSION(9, 0,
> >>>> 1))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(pcie_bw)) {
> >>>>> -		/* PCIe Perf counters won't work on APU nodes */
> >>>>> -		if (adev->flags & AMD_IS_APU)
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(unique_id)) {
> >>>>> -		switch (gc_ver) {
> >>>>> -		case IP_VERSION(9, 0, 1):
> >>>>> -		case IP_VERSION(9, 4, 0):
> >>>>> -		case IP_VERSION(9, 4, 1):
> >>>>> -		case IP_VERSION(9, 4, 2):
> >>>>> -		case IP_VERSION(10, 3, 0):
> >>>>> -		case IP_VERSION(11, 0, 0):
> >>>>> -			*states = ATTR_STATE_SUPPORTED;
> >>>>> -			break;
> >>>>> -		default:
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -		}
> >>>>> -	} else if (DEVICE_ATTR_IS(pp_features)) {
> >>>>> -		if (adev->flags & AMD_IS_APU || gc_ver <
> IP_VERSION(9, 0,
> >>>> 0))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(gpu_metrics)) {
> >>>>> -		if (gc_ver < IP_VERSION(9, 1, 0))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(pp_dpm_vclk)) {
> >>>>> -		if (!(gc_ver == IP_VERSION(10, 3, 1) ||
> >>>>> -		      gc_ver == IP_VERSION(10, 3, 0) ||
> >>>>> -		      gc_ver == IP_VERSION(10, 1, 2) ||
> >>>>> -		      gc_ver == IP_VERSION(11, 0, 0) ||
> >>>>> -		      gc_ver == IP_VERSION(11, 0, 2)))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(pp_dpm_dclk)) {
> >>>>> -		if (!(gc_ver == IP_VERSION(10, 3, 1) ||
> >>>>> -		      gc_ver == IP_VERSION(10, 3, 0) ||
> >>>>> -		      gc_ver == IP_VERSION(10, 1, 2) ||
> >>>>> -		      gc_ver == IP_VERSION(11, 0, 0) ||
> >>>>> -		      gc_ver == IP_VERSION(11, 0, 2)))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	} else if (DEVICE_ATTR_IS(pp_power_profile_mode)) {
> >>>>> -		if (amdgpu_dpm_get_power_profile_mode(adev,
> NULL) ==
> >>>> -EOPNOTSUPP)
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -		else if (gc_ver == IP_VERSION(10, 3, 0) &&
> >>>> amdgpu_sriov_vf(adev))
> >>>>> -			*states = ATTR_STATE_UNSUPPORTED;
> >>>>> -	}
> >>>>> -
> >>>>> -	switch (gc_ver) {
> >>>>> -	case IP_VERSION(9, 4, 1):
> >>>>> -	case IP_VERSION(9, 4, 2):
> >>>>> -		/* the Mi series card does not support standalone
> >>>> mclk/socclk/fclk level setting */
> >>>>> -		if (DEVICE_ATTR_IS(pp_dpm_mclk) ||
> >>>>> -		    DEVICE_ATTR_IS(pp_dpm_socclk) ||
> >>>>> -		    DEVICE_ATTR_IS(pp_dpm_fclk)) {
> >>>>> -			dev_attr->attr.mode &= ~S_IWUGO;
> >>>>> -			dev_attr->store = NULL;
> >>>>> -		}
> >>>>> -		break;
> >>>>> -	case IP_VERSION(10, 3, 0):
> >>>>> -		if
> (DEVICE_ATTR_IS(power_dpm_force_performance_level)
> >>>> &&
> >>>>> -		    amdgpu_sriov_vf(adev)) {
> >>>>> -			dev_attr->attr.mode &= ~0222;
> >>>>> -			dev_attr->store = NULL;
> >>>>> -		}
> >>>>> -		break;
> >>>>> -	default:
> >>>>> -		break;
> >>>>> -	}
> >>>>> -
> >>>>> -	if (DEVICE_ATTR_IS(pp_dpm_dcefclk)) {
> >>>>> -		/* SMU MP1 does not support dcefclk level setting */
> >>>>> -		if (gc_ver >= IP_VERSION(10, 0, 0)) {
> >>>>> -			dev_attr->attr.mode &= ~S_IWUGO;
> >>>>> -			dev_attr->store = NULL;
> >>>>> -		}
> >>>>> -	}
> >>>>> -
> >>>>> -	/* setting should not be allowed from VF if not in one VF
> mode */
> >>>>> -	if (amdgpu_sriov_vf(adev)
> && !amdgpu_sriov_is_pp_one_vf(adev))
> >>>> {
> >>>>> +	if (!(adev->pm.sysfs_if_attr_mode[attr->if_bit] & S_IWUGO))
> {
> >>>>>     		dev_attr->attr.mode &= ~S_IWUGO;
> >>>>>     		dev_attr->store = NULL;
> >>>>>     	}
> >>>>>
> >>>>> -#undef DEVICE_ATTR_IS
> >>>>> -
> >>>>>     	return 0;
> >>>>>     }
> >>>>>
> >>>>> -
> >>>>>     static int amdgpu_device_attr_create(struct amdgpu_device *adev,
> >>>>>     				     struct amdgpu_device_attr *attr,
> >>>>>     				     uint32_t mask, struct list_head
> *attr_list)
> >>>> @@ -3411,6
> >>>>> +3310,101 @@ static const struct attribute_group *hwmon_groups[]
> =
> >>>>> +{
> >>>>>     	NULL
> >>>>>     };
> >>>>>
> >>>>> +static void amdgpu_sysfs_if_support_check(struct amdgpu_device
> >>>>> +*adev) {
> >>>>> +	uint64_t *sysfs_if_supported = &adev-
> >pm.sysfs_if_supported;
> >>>>> +	umode_t *sysfs_if_attr_mode = adev-
> >pm.sysfs_if_attr_mode;
> >>>>> +	uint32_t mp1_ver = adev->ip_versions[MP1_HWIP][0];
> >>>>> +	uint32_t gc_ver = adev->ip_versions[GC_HWIP][0];
> >>>>> +	int i;
> >>>>> +
> >>>>> +	/* All but those specific ASICs support these */
> >>>>> +	*sysfs_if_supported &=
> ~BIT_ULL(AMD_SYSFS_IF_UNIQUE_ID_BIT);
> >>>>> +	*sysfs_if_supported &=
> >>>> ~(BIT_ULL(AMD_SYSFS_IF_PP_DPM_VCLK_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_DCLK_BIT));
> >>>>> +
> >>>>> +	if (gc_ver < IP_VERSION(9, 1, 0)) {
> >>>>> +		*sysfs_if_supported &=
> >>>> ~BIT_ULL(AMD_SYSFS_IF_GPU_METRICS_BIT);
> >>>>> +
> >>>>> +		if (gc_ver == IP_VERSION(9, 0, 1)) {
> >>>>> +			*sysfs_if_supported &=
> >>>> ~BIT_ULL(AMD_SYSFS_IF_MEM_BUSY_PERCENT_BIT);
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_UNIQUE_ID_BIT);
> >>>>> +		}
> >>>>> +
> >>>>> +		if (gc_ver < IP_VERSION(9, 0, 0))
> >>>>> +			*sysfs_if_supported &=
> >>>> ~(BIT_ULL(AMD_SYSFS_IF_PP_DPM_SOCCLK_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_DCEFCLK_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_FEATURES_BIT));
> >>>>> +	} else {
> >>>>> +		switch (gc_ver) {
> >>>>> +		case IP_VERSION(9, 4, 0):
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_UNIQUE_ID_BIT);
> >>>>> +			break;
> >>>>> +		case IP_VERSION(9, 4, 1):
> >>>>> +		case IP_VERSION(9, 4, 2):
> >>>>> +			*sysfs_if_supported &=
> >>>> ~BIT_ULL(AMD_SYSFS_IF_PP_DPM_DCEFCLK_BIT);
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_UNIQUE_ID_BIT);
> >>>>> +			/* the Mi series card does not support
> standalone
> >>>> mclk/socclk/fclk level setting */
> >>>>> +
> >>>> 	sysfs_if_attr_mode[AMD_SYSFS_IF_PP_DPM_MCLK_BIT] &=
> >> ~S_IWUGO;
> >>>>> +
> >>>> 	sysfs_if_attr_mode[AMD_SYSFS_IF_PP_DPM_SOCCLK_BIT] &=
> >> ~S_IWUGO;
> >>>>> +
> >>>> 	sysfs_if_attr_mode[AMD_SYSFS_IF_PP_DPM_FCLK_BIT] &=
> >> ~S_IWUGO;
> >>>>> +			break;
> >>>>> +		case IP_VERSION(10, 1, 2):
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_VCLK_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_DCLK_BIT);
> >>>>> +			break;
> >>>>> +		case IP_VERSION(10, 3, 0):
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_UNIQUE_ID_BIT);
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_VCLK_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_DCLK_BIT);
> >>>>> +			if (amdgpu_sriov_vf(adev)) {
> >>>>> +				*sysfs_if_supported &=
> >>>> ~BIT_ULL(AMD_SYSFS_IF_PP_POWER_PROFILE_MODE_BIT);
> >>>>> +
> >>>> 	sysfs_if_attr_mode[AMD_SYSFS_IF_POWER_DPM_FORCE_PERFOR
> >>>> MANCE_LEVEL_BIT] &= ~S_IWUGO;
> >>>>> +			}
> >>>>> +			break;
> >>>>> +		case IP_VERSION(10, 3, 1):
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_VCLK_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_DCLK_BIT);
> >>>>> +			break;
> >>>>> +		case IP_VERSION(11, 0, 0):
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_UNIQUE_ID_BIT);
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_VCLK_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_DCLK_BIT);
> >>>>> +			break;
> >>>>> +		case IP_VERSION(11, 0, 2):
> >>>>> +			*sysfs_if_supported |=
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_VCLK_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_DPM_DCLK_BIT);
> >>>>> +			break;
> >>>>> +		default:
> >>>>> +			break;
> >>>>> +		}
> >>>>> +	}
> >>>>> +
> >>>>> +	if (mp1_ver < IP_VERSION(10, 0, 0))
> >>>>> +		*sysfs_if_supported &=
> >>>> ~BIT_ULL(AMD_SYSFS_IF_PP_DPM_FCLK_BIT);
> >>>>> +
> >>>>
> >>>> With this change, the IP version based checks need to be moved to
> >>>> respective smu_v* checks so that each IP version decides what is
> >>>> supported at which level (R/W) rather than consolidating it here.
> >>>> Only generic checks like amdgpu_sriov_is_pp_one_vf may be
> >>>> maintained
> >> here.
> >>>> That way it really helps.
> >>> [Quan, Evan] For some of them, they could be moved to respective
> >> smu_v* or gfx_v* checks.
> >>> But for some of them, it will be difficult. For example, for
> >>> "mp1_ver <
> >> IP_VERSION(10, 0, 0)" or " gc_ver >= IP_VERSION(10, 0, 0)", you need
> >> to figure out which asics it refers to first and then apply the same
> >> change to every of them. That seems more error prone.
> >>> So, my thought is just left these old chunks as they were. And we
> >>> just need
> >> to take care of the future/new asics. How do you think?
> >>>
> >> My preference is to clean up this as much as possible. Also, you may
> >> be able to set some of them generically based on FEAT_DPM bits in
> >> swsmu/powerplay.
> > I see. But I would expect the future ASICs take the way used in
> patch3(more straightforward instead of implicit checking for some APIs or
> DPM features).
> > That's also the reason why I do not want to cleanup those old chunks. As I
> do not expect them to serve for future ASICs.
> > Then it's not worth to take the efforts(and risk) to do the cleanup.
> Thoughts?
> >
> 
> It's to make sure consistency. I don't think leaving two options to do the
> same thing is a good idea. Otherwise older will continue and cause confusion.
> Changing to newer one for all is the preferred method and handling common
> things in smu_common/powerplay is better rather than having to do
> everything in individual versions.
Those old bunches left in amdgpu_sysfs_if_support_check() can be divided into three types:
1. those which check for the existence for some API(like amdgpu_dpm_is_overdrive_supported/ amdgpu_dpm_get_power_profile_mode). The better choice for them is still left in amdgpu_pm.c I believe.
2. those which check for some common flags(like sriov or apu). The better choice for them is also left in amdgpu_pm.c
3. those which check for gc ip version or smu ip version. A better choice for them might be to move to amdgpu_discovery.c I think. But as mentioned before, I do not think it's worth to take the efforts(and risk) to do so.
So, as you can see, I do not think there is anything we can move to smu_common/powerplay part.
But if you were talking about splitting some changes in patch3 into smu_common/powerplay part, that will be a different story.

BR
Evan
> 
> Thanks,
> Lijo
> 
> > BR
> > Evan
> >>
> >> Thanks,
> >> Lijo
> >>
> >>> Evan
> >>>>
> >>>> Thanks,
> >>>> Lijo
> >>>>
> >>>>> +	if (adev->flags & AMD_IS_APU)
> >>>>> +		*sysfs_if_supported &=
> >>>> ~(BIT_ULL(AMD_SYSFS_IF_MEM_BUSY_PERCENT_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PCIE_BW_BIT) |
> >>>>> +
> >>>> BIT_ULL(AMD_SYSFS_IF_PP_FEATURES_BIT));
> >>>>> +
> >>>>> +	if (!amdgpu_dpm_is_overdrive_supported(adev))
> >>>>> +		*sysfs_if_supported &=
> >>>>> +~BIT_ULL(AMD_SYSFS_IF_PP_OD_CLK_VOLTAGE_BIT);
> >>>>> +
> >>>>> +	if (amdgpu_dpm_get_power_profile_mode(adev, NULL) ==
> -
> >>>> EOPNOTSUPP)
> >>>>> +		*sysfs_if_supported &=
> >>>>> +~BIT_ULL(AMD_SYSFS_IF_PP_POWER_PROFILE_MODE_BIT);
> >>>>> +
> >>>>> +	if (gc_ver >= IP_VERSION(10, 0, 0))
> >>>>> +
> 	sysfs_if_attr_mode[AMD_SYSFS_IF_PP_DPM_DCEFCLK_BIT]
> >>>> &= ~S_IWUGO;
> >>>>> +
> >>>>> +	/* setting should not be allowed from VF if not in one VF
> mode */
> >>>>> +	if (amdgpu_sriov_vf(adev) &&
> >>>>> +	    !amdgpu_sriov_is_pp_one_vf(adev)) {
> >>>>> +		for (i = 0; i <
> >>>> AMD_MAX_NUMBER_OF_SYSFS_IF_SUPPORTED; i++)
> >>>>> +			sysfs_if_attr_mode[i] &= ~S_IWUGO;
> >>>>> +	}
> >>>>> +}
> >>>>> +
> >>>>>     int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)
> >>>>>     {
> >>>>>     	int ret;
> >>>>> @@ -3424,6 +3418,8 @@ int amdgpu_pm_sysfs_init(struct
> >> amdgpu_device
> >>>> *adev)
> >>>>>     	if (adev->pm.dpm_enabled == 0)
> >>>>>     		return 0;
> >>>>>
> >>>>> +	amdgpu_sysfs_if_support_check(adev);
> >>>>> +
> >>>>>     	adev->pm.int_hwmon_dev =
> >>>> hwmon_device_register_with_groups(adev->dev,
> >>>>>
> >>>> DRIVER_NAME, adev,
> >>>>>
> >>>> hwmon_groups);




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

  Powered by Linux