[PATCH] soc: qcom: smem: fix 32-bit overflow in DDR frequency calculation
From: Gopikrishna Garmidi
Date: Thu Aug 27 2026 - 04:13:43 EST
The DDR frequency in SMEM is reported in kHz and converted to Hz by
multiplying it by 1000. Since the SMEM frequency value is a u32, using
an unsuffixed integer constant causes the multiplication to be performed
with 32-bit arithmetic.
This overflows for DDR frequencies above 4294967 kHz, resulting in an
incorrect frequency being reported through the SMEM DRAM interface.
Use an unsigned long constant for the multiplication so the calculation
is performed with 64-bit arithmetic on the supported Qualcomm platforms.
Apply the fix consistently to the v3, v3.1, v4, v5, and v7 SMEM parsers.
Fixes: 1d234eeafc56 ("soc: qcom: smem: Expose DDR data from SMEM")
Signed-off-by: Gopikrishna Garmidi <gopikrishna.garmidi@xxxxxxxxxxxxxxxx>
---
drivers/soc/qcom/smem_dramc.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/soc/qcom/smem_dramc.c b/drivers/soc/qcom/smem_dramc.c
index 63ebe7f6db59..9612230a03be 100644
--- a/drivers/soc/qcom/smem_dramc.c
+++ b/drivers/soc/qcom/smem_dramc.c
@@ -219,7 +219,7 @@ static void smem_dram_parse_v3_data(struct smem_dram *dram, void *data)
if (freq_entry->freq_khz && freq_entry->enabled) {
u32 freq_khz = le32_to_cpu(freq_entry->freq_khz);
- dram->frequencies[dram->num_frequencies++] = 1000 * freq_khz;
+ dram->frequencies[dram->num_frequencies++] = 1000UL * freq_khz;
}
}
}
@@ -232,7 +232,7 @@ static void smem_dram_parse_v3_14freqs_data(struct smem_dram *dram, void *data)
struct ddr_freq_table *freq_entry = &details->ddr_freq_tbl.ddr_freq[i];
if (freq_entry->freq_khz && freq_entry->enabled)
- dram->frequencies[dram->num_frequencies++] = 1000 * freq_entry->freq_khz;
+ dram->frequencies[dram->num_frequencies++] = 1000UL * freq_entry->freq_khz;
}
}
@@ -248,7 +248,7 @@ static void smem_dram_parse_v4_data(struct smem_dram *dram, void *data)
if (freq_entry->freq_khz && freq_entry->enabled) {
u32 freq_khz = le32_to_cpu(freq_entry->freq_khz);
- dram->frequencies[dram->num_frequencies++] = 1000 * freq_khz;
+ dram->frequencies[dram->num_frequencies++] = 1000UL * freq_khz;
}
}
}
@@ -265,7 +265,7 @@ static void smem_dram_parse_v5_data(struct smem_dram *dram, void *data)
if (freq_entry->freq_khz && freq_entry->enabled) {
u32 freq_khz = le32_to_cpu(freq_entry->freq_khz);
- dram->frequencies[dram->num_frequencies++] = 1000 * freq_khz;
+ dram->frequencies[dram->num_frequencies++] = 1000UL * freq_khz;
}
}
}
@@ -282,7 +282,7 @@ static void smem_dram_parse_v7_data(struct smem_dram *dram, void *data)
if (freq_entry->freq_khz && freq_entry->enabled) {
u32 freq_khz = le32_to_cpu(freq_entry->freq_khz);
- dram->frequencies[dram->num_frequencies++] = 1000 * freq_khz;
+ dram->frequencies[dram->num_frequencies++] = 1000UL * freq_khz;
}
}
}
---
base-commit: f82a5da2f04960df9fb57489992d03dd5e64ec6f
change-id: 20260826-glymur_dramc-55f6a0508ae0
Best regards,
--
Gopikrishna Garmidi <gopikrishna.garmidi@xxxxxxxxxxxxxxxx>