Ravi kumar would like mturney mturney to review this change.

View Change

sc7280: Provide initial SoC support

Change-Id: I1fc841b3113f2bf79b8376cd1ccdb671c53c2084
Signed-off-by: T Michael Turney <mturney@codeaurora.org>
---
M Documentation/soc/qualcomm/index.md
A Documentation/soc/qualcomm/sc7280/index.md
A src/soc/qualcomm/sc7280/Kconfig
A src/soc/qualcomm/sc7280/Makefile.inc
A src/soc/qualcomm/sc7280/bootblock.c
A src/soc/qualcomm/sc7280/cbmem.c
A src/soc/qualcomm/sc7280/include/soc/addressmap.h
A src/soc/qualcomm/sc7280/include/soc/gpio.h
A src/soc/qualcomm/sc7280/include/soc/mmu.h
A src/soc/qualcomm/sc7280/include/soc/symbols.h
A src/soc/qualcomm/sc7280/memlayout.ld
A src/soc/qualcomm/sc7280/mmu.c
A src/soc/qualcomm/sc7280/qclib.c
A src/soc/qualcomm/sc7280/soc.c
A src/soc/qualcomm/sc7280/spi.c
A src/soc/qualcomm/sc7280/timer.c
16 files changed, 319 insertions(+), 0 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/05/45205/1
diff --git a/Documentation/soc/qualcomm/index.md b/Documentation/soc/qualcomm/index.md
index 5cd7981..d177c0e 100644
--- a/Documentation/soc/qualcomm/index.md
+++ b/Documentation/soc/qualcomm/index.md
@@ -5,3 +5,4 @@
## Platforms

