From 5afeba30a3637792d8619d52572f95b3e80e76fb Mon Sep 17 00:00:00 2001 From: Ravi Kumar Bokka Date: Mon, 4 Jan 2021 14:28:14 +0530 Subject: [PATCH] sc7280: Add SHRM firmware support SHRM is a system hardware resource manager. It is used to manage run time DDRSS activities. DDRSS stands for DDR subsystem. BUG=b:182963902 TEST=Validated on qualcomm sc7280 development board by trying DDR clocks which through SHRM RSI command. Change-Id: I44484573a829eaefbd34907c6fe78d427506a762 Signed-off-by: Ravi Kumar Bokka Reviewed-on: https://review.coreboot.org/c/coreboot/+/49392 Tested-by: build bot (Jenkins) Reviewed-by: Shelley Chen --- src/mainboard/google/herobrine/romstage.c | 2 ++ .../common/include/soc/symbols_common.h | 1 + src/soc/qualcomm/sc7280/Makefile.inc | 9 ++++++++ src/soc/qualcomm/sc7280/include/soc/shrm.h | 8 +++++++ src/soc/qualcomm/sc7280/memlayout.ld | 2 ++ src/soc/qualcomm/sc7280/shrm_load_reset.c | 22 +++++++++++++++++++ 6 files changed, 44 insertions(+) create mode 100644 src/soc/qualcomm/sc7280/include/soc/shrm.h create mode 100644 src/soc/qualcomm/sc7280/shrm_load_reset.c diff --git a/src/mainboard/google/herobrine/romstage.c b/src/mainboard/google/herobrine/romstage.c index 64aeaaad14..ad2d2a0c46 100644 --- a/src/mainboard/google/herobrine/romstage.c +++ b/src/mainboard/google/herobrine/romstage.c @@ -3,9 +3,11 @@ #include #include #include "board.h" +#include void platform_romstage_main(void) { + shrm_fw_load_reset(); /* QCLib: DDR init & train */ qclib_load_and_run(); diff --git a/src/soc/qualcomm/common/include/soc/symbols_common.h b/src/soc/qualcomm/common/include/soc/symbols_common.h index 60c1069aa1..953acc2657 100644 --- a/src/soc/qualcomm/common/include/soc/symbols_common.h +++ b/src/soc/qualcomm/common/include/soc/symbols_common.h @@ -23,5 +23,6 @@ DECLARE_REGION(dram_modem_wifi_only) DECLARE_REGION(dram_modem_extra) DECLARE_REGION(dram_wlan) DECLARE_REGION(dram_wpss) +DECLARE_REGION(shrm) #endif // _SOC_QUALCOMM_SYMBOLS_COMMON_H_ diff --git a/src/soc/qualcomm/sc7280/Makefile.inc b/src/soc/qualcomm/sc7280/Makefile.inc index 9214152964..364c987dc6 100644 --- a/src/soc/qualcomm/sc7280/Makefile.inc +++ b/src/soc/qualcomm/sc7280/Makefile.inc @@ -26,6 +26,7 @@ verstage-$(CONFIG_DRIVERS_UART) += ../common/qupv3_uart.c ################################################################################ romstage-y += cbmem.c +romstage-y += shrm_load_reset.c romstage-y += ../common/qclib.c romstage-y += ../common/mmu.c romstage-y += mmu.c @@ -101,4 +102,12 @@ $(I2C_FW_CBFS)-type := raw $(I2C_FW_CBFS)-compression := $(CBFS_PRERAM_COMPRESS_FLAG) cbfs-files-y += $(I2C_FW_CBFS) +################################################################################ +SHRM_FILE := $(SC7280_BLOB)/shrm/shrm.elf +SHRM_CBFS := $(CONFIG_CBFS_PREFIX)/shrm +$(SHRM_CBFS)-file := $(SHRM_FILE) +$(SHRM_CBFS)-type := payload +$(SHRM_CBFS)-compression := none +cbfs-files-y += $(SHRM_CBFS) + endif diff --git a/src/soc/qualcomm/sc7280/include/soc/shrm.h b/src/soc/qualcomm/sc7280/include/soc/shrm.h new file mode 100644 index 0000000000..59661a8831 --- /dev/null +++ b/src/soc/qualcomm/sc7280/include/soc/shrm.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef _SOC_QUALCOMM_SC7280_SHRM_H__ +#define _SOC_QUALCOMM_SC7280_SHRM_H__ + +void shrm_fw_load_reset(void); + +#endif // _SOC_QUALCOMM_SC7280_SHRM_H__ diff --git a/src/soc/qualcomm/sc7280/memlayout.ld b/src/soc/qualcomm/sc7280/memlayout.ld index 64e500861c..6398dbabea 100644 --- a/src/soc/qualcomm/sc7280/memlayout.ld +++ b/src/soc/qualcomm/sc7280/memlayout.ld @@ -17,6 +17,8 @@ SECTIONS { + REGION(shrm, 0x09060000, 64K , 4K) + AOPSRAM_START(0x0B000000) REGION(aop, 0x0B000000, 0x100000, 4096) AOPSRAM_END(0x0B100000) diff --git a/src/soc/qualcomm/sc7280/shrm_load_reset.c b/src/soc/qualcomm/sc7280/shrm_load_reset.c new file mode 100644 index 0000000000..78830a2df1 --- /dev/null +++ b/src/soc/qualcomm/sc7280/shrm_load_reset.c @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include + +void shrm_fw_load_reset(void) +{ + bool shrm_fw_entry; + struct prog shrm_fw_prog = + PROG_INIT(PROG_PAYLOAD, CONFIG_CBFS_PREFIX "/shrm"); + + shrm_fw_entry = selfload(&shrm_fw_prog); + if (!shrm_fw_entry) + die("SOC image: SHRM load failed"); + + clock_reset_shrm(); + + printk(BIOS_DEBUG, "\nSOC:SHRM brought out of reset.\n"); +}