Hi Daniel,

I love your patch! Perhaps something to improve:

[auto build test WARNING on v4.16-rc4]
[also build test WARNING on next-20180319]
[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/Daniel-Drake/ACPI-PM-allow-deeper-wakeup-power-states-with-no-_SxD-nor-_SxW/20180319-185209
config: i386-randconfig-x074-201811 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

Note: it may well be a FALSE warning. FWIW you are at least aware of it now.
http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings

All warnings (new ones prefixed by >>):

   drivers/acpi/device_pm.c: In function 'acpi_dev_pm_get_state':
>> drivers/acpi/device_pm.c:607:7: warning: 'sxd_status' may be used 
>> uninitialized in this function [-Wmaybe-uninitialized]
       if (sxd_status == AE_OK && target_state > ACPI_STATE_S0)
          ^

vim +/sxd_status +607 drivers/acpi/device_pm.c

   516  
   517  /**
   518   * acpi_dev_pm_get_state - Get preferred power state of ACPI device.
   519   * @dev: Device whose preferred target power state to return.
   520   * @adev: ACPI device node corresponding to @dev.
   521   * @target_state: System state to match the resultant device state.
   522   * @d_min_p: Location to store the highest power state available to the 
device.
   523   * @d_max_p: Location to store the lowest power state available to the 
device.
   524   *
   525   * Find the lowest power (highest number) and highest power (lowest 
number) ACPI
   526   * device power states that the device can be in while the system is in 
the
   527   * state represented by @target_state.  Store the integer numbers 
representing
   528   * those stats in the memory locations pointed to by @d_max_p and 
@d_min_p,
   529   * respectively.
   530   *
   531   * Callers must ensure that @dev and @adev are valid pointers and that 
@adev
   532   * actually corresponds to @dev before using this function.
   533   *
   534   * Returns 0 on success or -ENODATA when one of the ACPI methods fails 
or
   535   * returns a value that doesn't make sense.  The memory locations 
pointed to by
   536   * @d_max_p and @d_min_p are only modified on success.
   537   */
   538  static int acpi_dev_pm_get_state(struct device *dev, struct acpi_device 
*adev,
   539                                   u32 target_state, int *d_min_p, int 
*d_max_p)
   540  {
   541          char method[] = { '_', 'S', '0' + target_state, 'D', '\0' };
   542          acpi_handle handle = adev->handle;
   543          unsigned long long ret;
   544          int d_min, d_max;
   545          bool wakeup = false;
   546          acpi_status sxd_status;
   547          acpi_status status;
   548  
   549          /*
   550           * If the system state is S0, the lowest power state the device 
can be
   551           * in is D3cold, unless the device has _S0W and is supposed to 
signal
   552           * wakeup, in which case the return value of _S0W has to be 
used as the
   553           * lowest power state available to the device.
   554           */
   555          d_min = ACPI_STATE_D0;
   556          d_max = ACPI_STATE_D3_COLD;
   557  
   558          /*
   559           * If present, _SxD methods return the minimum D-state (highest 
power
   560           * state) we can use for the corresponding S-states.  
Otherwise, the
   561           * minimum D-state is D0 (ACPI 3.x).
   562           */
   563          if (target_state > ACPI_STATE_S0) {
   564                  /*
   565                   * We rely on acpi_evaluate_integer() not clobbering 
the integer
   566                   * provided if AE_NOT_FOUND is returned.
   567                   */
   568                  ret = d_min;
   569                  sxd_status = acpi_evaluate_integer(handle, method, 
NULL, &ret);
   570                  if ((ACPI_FAILURE(sxd_status) && sxd_status != 
AE_NOT_FOUND)
   571                      || ret > ACPI_STATE_D3_COLD)
   572                          return -ENODATA;
   573  
   574                  /*
   575                   * We need to handle legacy systems where D3hot and 
D3cold are
   576                   * the same and 3 is returned in both cases, so fall 
back to
   577                   * D3cold if D3hot is not a valid state.
   578                   */
   579                  if (!adev->power.states[ret].flags.valid) {
   580                          if (ret == ACPI_STATE_D3_HOT)
   581                                  ret = ACPI_STATE_D3_COLD;
   582                          else
   583                                  return -ENODATA;
   584                  }
   585                  d_min = ret;
   586                  wakeup = device_may_wakeup(dev) && 
adev->wakeup.flags.valid
   587                          && adev->wakeup.sleep_state >= target_state;
   588          } else {
   589                  wakeup = adev->wakeup.flags.valid;
   590          }
   591  
   592          /*
   593           * If _PRW says we can wake up the system from the target sleep 
state,
   594           * the D-state returned by _SxD is sufficient for that (we 
assume a
   595           * wakeup-aware driver if wake is set).  Still, if _SxW exists
   596           * (ACPI 3.x), it should return the maximum (lowest power) 
D-state that
   597           * can wake the system.  _S0W may be valid, too.
   598           */
   599          if (wakeup) {
   600                  method[3] = 'W';
   601                  status = acpi_evaluate_integer(handle, method, NULL, 
&ret);
   602                  if (status == AE_NOT_FOUND) {
   603                          /* No _SxW. In this case, the ACPI spec says 
that we
   604                           * must not go into any power state deeper than 
the
   605                           * value returned from _SxD.
   606                           */
 > 607                          if (sxd_status == AE_OK && target_state > 
 > ACPI_STATE_S0)
   608                                  d_max = d_min;
   609                  } else if (ACPI_SUCCESS(status) && ret <= 
ACPI_STATE_D3_COLD) {
   610                          /* Fall back to D3cold if ret is not a valid 
state. */
   611                          if (!adev->power.states[ret].flags.valid)
   612                                  ret = ACPI_STATE_D3_COLD;
   613  
   614                          d_max = ret > d_min ? ret : d_min;
   615                  } else {
   616                          return -ENODATA;
   617                  }
   618          }
   619  
   620          if (d_min_p)
   621                  *d_min_p = d_min;
   622  
   623          if (d_max_p)
   624                  *d_max_p = d_max;
   625  
   626          return 0;
   627  }
   628  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to