plat/arm: Introduce FVP Versatile Express platform.
authorUsama Arif <usama.arif@arm.com>
Fri, 30 Nov 2018 15:43:56 +0000 (15:43 +0000)
committerUsama Arif <usama.arif@arm.com>
Tue, 19 Feb 2019 17:07:01 +0000 (17:07 +0000)
This patch adds support for Versatile express FVP (Fast models).
Versatile express is a family of platforms that are based on ARM v7.
Currently this port has only been tested on Cortex A7, although it
should work with other ARM V7 cores that support LPAE, generic timers,
VFP and hardware divide. Future patches will support other
cores like Cortex A5 that dont support features like LPAE
and hardware divide. This platform is tested on and only expected to
work on single core models.

Change-Id: I10893af65b8bb64da7b3bd851cab8231718e61dd
Signed-off-by: Usama Arif <usama.arif@arm.com>
19 files changed:
fdts/fvp-ve-Cortex-A7x1.dts [new file with mode: 0644]
plat/arm/board/fvp/include/platform_def.h
plat/arm/board/fvp_ve/aarch32/fvp_ve_helpers.S [new file with mode: 0644]
plat/arm/board/fvp_ve/fdts/fvp_ve_tb_fw_config.dts [new file with mode: 0644]
plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c [new file with mode: 0644]
plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c [new file with mode: 0644]
plat/arm/board/fvp_ve/fvp_ve_common.c [new file with mode: 0644]
plat/arm/board/fvp_ve/fvp_ve_def.h [new file with mode: 0644]
plat/arm/board/fvp_ve/fvp_ve_pm.c [new file with mode: 0644]
plat/arm/board/fvp_ve/fvp_ve_private.h [new file with mode: 0644]
plat/arm/board/fvp_ve/fvp_ve_security.c [new file with mode: 0644]
plat/arm/board/fvp_ve/fvp_ve_topology.c [new file with mode: 0644]
plat/arm/board/fvp_ve/include/platform_def.h [new file with mode: 0644]
plat/arm/board/fvp_ve/platform.mk [new file with mode: 0644]
plat/arm/board/fvp_ve/sp_min/fvp_ve_sp_min_setup.c [new file with mode: 0644]
plat/arm/board/fvp_ve/sp_min/sp_min-fvp_ve.mk [new file with mode: 0644]
plat/arm/common/arm_bl1_setup.c
plat/arm/common/arm_dyn_cfg.c
plat/arm/common/sp_min/arm_sp_min_setup.c

diff --git a/fdts/fvp-ve-Cortex-A7x1.dts b/fdts/fvp-ve-Cortex-A7x1.dts
new file mode 100644 (file)
index 0000000..fca3d90
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/dts-v1/;
+
+/ {
+       model = "V2F-1XV7 Cortex-A7x1 SMM";
+       compatible = "arm,vexpress,v2f-1xv7", "arm,vexpress";
+       interrupt-parent = <&gic>;
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       cpus {
+               #address-cells = <2>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a7";
+                       reg = <0 0>;
+               };
+       };
+
+       memory@0,80000000 {
+               device_type = "memory";
+               reg = <0 0x80000000 0 0x80000000>; /* 2GB @ 2GB */
+       };
+
+       gic: interrupt-controller@2c001000 {
+               compatible = "arm,cortex-a15-gic";
+               #interrupt-cells = <3>;
+               #address-cells = <0>;
+               interrupt-controller;
+               reg = <0 0x2c001000 0 0x1000>,
+                     <0 0x2c002000 0 0x1000>,
+                     <0 0x2c004000 0 0x2000>,
+                     <0 0x2c006000 0 0x2000>;
+               interrupts = <1 9 0xf04>;
+       };
+
+       smbclk: refclk24mhzx2 {
+               /* Reference 24MHz clock x 2 */
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <48000000>;
+               clock-output-names = "smclk";
+       };
+
+       smb {
+               compatible = "simple-bus";
+
+               #address-cells = <2>;
+               #size-cells = <1>;
+               ranges = <0 0 0 0x08000000 0x04000000>,
+                        <1 0 0 0x14000000 0x04000000>,
+                        <2 0 0 0x18000000 0x04000000>,
+                        <3 0 0 0x1c000000 0x04000000>,
+                        <4 0 0 0x0c000000 0x04000000>,
+                        <5 0 0 0x10000000 0x04000000>;
+
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 63>;
+               interrupt-map = <0 0  0 &gic 0  0 4>,
+                               <0 0  1 &gic 0  1 4>,
+                               <0 0  2 &gic 0  2 4>,
+                               <0 0  3 &gic 0  3 4>,
+                               <0 0  4 &gic 0  4 4>,
+                               <0 0  5 &gic 0  5 4>,
+                               <0 0 42 &gic 0 42 4>;
+
+               /include/ "rtsm_ve-motherboard-aarch32.dtsi"
+       };
+};
index 7a538e9c5589499dffa1bae4a78232eae7d6592f..780e6fcbf7ec9146a52312607024b5ed6bc16498 100644 (file)
 #define PLAT_ARM_RUN_UART_BASE         V2M_IOFPGA_UART1_BASE
 #define PLAT_ARM_RUN_UART_CLK_IN_HZ    V2M_IOFPGA_UART1_CLK_IN_HZ
 
-#define PLAT_ARM_SP_MIN_RUN_UART_BASE          V2M_IOFPGA_UART1_BASE
-#define PLAT_ARM_SP_MIN_RUN_UART_CLK_IN_HZ     V2M_IOFPGA_UART1_CLK_IN_HZ
-
 #define PLAT_ARM_CRASH_UART_BASE       PLAT_ARM_RUN_UART_BASE
 #define PLAT_ARM_CRASH_UART_CLK_IN_HZ  PLAT_ARM_RUN_UART_CLK_IN_HZ
 
