synquacer: Enable System level Generic timer
authorSumit Garg <sumit.garg@linaro.org>
Fri, 15 Jun 2018 09:32:31 +0000 (15:02 +0530)
committerSumit Garg <sumit.garg@linaro.org>
Thu, 21 Jun 2018 05:52:57 +0000 (11:22 +0530)
Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
plat/socionext/synquacer/include/platform_def.h
plat/socionext/synquacer/sq_bl31_setup.c

index e6cbea405157154278d69cd21768e91e4b5daa4a..82c38109ed7c38c1afb544e01867a4106a907a6a 100644 (file)
 #define PLAT_SQ_BOOT_UART_CLK_IN_HZ    62500000
 #define SQ_CONSOLE_BAUDRATE            115200
 
+#define SQ_SYS_CNTCTL_BASE             0x2a430000
+
+#define SQ_SYS_TIMCTL_BASE             0x2a810000
+#define PLAT_SQ_NSTIMER_FRAME_ID       0
+
 #define SQ_BOOT_CFG_ADDR                       0x45410000
 #define PLAT_SQ_PRIMARY_CPU_SHIFT              8
 #define PLAT_SQ_PRIMARY_CPU_BIT_WIDTH          6
index da25ff14329d075613a38ffefe2a650b3cd1fde5..d2a458ce3ac16de65e6969f3dc06994a4599906a 100644 (file)
@@ -11,6 +11,7 @@
 #include <bl_common.h>
 #include <pl011.h>
 #include <debug.h>
+#include <mmio.h>
 #include <sq_common.h>
 
 static console_pl011_t console;
@@ -94,6 +95,20 @@ void bl31_early_platform_setup(bl31_params_t *from_bl2,
        SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
 }
 
+static void sq_configure_sys_timer(void)
+{
+       unsigned int reg_val;
+
+       reg_val = (1 << CNTACR_RPCT_SHIFT) | (1 << CNTACR_RVCT_SHIFT);
+       reg_val |= (1 << CNTACR_RFRQ_SHIFT) | (1 << CNTACR_RVOFF_SHIFT);
+       reg_val |= (1 << CNTACR_RWVT_SHIFT) | (1 << CNTACR_RWPT_SHIFT);
+       mmio_write_32(SQ_SYS_TIMCTL_BASE +
+                     CNTACR_BASE(PLAT_SQ_NSTIMER_FRAME_ID), reg_val);
+
+       reg_val = (1 << CNTNSAR_NS_SHIFT(PLAT_SQ_NSTIMER_FRAME_ID));
+       mmio_write_32(SQ_SYS_TIMCTL_BASE + CNTNSAR, reg_val);
+}
+
 void bl31_platform_setup(void)
 {
        /* Initialize the CCN interconnect */
@@ -103,6 +118,13 @@ void bl31_platform_setup(void)
        /* Initialize the GIC driver, cpu and distributor interfaces */
        sq_gic_driver_init();
        sq_gic_init();
+
+       /* Enable and initialize the System level generic timer */
+       mmio_write_32(SQ_SYS_CNTCTL_BASE + CNTCR_OFF,
+                       CNTCR_FCREQ(0) | CNTCR_EN);
+
+       /* Allow access to the System counter timer module */
+       sq_configure_sys_timer();
 }
 
 void bl31_plat_runtime_setup(void)
@@ -112,3 +134,17 @@ void bl31_plat_runtime_setup(void)
 void bl31_plat_arch_setup(void)
 {
 }
+
+unsigned int plat_get_syscnt_freq2(void)
+{
+       unsigned int counter_base_frequency;
+
+       /* Read the frequency from Frequency modes table */
+       counter_base_frequency = mmio_read_32(SQ_SYS_CNTCTL_BASE + CNTFID_OFF);
+
+       /* The first entry of the frequency modes table must not be 0 */
+       if (counter_base_frequency == 0)
+               panic();
+
+       return counter_base_frequency;
+}