- [SC7180 series](sc7180/index.md)
+- [SC7280 series](sc7280/index.md)
diff --git a/Documentation/soc/qualcomm/sc7280/index.md b/Documentation/soc/qualcomm/sc7280/index.md
new file mode 100644
index 0000000..9dad39c
--- /dev/null
+++ b/Documentation/soc/qualcomm/sc7280/index.md
@@ -0,0 +1,19 @@
+# Qualcomm SC7280 documentation
+
+## SOC code
+
+The SOC folder contains functions for:
+* MMU
+* CLOCK
+* GPIO
+* QUPv3 FW (provides a bridge to serial interfaces)
+* UART
+* SPI-NOR
+* AOP FW
+* USB
+
+## Notes about the hardware
+
+The timer is used from the ARMv8 architecture specific code.
+
+
diff --git a/src/soc/qualcomm/sc7280/Kconfig b/src/soc/qualcomm/sc7280/Kconfig
new file mode 100644
index 0000000..fc2f34b
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/Kconfig
@@ -0,0 +1,27 @@
+
+config SOC_QUALCOMM_SC7280
+ bool
+ default n
+ select ARCH_BOOTBLOCK_ARMV8_64
+ select ARCH_RAMSTAGE_ARMV8_64
+ select ARCH_ROMSTAGE_ARMV8_64
+ select ARCH_VERSTAGE_ARMV8_64
+ select GENERIC_GPIO_LIB
+ select GENERIC_UDELAY
+ select HAVE_MONOTONIC_TIMER
+ select ARM64_USE_ARCH_TIMER
+ select SOC_QUALCOMM_COMMON
+
+if SOC_QUALCOMM_SC7280
+
+config MEMLAYOUT_LD_FILE
+ string
+ default "src/soc/qualcomm/sc7280/memlayout.ld"
+
+config VBOOT
+ select VBOOT_SEPARATE_VERSTAGE
+ select VBOOT_RETURN_FROM_VERSTAGE
+ select VBOOT_MUST_REQUEST_DISPLAY
+ select VBOOT_STARTS_IN_BOOTBLOCK
+
+endif
diff --git a/src/soc/qualcomm/sc7280/Makefile.inc b/src/soc/qualcomm/sc7280/Makefile.inc
new file mode 100644
index 0000000..2bed326
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/Makefile.inc
@@ -0,0 +1,36 @@
+
+ifeq ($(CONFIG_SOC_QUALCOMM_SC7280),y)
+
+################################################################################
+bootblock-y += bootblock.c
+bootblock-y += mmu.c
+bootblock-y += timer.c
+bootblock-y += spi.c
+
+################################################################################
+verstage-y += timer.c
+verstage-y += spi.c
+
+################################################################################
+romstage-y += cbmem.c
+romstage-y += timer.c
+romstage-y += ../common/qclib.c
+romstage-y += qclib.c
+romstage-y += ../common/mmu.c
+romstage-y += mmu.c
+romstage-y += spi.c
+
+################################################################################
+ramstage-y += soc.c
+ramstage-y += cbmem.c
+ramstage-y += timer.c
+ramstage-y += spi.c
+
+################################################################################
+
+CPPFLAGS_common += -Isrc/soc/qualcomm/sc7280/include
+CPPFLAGS_common += -Isrc/soc/qualcomm/common/include
+
+################################################################################
+
+endif
diff --git a/src/soc/qualcomm/sc7280/bootblock.c b/src/soc/qualcomm/sc7280/bootblock.c
new file mode 100644
index 0000000..807bb25
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/bootblock.c
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <bootblock_common.h>
+#include <soc/mmu.h>
+
+void bootblock_soc_init(void)
+{
+ sc7280_mmu_init();
+}
diff --git a/src/soc/qualcomm/sc7280/cbmem.c b/src/soc/qualcomm/sc7280/cbmem.c
new file mode 100644
index 0000000..4b9eb37
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/cbmem.c
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <cbmem.h>
+
+void *cbmem_top_chipset(void)
+{
+ return (void *)((uintptr_t)4 * GiB);
+}
diff --git a/src/soc/qualcomm/sc7280/include/soc/addressmap.h b/src/soc/qualcomm/sc7280/include/soc/addressmap.h
new file mode 100644
index 0000000..70d17be
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/include/soc/addressmap.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _SOC_QUALCOMM_SC7280_ADDRESS_MAP_H_
+#define _SOC_QUALCOMM_SC7280_ADDRESS_MAP_H_
+
+#include <stdint.h>
+
+#endif /* __SOC_QUALCOMM_SC7280_ADDRESS_MAP_H__ */
diff --git a/src/soc/qualcomm/sc7280/include/soc/gpio.h b/src/soc/qualcomm/sc7280/include/soc/gpio.h
new file mode 100644
index 0000000..82a0c39
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/include/soc/gpio.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _SOC_QUALCOMM_SC7280_GPIO_H_
+#define _SOC_QUALCOMM_SC7280_GPIO_H_
+
+#include <types.h>
+
+typedef struct {
+ u32 addr;
+} gpio_t;
+
+#endif /* _SOC_QUALCOMM_SC7280_GPIO_H_ */
diff --git a/src/soc/qualcomm/sc7280/include/soc/mmu.h b/src/soc/qualcomm/sc7280/include/soc/mmu.h
new file mode 100644
index 0000000..5a2984f
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/include/soc/mmu.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _SOC_QUALCOMM_SC7280_MMU_H_
+#define _SOC_QUALCOMM_SC7280_MMU_H_
+
+void sc7280_mmu_init(void);
+
+#endif /* _SOC_QUALCOMM_SC7280_MMU_H_ */
diff --git a/src/soc/qualcomm/sc7280/include/soc/symbols.h b/src/soc/qualcomm/sc7280/include/soc/symbols.h
new file mode 100644
index 0000000..e930638
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/include/soc/symbols.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _SOC_QUALCOMM_SC7280_SYMBOLS_H_
+#define _SOC_QUALCOMM_SC7280_SYMBOLS_H_
+
+#include <symbols.h>
+
+DECLARE_REGION(ssram)
+DECLARE_REGION(bsram)
+DECLARE_REGION(dram_aop)
+DECLARE_REGION(dram_soc)
+DECLARE_REGION(dcb)
+DECLARE_REGION(pmic)
+DECLARE_REGION(limits_cfg)
+DECLARE_REGION(aop)
+
+#endif /* _SOC_QUALCOMM_SC7280_SYMBOLS_H_ */
diff --git a/src/soc/qualcomm/sc7280/memlayout.ld b/src/soc/qualcomm/sc7280/memlayout.ld
new file mode 100644
index 0000000..94300e8
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/memlayout.ld
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <memlayout.h>
+#include <arch/header.ld>
+
+/* SYSTEM_IMEM : 0x14680000 - 0x146AE000 */
+#define SSRAM_START(addr) SYMBOL(ssram, addr)
+#define SSRAM_END(addr) SYMBOL(essram, addr)
+
+/* BOOT_IMEM : 0x14800000 - 0x14980000 */
+#define BSRAM_START(addr) SYMBOL(bsram, addr)
+#define BSRAM_END(addr) SYMBOL(ebsram, addr)
+
+/* AOP : 0x0B000000 - 0x0B100000 */
+#define AOPSRAM_START(addr) SYMBOL(aopsram, addr)
+#define AOPSRAM_END(addr) SYMBOL(eaopsram, addr)
+
+SECTIONS
+{
+ AOPSRAM_START(0x0B000000)
+ REGION(aop, 0x0B000000, 0x100000, 4096)
+ AOPSRAM_END(0x0B100000)
+
+ SSRAM_START(0x14680000)
+ OVERLAP_VERSTAGE_ROMSTAGE(0x14680000, 100K)
+ REGION(qcsdi, 0x14699000, 52K, 4K)
+ SSRAM_END(0x146AE000)
+
+ BSRAM_START(0x14800000)
+ REGION(pbl_timestamps, 0x14800000, 84K, 4K)
+ BOOTBLOCK(0x14815000, 40K)
+ PRERAM_CBFS_CACHE(0x1481F000, 70K)
+ PRERAM_CBMEM_CONSOLE(0x14830800, 32K)
+ TIMESTAMP(0x14838800, 1K)
+ TTB(0x14839000, 56K)
+ STACK(0x14847000, 16K)
+ VBOOT2_WORK(0x1484B000, 12K)
+ DMA_COHERENT(0x1484E000, 8K)
+ REGION(ddr_training, 0x14850000, 8K, 4K)
+ REGION(qclib_serial_log, 0x14852000, 4K, 4K)
+ REGION(ddr_information, 0x14853000, 1K, 1K)
+ FMAP_CACHE(0x14853400, 2K)
+ REGION(dcb, 0x1485b000, 16K, 4K)
+ REGION(pmic, 0x1485f000, 44K, 4K)
+ REGION(limits_cfg, 0x1486a000, 4K, 4K)
+ REGION(qclib, 0x1486b000, 596K, 4K)
+ BSRAM_END(0x14900000)
+
+ DRAM_START(0x80000000)
+ /* Various hardware/software subsystems make use of this area */
+ REGION(dram_aop, 0x80800000, 0x040000, 0x1000)
+ REGION(dram_soc, 0x80900000, 0x200000, 0x1000)
+ BL31(0x80B00000, 1M)
+ POSTRAM_CBFS_CACHE(0x9F800000, 16M)
+ RAMSTAGE(0xA0800000, 16M)
+}
diff --git a/src/soc/qualcomm/sc7280/mmu.c b/src/soc/qualcomm/sc7280/mmu.c
new file mode 100644
index 0000000..9905c29
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/mmu.c
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <symbols.h>
+#include <arch/mmu.h>
+#include <arch/cache.h>
+#include <soc/mmu.h>
+#include <soc/mmu_common.h>
+#include <soc/symbols.h>
+
+void sc7280_mmu_init(void)
+{
+ mmu_init();
+
+ mmu_config_range((void *)(4 * KiB), ((4UL * GiB) - (4 * KiB)), DEV_MEM);
+ mmu_config_range((void *)_ssram, REGION_SIZE(ssram), CACHED_RAM);
+ mmu_config_range((void *)_bsram, REGION_SIZE(bsram), CACHED_RAM);
+ mmu_config_range((void *)_dma_coherent, REGION_SIZE(dma_coherent),
+ UNCACHED_RAM);
+
+ mmu_enable();
+}
diff --git a/src/soc/qualcomm/sc7280/qclib.c b/src/soc/qualcomm/sc7280/qclib.c
new file mode 100644
index 0000000..6affc63
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/qclib.c
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <cbfs.h>
+#include <fmap.h>
+#include <console/console.h>
+#include <soc/symbols.h>
+#include <soc/qclib_common.h>
+
+int qclib_soc_blob_load(void)
+{
+ size_t size;
+ ssize_t ssize;
+
+ /* Attempt to load PMICCFG Blob */
+ size = cbfs_boot_load_file(CONFIG_CBFS_PREFIX "/pmiccfg",
+ _pmic, REGION_SIZE(pmic), CBFS_TYPE_RAW);
+ if (!size)
+ return -1;
+ qclib_add_if_table_entry(QCLIB_TE_PMIC_SETTINGS, _pmic, size, 0);
+
+ /* Attempt to load DCB Blob */
+ size = cbfs_boot_load_file(CONFIG_CBFS_PREFIX "/dcb",
+ _dcb, REGION_SIZE(dcb), CBFS_TYPE_RAW);
+ if (!size)
+ return -1;
+ qclib_add_if_table_entry(QCLIB_TE_DCB_SETTINGS, _dcb, size, 0);
+
+ /* Attempt to load Limits Config Blob */
+ ssize = fmap_read_area(QCLIB_FR_LIMITS_CFG_DATA, _limits_cfg,
+ REGION_SIZE(limits_cfg));
+ if (ssize < 0)
+ return -1;
+ qclib_add_if_table_entry(QCLIB_TE_LIMITS_CFG_DATA,
+ _limits_cfg, ssize, 0);
+
+ return 0;
+}
diff --git a/src/soc/qualcomm/sc7280/soc.c b/src/soc/qualcomm/sc7280/soc.c
new file mode 100644
index 0000000..7233d38
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/soc.c
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <symbols.h>
+#include <device/device.h>
+#include <soc/mmu.h>
+#include <soc/mmu_common.h>
+#include <soc/symbols.h>
+
+static void soc_read_resources(struct device *dev)
+{
+ ram_resource(dev, 0, (uintptr_t)ddr_region->offset / KiB,
+ ddr_region->size / KiB);
+ reserved_ram_resource(dev, 1, (uintptr_t)_dram_soc / KiB,
+ REGION_SIZE(dram_soc) / KiB);
+}
+
+static void soc_init(struct device *dev)
+{
+}
+
+static struct device_operations soc_ops = {
+ .read_resources = soc_read_resources,
+ .init = soc_init,
+};
+
+static void enable_soc_dev(struct device *dev)
+{
+ dev->ops = &soc_ops;
+}
+
+struct chip_operations soc_qualcomm_sc7280_ops = {
+ CHIP_NAME("SOC Qualcomm SC7280")
+ .enable_dev = enable_soc_dev,
+};
diff --git a/src/soc/qualcomm/sc7280/spi.c b/src/soc/qualcomm/sc7280/spi.c
new file mode 100644
index 0000000..50aa395
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/spi.c
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <spi-generic.h>
+#include <spi_flash.h>
+
+static const struct spi_ctrlr spi_ctrlr;
+
+const struct spi_ctrlr_buses spi_ctrlr_bus_map[] = {
+ {
+ .ctrlr = &spi_ctrlr,
+ .bus_start = CONFIG_BOOT_DEVICE_SPI_FLASH_BUS,
+ .bus_end = CONFIG_BOOT_DEVICE_SPI_FLASH_BUS,
+ },
+};
+
+const size_t spi_ctrlr_bus_map_count = ARRAY_SIZE(spi_ctrlr_bus_map);
diff --git a/src/soc/qualcomm/sc7280/timer.c b/src/soc/qualcomm/sc7280/timer.c
new file mode 100644
index 0000000..19e466a
--- /dev/null
+++ b/src/soc/qualcomm/sc7280/timer.c
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <delay.h>
+#include <arch/lib_helpers.h>
+#include <commonlib/helpers.h>
+
+void init_timer(void)
+{
+ raw_write_cntfrq_el0(19200*KHz);
+}

To view, visit change 45205. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I1fc841b3113f2bf79b8376cd1ccdb671c53c2084
Gerrit-Change-Number: 45205
Gerrit-PatchSet: 1
Gerrit-Owner: Ravi kumar <rbokka@codeaurora.org>
Gerrit-Reviewer: mturney mturney <mturney@codeaurora.org>
Gerrit-MessageType: newchange