llvm.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH v6 1/2] hwmon: (cros_ec) add PWM control over fans
       [not found] <20250718-cros_ec_fan-v6-1-8df018396b56@chromium.org>
@ 2025-07-18 19:44 ` kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2025-07-18 19:44 UTC (permalink / raw)
  To: Sung-Chi Li via B4 Relay; +Cc: llvm, oe-kbuild-all

Hi Sung-Chi,

kernel test robot noticed the following build errors:

[auto build test ERROR on 024e09e444bd2b06aee9d1f3fe7b313c7a2df1bb]

url:    https://github.com/intel-lab-lkp/linux/commits/Sung-Chi-Li-via-B4-Relay/hwmon-cros_ec-add-PWM-control-over-fans/20250718-151054
base:   024e09e444bd2b06aee9d1f3fe7b313c7a2df1bb
patch link:    https://lore.kernel.org/r/20250718-cros_ec_fan-v6-1-8df018396b56%40chromium.org
patch subject: [PATCH v6 1/2] hwmon: (cros_ec) add PWM control over fans
config: i386-buildonly-randconfig-006-20250719 (https://download.01.org/0day-ci/archive/20250719/202507190311.AMjh38Rm-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250719/202507190311.AMjh38Rm-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202507190311.AMjh38Rm-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/hwmon/cros_ec_hwmon.c:49:36: error: variable has incomplete type 'struct ec_params_pwm_get_fan_duty'
      49 |         struct ec_params_pwm_get_fan_duty req = {
         |                                           ^
   drivers/hwmon/cros_ec_hwmon.c:49:9: note: forward declaration of 'struct ec_params_pwm_get_fan_duty'
      49 |         struct ec_params_pwm_get_fan_duty req = {
         |                ^
>> drivers/hwmon/cros_ec_hwmon.c:52:38: error: variable has incomplete type 'struct ec_response_pwm_get_fan_duty'
      52 |         struct ec_response_pwm_get_fan_duty resp;
         |                                             ^
   drivers/hwmon/cros_ec_hwmon.c:52:9: note: forward declaration of 'struct ec_response_pwm_get_fan_duty'
      52 |         struct ec_response_pwm_get_fan_duty resp;
         |                ^
>> drivers/hwmon/cros_ec_hwmon.c:56:6: error: use of undeclared identifier 'EC_CMD_PWM_GET_FAN_DUTY'
      56 |                           EC_CMD_PWM_GET_FAN_DUTY, &req, sizeof(req), &resp, sizeof(resp));
         |                           ^
>> drivers/hwmon/cros_ec_hwmon.c:68:10: error: use of undeclared identifier 'EC_AUTO_FAN_CONTROL_CMD_GET'; did you mean 'EC_CHARGE_CONTROL_CMD_GET'?
      68 |                 .cmd = EC_AUTO_FAN_CONTROL_CMD_GET,
         |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                        EC_CHARGE_CONTROL_CMD_GET
   include/linux/platform_data/cros_ec_commands.h:3919:2: note: 'EC_CHARGE_CONTROL_CMD_GET' declared here
    3919 |         EC_CHARGE_CONTROL_CMD_GET,
         |         ^
>> drivers/hwmon/cros_ec_hwmon.c:67:36: error: variable has incomplete type 'struct ec_params_auto_fan_ctrl_v2'
      67 |         struct ec_params_auto_fan_ctrl_v2 req = {
         |                                           ^
   drivers/hwmon/cros_ec_hwmon.c:67:9: note: forward declaration of 'struct ec_params_auto_fan_ctrl_v2'
      67 |         struct ec_params_auto_fan_ctrl_v2 req = {
         |                ^
>> drivers/hwmon/cros_ec_hwmon.c:71:38: error: variable has incomplete type 'struct ec_response_auto_fan_control'
      71 |         struct ec_response_auto_fan_control resp;
         |                                             ^
   drivers/hwmon/cros_ec_hwmon.c:71:9: note: forward declaration of 'struct ec_response_auto_fan_control'
      71 |         struct ec_response_auto_fan_control resp;
         |                ^
>> drivers/hwmon/cros_ec_hwmon.c:217:10: error: use of undeclared identifier 'EC_AUTO_FAN_CONTROL_CMD_SET'; did you mean 'EC_CHARGE_CONTROL_CMD_SET'?
     217 |                 .cmd = EC_AUTO_FAN_CONTROL_CMD_SET,
         |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                        EC_CHARGE_CONTROL_CMD_SET
   include/linux/platform_data/cros_ec_commands.h:3918:2: note: 'EC_CHARGE_CONTROL_CMD_SET' declared here
    3918 |         EC_CHARGE_CONTROL_CMD_SET = 0,
         |         ^
   drivers/hwmon/cros_ec_hwmon.c:215:36: error: variable has incomplete type 'struct ec_params_auto_fan_ctrl_v2'
     215 |         struct ec_params_auto_fan_ctrl_v2 req = {
         |                                           ^
   drivers/hwmon/cros_ec_hwmon.c:215:9: note: forward declaration of 'struct ec_params_auto_fan_ctrl_v2'
     215 |         struct ec_params_auto_fan_ctrl_v2 req = {
         |                ^
   drivers/hwmon/cros_ec_hwmon.c:381:43: error: use of undeclared identifier 'EC_CMD_PWM_GET_FAN_DUTY'
     381 |         return is_cros_ec_cmd_available(cros_ec, EC_CMD_PWM_GET_FAN_DUTY,
         |                                                  ^
   9 errors generated.


vim +49 drivers/hwmon/cros_ec_hwmon.c

    46	
    47	static int cros_ec_hwmon_read_pwm_value(struct cros_ec_device *cros_ec, u8 index, u8 *pwm_value)
    48	{
  > 49		struct ec_params_pwm_get_fan_duty req = {
    50			.fan_idx = index,
    51		};
  > 52		struct ec_response_pwm_get_fan_duty resp;
    53		int ret;
    54	
    55		ret = cros_ec_cmd(cros_ec, CROS_EC_HWMON_PWM_GET_FAN_DUTY_CMD_VERSION,
  > 56				  EC_CMD_PWM_GET_FAN_DUTY, &req, sizeof(req), &resp, sizeof(resp));
    57		if (ret < 0)
    58			return ret;
    59	
    60		*pwm_value = (u8)DIV_ROUND_CLOSEST(le32_to_cpu(resp.percent) * 255, 100);
    61		return 0;
    62	}
    63	
    64	static int cros_ec_hwmon_read_pwm_enable(struct cros_ec_device *cros_ec, u8 index,
    65						 u8 *control_method)
    66	{
  > 67		struct ec_params_auto_fan_ctrl_v2 req = {
  > 68			.cmd = EC_AUTO_FAN_CONTROL_CMD_GET,
    69			.fan_idx = index,
    70		};
  > 71		struct ec_response_auto_fan_control resp;
    72		int ret;
    73	
    74		ret = cros_ec_cmd(cros_ec, CROS_EC_HWMON_THERMAL_AUTO_FAN_CTRL_CMD_VERSION,
    75				  EC_CMD_THERMAL_AUTO_FAN_CTRL, &req, sizeof(req), &resp, sizeof(resp));
    76		if (ret < 0)
    77			return ret;
    78	
    79		*control_method = resp.is_auto ? 2 : 1;
    80		return 0;
    81	}
    82	
    83	static int cros_ec_hwmon_read_temp(struct cros_ec_device *cros_ec, u8 index, u8 *temp)
    84	{
    85		unsigned int offset;
    86		int ret;
    87	
    88		if (index < EC_TEMP_SENSOR_ENTRIES)
    89			offset = EC_MEMMAP_TEMP_SENSOR + index;
    90		else
    91			offset = EC_MEMMAP_TEMP_SENSOR_B + index - EC_TEMP_SENSOR_ENTRIES;
    92	
    93		ret = cros_ec_cmd_readmem(cros_ec, offset, 1, temp);
    94		if (ret < 0)
    95			return ret;
    96		return 0;
    97	}
    98	
    99	static bool cros_ec_hwmon_is_error_fan(u16 speed)
   100	{
   101		return speed == EC_FAN_SPEED_NOT_PRESENT || speed == EC_FAN_SPEED_STALLED;
   102	}
   103	
   104	static bool cros_ec_hwmon_is_error_temp(u8 temp)
   105	{
   106		return temp == EC_TEMP_SENSOR_NOT_PRESENT     ||
   107		       temp == EC_TEMP_SENSOR_ERROR           ||
   108		       temp == EC_TEMP_SENSOR_NOT_POWERED     ||
   109		       temp == EC_TEMP_SENSOR_NOT_CALIBRATED;
   110	}
   111	
   112	static long cros_ec_hwmon_temp_to_millicelsius(u8 temp)
   113	{
   114		return kelvin_to_millicelsius((((long)temp) + EC_TEMP_SENSOR_OFFSET));
   115	}
   116	
   117	static int cros_ec_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
   118				      u32 attr, int channel, long *val)
   119	{
   120		struct cros_ec_hwmon_priv *priv = dev_get_drvdata(dev);
   121		int ret = -EOPNOTSUPP;
   122		u8 control_method;
   123		u8 pwm_value;
   124		u16 speed;
   125		u8 temp;
   126	
   127		if (type == hwmon_fan) {
   128			if (attr == hwmon_fan_input) {
   129				ret = cros_ec_hwmon_read_fan_speed(priv->cros_ec, channel, &speed);
   130				if (ret == 0) {
   131					if (cros_ec_hwmon_is_error_fan(speed))
   132						ret = -ENODATA;
   133					else
   134						*val = speed;
   135				}
   136			} else if (attr == hwmon_fan_fault) {
   137				ret = cros_ec_hwmon_read_fan_speed(priv->cros_ec, channel, &speed);
   138				if (ret == 0)
   139					*val = cros_ec_hwmon_is_error_fan(speed);
   140			}
   141		} else if (type == hwmon_pwm) {
   142			if (attr == hwmon_pwm_enable) {
   143				ret = cros_ec_hwmon_read_pwm_enable(priv->cros_ec, channel,
   144								    &control_method);
   145				if (ret == 0)
   146					*val = control_method;
   147			} else if (attr == hwmon_pwm_input) {
   148				ret = cros_ec_hwmon_read_pwm_value(priv->cros_ec, channel, &pwm_value);
   149				if (ret == 0)
   150					*val = pwm_value;
   151			}
   152		} else if (type == hwmon_temp) {
   153			if (attr == hwmon_temp_input) {
   154				ret = cros_ec_hwmon_read_temp(priv->cros_ec, channel, &temp);
   155				if (ret == 0) {
   156					if (cros_ec_hwmon_is_error_temp(temp))
   157						ret = -ENODATA;
   158					else
   159						*val = cros_ec_hwmon_temp_to_millicelsius(temp);
   160				}
   161			} else if (attr == hwmon_temp_fault) {
   162				ret = cros_ec_hwmon_read_temp(priv->cros_ec, channel, &temp);
   163				if (ret == 0)
   164					*val = cros_ec_hwmon_is_error_temp(temp);
   165			}
   166		}
   167	
   168		return ret;
   169	}
   170	
   171	static int cros_ec_hwmon_read_string(struct device *dev, enum hwmon_sensor_types type,
   172					     u32 attr, int channel, const char **str)
   173	{
   174		struct cros_ec_hwmon_priv *priv = dev_get_drvdata(dev);
   175	
   176		if (type == hwmon_temp && attr == hwmon_temp_label) {
   177			*str = priv->temp_sensor_names[channel];
   178			return 0;
   179		}
   180	
   181		return -EOPNOTSUPP;
   182	}
   183	
   184	static int cros_ec_hwmon_set_fan_pwm_val(struct cros_ec_device *cros_ec, u8 index, u8 val)
   185	{
   186		struct ec_params_pwm_set_fan_duty_v1 req = {
   187			.fan_idx = index,
   188			.percent = DIV_ROUND_CLOSEST((uint32_t)val * 100, 255),
   189		};
   190		int ret;
   191	
   192		ret = cros_ec_cmd(cros_ec, CROS_EC_HWMON_PWM_SET_FAN_DUTY_CMD_VERSION,
   193				  EC_CMD_PWM_SET_FAN_DUTY, &req, sizeof(req), NULL, 0);
   194		if (ret < 0)
   195			return ret;
   196		return 0;
   197	}
   198	
   199	static int cros_ec_hwmon_write_pwm_input(struct cros_ec_device *cros_ec, u8 index, u8 val)
   200	{
   201		u8 control_method;
   202		int ret;
   203	
   204		ret = cros_ec_hwmon_read_pwm_enable(cros_ec, index, &control_method);
   205		if (ret)
   206			return ret;
   207		if (control_method != 1)
   208			return -EOPNOTSUPP;
   209	
   210		return cros_ec_hwmon_set_fan_pwm_val(cros_ec, index, val);
   211	}
   212	
   213	static int cros_ec_hwmon_write_pwm_enable(struct cros_ec_device *cros_ec, u8 index, u8 val)
   214	{
   215		struct ec_params_auto_fan_ctrl_v2 req = {
   216			.fan_idx = index,
 > 217			.cmd = EC_AUTO_FAN_CONTROL_CMD_SET,
   218		};
   219		int ret;
   220	
   221		/* No CrOS EC supports no fan speed control */
   222		if (val == 0)
   223			return -EOPNOTSUPP;
   224	
   225		req.set_auto = (val != 1) ? true : false;
   226		ret = cros_ec_cmd(cros_ec, CROS_EC_HWMON_THERMAL_AUTO_FAN_CTRL_CMD_VERSION,
   227				  EC_CMD_THERMAL_AUTO_FAN_CTRL, &req, sizeof(req), NULL, 0);
   228		if (ret < 0)
   229			return ret;
   230		return 0;
   231	}
   232	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2025-07-18 19:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20250718-cros_ec_fan-v6-1-8df018396b56@chromium.org>
2025-07-18 19:44 ` [PATCH v6 1/2] hwmon: (cros_ec) add PWM control over fans kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).