diff --git a/plat/fvp/aarch64/bl1_plat_helpers.S b/plat/fvp/aarch64/bl1_plat_helpers.S index d72dc39..8cdb10e 100644 --- a/plat/fvp/aarch64/bl1_plat_helpers.S +++ b/plat/fvp/aarch64/bl1_plat_helpers.S @@ -226,15 +226,6 @@ str x19, [x1, x2] /* --------------------------------------------- - * Enable CCI-400 for this cluster. No need - * for locks as no other cpu is active at the - * moment - * --------------------------------------------- - */ - mov x0, x19 - bl cci_enable_coherency - - /* --------------------------------------------- * Architectural init. can be generic e.g. * enabling stack alignment and platform spec- * ific e.g. MMU & page table setup as per the diff --git a/plat/fvp/aarch64/fvp_common.c b/plat/fvp/aarch64/fvp_common.c index 762f542..78a44a5 100644 --- a/plat/fvp/aarch64/fvp_common.c +++ b/plat/fvp/aarch64/fvp_common.c @@ -576,6 +576,7 @@ platform_config[CONFIG_MAX_AFF1] = 1; platform_config[CONFIG_CPU_SETUP] = 0; platform_config[CONFIG_BASE_MMAP] = 0; + platform_config[CONFIG_HAS_CCI] = 0; break; case HBI_FVP_BASE: midr_pn = (read_midr() >> MIDR_PN_SHIFT) & MIDR_PN_MASK; @@ -587,6 +588,7 @@ platform_config[CONFIG_MAX_AFF0] = 4; platform_config[CONFIG_MAX_AFF1] = 2; platform_config[CONFIG_BASE_MMAP] = 1; + platform_config[CONFIG_HAS_CCI] = 1; break; default: assert(0); diff --git a/plat/fvp/bl1_plat_setup.c b/plat/fvp/bl1_plat_setup.c index 7131f7a..7fa3f76 100644 --- a/plat/fvp/bl1_plat_setup.c +++ b/plat/fvp/bl1_plat_setup.c @@ -34,6 +34,7 @@ #include #include #include +#include /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout @@ -126,6 +127,9 @@ bl1_tzram_layout.free_size = tzram_limit - bl1_coherent_ram_limit; } + + /* Initialize the platform config for future decision making */ + platform_config_setup(); } /******************************************************************************* @@ -153,11 +157,23 @@ /******************************************************************************* * Perform the very early platform specific architecture setup here. At the - * moment this is only intializes the mmu in a quick and dirty way. Later arch- - * itectural setup (bl1_arch_setup()) does not do anything platform specific. + * moment this only does basic initialization. Later architectural setup + * (bl1_arch_setup()) does not do anything platform specific. ******************************************************************************/ void bl1_plat_arch_setup(void) { + unsigned long cci_setup; + + /* + * Enable CCI-400 for this cluster. No need + * for locks as no other cpu is active at the + * moment + */ + cci_setup = platform_get_cfgvar(CONFIG_HAS_CCI); + if (cci_setup) { + cci_enable_coherency(read_mpidr()); + } + configure_mmu(&bl1_tzram_layout, TZROM_BASE, /* Read_only region start */ TZROM_BASE + TZROM_SIZE, /* Read_only region size */ diff --git a/plat/fvp/fvp_pm.c b/plat/fvp/fvp_pm.c index 9621319..af8d1b3 100644 --- a/plat/fvp/fvp_pm.c +++ b/plat/fvp/fvp_pm.c @@ -111,7 +111,7 @@ { int rc = PSCI_E_SUCCESS; unsigned int gicc_base, ectlr; - unsigned long cpu_setup; + unsigned long cpu_setup, cci_setup; switch (afflvl) { case MPIDR_AFFLVL1: @@ -120,7 +120,10 @@ * Disable coherency if this cluster is to be * turned off */ - cci_disable_coherency(mpidr); + cci_setup = platform_get_cfgvar(CONFIG_HAS_CCI); + if (cci_setup) { + cci_disable_coherency(mpidr); + } /* * Program the power controller to turn the @@ -187,7 +190,7 @@ { int rc = PSCI_E_SUCCESS; unsigned int gicc_base, ectlr; - unsigned long cpu_setup, linear_id; + unsigned long cpu_setup, cci_setup, linear_id; mailbox *fvp_mboxes; /* Cannot allow NS world to execute trusted firmware code */ @@ -203,7 +206,10 @@ * Disable coherency if this cluster is to be * turned off */ - cci_disable_coherency(mpidr); + cci_setup = platform_get_cfgvar(CONFIG_HAS_CCI); + if (cci_setup) { + cci_disable_coherency(mpidr); + } /* * Program the power controller to turn the @@ -270,7 +276,7 @@ unsigned int state) { int rc = PSCI_E_SUCCESS; - unsigned long linear_id, cpu_setup; + unsigned long linear_id, cpu_setup, cci_setup; mailbox *fvp_mboxes; unsigned int gicd_base, gicc_base, reg_val, ectlr; @@ -278,8 +284,12 @@ case MPIDR_AFFLVL1: /* Enable coherency if this cluster was off */ - if (state == PSCI_STATE_OFF) - cci_enable_coherency(mpidr); + if (state == PSCI_STATE_OFF) { + cci_setup = platform_get_cfgvar(CONFIG_HAS_CCI); + if (cci_setup) { + cci_enable_coherency(mpidr); + } + } break; case MPIDR_AFFLVL0: diff --git a/plat/fvp/platform.h b/plat/fvp/platform.h index 21a7912..463c637 100644 --- a/plat/fvp/platform.h +++ b/plat/fvp/platform.h @@ -72,7 +72,9 @@ /* Indicate whether the CPUECTLR SMP bit should be enabled. */ #define CONFIG_CPU_SETUP 6 #define CONFIG_BASE_MMAP 7 -#define CONFIG_LIMIT 8 +/* Indicates whether CCI should be enabled on the platform. */ +#define CONFIG_HAS_CCI 8 +#define CONFIG_LIMIT 9 /******************************************************************************* * Platform memory map related constants