diff --git a/board/qca/arm/common/fdt_fixup.c b/board/qca/arm/common/fdt_fixup.c index e4b2d93f0b..e1a07f1afe 100644 --- a/board/qca/arm/common/fdt_fixup.c +++ b/board/qca/arm/common/fdt_fixup.c @@ -486,6 +486,10 @@ __weak void fdt_fixup_sd_ldo_gpios_toggle(void *blob) return; } +__weak void fdt_low_memory_fixup(void *blob) +{ + return; +} __weak void fdt_fixup_cpr(void *blob) { @@ -587,6 +591,7 @@ int ft_board_setup(void *blob, bd_t *bd) fdt_fixup_auto_restart(blob); fdt_fixup_sd_ldo_gpios_toggle(blob); fdt_fixup_cpr(blob); + fdt_low_memory_fixup(blob); #ifdef CONFIG_QCA_MMC board_mmc_deinit(); diff --git a/board/qca/arm/ipq807x/ipq807x.c b/board/qca/arm/ipq807x/ipq807x.c index 7c94b777c0..f70548467a 100644 --- a/board/qca/arm/ipq807x/ipq807x.c +++ b/board/qca/arm/ipq807x/ipq807x.c @@ -1180,6 +1180,39 @@ void fdt_fixup_cpr(void *blob) return; } +void fdt_low_memory_fixup(void *blob) +{ + int node; + int len; + u64 *reg; + char *wcnss_node = "/reserved-memory/wcnss@4b000000"; + char *wifi_dump_node = "/reserved-memory/wifi_dump@50500000"; + unsigned int wcnss_size = 0x03700000; + unsigned int wifi_dump_size = 0x200000; + char *mem_mode = getenv("low_mem_mode"); + + if (!mem_mode) + return; + + node = fdt_path_offset(blob, wcnss_node); + if (node >= 0) { + reg = (u64 *)fdt_getprop(blob, node, "reg", &len); + if (reg != NULL) + reg[1] = cpu_to_fdt64(wcnss_size); + } else { + printf("Node \"%s\" not found\n", wcnss_node); + } + + node = fdt_path_offset(blob, wifi_dump_node); + if (node >= 0) { + reg = (u64 *)fdt_getprop(blob, node, "reg", &len); + if (reg != NULL) + reg[1] = cpu_to_fdt64(wifi_dump_size); + } else { + printf("Node \"%s\" not found\n", wifi_dump_node); + } +} + void set_flash_secondary_type(qca_smem_flash_info_t *smem) { return;