diff --git a/src/soc/mediatek/mt8183/dramc_param.c b/src/soc/mediatek/mt8183/dramc_param.c index ef3c19159f..bf1fee43a2 100644 --- a/src/soc/mediatek/mt8183/dramc_param.c +++ b/src/soc/mediatek/mt8183/dramc_param.c @@ -35,7 +35,6 @@ int validate_dramc_param(const void *blob) if (hdr->size != sizeof(*param)) return DRAMC_ERR_INVALID_SIZE; - /* TODO(hungte) Verify and check hdr->checksum. */ return DRAMC_SUCCESS; } diff --git a/src/soc/mediatek/mt8183/memory.c b/src/soc/mediatek/mt8183/memory.c index 3d7668d702..e48c56437c 100644 --- a/src/soc/mediatek/mt8183/memory.c +++ b/src/soc/mediatek/mt8183/memory.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -70,6 +71,12 @@ static void dump_param_header(const struct dramc_param *dparam) printk(BIOS_DEBUG, "header.checksum = %#x\n", header->checksum); } +static u32 compute_checksum(const struct dramc_param *dparam) +{ + return (u32)compute_ip_checksum(dparam->freq_params, + sizeof(dparam->freq_params)); +} + static int dram_run_fast_calibration(const struct dramc_param *dparam, u16 config) { @@ -88,6 +95,15 @@ static int dram_run_fast_calibration(const struct dramc_param *dparam, return -1; } + const u32 checksum = compute_checksum(dparam); + if (dparam->header.checksum != checksum) { + printk(BIOS_ERR, + "Invalid DRAM calibration checksum from flash " + "(expected: %#x, saved: %#x)\n", + checksum, dparam->header.checksum); + return -1; + } + return 0; } @@ -165,6 +181,7 @@ void mt_mem_init(struct dramc_param_ops *dparam_ops) printk(BIOS_INFO, "Successfully loaded DRAM blobs and " "ran DRAM calibration\n"); set_source_to_flash(dparam->freq_params); + dparam->header.checksum = compute_checksum(dparam); dparam_ops->write_to_flash(dparam); printk(BIOS_DEBUG, "Calibration params saved to flash: " "version=%#x, size=%#x\n",