[PATCH 3/3] hwmon: (occ) Check for device property for setting OCC active during probe

kernel test robot lkp at intel.com
Thu Aug 4 00:44:55 AEST 2022


Hi Eddie,

I love your patch! Yet something to improve:

[auto build test ERROR on next-20220728]
[also build test ERROR on v5.19]
[cannot apply to groeck-staging/hwmon-next linus/master v5.19 v5.19-rc8 v5.19-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Eddie-James/occ-Restore-default-behavior-of-polling-OCC-during-init/20220803-034854
base:    7c5e07b73ff3011c9b82d4a3286a3362b951ad2b
config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20220803/202208032229.qba4UTzM-lkp@intel.com/config)
compiler: sh4-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/31dc5bad51ddf22f4e097c0c5862d14341708188
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Eddie-James/occ-Restore-default-behavior-of-polling-OCC-during-init/20220803-034854
        git checkout 31dc5bad51ddf22f4e097c0c5862d14341708188
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sh SHELL=/bin/bash drivers/hwmon/occ/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp at intel.com>

All errors (new ones prefixed by >>):

   In file included from include/linux/device/driver.h:21,
                    from include/linux/device.h:32,
                    from drivers/hwmon/occ/p9_sbe.c:4:
>> drivers/hwmon/occ/p9_sbe.c:188:25: error: 'p8_i2c_occ_of_match' undeclared here (not in a function); did you mean 'p9_sbe_occ_of_match'?
     188 | MODULE_DEVICE_TABLE(of, p8_i2c_occ_of_match);
         |                         ^~~~~~~~~~~~~~~~~~~
   include/linux/module.h:244:15: note: in definition of macro 'MODULE_DEVICE_TABLE'
     244 | extern typeof(name) __mod_##type##__##name##_device_table               \
         |               ^~~~
>> include/linux/module.h:244:21: error: '__mod_of__p8_i2c_occ_of_match_device_table' aliased to undefined symbol 'p8_i2c_occ_of_match'
     244 | extern typeof(name) __mod_##type##__##name##_device_table               \
         |                     ^~~~~~
   drivers/hwmon/occ/p9_sbe.c:188:1: note: in expansion of macro 'MODULE_DEVICE_TABLE'
     188 | MODULE_DEVICE_TABLE(of, p8_i2c_occ_of_match);
         | ^~~~~~~~~~~~~~~~~~~


