[PATCH] [SCHEME 2]powernv/cpuidle: Add support for new idle state device-tree format

kbuild test robot lkp at intel.com
Sat Jun 2 02:39:02 AEST 2018


Hi Akshay,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.17-rc7 next-20180531]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Akshay-Adiga/powernv-cpuidle-Add-support-for-new-idle-state-device-tree-format/20180601-202708
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-allmodconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All errors (new ones prefixed by >>):

   drivers//cpuidle/cpuidle-powernv.c: In function 'powernv_add_idle_states':
>> drivers//cpuidle/cpuidle-powernv.c:403:36: error: 'versions' undeclared (first use in this function)
        "ibm,cpu-idle-state-versions", versions, additional_states) < 0) {
                                       ^~~~~~~~
   drivers//cpuidle/cpuidle-powernv.c:403:36: note: each undeclared identifier is reported only once for each function it appears in
>> drivers//cpuidle/cpuidle-powernv.c:436:17: error: 'version' undeclared (first use in this function); did you mean 'versions'?
      if (!( strcmp(version[i] , "ibm,idle-state-v1"))
                    ^~~~~~~
                    versions
>> drivers//cpuidle/cpuidle-powernv.c:437:5: error: expected ')' before 'continue'
        continue;
        ^~~~~~~~
>> drivers//cpuidle/cpuidle-powernv.c:511:2: error: expected expression before '}' token
     }
     ^
   drivers//cpuidle/cpuidle-powernv.c:426:8: warning: unused variable 'stops_timebase' [-Wunused-variable]
      bool stops_timebase = false;
           ^~~~~~~~~~~~~~
   drivers//cpuidle/cpuidle-powernv.c:425:30: warning: unused variable 'target_residency' [-Wunused-variable]
      unsigned int exit_latency, target_residency;
                                 ^~~~~~~~~~~~~~~~
   drivers//cpuidle/cpuidle-powernv.c:425:16: warning: unused variable 'exit_latency' [-Wunused-variable]
      unsigned int exit_latency, target_residency;
                   ^~~~~~~~~~~~
   At top level:
   drivers//cpuidle/cpuidle-powernv.c:121:12: warning: 'stop_loop' defined but not used [-Wunused-function]
    static int stop_loop(struct cpuidle_device *dev,
               ^~~~~~~~~
   drivers//cpuidle/cpuidle-powernv.c:95:12: warning: 'fastsleep_loop' defined but not used [-Wunused-function]
    static int fastsleep_loop(struct cpuidle_device *dev,
               ^~~~~~~~~~~~~~
   drivers//cpuidle/cpuidle-powernv.c:84:12: warning: 'nap_loop' defined but not used [-Wunused-function]
    static int nap_loop(struct cpuidle_device *dev,
               ^~~~~~~~

vim +/versions +403 drivers//cpuidle/cpuidle-powernv.c

   240	
   241	extern u32 pnv_get_supported_cpuidle_states(void);
   242	static int powernv_add_idle_states(void)
   243	{
   244		struct device_node *power_mgt,*np_new;
   245		int nr_idle_states = 1; /* Snooze */
   246		int dt_idle_states, count, additional_states;
   247		u32 latency_ns[CPUIDLE_STATE_MAX];
   248		u32 residency_ns[CPUIDLE_STATE_MAX];
   249		u32 flags[CPUIDLE_STATE_MAX];
   250		u64 psscr_val[CPUIDLE_STATE_MAX];
   251		u64 psscr_mask[CPUIDLE_STATE_MAX];
   252		const char *names[CPUIDLE_STATE_MAX];
   253		u32 has_stop_states = 0;
   254		int i, rc;
   255		u32 supported_flags = pnv_get_supported_cpuidle_states();
   256	
   257	
   258		/* Currently we have snooze statically defined */
   259	
   260		power_mgt = of_find_node_by_path("/ibm,opal/power-mgt");
   261		if (!power_mgt) {
   262			pr_warn("opal: PowerMgmt Node not found\n");
   263			goto out;
   264		}
   265	
   266		/* Read values of any property to determine the num of idle states */
   267		dt_idle_states = of_property_count_u32_elems(power_mgt, "ibm,cpu-idle-state-flags");
   268		if (dt_idle_states < 0) {
   269			pr_warn("cpuidle-powernv: no idle states found in the DT\n");
   270			goto out;
   271		}
   272	
   273		count = of_property_count_u32_elems(power_mgt,
   274						    "ibm,cpu-idle-state-latencies-ns");
   275	
   276		if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags", dt_idle_states,
   277					   "ibm,cpu-idle-state-latencies-ns",
   278					   count) != 0)
   279			goto out;
   280	
   281		count = of_property_count_strings(power_mgt,
   282						  "ibm,cpu-idle-state-names");
   283		if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags", dt_idle_states,
   284					   "ibm,cpu-idle-state-names",
   285					   count) != 0)
   286			goto out;
   287	
   288		/*
   289		 * Since snooze is used as first idle state, max idle states allowed is
   290		 * CPUIDLE_STATE_MAX -1
   291		 */
   292		if (dt_idle_states > CPUIDLE_STATE_MAX - 1) {
   293			pr_warn("cpuidle-powernv: discovered idle states more than allowed");
   294			dt_idle_states = CPUIDLE_STATE_MAX - 1;
   295		}
   296	
   297		if (of_property_read_u32_array(power_mgt,
   298				"ibm,cpu-idle-state-flags", flags, dt_idle_states)) {
   299			pr_warn("cpuidle-powernv : missing ibm,cpu-idle-state-flags in DT\n");
   300			goto out;
   301		}
   302	
   303		if (of_property_read_u32_array(power_mgt,
   304			"ibm,cpu-idle-state-latencies-ns", latency_ns,
   305			dt_idle_states)) {
   306			pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-latencies-ns in DT\n");
   307			goto out;
   308		}
   309		if (of_property_read_string_array(power_mgt,
   310			"ibm,cpu-idle-state-names", names, dt_idle_states) < 0) {
   311			pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-names in DT\n");
   312			goto out;
   313		}
   314	
   315		/*
   316		 * If the idle states use stop instruction, probe for psscr values
   317		 * and psscr mask which are necessary to specify required stop level.
   318		 */
   319		has_stop_states = (flags[0] &
   320				   (OPAL_PM_STOP_INST_FAST | OPAL_PM_STOP_INST_DEEP));
   321		if (has_stop_states) {
   322			count = of_property_count_u64_elems(power_mgt,
   323							    "ibm,cpu-idle-state-psscr");
   324			if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags",
   325						   dt_idle_states,
   326						   "ibm,cpu-idle-state-psscr",
   327						   count) != 0)
   328				goto out;
   329	
   330			count = of_property_count_u64_elems(power_mgt,
   331							    "ibm,cpu-idle-state-psscr-mask");
   332			if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags",
   333						   dt_idle_states,
   334						   "ibm,cpu-idle-state-psscr-mask",
   335						   count) != 0)
   336				goto out;
   337	
   338			if (of_property_read_u64_array(power_mgt,
   339			    "ibm,cpu-idle-state-psscr", psscr_val, dt_idle_states)) {
   340				pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-psscr in DT\n");
   341				goto out;
   342			}
   343	
   344			if (of_property_read_u64_array(power_mgt,
   345						       "ibm,cpu-idle-state-psscr-mask",
   346							psscr_mask, dt_idle_states)) {
   347				pr_warn("cpuidle-powernv:Missing ibm,cpu-idle-state-psscr-mask in DT\n");
   348				goto out;
   349			}
   350		}
   351	
   352		count = of_property_count_u32_elems(power_mgt,
   353						    "ibm,cpu-idle-state-residency-ns");
   354	
   355		if (count < 0) {
   356			rc = count;
   357		} else if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags",
   358						  dt_idle_states,
   359						  "ibm,cpu-idle-state-residency-ns",
   360						  count) != 0) {
   361			goto out;
   362		} else {
   363			rc = of_property_read_u32_array(power_mgt,
   364							"ibm,cpu-idle-state-residency-ns",
   365							residency_ns, dt_idle_states);
   366		}
   367	
   368		/* Support new dt format for idle states */
   369	
   370		np_new = of_find_node_by_path("/ibm,opal/power-mgt/ibm,idle-states");
   371		if (!np_new) {
   372			pr_info("opal: PowerMgmt/ibm,idle-states Node not found\n");
   373		} else {
   374			additional_states = of_property_count_u32_elems(np_new,
   375				"ibm,cpu-idle-state-flags");
   376			if (additional_states < 0) 
   377				pr_info("cpuidle-powernv: no idle states found in the DT\n");
   378			else {
   379				if (of_property_read_u32_array(np_new,
   380					"ibm,cpu-idle-state-flags", flags+dt_idle_states, additional_states)) {
   381					pr_warn("cpuidle-powernv : missing ibm,cpu-idle-state-flags in DT\n");
   382					goto out;
   383				}
   384	
   385				if (of_property_read_u32_array(np_new,
   386					"ibm,cpu-idle-state-latencies-ns", latency_ns+dt_idle_states,
   387					additional_states)) {
   388					pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-latencies-ns in DT\n");
   389					goto out;
   390				}
   391				if (of_property_read_u32_array(np_new,
   392					"ibm,cpu-idle-state-residencies-ns", residency_ns+dt_idle_states,
   393					additional_states)) {
   394					pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-residencies-ns in DT\n");
   395					goto out;
   396				}
   397				if (of_property_read_string_array(np_new,
   398					"ibm,cpu-idle-state-names", names+dt_idle_states, additional_states) < 0) {
   399					pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-names in DT\n");
   400					goto out;
   401				}
   402				if (of_property_read_string_array(np_new,
 > 403					"ibm,cpu-idle-state-versions", versions, additional_states) < 0) {
   404					pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-names in DT\n");
   405					goto out;
   406				}
   407				if (of_property_read_u64_array(np_new,
   408				    "ibm,cpu-idle-state-psscr", psscr_val+ dt_idle_states, additional_states)) {
   409					pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-psscr in DT\n");
   410					goto out;
   411				}
   412	
   413				if (of_property_read_u64_array(power_mgt,
   414						       "ibm,cpu-idle-state-psscr-mask",
   415							psscr_mask + dt_idle_states,additional_states)) {
   416					pr_warn("cpuidle-powernv:Missing ibm,cpu-idle-state-psscr-mask in DT\n");
   417					goto out;
   418				}
   419			
   420	
   421				dt_idle_states += additional_states;
   422			}
   423		}
   424		for (i = 0; i < dt_idle_states; i++) {
   425			unsigned int exit_latency, target_residency;
   426			bool stops_timebase = false;
   427	
   428			/*
   429			 * Skip the platform idle state whose flag isn't in
   430			 * the supported_cpuidle_states flag mask.
   431			 */
   432			if ((flags[i] & supported_flags) != flags[i])
   433				continue;
   434	
   435			/* Supported version */
 > 436			if (!( strcmp(version[i] , "ibm,idle-state-v1"))
 > 437					continue;
   438					
   439			/*
   440			 * If an idle state has exit latency beyond
   441			 * POWERNV_THRESHOLD_LATENCY_NS then don't use it
   442			 * in cpu-idle.
   443			 */
   444			if (latency_ns[i] > POWERNV_THRESHOLD_LATENCY_NS)
   445				continue;
   446			/*
   447			 * Firmware passes residency and latency values in ns.
   448			 * cpuidle expects it in us.
   449			 */
   450			exit_latency = DIV_ROUND_UP(latency_ns[i], 1000);
   451			if (!rc)
   452				target_residency = DIV_ROUND_UP(residency_ns[i], 1000);
   453			else
   454				target_residency = 0;
   455	
   456			if (has_stop_states) {
   457				int err = validate_psscr_val_mask(&psscr_val[i],
   458								  &psscr_mask[i],
   459								  flags[i]);
   460				if (err) {
   461					report_invalid_psscr_val(psscr_val[i], err);
   462					continue;
   463				}
   464			}
   465	
   466			if (flags[i] & OPAL_PM_TIMEBASE_STOP)
   467				stops_timebase = true;
   468	
   469			/*
   470			 * For nap and fastsleep, use default target_residency
   471			 * values if f/w does not expose it.
   472			 */
   473			if (flags[i] & OPAL_PM_NAP_ENABLED) {
   474				if (!rc)
   475					target_residency = 100;
   476				/* Add NAP state */
   477				add_powernv_state(nr_idle_states, "Nap",
   478						  CPUIDLE_FLAG_NONE, nap_loop,
   479						  target_residency, exit_latency, 0, 0);
   480			} else if (has_stop_states && !stops_timebase) {
   481				add_powernv_state(nr_idle_states, names[i],
   482						  CPUIDLE_FLAG_NONE, stop_loop,
   483						  target_residency, exit_latency,
   484						  psscr_val[i], psscr_mask[i]);
   485			}
   486	
   487			/*
   488			 * All cpuidle states with CPUIDLE_FLAG_TIMER_STOP set must come
   489			 * within this config dependency check.
   490			 */
   491	#ifdef CONFIG_TICK_ONESHOT
   492			else if (flags[i] & OPAL_PM_SLEEP_ENABLED ||
   493				 flags[i] & OPAL_PM_SLEEP_ENABLED_ER1) {
   494				if (!rc)
   495					target_residency = 300000;
   496				/* Add FASTSLEEP state */
   497				add_powernv_state(nr_idle_states, "FastSleep",
   498						  CPUIDLE_FLAG_TIMER_STOP,
   499						  fastsleep_loop,
   500						  target_residency, exit_latency, 0, 0);
   501			} else if (has_stop_states && stops_timebase) {
   502				add_powernv_state(nr_idle_states, names[i],
   503						  CPUIDLE_FLAG_TIMER_STOP, stop_loop,
   504						  target_residency, exit_latency,
   505						  psscr_val[i], psscr_mask[i]);
   506			}
   507	#endif
   508			else
   509				continue;
   510			nr_idle_states++;
 > 511		}
   512	out:
   513		return nr_idle_states;
   514	}
   515	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 56238 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20180602/a843423c/attachment-0001.gz>


More information about the Linuxppc-dev mailing list