diff options
-rw-r--r-- | Makefile | 22 | ||||
-rw-r--r-- | bl31/interrupt_mgmt.c | 7 | ||||
-rw-r--r-- | include/lib/aarch64/arch.h | 2 | ||||
-rw-r--r-- | make_helpers/tbbr/tbbr_tools.mk | 2 | ||||
-rw-r--r-- | plat/nvidia/tegra/common/tegra_pm.c | 9 | ||||
-rw-r--r-- | plat/nvidia/tegra/soc/t132/plat_psci_handlers.c | 22 | ||||
-rw-r--r-- | plat/nvidia/tegra/soc/t210/plat_psci_handlers.c | 22 |
7 files changed, 77 insertions, 9 deletions
@@ -167,7 +167,8 @@ ASFLAGS += -nostdinc -ffreestanding -Wa,--fatal-warnings \ ${DEFINES} ${INCLUDES} CFLAGS += -nostdinc -ffreestanding -Wall \ -Werror -Wmissing-include-dirs \ - -mgeneral-regs-only -std=c99 -c -Os \ + -mgeneral-regs-only -mstrict-align \ + -std=c99 -c -Os \ ${DEFINES} ${INCLUDES} CFLAGS += -ffunction-sections -fdata-sections @@ -240,10 +241,15 @@ ifneq (${SPD},none) $(info Including ${SPD_MAKE}) include ${SPD_MAKE} - # If there's BL3-2 companion for the chosen SPD, and the SPD wants to build the - # BL3-2 from source, we expect that the SPD's Makefile would set NEED_BL32 - # variable to "yes". In case the BL3-2 is a binary which needs to be included in - # fip, then the NEED_BL32 needs to be set and BL3-2 would need to point to the bin. + # If there's BL32 companion for the chosen SPD, we expect that the SPD's + # Makefile would set NEED_BL32 to "yes". In this case, the build system + # supports two mutually exclusive options: + # * BL32 is built from source: then BL32_SOURCES must contain the list + # of source files to build BL32 + # * BL32 is a prebuilt binary: then BL32 must point to the image file + # that will be included in the FIP + # If both BL32_SOURCES and BL32 are defined, the binary takes precedence + # over the sources. endif @@ -414,9 +420,13 @@ $(if ${BL31}, $(eval $(call MAKE_TOOL_ARGS,31,${BL31},in_fip)),\ $(eval $(call MAKE_BL,31,in_fip))) endif +# If a BL32 image is needed but neither BL32 nor BL32_SOURCES is defined, the +# build system will call FIP_ADD_IMG to print a warning message and abort the +# process. Note that the dependency on BL32 applies to the FIP only. ifeq (${NEED_BL32},yes) $(if ${BL32}, $(eval $(call MAKE_TOOL_ARGS,32,${BL32},in_fip)),\ - $(eval $(call MAKE_BL,32,in_fip))) + $(if ${BL32_SOURCES}, $(eval $(call MAKE_BL,32,in_fip)),\ + $(eval $(call FIP_ADD_IMG,BL32,--bl32)))) endif # Add the BL33 image if required by the platform diff --git a/bl31/interrupt_mgmt.c b/bl31/interrupt_mgmt.c index 5478902f..206578b4 100644 --- a/bl31/interrupt_mgmt.c +++ b/bl31/interrupt_mgmt.c @@ -129,7 +129,12 @@ static void set_scr_el3_from_rm(uint32_t type, flag = get_interrupt_rm_flag(interrupt_type_flags, security_state); bit_pos = plat_interrupt_type_to_line(type, security_state); intr_type_descs[type].scr_el3[security_state] = flag << bit_pos; - cm_write_scr_el3_bit(security_state, bit_pos, flag); + + /* Update scr_el3 only if there is a context available. If not, it + * will be updated later during context initialization which will obtain + * the scr_el3 value to be used via get_scr_el3_from_routing_model() */ + if (cm_get_context(security_state)) + cm_write_scr_el3_bit(security_state, bit_pos, flag); } /******************************************************************************* diff --git a/include/lib/aarch64/arch.h b/include/lib/aarch64/arch.h index 912643d2..9aea2c9d 100644 --- a/include/lib/aarch64/arch.h +++ b/include/lib/aarch64/arch.h @@ -134,7 +134,7 @@ (1 << 4)) #define SCTLR_EL1_RES1 ((1 << 29) | (1 << 28) | (1 << 23) | (1 << 22) | \ - (1 << 11)) + (1 << 20) | (1 << 11)) #define SCTLR_AARCH32_EL1_RES1 \ ((1 << 23) | (1 << 22) | (1 << 11) | (1 << 4) | \ (1 << 3)) diff --git a/make_helpers/tbbr/tbbr_tools.mk b/make_helpers/tbbr/tbbr_tools.mk index 58c84d20..2ec72b90 100644 --- a/make_helpers/tbbr/tbbr_tools.mk +++ b/make_helpers/tbbr/tbbr_tools.mk @@ -97,7 +97,7 @@ $(eval $(call FIP_ADD_PAYLOAD,${BUILD_PLAT}/bl31_key.crt,--bl31-key-cert)) # Add the BL32 CoT (key cert + img cert + image) ifeq (${NEED_BL32},yes) $(if ${BL32},$(eval $(call CERT_ADD_CMD_OPT,${BL32},--bl32,true)),\ - $(eval $(call CERT_ADD_CMD_OPT,$(call IMG_BIN,32),--bl32,true))) + $(if ${BL32_SOURCES},$(eval $(call CERT_ADD_CMD_OPT,$(call IMG_BIN,32),--bl32,true)))) $(if ${BL32_KEY},$(eval $(call CERT_ADD_CMD_OPT,${BL32_KEY},--bl32-key))) $(eval $(call CERT_ADD_CMD_OPT,${BUILD_PLAT}/bl32.crt,--bl32-cert)) $(eval $(call CERT_ADD_CMD_OPT,${BUILD_PLAT}/bl32_key.crt,--bl32-key-cert)) diff --git a/plat/nvidia/tegra/common/tegra_pm.c b/plat/nvidia/tegra/common/tegra_pm.c index 87f72403..c2c73f63 100644 --- a/plat/nvidia/tegra/common/tegra_pm.c +++ b/plat/nvidia/tegra/common/tegra_pm.c @@ -55,6 +55,7 @@ static int system_suspended; #pragma weak tegra_soc_prepare_cpu_on #pragma weak tegra_soc_prepare_cpu_off #pragma weak tegra_soc_prepare_cpu_on_finish +#pragma weak tegra_soc_prepare_system_reset int tegra_soc_prepare_cpu_suspend(unsigned int id, unsigned int afflvl) { @@ -76,6 +77,11 @@ int tegra_soc_prepare_cpu_on_finish(unsigned long mpidr) return PSCI_E_SUCCESS; } +int tegra_soc_prepare_system_reset(void) +{ + return PSCI_E_SUCCESS; +} + /******************************************************************************* * Track system suspend entry. ******************************************************************************/ @@ -298,6 +304,9 @@ __dead2 void tegra_system_off(void) ******************************************************************************/ __dead2 void tegra_system_reset(void) { + /* per-SoC system reset handler */ + tegra_soc_prepare_system_reset(); + /* * Program the PMC in order to restart the system. */ diff --git a/plat/nvidia/tegra/soc/t132/plat_psci_handlers.c b/plat/nvidia/tegra/soc/t132/plat_psci_handlers.c index 79e9f1c5..46e59409 100644 --- a/plat/nvidia/tegra/soc/t132/plat_psci_handlers.c +++ b/plat/nvidia/tegra/soc/t132/plat_psci_handlers.c @@ -33,6 +33,7 @@ #include <assert.h> #include <denver.h> #include <debug.h> +#include <delay_timer.h> #include <flowctrl.h> #include <mmio.h> #include <platform_def.h> @@ -48,6 +49,11 @@ #define CPU_CMPLX_RESET_CLR 0x344 #define CPU_CORE_RESET_MASK 0x10001 +/* Clock and Reset controller registers for system clock's settings */ +#define SCLK_RATE 0x30 +#define SCLK_BURST_POLICY 0x28 +#define SCLK_BURST_POLICY_DEFAULT 0x10000000 + static int cpu_powergate_mask[PLATFORM_MAX_CPUS_PER_CLUSTER]; int32_t tegra_soc_validate_power_state(unsigned int power_state) @@ -121,3 +127,19 @@ int tegra_soc_prepare_cpu_suspend(unsigned int id, unsigned int afflvl) return PSCI_E_SUCCESS; } + +int tegra_soc_prepare_system_reset(void) +{ + /* + * Set System Clock (SCLK) to POR default so that the clock source + * for the PMC APB clock would not be changed due to system reset. + */ + mmio_write_32((uintptr_t)TEGRA_CAR_RESET_BASE + SCLK_BURST_POLICY, + SCLK_BURST_POLICY_DEFAULT); + mmio_write_32((uintptr_t)TEGRA_CAR_RESET_BASE + SCLK_RATE, 0); + + /* Wait 1 ms to make sure clock source/device logic is stabilized. */ + mdelay(1); + + return PSCI_E_SUCCESS; +} diff --git a/plat/nvidia/tegra/soc/t210/plat_psci_handlers.c b/plat/nvidia/tegra/soc/t210/plat_psci_handlers.c index 57be3476..73358d4d 100644 --- a/plat/nvidia/tegra/soc/t210/plat_psci_handlers.c +++ b/plat/nvidia/tegra/soc/t210/plat_psci_handlers.c @@ -31,6 +31,7 @@ #include <arch_helpers.h> #include <assert.h> #include <debug.h> +#include <delay_timer.h> #include <mmio.h> #include <platform.h> #include <platform_def.h> @@ -47,6 +48,11 @@ #define CPU_CMPLX_RESET_CLR 0x454 #define CPU_CORE_RESET_MASK 0x10001 +/* Clock and Reset controller registers for system clock's settings */ +#define SCLK_RATE 0x30 +#define SCLK_BURST_POLICY 0x28 +#define SCLK_BURST_POLICY_DEFAULT 0x10000000 + static int cpu_powergate_mask[PLATFORM_MAX_CPUS_PER_CLUSTER]; int32_t tegra_soc_validate_power_state(unsigned int power_state) @@ -183,3 +189,19 @@ int tegra_soc_prepare_cpu_off(unsigned long mpidr) tegra_fc_cpu_off(mpidr & MPIDR_CPU_MASK); return PSCI_E_SUCCESS; } + +int tegra_soc_prepare_system_reset(void) +{ + /* + * Set System Clock (SCLK) to POR default so that the clock source + * for the PMC APB clock would not be changed due to system reset. + */ + mmio_write_32((uintptr_t)TEGRA_CAR_RESET_BASE + SCLK_BURST_POLICY, + SCLK_BURST_POLICY_DEFAULT); + mmio_write_32((uintptr_t)TEGRA_CAR_RESET_BASE + SCLK_RATE, 0); + + /* Wait 1 ms to make sure clock source/device logic is stabilized. */ + mdelay(1); + + return PSCI_E_SUCCESS; +} |