diff --git a/bl1/aarch64/bl1_arch_setup.c b/bl1/aarch64/bl1_arch_setup.c index e82ad09b5507d381c22cf944aa468131ae3675fa..3a528e1dd12853c02ff5a42f5f51cf95c1f5724b 100644 --- a/bl1/aarch64/bl1_arch_setup.c +++ b/bl1/aarch64/bl1_arch_setup.c @@ -39,6 +39,7 @@ void bl1_arch_setup(void) { unsigned long tmp_reg = 0; + unsigned int counter_base_frequency; /* Enable alignment checks and set the exception endianess to LE */ tmp_reg = read_sctlr(); @@ -60,6 +61,13 @@ void bl1_arch_setup(void) enable_serror(); enable_debug_exceptions(); + /* Read the frequency from Frequency modes table */ + counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF); + /* The first entry of the frequency modes table must not be 0 */ + assert(counter_base_frequency != 0); + + /* Program the counter frequency */ + write_cntfrq_el0(counter_base_frequency); return; } diff --git a/bl31/aarch64/bl31_arch_setup.c b/bl31/aarch64/bl31_arch_setup.c index faeccf3130e0c2f0833ab707c444d070d8af94f8..03b9623c02c2ccfe8039226d577f97b845c873e2 100644 --- a/bl31/aarch64/bl31_arch_setup.c +++ b/bl31/aarch64/bl31_arch_setup.c @@ -40,6 +40,7 @@ void bl31_arch_setup(void) { unsigned long tmp_reg = 0; + unsigned int counter_base_frequency; /* Enable alignment checks and set the exception endianness to LE */ tmp_reg = read_sctlr(); @@ -61,6 +62,13 @@ void bl31_arch_setup(void) enable_serror(); enable_debug_exceptions(); + /* Read the frequency from Frequency modes table */ + counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF); + /* The first entry of the frequency modes table must not be 0 */ + assert(counter_base_frequency != 0); + + /* Program the counter frequency */ + write_cntfrq_el0(counter_base_frequency); return; } diff --git a/docs/firmware-design.md b/docs/firmware-design.md index 1f799b6448da7d455e6f4458262aae74a187b6a5..11d6f1d05a222fbeade87a94ba5a1d787487ee29 100644 --- a/docs/firmware-design.md +++ b/docs/firmware-design.md @@ -151,16 +151,19 @@ BL1 performs minimal architectural initialization as follows. and Advanced SIMD execution are configured to not trap to EL3 by clearing the `CPTR_EL3.TFP` bit. + - `CNTFRQ_EL0`. The `CNTFRQ_EL0` register is programmed with the base + frequency of the system counter, which is retrieved from the first entry + in the frequency modes table. + + - Generic Timer. The system level implementation of the generic timer is + enabled through the memory mapped interface. + #### Platform initialization -BL1 enables issuing of snoop and DVM (Distributed Virtual Memory) requests -from the CCI-400 slave interface corresponding to the cluster that includes -the primary CPU. BL1 also initializes UART0 (PL011 console), which enables -access to the `printf` family of functions. The `CNTFRQ_EL0` register is -programmed with the base frequency of the system counter, which is retrieved -from the first entry in the frequency modes table. The system level -implementation of the generic timer is enabled through the memory mapped -interface. +BL1 enables issuing of snoop and DVM (Distributed Virtual Memory) requests from +the CCI-400 slave interface corresponding to the cluster that includes the +primary CPU. BL1 also initializes UART0 (PL011 console), which enables access to +the `printf` family of functions. #### BL2 image load and execution diff --git a/docs/porting-guide.md b/docs/porting-guide.md index 6bba3604b7dcf794b9f8a46c6a86f38ed9de34a2..56467fb97bd62117698e0a9a7b37bb7915a652fc 100644 --- a/docs/porting-guide.md +++ b/docs/porting-guide.md @@ -446,9 +446,8 @@ This function executes with the MMU and data caches enabled. It is responsible for performing any remaining platform-specific setup that can occur after the MMU and data cache have been enabled. -In the ARM FVP port, this function enables system-level implementation of the -generic timer counter. It also initializes counter frequency for CPU's generic -timers. +In the ARM FVP port, it zeros out the ZI section and enables the system level +implementation of the generic timer counter. This function is also responsible for initializing the storage abstraction layer which is used to load further bootloader images. @@ -772,7 +771,6 @@ BL3-1 runtime services and normal world software can function correctly. The ARM FVP port does the following: * Initializes the generic interrupt controller. * Configures the CLCD controller. -* Initializes counter frequency for CPU's generic timer * Grants access to the system counter timer module * Initializes the FVP power controller device * Detects the system topology. diff --git a/plat/fvp/bl1_plat_setup.c b/plat/fvp/bl1_plat_setup.c index b0c011eb43b67bb4cf411a48bf10634e65158aa1..d4fd81b2524c28a70e745ca7433e033297b9c09d 100644 --- a/plat/fvp/bl1_plat_setup.c +++ b/plat/fvp/bl1_plat_setup.c @@ -112,25 +112,11 @@ void bl1_early_platform_setup(void) ******************************************************************************/ void bl1_platform_setup(void) { - unsigned int counter_base_frequency; - /* Initialise the IO layer and register platform IO devices */ io_setup(); - /* - * Enable and initialize the System level generic timer. Choose base - * frequency for the timer - */ - mmio_write_32(SYS_CNTCTL_BASE + CNTCR_OFF, CNTCR_FCREQ(0) | CNTCR_EN); - - /* Read the frequency from Frequency modes table */ - counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF); - - /* The first entry of the frequency modes table must not be 0 */ - assert(counter_base_frequency != 0); - - /* Program the counter frequency */ - write_cntfrq_el0(counter_base_frequency); + /* Enable and initialize the System level generic timer */ + mmio_write_32(SYS_CNTCTL_BASE + CNTCR_OFF, CNTCR_EN); } diff --git a/plat/fvp/bl31_plat_setup.c b/plat/fvp/bl31_plat_setup.c index 1b24687bcdd9bbc95d50db4919f45761e9e017b5..01b0a454c6c10c424dd5f63c025174ac44e6098e 100644 --- a/plat/fvp/bl31_plat_setup.c +++ b/plat/fvp/bl31_plat_setup.c @@ -30,8 +30,7 @@ #include <platform.h> #include <fvp_pwrc.h> -#include <assert.h> -#include <arch_helpers.h> +#include <bl_common.h> /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout @@ -126,7 +125,6 @@ void bl31_early_platform_setup(bl31_args *from_bl2, void bl31_platform_setup() { unsigned int reg_val; - unsigned int counter_base_frequency; /* Initialize the gic cpu and distributor interfaces */ gic_setup(); @@ -140,15 +138,6 @@ void bl31_platform_setup() mmio_write_32(VE_SYSREGS_BASE + V2M_SYS_CFGCTRL, (1ull << 31) | (1 << 30) | (7 << 20) | (0 << 16)); - /* Read the frequency from Frequency modes table */ - counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF); - - /* The first entry of the frequency modes table must not be 0 */ - assert(counter_base_frequency != 0); - - /* Program the counter frequency */ - write_cntfrq_el0(counter_base_frequency); - /* Allow access to the System counter timer module */ reg_val = (1 << CNTACR_RPCT_SHIFT) | (1 << CNTACR_RVCT_SHIFT); reg_val |= (1 << CNTACR_RFRQ_SHIFT) | (1 << CNTACR_RVOFF_SHIFT);