sc7280: Add Modem region to avoid modem cleanup in Secboot reboot

Modem uses different memory regions based on LTE/WiFi.
This adds correct carve-out to prevent region being disturbed.

BUG=b:182963902
TEST=Validated on qualcomm sc7280 developement board

Signed-off-by: T Michael Turney <quic_mturney@quicinc.com>
Change-Id: I56bfb210606b08893ff71dd1b6679f1ec102ec95
Reviewed-on: https://review.coreboot.org/c/coreboot/+/58545
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Shelley Chen <shchen@google.com>
diff --git a/src/soc/qualcomm/common/include/soc/symbols_common.h b/src/soc/qualcomm/common/include/soc/symbols_common.h
index 7f3cfbb..7560266 100644
--- a/src/soc/qualcomm/common/include/soc/symbols_common.h
+++ b/src/soc/qualcomm/common/include/soc/symbols_common.h
@@ -25,5 +25,6 @@
 DECLARE_REGION(dram_wpss)
 DECLARE_REGION(shrm)
 DECLARE_REGION(dram_cpucp)
+DECLARE_REGION(dram_modem)
 
 #endif // _SOC_QUALCOMM_SYMBOLS_COMMON_H_
diff --git a/src/soc/qualcomm/sc7280/Makefile.inc b/src/soc/qualcomm/sc7280/Makefile.inc
index 4c83722..85508e9 100644
--- a/src/soc/qualcomm/sc7280/Makefile.inc
+++ b/src/soc/qualcomm/sc7280/Makefile.inc
@@ -31,10 +31,12 @@
 romstage-y += ../common/mmu.c
 romstage-y += mmu.c
 romstage-y += ../common/usb/usb.c
+romstage-y += carve_out.c
 romstage-$(CONFIG_DRIVERS_UART) += ../common/qupv3_uart.c
 
 ################################################################################
 ramstage-y += soc.c
+ramstage-y += carve_out.c
 ramstage-y += cbmem.c
 ramstage-$(CONFIG_DRIVERS_UART) += ../common/qupv3_uart.c
 ramstage-y += ../common/usb/usb.c
diff --git a/src/soc/qualcomm/sc7280/carve_out.c b/src/soc/qualcomm/sc7280/carve_out.c
new file mode 100644
index 0000000..d548235
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/carve_out.c
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <arch/stages.h>
+#include <soc/mmu_common.h>
+#include <soc/symbols_common.h>
+#include <device/mmio.h>
+
+#define MODEM_ONLY 0x004c5445
+
+bool soc_modem_carve_out(void **start, void **end)
+{
+	uint32_t modem_id = read32(_modem_id);
+
+	switch (modem_id) {
+	case MODEM_ONLY:
+		*start = _dram_modem;
+		*end = _edram_modem;
+		return true;
+	default:
+		return false;
+	}
+}
diff --git a/src/soc/qualcomm/sc7280/memlayout.ld b/src/soc/qualcomm/sc7280/memlayout.ld
index 57cdb59..1677dc4 100644
--- a/src/soc/qualcomm/sc7280/memlayout.ld
+++ b/src/soc/qualcomm/sc7280/memlayout.ld
@@ -56,6 +56,7 @@
 	REGION(dram_soc,  0x80900000, 0x200000, 0x1000)
 	REGION(dram_cpucp,0x80B00000, 0x100000, 0x1000)
 	REGION(dram_wlan, 0x80C00000, 0xC00000, 0x1000)
+	REGION(dram_modem, 0x8B800000, 0xF600000, 0x1000)
 	REGION(dram_wpss, 0x9AE00000, 0x1900000, 0x1000)
 	POSTRAM_CBFS_CACHE(0x9F800000, 16M)
 	RAMSTAGE(0xA0800000, 16M)
diff --git a/src/soc/qualcomm/sc7280/soc.c b/src/soc/qualcomm/sc7280/soc.c
index 8d27a46..98b62cc 100644
--- a/src/soc/qualcomm/sc7280/soc.c
+++ b/src/soc/qualcomm/sc7280/soc.c
@@ -9,6 +9,9 @@
 
 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_soc / KiB,
@@ -21,6 +24,8 @@
 				REGION_SIZE(dram_aop) / KiB);
 	reserved_ram_resource(dev, 5, (uintptr_t)_dram_cpucp / KiB,
 				REGION_SIZE(dram_cpucp) / KiB);
+	if (soc_modem_carve_out(&start, &end))
+		reserved_ram_resource(dev, 6, (uintptr_t)start / KiB, (end - start) / KiB);
 }
 
 static void soc_init(struct device *dev)