Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 1 | /* |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 2 | * Copyright (c) 2019-2022, ARM Limited and Contributors. All rights reserved. |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 3 | * |
| 4 | * SPDX-License-Identifier: BSD-3-Clause |
| 5 | */ |
| 6 | |
| 7 | #include <assert.h> |
| 8 | #include <arch_helpers.h> |
| 9 | #include <drivers/delay_timer.h> |
| 10 | #include <lib/mmio.h> |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 11 | #include "socfpga_plat_def.h" |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 12 | |
Sieu Mun Tang | f48707a | 2022-06-23 18:05:02 +0800 | [diff] [blame] | 13 | |
| 14 | #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX |
| 15 | #include "agilex_clock_manager.h" |
| 16 | #elif PLATFORM_MODEL == PLAT_SOCFPGA_N5X |
| 17 | #include "n5x_clock_manager.h" |
| 18 | #elif PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10 |
| 19 | #include "s10_clock_manager.h" |
| 20 | #endif |
| 21 | |
Hadi Asyrafi | 6a240c7 | 2019-08-01 15:21:20 +0800 | [diff] [blame] | 22 | #define SOCFPGA_GLOBAL_TIMER 0xffd01000 |
| 23 | #define SOCFPGA_GLOBAL_TIMER_EN 0x3 |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 24 | |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 25 | static timer_ops_t plat_timer_ops; |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 26 | /******************************************************************** |
| 27 | * The timer delay function |
| 28 | ********************************************************************/ |
| 29 | static uint32_t socfpga_get_timer_value(void) |
| 30 | { |
| 31 | /* |
| 32 | * Generic delay timer implementation expects the timer to be a down |
| 33 | * counter. We apply bitwise NOT operator to the tick values returned |
| 34 | * by read_cntpct_el0() to simulate the down counter. The value is |
| 35 | * clipped from 64 to 32 bits. |
| 36 | */ |
| 37 | return (uint32_t)(~read_cntpct_el0()); |
| 38 | } |
| 39 | |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 40 | void socfpga_delay_timer_init_args(void) |
| 41 | { |
| 42 | plat_timer_ops.get_timer_value = socfpga_get_timer_value; |
| 43 | plat_timer_ops.clk_mult = 1; |
| 44 | plat_timer_ops.clk_div = PLAT_SYS_COUNTER_FREQ_IN_MHZ; |
| 45 | |
| 46 | timer_init(&plat_timer_ops); |
| 47 | |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 48 | } |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 49 | |
| 50 | void socfpga_delay_timer_init(void) |
| 51 | { |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 52 | socfpga_delay_timer_init_args(); |
Hadi Asyrafi | 6a240c7 | 2019-08-01 15:21:20 +0800 | [diff] [blame] | 53 | mmio_write_32(SOCFPGA_GLOBAL_TIMER, SOCFPGA_GLOBAL_TIMER_EN); |
Tien Hock Loh | 64d2b2f | 2020-05-11 01:12:03 -0700 | [diff] [blame] | 54 | |
Sieu Mun Tang | f48707a | 2022-06-23 18:05:02 +0800 | [diff] [blame] | 55 | NOTICE("BL31 CLK freq = %d MHz\n", PLAT_SYS_COUNTER_FREQ_IN_MHZ); |
| 56 | |
Tien Hock Loh | 64d2b2f | 2020-05-11 01:12:03 -0700 | [diff] [blame] | 57 | asm volatile("msr cntp_ctl_el0, %0" : : "r" (SOCFPGA_GLOBAL_TIMER_EN)); |
| 58 | asm volatile("msr cntp_tval_el0, %0" : : "r" (~0)); |
| 59 | |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 60 | } |