vim +188 drivers/hwmon/occ/p9_sbe.c

     3	
   > 4	#include <linux/device.h>
     5	#include <linux/errno.h>
     6	#include <linux/slab.h>
     7	#include <linux/fsi-occ.h>
     8	#include <linux/mm.h>
     9	#include <linux/module.h>
    10	#include <linux/mod_devicetable.h>
    11	#include <linux/mutex.h>
    12	#include <linux/platform_device.h>
    13	#include <linux/string.h>
    14	#include <linux/sysfs.h>
    15	
    16	#include "common.h"
    17	
    18	#define OCC_CHECKSUM_RETRIES	3
    19	
    20	struct p9_sbe_occ {
    21		struct occ occ;
    22		bool sbe_error;
    23		void *ffdc;
    24		size_t ffdc_len;
    25		size_t ffdc_size;
    26		struct mutex sbe_error_lock;	/* lock access to ffdc data */
    27		struct device *sbe;
    28	};
    29	
    30	#define to_p9_sbe_occ(x)	container_of((x), struct p9_sbe_occ, occ)
    31	
    32	static ssize_t ffdc_read(struct file *filp, struct kobject *kobj,
    33				 struct bin_attribute *battr, char *buf, loff_t pos,
    34				 size_t count)
    35	{
    36		ssize_t rc = 0;
    37		struct occ *occ = dev_get_drvdata(kobj_to_dev(kobj));
    38		struct p9_sbe_occ *ctx = to_p9_sbe_occ(occ);
    39	
    40		mutex_lock(&ctx->sbe_error_lock);
    41		if (ctx->sbe_error) {
    42			rc = memory_read_from_buffer(buf, count, &pos, ctx->ffdc,
    43						     ctx->ffdc_len);
    44			if (pos >= ctx->ffdc_len)
    45				ctx->sbe_error = false;
    46		}
    47		mutex_unlock(&ctx->sbe_error_lock);
    48	
    49		return rc;
    50	}
    51	static BIN_ATTR_RO(ffdc, OCC_MAX_RESP_WORDS * 4);
    52	
    53	static bool p9_sbe_occ_save_ffdc(struct p9_sbe_occ *ctx, const void *resp,
    54					 size_t resp_len)
    55	{
    56		bool notify = false;
    57	
    58		mutex_lock(&ctx->sbe_error_lock);
    59		if (!ctx->sbe_error) {
    60			if (resp_len > ctx->ffdc_size) {
    61				kvfree(ctx->ffdc);
    62				ctx->ffdc = kvmalloc(resp_len, GFP_KERNEL);
    63				if (!ctx->ffdc) {
    64					ctx->ffdc_len = 0;
    65					ctx->ffdc_size = 0;
    66					goto done;
    67				}
    68	
    69				ctx->ffdc_size = resp_len;
    70			}
    71	
    72			notify = true;
    73			ctx->sbe_error = true;
    74			ctx->ffdc_len = resp_len;
    75			memcpy(ctx->ffdc, resp, resp_len);
    76		}
    77	
    78	done:
    79		mutex_unlock(&ctx->sbe_error_lock);
    80		return notify;
    81	}
    82	
    83	static int p9_sbe_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len,
    84				       void *resp, size_t resp_len)
    85	{
    86		struct p9_sbe_occ *ctx = to_p9_sbe_occ(occ);
    87		int rc, i;
    88	
    89		for (i = 0; i < OCC_CHECKSUM_RETRIES; ++i) {
    90			rc = fsi_occ_submit(ctx->sbe, cmd, len, resp, &resp_len);
    91			if (rc >= 0)
    92				break;
    93			if (resp_len) {
    94				if (p9_sbe_occ_save_ffdc(ctx, resp, resp_len))
    95					sysfs_notify(&occ->bus_dev->kobj, NULL,
    96						     bin_attr_ffdc.attr.name);
    97				return rc;
    98			}
    99			if (rc != -EBADE)
   100				return rc;
   101		}
   102	
   103		switch (((struct occ_response *)resp)->return_status) {
   104		case OCC_RESP_CMD_IN_PRG:
   105			rc = -ETIMEDOUT;
   106			break;
   107		case OCC_RESP_SUCCESS:
   108			rc = 0;
   109			break;
   110		case OCC_RESP_CMD_INVAL:
   111		case OCC_RESP_CMD_LEN_INVAL:
   112		case OCC_RESP_DATA_INVAL:
   113		case OCC_RESP_CHKSUM_ERR:
   114			rc = -EINVAL;
   115			break;
   116		case OCC_RESP_INT_ERR:
   117		case OCC_RESP_BAD_STATE:
   118		case OCC_RESP_CRIT_EXCEPT:
   119		case OCC_RESP_CRIT_INIT:
   120		case OCC_RESP_CRIT_WATCHDOG:
   121		case OCC_RESP_CRIT_OCB:
   122		case OCC_RESP_CRIT_HW:
   123			rc = -EREMOTEIO;
   124			break;
   125		default:
   126			rc = -EPROTO;
   127		}
   128	
   129		return rc;
   130	}
   131	
   132	static int p9_sbe_occ_probe(struct platform_device *pdev)
   133	{
   134		int rc;
   135		struct occ *occ;
   136		struct p9_sbe_occ *ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx),
   137						      GFP_KERNEL);
   138		if (!ctx)
   139			return -ENOMEM;
   140	
   141		mutex_init(&ctx->sbe_error_lock);
   142	
   143		ctx->sbe = pdev->dev.parent;
   144		occ = &ctx->occ;
   145		occ->bus_dev = &pdev->dev;
   146		platform_set_drvdata(pdev, occ);
   147	
   148		occ->powr_sample_time_us = 500;
   149		occ->poll_cmd_data = 0x20;		/* P9 OCC poll data */
   150		occ->send_cmd = p9_sbe_occ_send_cmd;
   151	
   152		rc = occ_setup(occ);
   153		if (rc == -ESHUTDOWN)
   154			rc = -ENODEV;	/* Host is shutdown, don't spew errors */
   155	
   156		if (!rc) {
   157			rc = device_create_bin_file(occ->bus_dev, &bin_attr_ffdc);
   158			if (rc) {
   159				dev_warn(occ->bus_dev,
   160					 "failed to create SBE error ffdc file\n");
   161				rc = 0;
   162			}
   163		}
   164	
   165		return rc;
   166	}
   167	
   168	static int p9_sbe_occ_remove(struct platform_device *pdev)
   169	{
   170		struct occ *occ = platform_get_drvdata(pdev);
   171		struct p9_sbe_occ *ctx = to_p9_sbe_occ(occ);
   172	
   173		device_remove_bin_file(occ->bus_dev, &bin_attr_ffdc);
   174	
   175		ctx->sbe = NULL;
   176		occ_shutdown(occ);
   177	
   178		kvfree(ctx->ffdc);
   179	
   180		return 0;
   181	}
   182	
   183	static const struct of_device_id p9_sbe_occ_of_match[] = {
   184		{ .compatible = "ibm,p9-occ-hwmon" },
   185		{ .compatible = "ibm,p10-occ-hwmon" },
   186		{}
   187	};
 > 188	MODULE_DEVICE_TABLE(of, p8_i2c_occ_of_match);
   189	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp


More information about the linux-fsi mailing list