diff --git a/plat/arm/board/fvp_ve/aarch32/fvp_ve_helpers.S b/plat/arm/board/fvp_ve/aarch32/fvp_ve_helpers.S
new file mode 100644 (file)
index 0000000..78f6c68
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include <platform_def.h>
+
+       .globl  plat_secondary_cold_boot_setup
+       .globl  plat_get_my_entrypoint
+       .globl  plat_is_my_cpu_primary
+
+       /* --------------------------------------------------------------------
+        * void plat_secondary_cold_boot_setup (void);
+        *
+        * For AArch32, cold-booting secondary CPUs is not yet
+        * implemented and they panic.
+        * --------------------------------------------------------------------
+        */
+func plat_secondary_cold_boot_setup
+cb_panic:
+       b       cb_panic
+endfunc plat_secondary_cold_boot_setup
+
+       /* ---------------------------------------------------------------------
+        * unsigned long plat_get_my_entrypoint (void);
+        *
+        * Main job of this routine is to distinguish between a cold and warm
+        * boot. On FVP, this information can be queried from the power
+        * controller. The Power Control SYS Status Register (PSYSR) indicates
+        * the wake-up reason for the CPU.
+        *
+        * For a cold boot, return 0.
+        * For a warm boot, read the mailbox and return the address it contains.
+        *
+        * TODO: PSYSR is a common register and should be
+        *      accessed using locks. Since it is not possible
+        *      to use locks immediately after a cold reset
+        *      we are relying on the fact that after a cold
+        *      reset all cpus will read the same WK field
+        * ---------------------------------------------------------------------
+        */
+func plat_get_my_entrypoint
+       /* TODO support warm boot */
+       /* Cold reset */
+       mov     r0, #0
+       bx      lr
+
+endfunc plat_get_my_entrypoint
+
+       /* -----------------------------------------------------
+        * unsigned int plat_is_my_cpu_primary (void);
+        *
+        * Currently configured for a sigle CPU
+        * -----------------------------------------------------
+        */
+func plat_is_my_cpu_primary
+       mov     r0, #1
+       bx      lr
+endfunc plat_is_my_cpu_primary
diff --git a/plat/arm/board/fvp_ve/fdts/fvp_ve_tb_fw_config.dts b/plat/arm/board/fvp_ve/fdts/fvp_ve_tb_fw_config.dts
new file mode 100644 (file)
index 0000000..9ab2d96
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/dts-v1/;
+
+/ {
+       /* Platform Config */
+       plat_arm_bl2 {
+               compatible = "arm,tb_fw";
+               hw_config_addr = <0x0 0x82000000>;
+               hw_config_max_size = <0x01000000>;
+               /* Disable authentication for development */
+               disable_auth = <0x0>;
+       };
+};
diff --git a/plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c b/plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c
new file mode 100644 (file)
index 0000000..47cd876
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <plat/arm/common/plat_arm.h>
+#include <plat/common/platform.h>
+
+/*******************************************************************************
+ * Perform any BL1 specific platform actions.
+ ******************************************************************************/
+void bl1_early_platform_setup(void)
+{
+       arm_bl1_early_platform_setup();
+}
diff --git a/plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c b/plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c
new file mode 100644 (file)
index 0000000..25e0964
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <drivers/arm/sp804_delay_timer.h>
+#include <drivers/generic_delay_timer.h>
+#include <lib/mmio.h>
+#include <plat/arm/common/plat_arm.h>
+#include <plat/common/platform.h>
+#include <platform_def.h>
+
+#include "fvp_ve_private.h"
+
+void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3)
+{
+       arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1);
+
+       /* Initialize the platform config for future decision making */
+       fvp_ve_config_setup();
+}
+
+void bl2_platform_setup(void)
+{
+       arm_bl2_platform_setup();
+
+#ifdef FVP_VE_USE_SP804_TIMER
+       /*
+        * Enable the clock override for SP804 timer 0, which means that no
+        * clock dividers are applied and the raw (35 MHz) clock will be used
+        */
+       mmio_write_32(V2M_SP810_BASE, FVP_SP810_CTRL_TIM0_OV);
+
+       /* Initialize delay timer driver using SP804 dual timer 0 */
+       sp804_timer_init(V2M_SP804_TIMER0_BASE,
+                       SP804_TIMER_CLKMULT, SP804_TIMER_CLKDIV);
+#else
+       generic_delay_timer_init();
+#endif /* FVP_VE_USE_SP804_TIMER */
+}
diff --git a/plat/arm/board/fvp_ve/fvp_ve_common.c b/plat/arm/board/fvp_ve/fvp_ve_common.c
new file mode 100644 (file)
index 0000000..768dad5
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <assert.h>
+
+#include <common/debug.h>
+#include <lib/mmio.h>
+#include <platform_def.h>
+#include <plat/arm/common/arm_config.h>
+#include <plat/arm/common/plat_arm.h>
+
+#define MAP_DEVICE0    MAP_REGION_FLAT(DEVICE0_BASE,                   \
+                                       DEVICE0_SIZE,                   \
+                                       MT_DEVICE | MT_RW | MT_SECURE)
+
+#ifdef IMAGE_BL1
+const mmap_region_t plat_arm_mmap[] = {
+       ARM_MAP_SHARED_RAM,
+       V2M_MAP_FLASH1_RW,
+       V2M_MAP_IOFPGA,
+       {0}
+};
+#endif
+#ifdef IMAGE_BL2
+const mmap_region_t plat_arm_mmap[] = {
+       ARM_MAP_SHARED_RAM,
+       V2M_MAP_FLASH1_RW,
+       V2M_MAP_IOFPGA,
+       ARM_MAP_NS_DRAM1,
+       {0}
+};
+#endif
+#ifdef IMAGE_BL32
+const mmap_region_t plat_arm_mmap[] = {
+       ARM_MAP_SHARED_RAM,
+       V2M_MAP_IOFPGA,
+       MAP_DEVICE0,
+       {0}
+};
+#endif
+
+ARM_CASSERT_MMAP
+
+void __init fvp_ve_config_setup(void)
+{
+       unsigned int sys_id, arch;
+
+       sys_id = mmio_read_32(V2M_SYSREGS_BASE + V2M_SYS_ID);
+       arch = (sys_id >> V2M_SYS_ID_ARCH_SHIFT) & V2M_SYS_ID_ARCH_MASK;
+
+       if (arch != ARCH_MODEL_VE) {
+               ERROR("This firmware is for FVP VE models\n");
+               panic();
+       }
+}
+
+unsigned int plat_get_syscnt_freq2(void)
+{
+       return FVP_VE_TIMER_BASE_FREQUENCY;
+}
diff --git a/plat/arm/board/fvp_ve/fvp_ve_def.h b/plat/arm/board/fvp_ve/fvp_ve_def.h
new file mode 100644 (file)
index 0000000..fa13058
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef FVP_VE_DEF_H
+#define FVP_VE_DEF_H
+
+#include <lib/utils_def.h>
+
+/* Default cluster count for FVP VE */
+#define FVP_VE_CLUSTER_COUNT   1
+
+/* Default number of CPUs per cluster on FVP VE */
+#define FVP_VE_MAX_CPUS_PER_CLUSTER    1
+
+/* Default number of threads per CPU on FVP VE */
+#define FVP_VE_MAX_PE_PER_CPU  1
+
+#define FVP_VE_CORE_COUNT 1
+
+#define FVP_VE_PRIMARY_CPU                     0x0
+
+/*******************************************************************************
+ * FVP memory map related constants
+ ******************************************************************************/
+
+#define FLASH1_BASE                    0x0c000000
+#define FLASH1_SIZE                    0x04000000
+
+/* Aggregate of all devices in the first GB */
+#define DEVICE0_BASE                   0x20000000
+#define DEVICE0_SIZE                   0x0c200000
+
+#define NSRAM_BASE                     0x2e000000
+#define NSRAM_SIZE                     0x10000
+
+#define PCIE_EXP_BASE                  0x40000000
+#define TZRNG_BASE                     0x7fe60000
+
+#define ARCH_MODEL_VE                  0x5
+
+/* FVP Power controller base address*/
+#define PWRC_BASE                      UL(0x1c100000)
+
+/* FVP SP804 timer frequency is 35 MHz*/
+#define SP804_TIMER_CLKMULT            1
+#define SP804_TIMER_CLKDIV             35
+
+/* SP810 controller. FVP specific flags */
+#define FVP_SP810_CTRL_TIM0_OV         (1 << 16)
+#define FVP_SP810_CTRL_TIM1_OV         (1 << 18)
+#define FVP_SP810_CTRL_TIM2_OV         (1 << 20)
+#define FVP_SP810_CTRL_TIM3_OV         (1 << 22)
+
+/*******************************************************************************
+ * GIC-400 & interrupt handling related constants
+ ******************************************************************************/
+/* VE compatible GIC memory map */
+#define VE_GICD_BASE                   0x2c001000
+#define VE_GICC_BASE                   0x2c002000
+#define VE_GICH_BASE                   0x2c004000
+#define VE_GICV_BASE                   0x2c006000
+
+#define FVP_VE_IRQ_TZ_WDOG                     56
+#define FVP_VE_IRQ_SEC_SYS_TIMER               57
+
+#define V2M_FLASH1_BASE                        UL(0x0C000000)
+#define V2M_FLASH1_SIZE                        UL(0x04000000)
+
+#define V2M_MAP_FLASH1_RW              MAP_REGION_FLAT(V2M_FLASH1_BASE,\
+                                               V2M_FLASH1_SIZE,        \
+                                               MT_DEVICE | MT_RW | MT_SECURE)
+
+#define V2M_MAP_FLASH1_RO              MAP_REGION_FLAT(V2M_FLASH1_BASE,\
+                                               V2M_FLASH1_SIZE,        \
+                                               MT_RO_DATA | MT_SECURE)
+
+#endif /* FVP_VE_DEF_H */
diff --git a/plat/arm/board/fvp_ve/fvp_ve_pm.c b/plat/arm/board/fvp_ve/fvp_ve_pm.c
new file mode 100644 (file)
index 0000000..a4d627b
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2019, Arm Limited. All rights reserved.
+*
+* SPDX-License-Identifier: BSD-3-Clause
+*/
+
+#include <lib/psci/psci.h>
+#include <plat/arm/common/plat_arm.h>
+
+/*******************************************************************************
+ * Export the platform handlers via fvp_ve_psci_pm_ops. The ARM Standard
+ * platform layer will take care of registering the handlers with PSCI.
+ ******************************************************************************/
+plat_psci_ops_t fvp_ve_psci_pm_ops = {
+       /* dummy struct */
+       .validate_ns_entrypoint = NULL,
+};
+
+int __init plat_setup_psci_ops(uintptr_t sec_entrypoint,
+                               const plat_psci_ops_t **psci_ops)
+{
+       *psci_ops = &fvp_ve_psci_pm_ops;
+
+       return 0;
+}
diff --git a/plat/arm/board/fvp_ve/fvp_ve_private.h b/plat/arm/board/fvp_ve/fvp_ve_private.h
new file mode 100644 (file)
index 0000000..5d396bc
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef FVP_VE_PRIVATE_H
+#define FVP_VE_PRIVATE_H
+
+#include <plat/arm/common/plat_arm.h>
+
+/*******************************************************************************
+ * Function and variable prototypes
+ ******************************************************************************/
+
+void fvp_ve_config_setup(void);
+
+#endif /* FVP_VE_PRIVATE_H */
diff --git a/plat/arm/board/fvp_ve/fvp_ve_security.c b/plat/arm/board/fvp_ve/fvp_ve_security.c
new file mode 100644 (file)
index 0000000..24465cb
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/*
+ * We assume that all security programming is done by the primary core.
+ */
+void plat_arm_security_setup(void)
+{
+       /*
+        * The Base FVP has a TrustZone address space controller, the Foundation
+        * FVP does not. Trying to program the device on the foundation FVP will
+        * cause an abort.
+        *
+        * If the platform had additional peripheral specific security
+        * configurations, those would be configured here.
+        */
+
+       return;
+}
diff --git a/plat/arm/board/fvp_ve/fvp_ve_topology.c b/plat/arm/board/fvp_ve/fvp_ve_topology.c
new file mode 100644 (file)
index 0000000..51cc9da
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <platform_def.h>
+
+#include <drivers/arm/fvp/fvp_pwrc.h>
+#include <plat/arm/common/arm_config.h>
+#include <plat/arm/common/plat_arm.h>
+#include <plat/common/platform.h>
+
+/* The FVP VE power domain tree descriptor */
+static const unsigned char fvp_ve_power_domain_tree_desc[] = {
+       1,
+       /* No of children for the root node */
+       FVP_VE_CLUSTER_COUNT,
+       /* No of children for the first cluster node */
+       FVP_VE_CORE_COUNT,
+};
+
+/*******************************************************************************
+ * This function returns the topology according to FVP_VE_CLUSTER_COUNT.
+ ******************************************************************************/
+const unsigned char *plat_get_power_domain_tree_desc(void)
+{
+       return fvp_ve_power_domain_tree_desc;
+}
+
+/*******************************************************************************
+ * Currently FVP VE has only been tested with one core, therefore 0 is returned.
+ ******************************************************************************/
+int plat_core_pos_by_mpidr(u_register_t mpidr)
+{
+       return 0;
+}
diff --git a/plat/arm/board/fvp_ve/include/platform_def.h b/plat/arm/board/fvp_ve/include/platform_def.h
new file mode 100644 (file)
index 0000000..1870442
--- /dev/null
@@ -0,0 +1,330 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef PLATFORM_DEF_H
+#define PLATFORM_DEF_H
+
+#include <common/tbbr/tbbr_img_def.h>
+#include <lib/utils_def.h>
+#include <lib/xlat_tables/xlat_tables_defs.h>
+#include <plat/arm/board/common/v2m_def.h>
+#include <plat/common/common_def.h>
+
+#include "../fvp_ve_def.h"
+
+#define ARM_CACHE_WRITEBACK_SHIFT      6
+
+/* Memory location options for TSP */
+#define ARM_DRAM_ID                    2
+
+#define ARM_DRAM1_BASE                 UL(0x80000000)
+#define ARM_DRAM1_SIZE                 UL(0x80000000)
+#define ARM_DRAM1_END                  (ARM_DRAM1_BASE +               \
+                                        ARM_DRAM1_SIZE - 1)
+
+#define ARM_DRAM2_BASE                 UL(0x880000000)
+#define ARM_DRAM2_SIZE                 PLAT_ARM_DRAM2_SIZE
+#define ARM_DRAM2_END                  (ARM_DRAM2_BASE +               \
+                                        ARM_DRAM2_SIZE - 1)
+
+#define ARM_NS_DRAM1_BASE              ARM_DRAM1_BASE
+/*
+ * The last 2MB is meant to be NOLOAD and will not be zero
+ * initialized.
+ */
+#define ARM_NS_DRAM1_SIZE              (ARM_DRAM1_SIZE -               \
+                                        0x00200000)
+
+
+/* The first 4KB of NS DRAM1 are used as shared memory */
+#define FVP_VE_SHARED_RAM_BASE         ARM_NS_DRAM1_BASE
+#define FVP_VE_SHARED_RAM_SIZE         UL(0x00001000)  /* 4 KB */
+
+/* The next 252 kB of NS DRAM is used to load the BL images */
+#define ARM_BL_RAM_BASE                        (FVP_VE_SHARED_RAM_BASE +       \
+                                        FVP_VE_SHARED_RAM_SIZE)
+#define ARM_BL_RAM_SIZE                        (PLAT_ARM_BL_PLUS_SHARED_RAM_SIZE -     \
+                                        FVP_VE_SHARED_RAM_SIZE)
+
+
+#define ARM_IRQ_SEC_PHY_TIMER          29
+
+#define ARM_IRQ_SEC_SGI_0              8
+#define ARM_IRQ_SEC_SGI_1              9
+#define ARM_IRQ_SEC_SGI_2              10
+#define ARM_IRQ_SEC_SGI_3              11
+#define ARM_IRQ_SEC_SGI_4              12
+#define ARM_IRQ_SEC_SGI_5              13
+#define ARM_IRQ_SEC_SGI_6              14
+#define ARM_IRQ_SEC_SGI_7              15
+
+/*
+ * Define a list of Group 1 Secure and Group 0 interrupt properties as per GICv3
+ * terminology. On a GICv2 system or mode, the lists will be merged and treated
+ * as Group 0 interrupts.
+ */
+#define ARM_G1S_IRQ_PROPS(grp) \
+       INTR_PROP_DESC(ARM_IRQ_SEC_PHY_TIMER, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_LEVEL), \
+       INTR_PROP_DESC(ARM_IRQ_SEC_SGI_1, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_EDGE), \
+       INTR_PROP_DESC(ARM_IRQ_SEC_SGI_2, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_EDGE), \
+       INTR_PROP_DESC(ARM_IRQ_SEC_SGI_3, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_EDGE), \
+       INTR_PROP_DESC(ARM_IRQ_SEC_SGI_4, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_EDGE), \
+       INTR_PROP_DESC(ARM_IRQ_SEC_SGI_5, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_EDGE), \
+       INTR_PROP_DESC(ARM_IRQ_SEC_SGI_7, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_EDGE)
+
+#define ARM_G0_IRQ_PROPS(grp) \
+       INTR_PROP_DESC(ARM_IRQ_SEC_SGI_6, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_EDGE)
+
+#define ARM_MAP_SHARED_RAM             MAP_REGION_FLAT(                \
+                                               FVP_VE_SHARED_RAM_BASE, \
+                                               FVP_VE_SHARED_RAM_SIZE, \
+                                               MT_DEVICE | MT_RW | MT_SECURE)
+
+#define ARM_MAP_NS_DRAM1               MAP_REGION_FLAT(                \
+                                               ARM_NS_DRAM1_BASE,      \
+                                               ARM_NS_DRAM1_SIZE,      \
+                                               MT_MEMORY | MT_RW | MT_NS)
+
+#define ARM_MAP_DRAM2                  MAP_REGION_FLAT(                \
+                                               ARM_DRAM2_BASE,         \
+                                               ARM_DRAM2_SIZE,         \
+                                               MT_MEMORY | MT_RW | MT_NS)
+
+#define ARM_MAP_BL_RO                  MAP_REGION_FLAT(                        \
+                                               BL_CODE_BASE,                   \
+                                               BL_CODE_END - BL_CODE_BASE,     \
+                                               MT_CODE | MT_SECURE),           \
+                                       MAP_REGION_FLAT(                        \
+                                               BL_RO_DATA_BASE,                \
+                                               BL_RO_DATA_END                  \
+                                                       - BL_RO_DATA_BASE,      \
+                                               MT_RO_DATA | MT_SECURE)
+
+#if USE_COHERENT_MEM
+#define ARM_MAP_BL_COHERENT_RAM                MAP_REGION_FLAT(                        \
+                                               BL_COHERENT_RAM_BASE,           \
+                                               BL_COHERENT_RAM_END             \
+                                                       - BL_COHERENT_RAM_BASE, \
+                                               MT_DEVICE | MT_RW | MT_SECURE)
+#endif
+
+/*
+ * The max number of regions like RO(code), coherent and data required by
+ * different BL stages which need to be mapped in the MMU.
+ */
+#define ARM_BL_REGIONS                 5
+
+#define MAX_MMAP_REGIONS               (PLAT_ARM_MMAP_ENTRIES +        \
+                                        ARM_BL_REGIONS)
+
+/* Memory mapped Generic timer interfaces  */
+#define FVP_VE_TIMER_BASE_FREQUENCY            UL(24000000)
+#define ARM_SYS_CNTREAD_BASE   UL(0x2a800000)
+#define ARM_SYS_CNT_BASE_S             UL(0x2a820000)
+#define ARM_SYS_CNT_BASE_NS            UL(0x2a830000)
+
+#define ARM_CONSOLE_BAUDRATE           115200
+
+/* Trusted Watchdog constants */
+#define ARM_SP805_TWDG_BASE            UL(0x1C0F0000)
+#define ARM_SP805_TWDG_CLK_HZ          32768
+/* The TBBR document specifies a watchdog timeout of 256 seconds. SP805
+ * asserts reset after two consecutive countdowns (2 x 128 = 256 sec) */
+#define ARM_TWDG_TIMEOUT_SEC           128
+#define ARM_TWDG_LOAD_VAL              (ARM_SP805_TWDG_CLK_HZ *        \
+                                        ARM_TWDG_TIMEOUT_SEC)
+
+#define PLAT_PHY_ADDR_SPACE_SIZE                       (1ULL << 32)
+#define PLAT_VIRT_ADDR_SPACE_SIZE                      (1ULL << 32)
+
+/*
+ * This macro defines the deepest retention state possible. A higher state
+ * id will represent an invalid or a power down state.
+ */
+#define PLAT_MAX_RET_STATE             1
+
+/*
+ * This macro defines the deepest power down states possible. Any state ID
+ * higher than this is invalid.
+ */
+#define PLAT_MAX_OFF_STATE             2
+
+/*
+ * Some data must be aligned on the biggest cache line size in the platform.
+ * This is known only to the platform as it might have a combination of
+ * integrated and external caches.
+ */
+#define CACHE_WRITEBACK_GRANULE                (U(1) << ARM_CACHE_WRITEBACK_SHIFT)
+
+/*
+ * To enable TB_FW_CONFIG to be loaded by BL1, define the corresponding base
+ * and limit. Leave enough space of BL2 meminfo.
+ */
+#define ARM_TB_FW_CONFIG_BASE          (ARM_BL_RAM_BASE + sizeof(meminfo_t))
+#define ARM_TB_FW_CONFIG_LIMIT         (ARM_BL_RAM_BASE + PAGE_SIZE)
+
+/*******************************************************************************
+ * BL1 specific defines.
+ * BL1 RW data is relocated from ROM to RAM at runtime so we need 2 sets of
+ * addresses.
+ ******************************************************************************/
+#define BL1_RO_BASE                    0x00000000
+#define BL1_RO_LIMIT                   PLAT_ARM_TRUSTED_ROM_SIZE
+/*
+ * Put BL1 RW at the top of the memory allocated for BL images in NS DRAM.
+ */
+#define BL1_RW_BASE                    (ARM_BL_RAM_BASE +              \
+                                               ARM_BL_RAM_SIZE -       \
+                                               (PLAT_ARM_MAX_BL1_RW_SIZE))
+#define BL1_RW_LIMIT                   (ARM_BL_RAM_BASE +              \
+                                           (ARM_BL_RAM_SIZE))
+
+
+/*******************************************************************************
+ * BL2 specific defines.
+ ******************************************************************************/
+
+/*
+ * Put BL2 just below BL1.
+ */
+#define BL2_BASE                       (BL1_RW_BASE - FVP_VE_MAX_BL2_SIZE)
+#define BL2_LIMIT                      BL1_RW_BASE
+
+
+/* Put BL32 below BL2 in NS DRAM.*/
+#define ARM_BL2_MEM_DESC_BASE          ARM_TB_FW_CONFIG_LIMIT
+
+#define BL32_BASE                      ((ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE)\
+                                               - PLAT_ARM_MAX_BL32_SIZE)
+#define BL32_PROGBITS_LIMIT            BL2_BASE
+#define BL32_LIMIT                     (ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE)
+
+/* Required platform porting definitions */
+#define PLATFORM_CORE_COUNT            1
+#define PLAT_NUM_PWR_DOMAINS           ((FVP_VE_CLUSTER_COUNT + \
+                                       PLATFORM_CORE_COUNT) + 1)
+
+#define PLAT_MAX_PWR_LVL               2
+
+/*
+ * Other platform porting definitions are provided by included headers
+ */
+
+/*
+ * Required ARM standard platform porting definitions
+ */
+
+#define PLAT_ARM_BL_PLUS_SHARED_RAM_SIZE       0x00040000      /* 256 KB */
+
+#define PLAT_ARM_TRUSTED_ROM_BASE      0x00000000
+#define PLAT_ARM_TRUSTED_ROM_SIZE      0x04000000      /* 64 MB */
+
+#define PLAT_ARM_DRAM2_SIZE            ULL(0x80000000)
+
+/*
+ * Load address of BL33 for this platform port
+ */
+#define PLAT_ARM_NS_IMAGE_BASE (ARM_DRAM1_BASE + U(0x8000000))
+
+/*
+ * PLAT_ARM_MMAP_ENTRIES depends on the number of entries in the
+ * plat_arm_mmap array defined for each BL stage.
+ */
+#if defined(IMAGE_BL32)
+# define PLAT_ARM_MMAP_ENTRIES         8
+# define MAX_XLAT_TABLES               6
+#else
+# define PLAT_ARM_MMAP_ENTRIES         12
+# define MAX_XLAT_TABLES               6
+#endif
+
+/*
+ * PLAT_ARM_MAX_BL1_RW_SIZE is calculated using the current BL1 RW debug size
+ * plus a little space for growth.
+ */
+#define PLAT_ARM_MAX_BL1_RW_SIZE       0xB000
+
+/*
+ * FVP_VE_MAX_BL2_SIZE is calculated using the current BL2 debug size plus a
+ * little space for growth.
+ */
+#define FVP_VE_MAX_BL2_SIZE            0x11000
+
+/*
+ * Since BL32 NOBITS overlays BL2 and BL1-RW, PLAT_ARM_MAX_BL32_SIZE is
+ * calculated using the current SP_MIN PROGBITS debug size plus the sizes of
+ * BL2 and BL1-RW
+ */
+#define PLAT_ARM_MAX_BL32_SIZE         0x3B000
+/*
+
+ * Size of cacheable stacks
+ */
+#if defined(IMAGE_BL1)
+#  define PLATFORM_STACK_SIZE 0x440
+#elif defined(IMAGE_BL2)
+#  define PLATFORM_STACK_SIZE 0x400
+#elif defined(IMAGE_BL32)
+# define PLATFORM_STACK_SIZE 0x440
+#endif
+
+#define MAX_IO_DEVICES                 3
+#define MAX_IO_HANDLES                 4
+
+/* Reserve the last block of flash for PSCI MEM PROTECT flag */
+#define PLAT_ARM_FIP_BASE              V2M_FLASH1_BASE
+#define PLAT_ARM_FIP_MAX_SIZE          (V2M_FLASH1_SIZE - V2M_FLASH_BLOCK_SIZE)
+
+#define PLAT_ARM_NVM_BASE              V2M_FLASH1_BASE
+#define PLAT_ARM_NVM_SIZE              (V2M_FLASH1_SIZE - V2M_FLASH_BLOCK_SIZE)
+
+/*
+ * PL011 related constants
+ */
+#define PLAT_ARM_BOOT_UART_BASE                V2M_IOFPGA_UART0_BASE
+#define PLAT_ARM_BOOT_UART_CLK_IN_HZ   V2M_IOFPGA_UART0_CLK_IN_HZ
+
+#define PLAT_ARM_RUN_UART_BASE         V2M_IOFPGA_UART1_BASE
+#define PLAT_ARM_RUN_UART_CLK_IN_HZ    V2M_IOFPGA_UART1_CLK_IN_HZ
+
+#define PLAT_ARM_CRASH_UART_BASE       PLAT_ARM_RUN_UART_BASE
+#define PLAT_ARM_CRASH_UART_CLK_IN_HZ  PLAT_ARM_RUN_UART_CLK_IN_HZ
+
+/* System timer related constants */
+#define PLAT_ARM_NSTIMER_FRAME_ID              1
+
+/* Mailbox base address */
+#define FVP_VE_TRUSTED_MAILBOX_BASE    FVP_VE_SHARED_RAM_BASE
+
+/*
+ * GIC related constants to cater for GICv2
+ */
+#define PLAT_ARM_GICD_BASE             VE_GICD_BASE
+#define PLAT_ARM_GICC_BASE             VE_GICC_BASE
+
+/*
+ * Define a list of Group 1 Secure and Group 0 interrupts as per GICv3
+ * terminology. On a GICv2 system or mode, the lists will be merged and treated
+ * as Group 0 interrupts.
+ */
+#define PLAT_ARM_G1S_IRQ_PROPS(grp) \
+       ARM_G1S_IRQ_PROPS(grp), \
+       INTR_PROP_DESC(FVP_VE_IRQ_TZ_WDOG, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_LEVEL), \
+       INTR_PROP_DESC(FVP_VE_IRQ_SEC_SYS_TIMER, GIC_HIGHEST_SEC_PRIORITY, (grp), \
+                       GIC_INTR_CFG_LEVEL)
+
+#define PLAT_ARM_G0_IRQ_PROPS(grp)     ARM_G0_IRQ_PROPS(grp)
+
+#endif /* PLATFORM_H */
diff --git a/plat/arm/board/fvp_ve/platform.mk b/plat/arm/board/fvp_ve/platform.mk
new file mode 100644 (file)
index 0000000..f9ced2c
--- /dev/null
@@ -0,0 +1,125 @@
+#
+# Copyright (c) 2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+ifdef ARM_CORTEX_A5
+# Use the SP804 timer instead of the generic one
+FVP_VE_USE_SP804_TIMER := 1
+$(eval $(call add_define,FVP_VE_USE_SP804_TIMER))
+BL2_SOURCES            +=      drivers/arm/sp804/sp804_delay_timer.c
+endif
+
+FVP_VE_GIC_SOURCES             :=      drivers/arm/gic/common/gic_common.c     \
+                               drivers/arm/gic/v2/gicv2_main.c         \
+                               drivers/arm/gic/v2/gicv2_helpers.c      \
+                               plat/common/plat_gicv2.c                \
+                               plat/arm/common/arm_gicv2.c
+
+FVP_VE_SECURITY_SOURCES        :=      plat/arm/board/fvp_ve/fvp_ve_security.c
+
+PLAT_INCLUDES          :=      -Iplat/arm/board/fvp_ve/include
+
+PLAT_BL_COMMON_SOURCES :=      plat/arm/board/fvp_ve/fvp_ve_common.c           \
+                               plat/arm/common/${ARCH}/arm_helpers.S           \
+                               plat/arm/common/arm_common.c                    \
+                               plat/arm/common/arm_console.c                   \
+                               drivers/arm/pl011/${ARCH}/pl011_console.S       \
+                               plat/arm/board/common/${ARCH}/board_arm_helpers.S
+
+ifdef ARM_CORTEX_A5
+FVP_VE_CPU_LIBS                :=      lib/cpus/aarch32/cortex_a5.S
+else
+FVP_VE_CPU_LIBS                :=      lib/cpus/aarch32/cortex_a7.S
+endif
+
+BL1_SOURCES            +=      drivers/arm/sp805/sp805.c                       \
+                               drivers/io/io_fip.c                             \
+                               drivers/io/io_memmap.c                          \
+                               drivers/io/io_storage.c                         \
+                               plat/arm/common/arm_bl1_setup.c                 \
+                               plat/arm/common/arm_err.c                       \
+                               plat/arm/common/arm_io_storage.c                \
+                               drivers/cfi/v2m/v2m_flash.c                     \
+                               plat/arm/board/fvp_ve/${ARCH}/fvp_ve_helpers.S  \
+                               plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c        \
+                               lib/aarch32/arm32_aeabi_divmod.c                \
+                               lib/aarch32/arm32_aeabi_divmod_a32.S            \
+                               ${FVP_VE_CPU_LIBS}                                      \
+                               ${DYN_CFG_SOURCES}
+
+BL2_SOURCES            +=      plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c                \
+                               lib/aarch32/arm32_aeabi_divmod.c                \
+                               lib/aarch32/arm32_aeabi_divmod_a32.S            \
+                               drivers/delay_timer/delay_timer.c               \
+                               drivers/delay_timer/generic_delay_timer.c       \
+                               drivers/cfi/v2m/v2m_flash.c                     \
+                               drivers/io/io_fip.c                             \
+                               drivers/io/io_memmap.c                          \
+                               drivers/io/io_storage.c                         \
+                               plat/arm/common/arm_bl2_setup.c                 \
+                               plat/arm/common/arm_err.c                       \
+                               plat/arm/common/arm_io_storage.c                \
+                               plat/arm/common/${ARCH}/arm_bl2_mem_params_desc.c       \
+                               plat/arm/common/arm_image_load.c                \
+                               common/desc_image_load.c                        \
+                               ${DYN_CFG_SOURCES}                              \
+                               ${FVP_VE_SECURITY_SOURCES}
+
+# Add the FDT_SOURCES and options for Dynamic Config (only for Unix env)
+ifdef UNIX_MK
+
+FDT_SOURCES            +=      plat/arm/board/fvp_ve/fdts/fvp_ve_tb_fw_config.dts
+
+FVP_TB_FW_CONFIG       :=      ${BUILD_PLAT}/fdts/fvp_ve_tb_fw_config.dtb
+
+# Add the TB_FW_CONFIG to FIP and specify the same to certtool
+$(eval $(call TOOL_ADD_PAYLOAD,${FVP_TB_FW_CONFIG},--tb-fw-config))
+
+FDT_SOURCES            +=      ${FVP_HW_CONFIG_DTS}
+$(eval FVP_HW_CONFIG   :=      ${BUILD_PLAT}/$(patsubst %.dts,%.dtb, \
+       fdts/$(notdir ${FVP_HW_CONFIG_DTS})))
+# Add the HW_CONFIG to FIP and specify the same to certtool
+$(eval $(call TOOL_ADD_PAYLOAD,${FVP_HW_CONFIG},--hw-config))
+endif
+
+NEED_BL32 := yes
+
+# Modification of arm_common.mk
+
+# Process ARM_DISABLE_TRUSTED_WDOG flag
+# By default, Trusted Watchdog is always enabled unless SPIN_ON_BL1_EXIT is set
+ARM_DISABLE_TRUSTED_WDOG       :=      0
+ifeq (${SPIN_ON_BL1_EXIT}, 1)
+ARM_DISABLE_TRUSTED_WDOG       :=      1
+endif
+$(eval $(call assert_boolean,ARM_DISABLE_TRUSTED_WDOG))
+$(eval $(call add_define,ARM_DISABLE_TRUSTED_WDOG))
+
+# Use translation tables library v1 if using Cortex-A5
+ifdef ARM_CORTEX_A5
+ARM_XLAT_TABLES_LIB_V1         :=      1
+else
+ARM_XLAT_TABLES_LIB_V1         :=      0
+endif
+$(eval $(call assert_boolean,ARM_XLAT_TABLES_LIB_V1))
+$(eval $(call add_define,ARM_XLAT_TABLES_LIB_V1))
+
+MULTI_CONSOLE_API              :=      1
+
+ifeq (${ARM_XLAT_TABLES_LIB_V1}, 1)
+       # Only use nonlpae version of xlatv1 otherwise use xlat v2
+       PLAT_BL_COMMON_SOURCES  +=      lib/xlat_tables/${ARCH}/nonlpae_tables.c
+else
+       include lib/xlat_tables_v2/xlat_tables.mk
+       PLAT_BL_COMMON_SOURCES  +=      ${XLAT_TABLES_LIB_SRCS}
+endif
+
+# Add `libfdt` and Arm common helpers required for Dynamic Config
+include lib/libfdt/libfdt.mk
+
+DYN_CFG_SOURCES                +=      plat/arm/common/arm_dyn_cfg.c           \
+                               plat/arm/common/arm_dyn_cfg_helpers.c   \
+                               common/fdt_wrappers.c
+
diff --git a/plat/arm/board/fvp_ve/sp_min/fvp_ve_sp_min_setup.c b/plat/arm/board/fvp_ve/sp_min/fvp_ve_sp_min_setup.c
new file mode 100644 (file)
index 0000000..e6a1bbe
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <assert.h>
+
+#include <plat/arm/common/plat_arm.h>
+
+void plat_arm_sp_min_early_platform_setup(u_register_t arg0, u_register_t arg1,
+                       u_register_t arg2, u_register_t arg3)
+{
+       arm_sp_min_early_platform_setup((void *)arg0, arg1, arg2, (void *)arg3);
+}
diff --git a/plat/arm/board/fvp_ve/sp_min/sp_min-fvp_ve.mk b/plat/arm/board/fvp_ve/sp_min/sp_min-fvp_ve.mk
new file mode 100644 (file)
index 0000000..4ca810d
--- /dev/null
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# SP_MIN source files specific to FVP platform
+BL32_SOURCES           +=      drivers/cfi/v2m/v2m_flash.c                     \
+                               lib/utils/mem_region.c                          \
+                               plat/arm/board/fvp_ve/aarch32/fvp_ve_helpers.S  \
+                               drivers/arm/fvp/fvp_pwrc.c                      \
+                               plat/arm/board/fvp_ve/fvp_ve_pm.c               \
+                               plat/arm/board/fvp_ve/fvp_ve_topology.c         \
+                               plat/arm/board/fvp_ve/sp_min/fvp_ve_sp_min_setup.c      \
+                               lib/aarch32/arm32_aeabi_divmod.c                \
+                               lib/aarch32/arm32_aeabi_divmod_a32.S            \
+                               plat/arm/common/sp_min/arm_sp_min_setup.c       \
+                               plat/common/aarch32/platform_mp_stack.S         \
+                               plat/common/plat_psci_common.c                  \
+                               ${FVP_VE_CPU_LIBS}                              \
+                               ${FVP_VE_GIC_SOURCES}                           \
+                               ${FVP_VE_SECURITY_SOURCES}
index fd4809c16294cdf80c357d5b61109c22caa48bf8..59a255e9eb3c9c91d0bdc82a30f1e6e6e7ea244d 100644 (file)
@@ -155,7 +155,9 @@ void arm_bl1_platform_setup(void)
         * Allow access to the System counter timer module and program
         * counter frequency for non secure images during FWU
         */
