sc7180: Add Modem region in memlayout to avoid modem cleanup in Secboot reboot.

two different modem regions wifi and lte to be handled in QC_SEC and modem

Change-Id: Ib4592ca66d3d0db4c4768be4cd27422fe9f786b8
Signed-off-by: Ravi Kumar Bokka <rbokka@codeaurora.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/46661
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
diff --git a/src/soc/qualcomm/common/include/soc/mmu_common.h b/src/soc/qualcomm/common/include/soc/mmu_common.h
index a38196f..b6c8aab 100644
--- a/src/soc/qualcomm/common/include/soc/mmu_common.h
+++ b/src/soc/qualcomm/common/include/soc/mmu_common.h
@@ -14,5 +14,6 @@
 
 void soc_mmu_dram_config_post_dram_init(void);
 void qc_mmu_dram_config_post_dram_init(void *ddr_base, size_t ddr_size);
+bool soc_modem_carve_out(void **start, void **end);
 
 #endif  /* _SOC_QUALCOMM_MMU_COMMON_H_ */
diff --git a/src/soc/qualcomm/common/mmu.c b/src/soc/qualcomm/common/mmu.c
index 4f606be..ba1173e 100644
--- a/src/soc/qualcomm/common/mmu.c
+++ b/src/soc/qualcomm/common/mmu.c
@@ -4,10 +4,19 @@
 #include <soc/mmu.h>
 #include <soc/mmu_common.h>
 
+__weak bool soc_modem_carve_out(void **start, void **end) { return false; }
 __weak void soc_mmu_dram_config_post_dram_init(void) { /* no-op */ }
 
 void qc_mmu_dram_config_post_dram_init(void *ddr_base, size_t ddr_size)
 {
-	mmu_config_range((void *)ddr_base, ddr_size, CACHED_RAM);
+	void *start = NULL;
+	void *end = NULL;
+
+	if (!soc_modem_carve_out(&start, &end)) {
+		mmu_config_range((void *)ddr_base, ddr_size, CACHED_RAM);
+	} else {
+		mmu_config_range(ddr_base, start - ddr_base, CACHED_RAM);
+		mmu_config_range(end, ddr_base + ddr_size - end, CACHED_RAM);
+	}
 	soc_mmu_dram_config_post_dram_init();
 }
diff --git a/src/soc/qualcomm/sc7180/Makefile.inc b/src/soc/qualcomm/sc7180/Makefile.inc
index 7f52a9a..07d2652 100644
--- a/src/soc/qualcomm/sc7180/Makefile.inc
+++ b/src/soc/qualcomm/sc7180/Makefile.inc
@@ -45,6 +45,7 @@
 romstage-y += gpio.c
 romstage-y += qupv3_i2c.c
 romstage-y += clock.c
+romstage-y += carve_out.c
 romstage-$(CONFIG_SC7180_QSPI) += qspi.c
 romstage-y += qcom_qup_se.c
 romstage-y += qupv3_config.c
@@ -52,6 +53,7 @@
 
 ################################################################################
 ramstage-y += soc.c
+ramstage-y += carve_out.c
 ramstage-y += timer.c
 ramstage-y += spi.c
 ramstage-y += qupv3_spi.c
diff --git a/src/soc/qualcomm/sc7180/carve_out.c b/src/soc/qualcomm/sc7180/carve_out.c
new file mode 100644
index 0000000..960b923
--- /dev/null
+++ b/src/soc/qualcomm/sc7180/carve_out.c
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <arch/stages.h>
+#include <soc/mmu_common.h>
+#include <soc/symbols.h>
+#include <device/mmio.h>
+#include <string.h>
+
+#define MODEM_ID_LTE 0x004c5445
+#define MODEM_ID_WIFI 0x57494649
+
+bool soc_modem_carve_out(void **start, void **end)
+{
+	uint32_t modem_id = read32(_modem_id);
+
+	switch (modem_id) {
+	case MODEM_ID_LTE:
+		*start = _dram_modem_wifi_only;
+		*end = _edram_modem_extra;
+		return true;
+	case MODEM_ID_WIFI:
+		*start = _dram_modem_wifi_only;
+		*end = _edram_modem_wifi_only;
+		return true;
+	default:
+		return false;
+	}
+}
diff --git a/src/soc/qualcomm/sc7180/include/soc/symbols.h b/src/soc/qualcomm/sc7180/include/soc/symbols.h
index f15a8bb..207bc43 100644
--- a/src/soc/qualcomm/sc7180/include/soc/symbols.h
+++ b/src/soc/qualcomm/sc7180/include/soc/symbols.h
@@ -9,9 +9,12 @@
 DECLARE_REGION(bsram)
 DECLARE_REGION(dram_aop)
 DECLARE_REGION(dram_soc)
+DECLARE_REGION(dram_modem_wifi_only)
+DECLARE_REGION(dram_modem_extra)
 DECLARE_REGION(dcb)
 DECLARE_REGION(pmic)
 DECLARE_REGION(limits_cfg)
 DECLARE_REGION(aop)
+DECLARE_REGION(modem_id)
 
 #endif /* _SOC_QUALCOMM_SC7180_SYMBOLS_H_ */
diff --git a/src/soc/qualcomm/sc7180/memlayout.ld b/src/soc/qualcomm/sc7180/memlayout.ld
index ce08478..65e50d1 100644
--- a/src/soc/qualcomm/sc7180/memlayout.ld
+++ b/src/soc/qualcomm/sc7180/memlayout.ld
@@ -24,6 +24,7 @@
 	SSRAM_START(0x14680000)
 	OVERLAP_DECOMPRESSOR_VERSTAGE_ROMSTAGE(0x14680000, 100K)
 	REGION(qcsdi, 0x14699000, 52K, 4K)
+	REGION(modem_id, 0x146ABD00, 4, 4)
 	SSRAM_END(0x146AE000)
 
 	BSRAM_START(0x14800000)
@@ -51,6 +52,8 @@
 	REGION(dram_aop,  0x80800000, 0x040000, 0x1000)
 	REGION(dram_soc,  0x80900000, 0x200000, 0x1000)
 	BL31(0x80B00000, 1M)
+	REGION(dram_modem_wifi_only, 0x86000000, 32M, 4)
+	REGION(dram_modem_extra, 0x88000000, 108M, 4)
 	POSTRAM_CBFS_CACHE(0x9F800000, 16M)
 	RAMSTAGE(0xA0800000, 16M)
 }
diff --git a/src/soc/qualcomm/sc7180/soc.c b/src/soc/qualcomm/sc7180/soc.c
index 74f0868..d8cade4 100644
--- a/src/soc/qualcomm/sc7180/soc.c
+++ b/src/soc/qualcomm/sc7180/soc.c
@@ -9,12 +9,17 @@
 
 static void soc_read_resources(struct device *dev)
 {
+	void *start = NULL;
+	void *end = NULL;
+
 	ram_resource(dev, 0, (uintptr_t)ddr_region->offset / KiB,
 				ddr_region->size / KiB);
 	reserved_ram_resource(dev, 1, (uintptr_t)_dram_aop / KiB,
 				REGION_SIZE(dram_aop) / KiB);
 	reserved_ram_resource(dev, 2, (uintptr_t)_dram_soc / KiB,
 				REGION_SIZE(dram_soc) / KiB);
+	if (soc_modem_carve_out(&start, &end))
+		reserved_ram_resource(dev, 3, (uintptr_t)start / KiB, (end - start) / KiB);
 }
 
 static void soc_init(struct device *dev)