From: Aditya Angadi Date: Tue, 16 Apr 2019 05:59:14 +0000 (+0530) Subject: plat/arm: introduce wrapper functions to setup secure watchdog X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=b0c97dafe00f5da71361b53fcbf5e4c12b174ec2;p=project%2Fbcm63xx%2Fatf.git plat/arm: introduce wrapper functions to setup secure watchdog The BL1 stage setup code for ARM platforms sets up the SP805 watchdog controller as the secure watchdog. But not all ARM platforms use SP805 as the secure watchdog controller. So introduce two new ARM platform code specific wrapper functions to start and stop the secure watchdog. These functions then replace the calls to SP805 driver in common BL1 setup code. All the ARM platforms implement these wrapper functions by either calling into SP805 driver or the SBSA watchdog driver. Change-Id: I1a9a11b124cf3fac2a84f22ca40acd440a441257 Signed-off-by: Aditya Angadi --- diff --git a/include/plat/arm/common/plat_arm.h b/include/plat/arm/common/plat_arm.h index 527375f6..97e67225 100644 --- a/include/plat/arm/common/plat_arm.h +++ b/include/plat/arm/common/plat_arm.h @@ -295,4 +295,8 @@ extern plat_psci_ops_t plat_arm_psci_pm_ops; extern const mmap_region_t plat_arm_mmap[]; extern const unsigned int arm_pm_idle_states[]; +/* secure watchdog */ +void plat_arm_secure_wdt_start(void); +void plat_arm_secure_wdt_stop(void); + #endif /* PLAT_ARM_H */ diff --git a/plat/arm/board/fvp/fvp_bl1_setup.c b/plat/arm/board/fvp/fvp_bl1_setup.c index 75090e87..aa567166 100644 --- a/plat/arm/board/fvp/fvp_bl1_setup.c +++ b/plat/arm/board/fvp/fvp_bl1_setup.c @@ -5,9 +5,10 @@ */ #include +#include #include +#include #include - #include "fvp_private.h" /******************************************************************************* @@ -30,3 +31,13 @@ void bl1_early_platform_setup(void) */ fvp_interconnect_enable(); } + +void plat_arm_secure_wdt_start(void) +{ + sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL); +} + +void plat_arm_secure_wdt_stop(void) +{ + sp805_stop(ARM_SP805_TWDG_BASE); +} diff --git a/plat/arm/board/fvp/platform.mk b/plat/arm/board/fvp/platform.mk index 1a63e874..c11d848e 100644 --- a/plat/arm/board/fvp/platform.mk +++ b/plat/arm/board/fvp/platform.mk @@ -112,7 +112,8 @@ else FVP_CPU_LIBS += lib/cpus/aarch32/cortex_a32.S endif -BL1_SOURCES += drivers/io/io_semihosting.c \ +BL1_SOURCES += drivers/arm/sp805/sp805.c \ + drivers/io/io_semihosting.c \ lib/semihosting/semihosting.c \ lib/semihosting/${ARCH}/semihosting_call.S \ plat/arm/board/fvp/${ARCH}/fvp_helpers.S \ diff --git a/plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c b/plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c index 47cd8762..4338f6f2 100644 --- a/plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c +++ b/plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c @@ -4,8 +4,10 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include #include #include +#include /******************************************************************************* * Perform any BL1 specific platform actions. @@ -14,3 +16,13 @@ void bl1_early_platform_setup(void) { arm_bl1_early_platform_setup(); } + +void plat_arm_secure_wdt_start(void) +{ + sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL); +} + +void plat_arm_secure_wdt_stop(void) +{ + sp805_stop(ARM_SP805_TWDG_BASE); +} diff --git a/plat/arm/board/juno/juno_bl1_setup.c b/plat/arm/board/juno/juno_bl1_setup.c index 33f5c479..7a3d22de 100644 --- a/plat/arm/board/juno/juno_bl1_setup.c +++ b/plat/arm/board/juno/juno_bl1_setup.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -112,3 +113,13 @@ void bl1_plat_prepare_exit(entry_point_info_t *ep_info) juno_reset_to_aarch32_state(); } #endif /* JUNO_AARCH32_EL3_RUNTIME */ + +void plat_arm_secure_wdt_start(void) +{ + sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL); +} + +void plat_arm_secure_wdt_stop(void) +{ + sp805_stop(ARM_SP805_TWDG_BASE); +} diff --git a/plat/arm/board/juno/platform.mk b/plat/arm/board/juno/platform.mk index e44791b4..40e62644 100644 --- a/plat/arm/board/juno/platform.mk +++ b/plat/arm/board/juno/platform.mk @@ -62,6 +62,7 @@ BL1_SOURCES += lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a72.S \ plat/arm/board/juno/juno_err.c \ plat/arm/board/juno/juno_bl1_setup.c \ + drivers/arm/sp805/sp805.c \ ${JUNO_INTERCONNECT_SOURCES} \ ${JUNO_SECURITY_SOURCES} diff --git a/plat/arm/board/n1sdp/include/platform_def.h b/plat/arm/board/n1sdp/include/platform_def.h index 03bd3803..adb957e5 100644 --- a/plat/arm/board/n1sdp/include/platform_def.h +++ b/plat/arm/board/n1sdp/include/platform_def.h @@ -87,4 +87,8 @@ /* Platform ID address */ #define SSC_VERSION (SSC_REG_BASE + SSC_VERSION_OFFSET) +/* Secure Watchdog Constants */ +#define SBSA_SECURE_WDOG_BASE UL(0x2A480000) +#define SBSA_SECURE_WDOG_TIMEOUT UL(100) + #endif /* PLATFORM_DEF_H */ diff --git a/plat/arm/board/n1sdp/n1sdp_plat.c b/plat/arm/board/n1sdp/n1sdp_plat.c index 6905896c..f36f9e25 100644 --- a/plat/arm/board/n1sdp/n1sdp_plat.c +++ b/plat/arm/board/n1sdp/n1sdp_plat.c @@ -10,6 +10,7 @@ #include #include #include +#include /* * Table of regions to map using the MMU. @@ -22,3 +23,12 @@ const mmap_region_t plat_arm_mmap[] = { {0} }; +void plat_arm_secure_wdt_start(void) +{ + sbsa_wdog_start(SBSA_SECURE_WDOG_BASE, SBSA_SECURE_WDOG_TIMEOUT); +} + +void plat_arm_secure_wdt_stop(void) +{ + sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE); +} diff --git a/plat/arm/board/n1sdp/platform.mk b/plat/arm/board/n1sdp/platform.mk index 653d0810..d0c34c8f 100644 --- a/plat/arm/board/n1sdp/platform.mk +++ b/plat/arm/board/n1sdp/platform.mk @@ -25,6 +25,7 @@ N1SDP_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ PLAT_BL_COMMON_SOURCES := ${N1SDP_BASE}/n1sdp_plat.c \ ${N1SDP_BASE}/aarch64/n1sdp_helper.S +BL1_SOURCES += drivers/arm/sbsa/sbsa.c BL31_SOURCES := ${N1SDP_CPU_SOURCES} \ ${INTERCONNECT_SOURCES} \ diff --git a/plat/arm/common/arm_bl1_setup.c b/plat/arm/common/arm_bl1_setup.c index 1e9edefd..8e0c046f 100644 --- a/plat/arm/common/arm_bl1_setup.c +++ b/plat/arm/common/arm_bl1_setup.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -67,7 +66,7 @@ void arm_bl1_early_platform_setup(void) #if !ARM_DISABLE_TRUSTED_WDOG /* Enable watchdog */ - sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL); + plat_arm_secure_wdt_start(); #endif /* Initialize the console to provide early debug support */ @@ -172,7 +171,7 @@ void bl1_plat_prepare_exit(entry_point_info_t *ep_info) { #if !ARM_DISABLE_TRUSTED_WDOG /* Disable watchdog before leaving BL1 */ - sp805_stop(ARM_SP805_TWDG_BASE); + plat_arm_secure_wdt_stop(); #endif #ifdef EL3_PAYLOAD_BASE diff --git a/plat/arm/common/arm_common.mk b/plat/arm/common/arm_common.mk index 5e890ed1..c3d9e030 100644 --- a/plat/arm/common/arm_common.mk +++ b/plat/arm/common/arm_common.mk @@ -158,8 +158,7 @@ include lib/xlat_tables_v2/xlat_tables.mk PLAT_BL_COMMON_SOURCES += ${XLAT_TABLES_LIB_SRCS} endif -BL1_SOURCES += drivers/arm/sp805/sp805.c \ - drivers/io/io_fip.c \ +BL1_SOURCES += drivers/io/io_fip.c \ drivers/io/io_memmap.c \ drivers/io/io_storage.c \ plat/arm/common/arm_bl1_setup.c \ diff --git a/plat/arm/css/sgi/include/sgi_base_platform_def.h b/plat/arm/css/sgi/include/sgi_base_platform_def.h index c0e65558..032a1f47 100644 --- a/plat/arm/css/sgi/include/sgi_base_platform_def.h +++ b/plat/arm/css/sgi/include/sgi_base_platform_def.h @@ -208,5 +208,8 @@ #define PLAT_ARM_MEM_PROT_ADDR (V2M_FLASH0_BASE + \ V2M_FLASH0_SIZE - V2M_FLASH_BLOCK_SIZE) +/*Secure Watchdog Constants */ +#define SBSA_SECURE_WDOG_BASE UL(0x2A480000) +#define SBSA_SECURE_WDOG_TIMEOUT UL(100) #endif /* SGI_BASE_PLATFORM_DEF_H */ diff --git a/plat/arm/css/sgi/sgi-common.mk b/plat/arm/css/sgi/sgi-common.mk index 613d3d5f..b736b0bb 100644 --- a/plat/arm/css/sgi/sgi-common.mk +++ b/plat/arm/css/sgi/sgi-common.mk @@ -33,7 +33,8 @@ ENT_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ PLAT_BL_COMMON_SOURCES += ${CSS_ENT_BASE}/sgi_plat.c \ ${CSS_ENT_BASE}/aarch64/sgi_helper.S -BL1_SOURCES += ${INTERCONNECT_SOURCES} +BL1_SOURCES += ${INTERCONNECT_SOURCES} \ + drivers/arm/sbsa/sbsa.c BL2_SOURCES += ${CSS_ENT_BASE}/sgi_image_load.c diff --git a/plat/arm/css/sgi/sgi_plat.c b/plat/arm/css/sgi/sgi_plat.c index 42eff866..3e207ecc 100644 --- a/plat/arm/css/sgi/sgi_plat.c +++ b/plat/arm/css/sgi/sgi_plat.c @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #define SGI_MAP_FLASH0_RO MAP_REGION_FLAT(V2M_FLASH0_BASE,\ @@ -139,3 +141,13 @@ int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) return arm_get_mbedtls_heap(heap_addr, heap_size); } #endif + +void plat_arm_secure_wdt_start(void) +{ + sbsa_wdog_start(SBSA_SECURE_WDOG_BASE, SBSA_SECURE_WDOG_TIMEOUT); +} + +void plat_arm_secure_wdt_stop(void) +{ + sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE); +} diff --git a/plat/arm/css/sgm/sgm-common.mk b/plat/arm/css/sgm/sgm-common.mk index 0a136e63..34e78b2f 100644 --- a/plat/arm/css/sgm/sgm-common.mk +++ b/plat/arm/css/sgm/sgm-common.mk @@ -31,7 +31,8 @@ SGM_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ BL1_SOURCES += $(SGM_CPU_SOURCES) \ ${INTERCONNECT_SOURCES} \ ${CSS_SGM_BASE}/sgm_bl1_setup.c \ - ${CSS_SGM_BASE}/sgm_plat_config.c + ${CSS_SGM_BASE}/sgm_plat_config.c \ + drivers/arm/sp805/sp805.c BL2_SOURCES += ${SECURITY_SOURCES} \ ${CSS_SGM_BASE}/sgm_plat_config.c diff --git a/plat/arm/css/sgm/sgm_bl1_setup.c b/plat/arm/css/sgm/sgm_bl1_setup.c index 20365159..5fd96552 100644 --- a/plat/arm/css/sgm/sgm_bl1_setup.c +++ b/plat/arm/css/sgm/sgm_bl1_setup.c @@ -8,7 +8,8 @@ #include #include #include - +#include +#include #include void bl1_early_platform_setup(void) @@ -32,3 +33,13 @@ void bl1_early_platform_setup(void) plat_arm_interconnect_enter_coherency(); #endif } + +void plat_arm_secure_wdt_start(void) +{ + sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL); +} + +void plat_arm_secure_wdt_stop(void) +{ + sp805_stop(ARM_SP805_TWDG_BASE); +}