lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <202601150105.Pod3agMP-lkp@intel.com>
Date: Thu, 15 Jan 2026 00:36:02 +0800
From: kernel test robot <lkp@...el.com>
To: Konrad Dybcio <konradybcio@...nel.org>,
	Bjorn Andersson <andersson@...nel.org>, Kees Cook <kees@...nel.org>,
	"Gustavo A. R. Silva" <gustavoars@...nel.org>,
	Rob Clark <robin.clark@....qualcomm.com>,
	Sean Paul <sean@...rly.run>,
	Akhil P Oommen <akhilpo@....qualcomm.com>,
	Dmitry Baryshkov <lumag@...nel.org>,
	Abhinav Kumar <abhinav.kumar@...ux.dev>,
	Jessica Zhang <jesszhan0024@...il.com>,
	Marijn Suijten <marijn.suijten@...ainline.org>,
	David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>
Cc: oe-kbuild-all@...ts.linux.dev, linux-kernel@...r.kernel.org,
	linux-arm-msm@...r.kernel.org, linux-hardening@...r.kernel.org,
	dri-devel@...ts.freedesktop.org, freedreno@...ts.freedesktop.org
Subject: Re: [PATCH v3 1/3] soc: qcom: smem: Expose DDR data from SMEM

Hi Konrad,

kernel test robot noticed the following build warnings:

[auto build test WARNING on fc4e91c639c0af93d63c3d5bc0ee45515dd7504a]

url:    https://github.com/intel-lab-lkp/linux/commits/Konrad-Dybcio/soc-qcom-smem-Expose-DDR-data-from-SMEM/20260108-222445
base:   fc4e91c639c0af93d63c3d5bc0ee45515dd7504a
patch link:    https://lore.kernel.org/r/20260108-topic-smem_dramc-v3-1-6b64df58a017%40oss.qualcomm.com
patch subject: [PATCH v3 1/3] soc: qcom: smem: Expose DDR data from SMEM
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20260115/202601150105.Pod3agMP-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260115/202601150105.Pod3agMP-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@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601150105.Pod3agMP-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In function 'smem_dram_parse_v3_data',
       inlined from 'smem_dram_parse' at drivers/soc/qcom/smem_dramc.c:380:3:
>> drivers/soc/qcom/smem_dramc.c:216:31: warning: iteration 13 invokes undefined behavior [-Waggressive-loop-optimizations]
     216 |                 if (freq_entry->freq_khz && freq_entry->enabled)
         |                     ~~~~~~~~~~^~~~~~~~~~
   drivers/soc/qcom/smem_dramc.c:213:27: note: within this loop
     213 |         for (int i = 0; i < num_freq_entries; i++) {
         |                         ~~^~~~~~~~~~~~~~~~~~
--
>> Warning: drivers/soc/qcom/smem.c:293 struct member 'debugfs_dir' not described in 'qcom_smem'
>> Warning: drivers/soc/qcom/smem.c:293 struct member 'debugfs_dir' not described in 'qcom_smem'


vim +216 drivers/soc/qcom/smem_dramc.c

   203	
   204	static void smem_dram_parse_v3_data(struct smem_dram *dram, void *data, bool additional_freq_entry)
   205	{
   206		/* This may be 13 or 14 */
   207		int num_freq_entries = MAX_DDR_FREQ_NUM_V3;
   208		struct ddr_details_v3 *details = data;
   209	
   210		if (additional_freq_entry)
   211			num_freq_entries++;
   212	
   213		for (int i = 0; i < num_freq_entries; i++) {
   214			struct ddr_freq_table *freq_entry = &details->ddr_freq_tbl.ddr_freq[i];
   215	
 > 216			if (freq_entry->freq_khz && freq_entry->enabled)
   217				dram->frequencies[dram->num_frequencies++] = 1000 * freq_entry->freq_khz;
   218		}
   219	}
   220	
   221	static void smem_dram_parse_v4_data(struct smem_dram *dram, void *data)
   222	{
   223		struct ddr_details_v4 *details = data;
   224	
   225		/* Rank 0 channel 0 entry holds the correct value */
   226		dram->hbb = details->highest_bank_addr_bit[0][0];
   227	
   228		for (int i = 0; i < MAX_DDR_FREQ_NUM_V3; i++) {
   229			struct ddr_freq_table *freq_entry = &details->ddr_freq_tbl.ddr_freq[i];
   230	
   231			if (freq_entry->freq_khz && freq_entry->enabled)
   232				dram->frequencies[dram->num_frequencies++] = 1000 * freq_entry->freq_khz;
   233		}
   234	}
   235	
   236	static void smem_dram_parse_v5_data(struct smem_dram *dram, void *data)
   237	{
   238		struct ddr_details_v5 *details = data;
   239		struct ddr_regions_v5 *region = &details->ddr_regions;
   240	
   241		dram->hbb = region[0].highest_bank_addr_bit;
   242	
   243		for (int i = 0; i < MAX_DDR_FREQ_NUM_V5; i++) {
   244			struct ddr_freq_table *freq_entry = &details->ddr_freq_tbl.ddr_freq[i];
   245	
   246			if (freq_entry->freq_khz && freq_entry->enabled)
   247				dram->frequencies[dram->num_frequencies++] = 1000 * freq_entry->freq_khz;
   248		}
   249	}
   250	
   251	static void smem_dram_parse_v7_data(struct smem_dram *dram, void *data)
   252	{
   253		struct ddr_details_v7 *details = data;
   254		struct ddr_regions_v5 *region = &details->ddr_regions;
   255	
   256		dram->hbb = region[0].highest_bank_addr_bit;
   257	
   258		for (int i = 0; i < MAX_DDR_FREQ_NUM_V5; i++) {
   259			struct ddr_freq_table *freq_entry = &details->ddr_freq_tbl.ddr_freq[i];
   260	
   261			if (freq_entry->freq_khz && freq_entry->enabled)
   262				dram->frequencies[dram->num_frequencies++] = 1000 * freq_entry->freq_khz;
   263		}
   264	}
   265	
   266	/* The structure contains no version field, so we have to perform some guesswork.. */
   267	static int smem_dram_infer_struct_version(size_t size)
   268	{
   269		/* Some early versions provided less bytes of less useful data */
   270		if (size < sizeof(struct ddr_details_v3))
   271			return -EINVAL;
   272	
   273		if (size == sizeof(struct ddr_details_v3))
   274			return INFO_V3;
   275	
   276		if (size == sizeof(struct ddr_details_v3)
   277			 + sizeof(struct ddr_freq_table))
   278			return INFO_V3_WITH_14_FREQS;
   279	
   280		if (size == sizeof(struct ddr_details_v4))
   281			return INFO_V4;
   282	
   283		if (size == sizeof(struct ddr_details_v5)
   284			 + 4 * sizeof(struct ddr_region_v5))
   285			return INFO_V5;
   286	
   287		if (size == sizeof(struct ddr_details_v5)
   288			 + 4 * sizeof(struct ddr_region_v5)
   289			 + sizeof(struct ddr_xbl2quantum_smem_data)
   290			 + sizeof(struct shub_freq_plan_entry))
   291			return INFO_V5;
   292	
   293		if (size == sizeof(struct ddr_details_v5)
   294			 + 6 * sizeof(struct ddr_region_v5))
   295			return INFO_V5_WITH_6_REGIONS;
   296	
   297		if (size == sizeof(struct ddr_details_v5)
   298			 + 6 * sizeof(struct ddr_region_v5)
   299			 + sizeof(struct ddr_xbl2quantum_smem_data)
   300			 + sizeof(struct shub_freq_plan_entry))
   301			return INFO_V5_WITH_6_REGIONS;
   302	
   303		if (size == sizeof(struct ddr_details_v5)
   304			 + 6 * sizeof(struct ddr_region_v5)
   305			 + sizeof(struct ddr_misc_info_v6)
   306			 + sizeof(struct shub_freq_plan_entry))
   307			return INFO_V6;
   308	
   309		if (size == sizeof(struct ddr_details_v7)
   310			 + 4 * sizeof(struct ddr_region_v5)
   311			 + sizeof(struct ddr_misc_info_v6)
   312			 + sizeof(struct shub_freq_plan_entry))
   313			return INFO_V7;
   314	
   315		if (size == sizeof(struct ddr_details_v7)
   316			 + 6 * sizeof(struct ddr_region_v5)
   317			 + sizeof(struct ddr_misc_info_v6)
   318			 + sizeof(struct shub_freq_plan_entry))
   319			return INFO_V7_WITH_6_REGIONS;
   320	
   321		return INFO_UNKNOWN;
   322	}
   323	
   324	static int smem_dram_frequencies_show(struct seq_file *s, void *unused)
   325	{
   326		struct smem_dram *dram = s->private;
   327	
   328		for (int i = 0; i < dram->num_frequencies; i++)
   329			seq_printf(s, "%lu\n", dram->frequencies[i]);
   330	
   331		return 0;
   332	}
   333	DEFINE_SHOW_ATTRIBUTE(smem_dram_frequencies);
   334	
   335	static int smem_hbb_show(struct seq_file *s, void *unused)
   336	{
   337		struct smem_dram *dram = s->private;
   338	
   339		if (!dram->hbb)
   340			return -EINVAL;
   341	
   342		seq_printf(s, "%d\n", dram->hbb);
   343	
   344		return 0;
   345	}
   346	DEFINE_SHOW_ATTRIBUTE(smem_hbb);
   347	
   348	struct dentry *smem_dram_parse(struct device *dev)
   349	{
   350		struct dentry *debugfs_dir;
   351		enum ddr_info_version ver;
   352		struct smem_dram *dram;
   353		size_t actual_size;
   354		void *data = NULL;
   355	
   356		/* No need to check qcom_smem_is_available(), this func is called by the SMEM driver */
   357		data = qcom_smem_get(QCOM_SMEM_HOST_ANY, SMEM_DDR_INFO_ID, &actual_size);
   358		if (IS_ERR_OR_NULL(data))
   359			return ERR_PTR(-ENODATA);
   360	
   361		ver = smem_dram_infer_struct_version(actual_size);
   362		if (ver < 0) {
   363			/* Some SoCs don't provide data that's useful for us */
   364			return ERR_PTR(-ENODATA);
   365		} else if (ver == INFO_UNKNOWN) {
   366			/* In other cases, we may not have added support for a newer struct revision */
   367			pr_err("Found an unknown type of DRAM info struct (size = %zu)\n", actual_size);
   368			return ERR_PTR(-EINVAL);
   369		}
   370	
   371		dram = devm_kzalloc(dev, sizeof(*dram), GFP_KERNEL);
   372		if (!dram)
   373			return ERR_PTR(-ENOMEM);
   374	
   375		switch (ver) {
   376		case INFO_V3:
   377			smem_dram_parse_v3_data(dram, data, false);
   378			break;
   379		case INFO_V3_WITH_14_FREQS:
 > 380			smem_dram_parse_v3_data(dram, data, true);

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