+#ifdef ARM_SYS_TIMCTL_BASE
        arm_configure_sys_timer();
+#endif
        write_cntfrq_el0(plat_get_syscnt_freq2());
 }
 
index 1c58649ba51c59695940d6c63ad798d0b7eb067b..9a536495203bb52796f3a8a09d022cc836f350d4 100644 (file)
@@ -243,10 +243,11 @@ void arm_bl2_dyn_cfg_init(void)
                        if (check_uptr_overflow(image_base, image_size))
                                continue;
 
+#ifdef BL31_BASE
                        /* Ensure the configs don't overlap with BL31 */
                        if ((image_base > BL31_BASE) || ((image_base + image_size) > BL31_BASE))
                                continue;
-
+#endif
                        /* Ensure the configs are loaded in a valid address */
                        if (image_base < ARM_BL_RAM_BASE)
                                continue;
index c0ea027b846839ad23df7ea53d37d0fa5275e8fb..bb69914ae33b56fd35a4c6c3a9c58b0ab1a81901 100644 (file)
@@ -193,12 +193,14 @@ void sp_min_platform_setup(void)
 #endif
 
        /* Enable and initialize the System level generic timer */
+#ifdef ARM_SYS_CNTCTL_BASE
        mmio_write_32(ARM_SYS_CNTCTL_BASE + CNTCR_OFF,
                        CNTCR_FCREQ(0U) | CNTCR_EN);
-
+#endif
+#ifdef ARM_SYS_TIMCTL_BASE
        /* Allow access to the System counter timer module */
        arm_configure_sys_timer();
-
+#endif
        /* Initialize power controller before setting up topology */
        plat_arm_pwrc_setup();
 }