All of lore.kernel.org
 help / color / mirror / Atom feed
* [cris:scmi_telemetry_unified_fs_V4 14/34] drivers/firmware/arm_scmi/telemetry.c:2246:31: sparse: sparse: incorrect type in return expression (different address spaces)
@ 2026-06-13 20:25 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-06-13 20:25 UTC (permalink / raw)
  To: Cristian Marussi; +Cc: oe-kbuild-all

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/cris/linux.git scmi_telemetry_unified_fs_V4
head:   ed28087005811783e972fe7a788446936878932f
commit: ae63fff933f721d22cd5eec34112097e91df5856 [14/34] firmware: arm_scmi: Add Telemetry DataEvent read capabilities
config: arc-randconfig-r132-20260613 (https://download.01.org/0day-ci/archive/20260614/202606140455.3K8Fziww-lkp@intel.com/config)
compiler: arc-linux-gcc (GCC) 8.5.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260614/202606140455.3K8Fziww-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/202606140455.3K8Fziww-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
   drivers/firmware/arm_scmi/telemetry.c:710:30: sparse: sparse: restricted __le32 degrades to integer
   drivers/firmware/arm_scmi/telemetry.c:711:32: sparse: sparse: restricted __le32 degrades to integer
   drivers/firmware/arm_scmi/telemetry.c:825:49: sparse: sparse: incorrect type in initializer (different modifiers) @@     expected struct scmi_telemetry_res_info *rinfo @@     got struct scmi_telemetry_res_info [noderef] * @@
   drivers/firmware/arm_scmi/telemetry.c:825:49: sparse:     expected struct scmi_telemetry_res_info *rinfo
   drivers/firmware/arm_scmi/telemetry.c:825:49: sparse:     got struct scmi_telemetry_res_info [noderef] *
   drivers/firmware/arm_scmi/telemetry.c:939:20: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le32 [usertype] flags @@     got unsigned long @@
   drivers/firmware/arm_scmi/telemetry.c:939:20: sparse:     expected restricted __le32 [usertype] flags
   drivers/firmware/arm_scmi/telemetry.c:939:20: sparse:     got unsigned long
   drivers/firmware/arm_scmi/telemetry.c:963:28: sparse: sparse: restricted __le32 degrades to integer
   drivers/firmware/arm_scmi/telemetry.c:993:56: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int @@     got restricted __le32 const @@
   drivers/firmware/arm_scmi/telemetry.c:993:56: sparse:     expected unsigned int
   drivers/firmware/arm_scmi/telemetry.c:993:56: sparse:     got restricted __le32 const
   drivers/firmware/arm_scmi/telemetry.c:1030:49: sparse: sparse: incorrect type in initializer (different modifiers) @@     expected struct scmi_telemetry_res_info *rinfo @@     got struct scmi_telemetry_res_info [noderef] * @@
   drivers/firmware/arm_scmi/telemetry.c:1030:49: sparse:     expected struct scmi_telemetry_res_info *rinfo
   drivers/firmware/arm_scmi/telemetry.c:1030:49: sparse:     got struct scmi_telemetry_res_info [noderef] *
   drivers/firmware/arm_scmi/telemetry.c:1241:34: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/firmware/arm_scmi/telemetry.c:1318:62: sparse: sparse: incorrect type in argument 3 (different address spaces) @@     expected struct payload [noderef] __iomem *payld @@     got struct payload *payld @@
   drivers/firmware/arm_scmi/telemetry.c:1318:62: sparse:     expected struct payload [noderef] __iomem *payld
   drivers/firmware/arm_scmi/telemetry.c:1318:62: sparse:     got struct payload *payld
   drivers/firmware/arm_scmi/telemetry.c:1354:44: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1354:44: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1354:44: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1354:44: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1354:44: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1354:44: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1356:63: sparse: sparse: incorrect type in argument 3 (different address spaces) @@     expected struct payload [noderef] __iomem *payld @@     got struct payload *payld @@
   drivers/firmware/arm_scmi/telemetry.c:1356:63: sparse:     expected struct payload [noderef] __iomem *payld
   drivers/firmware/arm_scmi/telemetry.c:1356:63: sparse:     got struct payload *payld
   drivers/firmware/arm_scmi/telemetry.c:1394:50: sparse: sparse: incorrect type in argument 3 (different address spaces) @@     expected struct payload *payld @@     got struct payload [noderef] __iomem *payld @@
   drivers/firmware/arm_scmi/telemetry.c:1394:50: sparse:     expected struct payload *payld
   drivers/firmware/arm_scmi/telemetry.c:1394:50: sparse:     got struct payload [noderef] __iomem *payld
   drivers/firmware/arm_scmi/telemetry.c:1409:14: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void *next @@     got unsigned char [noderef] __iomem * @@
   drivers/firmware/arm_scmi/telemetry.c:1409:14: sparse:     expected void *next
   drivers/firmware/arm_scmi/telemetry.c:1409:14: sparse:     got unsigned char [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:1411:21: sparse: sparse: incorrect type in argument 1 (different base types) @@     expected restricted __le32 [usertype] v @@     got unsigned int @@
   drivers/firmware/arm_scmi/telemetry.c:1411:21: sparse:     expected restricted __le32 [usertype] v
   drivers/firmware/arm_scmi/telemetry.c:1411:21: sparse:     got unsigned int
   drivers/firmware/arm_scmi/telemetry.c:1465:65: sparse: sparse: incorrect type in argument 3 (different address spaces) @@     expected struct payload *payld @@     got struct payload [noderef] __iomem *payld @@
   drivers/firmware/arm_scmi/telemetry.c:1465:65: sparse:     expected struct payload *payld
   drivers/firmware/arm_scmi/telemetry.c:1465:65: sparse:     got struct payload [noderef] __iomem *payld
   drivers/firmware/arm_scmi/telemetry.c:1602:17: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/firmware/arm_scmi/telemetry.c:1626:29: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct eplg *_eplg @@     got void [noderef] __iomem * @@
   drivers/firmware/arm_scmi/telemetry.c:1626:29: sparse:     expected struct eplg *_eplg
   drivers/firmware/arm_scmi/telemetry.c:1626:29: sparse:     got void [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:1626:27: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct eplg [noderef] __iomem *eplg @@     got struct eplg *_eplg @@
   drivers/firmware/arm_scmi/telemetry.c:1626:27: sparse:     expected struct eplg [noderef] __iomem *eplg
   drivers/firmware/arm_scmi/telemetry.c:1626:27: sparse:     got struct eplg *_eplg
   drivers/firmware/arm_scmi/telemetry.c:1627:32: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/firmware/arm_scmi/telemetry.c:1627:48: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/firmware/arm_scmi/telemetry.c:1662:39: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/firmware/arm_scmi/telemetry.c:1666:17: sparse: sparse: incorrect type in argument 1 (different base types) @@     expected restricted __le32 [usertype] v @@     got unsigned int @@
   drivers/firmware/arm_scmi/telemetry.c:1666:17: sparse:     expected restricted __le32 [usertype] v
   drivers/firmware/arm_scmi/telemetry.c:1666:17: sparse:     got unsigned int
   drivers/firmware/arm_scmi/telemetry.c:1678:39: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/firmware/arm_scmi/telemetry.c:1816:37: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct eplg *_eplg @@     got void [noderef] __iomem * @@
   drivers/firmware/arm_scmi/telemetry.c:1816:37: sparse:     expected struct eplg *_eplg
   drivers/firmware/arm_scmi/telemetry.c:1816:37: sparse:     got void [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:1816:35: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct eplg [noderef] __iomem *eplg @@     got struct eplg *_eplg @@
   drivers/firmware/arm_scmi/telemetry.c:1816:35: sparse:     expected struct eplg [noderef] __iomem *eplg
   drivers/firmware/arm_scmi/telemetry.c:1816:35: sparse:     got struct eplg *_eplg
   drivers/firmware/arm_scmi/telemetry.c:1818:31: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct payload *payld @@     got void [noderef] __iomem * @@
   drivers/firmware/arm_scmi/telemetry.c:1818:31: sparse:     expected struct payload *payld
   drivers/firmware/arm_scmi/telemetry.c:1818:31: sparse:     got void [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:1824:43: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct payload *bts_payld @@     got void [noderef] __iomem * @@
   drivers/firmware/arm_scmi/telemetry.c:1824:43: sparse:     expected struct payload *bts_payld
   drivers/firmware/arm_scmi/telemetry.c:1824:43: sparse:     got void [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:1904:20: sparse: sparse: invalid assignment: |=
   drivers/firmware/arm_scmi/telemetry.c:1904:20: sparse:    left side has type restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1904:20: sparse:    right side has type unsigned long
   drivers/firmware/arm_scmi/telemetry.c:1911:36: sparse: sparse: invalid assignment: |=
   drivers/firmware/arm_scmi/telemetry.c:1911:36: sparse:    left side has type restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1911:36: sparse:    right side has type unsigned long
   drivers/firmware/arm_scmi/telemetry.c:1914:36: sparse: sparse: invalid assignment: |=
   drivers/firmware/arm_scmi/telemetry.c:1914:36: sparse:    left side has type restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:1914:36: sparse:    right side has type unsigned long
   drivers/firmware/arm_scmi/telemetry.c:2037:20: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le32 [usertype] flags @@     got unsigned long @@
   drivers/firmware/arm_scmi/telemetry.c:2037:20: sparse:     expected restricted __le32 [usertype] flags
   drivers/firmware/arm_scmi/telemetry.c:2037:20: sparse:     got unsigned long
   drivers/firmware/arm_scmi/telemetry.c:2039:28: sparse: sparse: invalid assignment: |=
   drivers/firmware/arm_scmi/telemetry.c:2039:28: sparse:    left side has type restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2039:28: sparse:    right side has type unsigned long
   drivers/firmware/arm_scmi/telemetry.c:2102:26: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] interval @@     got restricted __le32 [usertype] @@
   drivers/firmware/arm_scmi/telemetry.c:2102:26: sparse:     expected unsigned int [usertype] interval
   drivers/firmware/arm_scmi/telemetry.c:2102:26: sparse:     got restricted __le32 [usertype]
   drivers/firmware/arm_scmi/telemetry.c:2110:21: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le32 [usertype] grp_id @@     got unsigned int res_id @@
   drivers/firmware/arm_scmi/telemetry.c:2110:21: sparse:     expected restricted __le32 [usertype] grp_id
   drivers/firmware/arm_scmi/telemetry.c:2110:21: sparse:     got unsigned int res_id
   drivers/firmware/arm_scmi/telemetry.c:2111:22: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le32 [usertype] control @@     got unsigned long @@
   drivers/firmware/arm_scmi/telemetry.c:2111:22: sparse:     expected restricted __le32 [usertype] control
   drivers/firmware/arm_scmi/telemetry.c:2111:22: sparse:     got unsigned long
   drivers/firmware/arm_scmi/telemetry.c:2112:22: sparse: sparse: invalid assignment: |=
   drivers/firmware/arm_scmi/telemetry.c:2112:22: sparse:    left side has type restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2112:22: sparse:    right side has type unsigned long
   drivers/firmware/arm_scmi/telemetry.c:2114:22: sparse: sparse: invalid assignment: |=
   drivers/firmware/arm_scmi/telemetry.c:2114:22: sparse:    left side has type restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2114:22: sparse:    right side has type unsigned long
   drivers/firmware/arm_scmi/telemetry.c:2115:28: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le32 [usertype] sampling_rate @@     got unsigned int [assigned] [usertype] interval @@
   drivers/firmware/arm_scmi/telemetry.c:2115:28: sparse:     expected restricted __le32 [usertype] sampling_rate
   drivers/firmware/arm_scmi/telemetry.c:2115:28: sparse:     got unsigned int [assigned] [usertype] interval
   drivers/firmware/arm_scmi/telemetry.c:2245:39: sparse: sparse: cast removes address space '__iomem' of expression
>> drivers/firmware/arm_scmi/telemetry.c:2246:31: sparse: sparse: incorrect type in return expression (different address spaces) @@     expected struct payload [noderef] __iomem * @@     got void * @@
   drivers/firmware/arm_scmi/telemetry.c:2246:31: sparse:     expected struct payload [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:2246:31: sparse:     got void *
   drivers/firmware/arm_scmi/telemetry.c:2249:13: sparse: sparse: incorrect type in argument 1 (different base types) @@     expected restricted __le32 [usertype] v @@     got unsigned int @@
   drivers/firmware/arm_scmi/telemetry.c:2249:13: sparse:     expected restricted __le32 [usertype] v
   drivers/firmware/arm_scmi/telemetry.c:2249:13: sparse:     got unsigned int
   drivers/firmware/arm_scmi/telemetry.c:2251:31: sparse: sparse: incorrect type in return expression (different address spaces) @@     expected struct payload [noderef] __iomem * @@     got void * @@
   drivers/firmware/arm_scmi/telemetry.c:2251:31: sparse:     expected struct payload [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:2251:31: sparse:     got void *
   drivers/firmware/arm_scmi/telemetry.c:2254:13: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/firmware/arm_scmi/telemetry.c:2256:31: sparse: sparse: incorrect type in return expression (different address spaces) @@     expected struct payload [noderef] __iomem * @@     got void * @@
   drivers/firmware/arm_scmi/telemetry.c:2256:31: sparse:     expected struct payload [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:2256:31: sparse:     got void *
   drivers/firmware/arm_scmi/telemetry.c:2265:31: sparse: sparse: incorrect type in return expression (different address spaces) @@     expected struct payload [noderef] __iomem * @@     got void * @@
   drivers/firmware/arm_scmi/telemetry.c:2265:31: sparse:     expected struct payload [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:2265:31: sparse:     got void *
   drivers/firmware/arm_scmi/telemetry.c:2446:25: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2446:25: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2446:25: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2446:25: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2446:25: sparse: sparse: cast to restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2446:25: sparse: sparse: cast to restricted __le32
>> drivers/firmware/arm_scmi/telemetry.c:2491:21: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le32 [usertype] grp_id @@     got int grp_id @@
   drivers/firmware/arm_scmi/telemetry.c:2491:21: sparse:     expected restricted __le32 [usertype] grp_id
   drivers/firmware/arm_scmi/telemetry.c:2491:21: sparse:     got int grp_id
   drivers/firmware/arm_scmi/telemetry.c:2492:22: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le32 [usertype] control @@     got unsigned long @@
   drivers/firmware/arm_scmi/telemetry.c:2492:22: sparse:     expected restricted __le32 [usertype] control
   drivers/firmware/arm_scmi/telemetry.c:2492:22: sparse:     got unsigned long
   drivers/firmware/arm_scmi/telemetry.c:2493:22: sparse: sparse: invalid assignment: |=
   drivers/firmware/arm_scmi/telemetry.c:2493:22: sparse:    left side has type restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2493:22: sparse:    right side has type unsigned long
   drivers/firmware/arm_scmi/telemetry.c:2495:22: sparse: sparse: invalid assignment: |=
   drivers/firmware/arm_scmi/telemetry.c:2495:22: sparse:    left side has type restricted __le32
   drivers/firmware/arm_scmi/telemetry.c:2495:22: sparse:    right side has type unsigned long
>> drivers/firmware/arm_scmi/telemetry.c:2504:63: sparse: sparse: incorrect type in argument 2 (different base types) @@     expected unsigned int num_dwords @@     got restricted __le32 [usertype] num_dwords @@
   drivers/firmware/arm_scmi/telemetry.c:2504:63: sparse:     expected unsigned int num_dwords
   drivers/firmware/arm_scmi/telemetry.c:2504:63: sparse:     got restricted __le32 [usertype] num_dwords
>> drivers/firmware/arm_scmi/telemetry.c:2505:58: sparse: sparse: incorrect type in argument 3 (different base types) @@     expected unsigned int [usertype] *dwords @@     got restricted __le32 * @@
   drivers/firmware/arm_scmi/telemetry.c:2505:58: sparse:     expected unsigned int [usertype] *dwords
   drivers/firmware/arm_scmi/telemetry.c:2505:58: sparse:     got restricted __le32 *
   drivers/firmware/arm_scmi/telemetry.c:2605:35: sparse: sparse: incorrect type in assignment (different modifiers) @@     expected struct scmi_telemetry_res_info [noderef] * @@     got struct scmi_telemetry_res_info * @@
   drivers/firmware/arm_scmi/telemetry.c:2605:35: sparse:     expected struct scmi_telemetry_res_info [noderef] *
   drivers/firmware/arm_scmi/telemetry.c:2605:35: sparse:     got struct scmi_telemetry_res_info *
   drivers/firmware/arm_scmi/telemetry.c:2613:49: sparse: sparse: incorrect type in initializer (different modifiers) @@     expected struct scmi_telemetry_res_info *rinfo @@     got struct scmi_telemetry_res_info [noderef] * @@
   drivers/firmware/arm_scmi/telemetry.c:2613:49: sparse:     expected struct scmi_telemetry_res_info *rinfo
   drivers/firmware/arm_scmi/telemetry.c:2613:49: sparse:     got struct scmi_telemetry_res_info [noderef] *
   drivers/firmware/arm_scmi/telemetry.c:2662:49: sparse: sparse: incorrect type in initializer (different modifiers) @@     expected struct scmi_telemetry_res_info *rinfo @@     got struct scmi_telemetry_res_info [noderef] * @@
   drivers/firmware/arm_scmi/telemetry.c:2662:49: sparse:     expected struct scmi_telemetry_res_info *rinfo
   drivers/firmware/arm_scmi/telemetry.c:2662:49: sparse:     got struct scmi_telemetry_res_info [noderef] *
   drivers/firmware/arm_scmi/telemetry.c:1100:20: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct eplg *_eplg @@     got void [noderef] __iomem * @@
   drivers/firmware/arm_scmi/telemetry.c:1100:20: sparse:     expected struct eplg *_eplg
   drivers/firmware/arm_scmi/telemetry.c:1100:20: sparse:     got void [noderef] __iomem *
   drivers/firmware/arm_scmi/telemetry.c:1324:40: sparse: sparse: non size-preserving pointer to integer cast
   drivers/firmware/arm_scmi/telemetry.c:1362:40: sparse: sparse: non size-preserving pointer to integer cast

vim +2246 drivers/firmware/arm_scmi/telemetry.c

  2057	
  2058	static int
  2059	scmi_telemetry_collection_configure(const struct scmi_protocol_handle *ph,
  2060					    unsigned int res_id, bool grp_ignore,
  2061					    bool *enable,
  2062					    unsigned int *update_interval_ms,
  2063					    enum scmi_telemetry_collection *mode)
  2064	{
  2065		enum scmi_telemetry_collection *current_mode, next_mode;
  2066		struct telemetry_info *ti = ph->get_priv(ph);
  2067		struct scmi_msg_telemetry_config_set *msg;
  2068		unsigned int *active_update_interval;
  2069		struct scmi_xfer *t;
  2070		bool tlm_enable;
  2071		u32 interval;
  2072		int ret;
  2073	
  2074		if (mode && *mode == SCMI_TLM_NOTIFICATION &&
  2075		    !ti->info.continuos_update_support)
  2076			return -EINVAL;
  2077	
  2078		if (res_id != SCMI_TLM_GRP_INVALID && res_id >= ti->info.base.num_groups)
  2079			return -EINVAL;
  2080	
  2081		if (res_id == SCMI_TLM_GRP_INVALID || grp_ignore) {
  2082			active_update_interval = &ti->info.active_update_interval;
  2083			current_mode = &ti->info.current_mode;
  2084		} else {
  2085			struct scmi_telemetry_res_info *rinfo;
  2086	
  2087			rinfo = ti->res_get(ti);
  2088			active_update_interval =
  2089				&rinfo->grps[res_id].active_update_interval;
  2090			current_mode = &rinfo->grps[res_id].current_mode;
  2091		}
  2092	
  2093		if (!enable && !update_interval_ms && (!mode || *mode == *current_mode))
  2094			return 0;
  2095	
  2096		ret = ph->xops->xfer_get_init(ph, TELEMETRY_CONFIG_SET,
  2097					      sizeof(*msg), 0, &t);
  2098		if (ret)
  2099			return ret;
  2100	
  2101		if (!update_interval_ms)
  2102			interval = cpu_to_le32(*active_update_interval);
  2103		else
  2104			interval = *update_interval_ms;
  2105	
  2106		tlm_enable = enable ? *enable : ti->info.enabled;
  2107		next_mode = mode ? *mode : *current_mode;
  2108	
  2109		msg = t->tx.buf;
  2110		msg->grp_id = res_id;
  2111		msg->control = tlm_enable ? TELEMETRY_ENABLE : 0;
> 2112		msg->control |= grp_ignore ? TELEMETRY_SET_SELECTOR_ALL :
  2113			TELEMETRY_SET_SELECTOR_GROUP;
  2114		msg->control |= TELEMETRY_MODE_SET(next_mode);
  2115		msg->sampling_rate = interval;
  2116		ret = ph->xops->do_xfer(ph, t);
  2117		if (!ret) {
  2118			ti->info.enabled = tlm_enable;
  2119			*current_mode = next_mode;
  2120			ti->info.notif_enabled = *current_mode == SCMI_TLM_NOTIFICATION;
  2121			if (update_interval_ms)
  2122				*active_update_interval = interval;
  2123		}
  2124	
  2125		ph->xops->xfer_put(ph, t);
  2126	
  2127		return ret;
  2128	}
  2129	
  2130	static inline void
  2131	scmi_telemetry_de_data_fc_read(struct telemetry_de *tde,
  2132				       struct scmi_telemetry_de_sample *sample)
  2133	{
  2134		struct fc_tsline __iomem *fc = tde->base + tde->offset;
  2135	
  2136		sample->val = LINE_DATA_GET(fc);
  2137		sample->tstamp = LINE_TSTAMP_GET(fc);
  2138	
  2139		/* Trace originally read tstamp */
  2140		trace_scmi_tlm_collect(sample->tstamp, tde->de.info->id, sample->val,
  2141				       "FC_READ");
  2142	
  2143		scmi_telemetry_tde_cache_update(tde, sample, NULL);
  2144	}
  2145	
  2146	static void scmi_telemetry_scan_update(struct telemetry_info *ti)
  2147	{
  2148		struct telemetry_de *tde;
  2149	
  2150		/* Scan all SHMTIs ... */
  2151		for (int id = 0; id < ti->num_shmti; id++) {
  2152			int ret;
  2153	
  2154			ret = scmi_telemetry_shmti_scan(ti, id, SCAN_LOOKUP);
  2155			if (ret)
  2156				dev_warn(ti->ph->dev,
  2157					 "Failed update-scan of SHMTI ID:%d - ret:%d\n",
  2158					 id, ret);
  2159		}
  2160	
  2161		if (!ti->info.fc_support)
  2162			return;
  2163	
  2164		/* Need to enumerate resources to access fastchannels */
  2165		ti->res_get(ti);
  2166		list_for_each_entry(tde, &ti->fcs_des, item) {
  2167			struct scmi_telemetry_de_sample sample = {};
  2168	
  2169			if (!tde->de.enabled)
  2170				continue;
  2171	
  2172			/* Only for the sake of updating TDE cache */
  2173			scmi_telemetry_de_data_fc_read(tde, &sample);
  2174		}
  2175	}
  2176	
  2177	/*
  2178	 * TDCF and TS Line Management Notes
  2179	 * ---------------------------------
  2180	 *
  2181	 * TDCF Payload Metadata notable bits:
  2182	 *  - Bit[3]: USE BLK Tstamp
  2183	 *  - Bit[2]: Line-Extension Field present (LineTstamp)
  2184	 *  - Bit[1]: Tstamp VALID
  2185	 *  - Bit[0]: Data INVALID
  2186	 *
  2187	 * CASE_1:
  2188	 * -------
  2189	 *	+ A DE is enabled with timestamp disabled, so the TS fields are
  2190	 *	  NOT present
  2191	 *	  -> BIT[3:0] = 0000b
  2192	 *
  2193	 *	  - 1/A LINE_TSTAMP
  2194	 *	  ------------------
  2195	 *	     + that DE is then 're-enabled' with TS: so it was ON, it remains
  2196	 *	       ON but using DE_CONFIGURE I now enabled also TS, so the
  2197	 *	       platform relocates it at the end of the SHMTI and return the
  2198	 *	       new offset
  2199	 *	       -> BIT[3:0] = 0110b
  2200	 *
  2201	 *	  - 1/B BLK_TSTAMP
  2202	 *	  ------------------
  2203	 *	     + that DE is then 're-enabled' with BLK TS: so it was ON, it
  2204	 *	       remains ON but using DE_CONFIGURE, we now also enabled the TS,
  2205	 *	       so the platform will:
  2206	 *	       - IF a preceding BLK_TS line exist (with same clk rate)
  2207	 *	         it relocates the DE at the end of the SHMTI and return the
  2208	 *	         new offset (if there is enough room, if not in another SHMTI)
  2209	 *	       - IF a preceding BLK_TS line DOES NOT exist (with same clk rate)
  2210	 *	         it creates a new BLK_TS line at the end of the SHMTI and then
  2211	 *	         relocates the DE after the new BLK_TS and return the
  2212	 *	         new offset (if there is enough room, if not in another SHMTI)
  2213	 *	       -> BIT[3:1] = 1010b
  2214	 *
  2215	 *	+ the hole left from the relocated DE can be reused by the platform
  2216	 *	to fit another equally sized DE. (i.e. without shuffling around any
  2217	 *	other enabled DE, since that would cause a change of the known offset)
  2218	 *	anyway it will be marked as:
  2219	 *	-> BIT[3:0] = 0101b iff it was a LINE_TSTAMP
  2220	 *	-> BIT[3:0] = 0001b iff it was a BLK_TSTAMP
  2221	 *
  2222	 * CASE_2:
  2223	 * -------
  2224	 *	+ A DE is enabled with LINE timestamp enabled, so the TS_Line is there
  2225	 *	  -> BIT[3:0] = 0110b
  2226	 *	+ that DE has its timestamp disabled: again, you can do this without
  2227	 *	  disabling it fully but just disabling the TS, so now that TS_line
  2228	 *	  fields are still physically there but NOT valid
  2229	 *	  -> BIT[3:0] = 0100b
  2230	 *	+ the hole from the timestamp remain there unused until
  2231	 *		- you enable again the TS so the hole is used again
  2232	 *		  -> BIT[3:0] = 0110b
  2233	 *			OR
  2234	 *		- you disable fully the DE and then re-enable it with the TS
  2235	 *		  -> potentially CASE_1 the DE is relocated on enable
  2236	 *	+ same kind of dynamic applies if the DE had a BLK_TS line
  2237	 */
  2238	static struct payload __iomem *
  2239	scmi_telemetry_tdcf_de_payld_get(struct telemetry_de *tde)
  2240	{
  2241		struct payload __iomem *payld;
  2242	
  2243		payld = tde->base + tde->offset;
  2244		if (DATA_INVALID(payld)) {
  2245			trace_scmi_tlm_access(PAYLD_ID(payld), "DE_DATA_INVALID", 0, 0);
> 2246			return ERR_PTR(-EINVAL);
  2247		}
  2248	
  2249		if (IS_BLK_TS_LINE(payld)) {
  2250			trace_scmi_tlm_access(tde->de.info->id, "BAD_DE_META", 0, 0);
  2251			return ERR_PTR(-EPROTO);
  2252		}
  2253	
  2254		if (PAYLD_ID(payld) != tde->de.info->id) {
  2255			trace_scmi_tlm_access(tde->de.info->id, "DE_ID_MISMATCH", 0, 0);
  2256			return ERR_PTR(-ENODEV);
  2257		}
  2258	
  2259		/*
  2260		 * A valid line using BLK_TS should have been initialized with the
  2261		 * related BLK_TS when enabled.
  2262		 */
  2263		if (WARN_ON((USE_BLK_TS(payld) && !tde->bts))) {
  2264			trace_scmi_tlm_access(tde->de.info->id, "BAD_USE_BLK_TS", 0, 0);
> 2265			return ERR_PTR(-EPROTO);
  2266		}
  2267	
  2268		return payld;
  2269	}
  2270	

--
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:[~2026-06-13 20:26 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-13 20:25 [cris:scmi_telemetry_unified_fs_V4 14/34] drivers/firmware/arm_scmi/telemetry.c:2246:31: sparse: sparse: incorrect type in return expression (different address spaces) kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.