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 | |
Hadi Asyrafi | 6a240c7 | 2019-08-01 15:21:20 +0800 | [diff] [blame] | 13 | #define SOCFPGA_GLOBAL_TIMER 0xffd01000 |
| 14 | #define SOCFPGA_GLOBAL_TIMER_EN 0x3 |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 15 | |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 16 | static timer_ops_t plat_timer_ops; |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 17 | /******************************************************************** |
| 18 | * The timer delay function |
| 19 | ********************************************************************/ |
| 20 | static uint32_t socfpga_get_timer_value(void) |
| 21 | { |
| 22 | /* |
| 23 | * Generic delay timer implementation expects the timer to be a down |
| 24 | * counter. We apply bitwise NOT operator to the tick values returned |
| 25 | * by read_cntpct_el0() to simulate the down counter. The value is |
| 26 | * clipped from 64 to 32 bits. |
| 27 | */ |
| 28 | return (uint32_t)(~read_cntpct_el0()); |
| 29 | } |
| 30 | |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 31 | void socfpga_delay_timer_init_args(void) |
| 32 | { |
| 33 | plat_timer_ops.get_timer_value = socfpga_get_timer_value; |
| 34 | plat_timer_ops.clk_mult = 1; |
| 35 | plat_timer_ops.clk_div = PLAT_SYS_COUNTER_FREQ_IN_MHZ; |
| 36 | |
| 37 | timer_init(&plat_timer_ops); |
| 38 | |
| 39 | NOTICE("BL31: MPU clock frequency: %d MHz\n", plat_timer_ops.clk_div); |
| 40 | } |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 41 | |
| 42 | void socfpga_delay_timer_init(void) |
| 43 | { |
BenjaminLimJL | a4a4327 | 2022-04-06 10:19:16 +0800 | [diff] [blame] | 44 | socfpga_delay_timer_init_args(); |
Hadi Asyrafi | 6a240c7 | 2019-08-01 15:21:20 +0800 | [diff] [blame] | 45 | mmio_write_32(SOCFPGA_GLOBAL_TIMER, SOCFPGA_GLOBAL_TIMER_EN); |
Tien Hock Loh | 64d2b2f | 2020-05-11 01:12:03 -0700 | [diff] [blame] | 46 | |
| 47 | asm volatile("msr cntp_ctl_el0, %0" : : "r" (SOCFPGA_GLOBAL_TIMER_EN)); |
| 48 | asm volatile("msr cntp_tval_el0, %0" : : "r" (~0)); |
| 49 | |
Hadi Asyrafi | 616da77 | 2019-06-27 11:34:03 +0800 | [diff] [blame] | 50 | } |