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/[email protected]/config) compiler: m68k-linux-gcc (GCC) 15.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260115/[email protected]/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 <[email protected]> | Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/ 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
