@@ -2278,6 +2278,131 @@ static ssize_t amdgpu_set_xgmi_plpd_policy(struct device *dev,
22782278 return count ;
22792279}
22802280
2281+ /* pm policy attributes */
2282+ struct amdgpu_pm_policy_attr {
2283+ struct device_attribute dev_attr ;
2284+ enum pp_pm_policy id ;
2285+ };
2286+
2287+ static ssize_t amdgpu_get_pm_policy_attr (struct device * dev ,
2288+ struct device_attribute * attr ,
2289+ char * buf )
2290+ {
2291+ struct drm_device * ddev = dev_get_drvdata (dev );
2292+ struct amdgpu_device * adev = drm_to_adev (ddev );
2293+ struct amdgpu_pm_policy_attr * policy_attr ;
2294+
2295+ policy_attr =
2296+ container_of (attr , struct amdgpu_pm_policy_attr , dev_attr );
2297+
2298+ if (amdgpu_in_reset (adev ))
2299+ return - EPERM ;
2300+ if (adev -> in_suspend && !adev -> in_runpm )
2301+ return - EPERM ;
2302+
2303+ return amdgpu_dpm_get_pm_policy_info (adev , policy_attr -> id , buf );
2304+ }
2305+
2306+ static ssize_t amdgpu_set_pm_policy_attr (struct device * dev ,
2307+ struct device_attribute * attr ,
2308+ const char * buf , size_t count )
2309+ {
2310+ struct drm_device * ddev = dev_get_drvdata (dev );
2311+ struct amdgpu_device * adev = drm_to_adev (ddev );
2312+ struct amdgpu_pm_policy_attr * policy_attr ;
2313+ int ret , num_params = 0 ;
2314+ char delimiter [] = " \n\t" ;
2315+ char tmp_buf [128 ];
2316+ char * tmp , * param ;
2317+ long val ;
2318+
2319+ if (amdgpu_in_reset (adev ))
2320+ return - EPERM ;
2321+ if (adev -> in_suspend && !adev -> in_runpm )
2322+ return - EPERM ;
2323+
2324+ count = min (count , sizeof (tmp_buf ));
2325+ memcpy (tmp_buf , buf , count );
2326+ tmp_buf [count - 1 ] = '\0' ;
2327+ tmp = tmp_buf ;
2328+
2329+ tmp = skip_spaces (tmp );
2330+ while ((param = strsep (& tmp , delimiter ))) {
2331+ if (!strlen (param )) {
2332+ tmp = skip_spaces (tmp );
2333+ continue ;
2334+ }
2335+ ret = kstrtol (param , 0 , & val );
2336+ if (ret )
2337+ return - EINVAL ;
2338+ num_params ++ ;
2339+ if (num_params > 1 )
2340+ return - EINVAL ;
2341+ }
2342+
2343+ if (num_params != 1 )
2344+ return - EINVAL ;
2345+
2346+ policy_attr =
2347+ container_of (attr , struct amdgpu_pm_policy_attr , dev_attr );
2348+
2349+ ret = pm_runtime_get_sync (ddev -> dev );
2350+ if (ret < 0 ) {
2351+ pm_runtime_put_autosuspend (ddev -> dev );
2352+ return ret ;
2353+ }
2354+
2355+ ret = amdgpu_dpm_set_pm_policy (adev , policy_attr -> id , val );
2356+
2357+ pm_runtime_mark_last_busy (ddev -> dev );
2358+ pm_runtime_put_autosuspend (ddev -> dev );
2359+
2360+ if (ret )
2361+ return ret ;
2362+
2363+ return count ;
2364+ }
2365+
2366+ #define AMDGPU_PM_POLICY_ATTR (_name , _id ) \
2367+ static struct amdgpu_pm_policy_attr pm_policy_attr_##_name = { \
2368+ .dev_attr = __ATTR(_name, 0644, amdgpu_get_pm_policy_attr, \
2369+ amdgpu_set_pm_policy_attr), \
2370+ .id = PP_PM_POLICY_##_id, \
2371+ };
2372+
2373+ #define AMDGPU_PM_POLICY_ATTR_VAR (_name ) pm_policy_attr_##_name.dev_attr.attr
2374+
2375+ AMDGPU_PM_POLICY_ATTR (soc_pstate , SOC_PSTATE )
2376+
2377+ static struct attribute * pm_policy_attrs [] = {
2378+ & AMDGPU_PM_POLICY_ATTR_VAR (soc_pstate ),
2379+ NULL
2380+ };
2381+
2382+ static umode_t amdgpu_pm_policy_attr_visible (struct kobject * kobj ,
2383+ struct attribute * attr , int n )
2384+ {
2385+ struct device * dev = kobj_to_dev (kobj );
2386+ struct drm_device * ddev = dev_get_drvdata (dev );
2387+ struct amdgpu_device * adev = drm_to_adev (ddev );
2388+ struct amdgpu_pm_policy_attr * policy_attr ;
2389+
2390+ policy_attr =
2391+ container_of (attr , struct amdgpu_pm_policy_attr , dev_attr .attr );
2392+
2393+ if (amdgpu_dpm_get_pm_policy_info (adev , policy_attr -> id , NULL ) ==
2394+ - ENOENT )
2395+ return 0 ;
2396+
2397+ return attr -> mode ;
2398+ }
2399+
2400+ const struct attribute_group amdgpu_pm_policy_attr_group = {
2401+ .name = "pm_policy" ,
2402+ .attrs = pm_policy_attrs ,
2403+ .is_visible = amdgpu_pm_policy_attr_visible ,
2404+ };
2405+
22812406static struct amdgpu_device_attr amdgpu_device_attrs [] = {
22822407 AMDGPU_DEVICE_ATTR_RW (power_dpm_state , ATTR_FLAG_BASIC |ATTR_FLAG_ONEVF ),
22832408 AMDGPU_DEVICE_ATTR_RW (power_dpm_force_performance_level , ATTR_FLAG_BASIC |ATTR_FLAG_ONEVF ),
@@ -4419,6 +4544,14 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)
44194544 dev_info (adev -> dev , "overdrive feature is not supported\n" );
44204545 }
44214546
4547+ if (amdgpu_dpm_get_pm_policy_info (adev , PP_PM_POLICY_NONE , NULL ) !=
4548+ - EOPNOTSUPP ) {
4549+ ret = devm_device_add_group (adev -> dev ,
4550+ & amdgpu_pm_policy_attr_group );
4551+ if (ret )
4552+ goto err_out0 ;
4553+ }
4554+
44224555 adev -> pm .sysfs_initialized = true;
44234556
44244557 return 0 ;
0 commit comments