xref: /rk3399_ARM-atf/drivers/qti/qtimer/qtimer.c (revision 5de3e03dbd7c2da6748e294f423c83f9582f459c)
1 /*
2  * Copyright (c) 2026, Qualcomm Technologies, Inc. and/or its subsidiaries.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <arch_helpers.h>
8 #include <drivers/qti/qtimer/qtimer.h>
9 #include <lib/mmio.h>
10 
11 #include <qtimer_defs.h>
12 
13 #define	QTIMER_FREQ_IN_100KHZ		192ULL
14 
15 #define VOFF_FG0_LO_OFFSET(n)		(0x80 + 0x8 * (n))
16 #define VOFF_FG0_HI_OFFSET(n)		(0x84 + 0x8 * (n))
17 #define ACR_FG0_OFFSET(n)		(0x40 + 0x4 * (n))
18 #define SAR_FG0_OFFSET			(0x4)
19 
20 /* Security configuration */
qti_qtimer_init(void)21 void qti_qtimer_init(void)
22 {
23 	uint8_t i;
24 
25 	mmio_write_32(QTI_QTIMER_BASE + SAR_FG0_OFFSET, 0x7F);
26 
27 	for (i = 0; i < QTIMER_NBR_FRAMES; i++) {
28 		mmio_write_32(QTI_QTIMER_BASE + ACR_FG0_OFFSET(i), 0x3F);
29 		mmio_write_32(QTI_QTIMER_BASE + VOFF_FG0_LO_OFFSET(i), 0x0);
30 		mmio_write_32(QTI_QTIMER_BASE + VOFF_FG0_HI_OFFSET(i), 0x0);
31 	}
32 
33 	dsbsy();
34 	isb();
35 }
36 
qti_qtimer_get_raw(void)37 uint64_t qti_qtimer_get_raw(void)
38 {
39 	/* Assumes atomics reads */
40 	return mmio_read_64(QTIMER0_F2V1_BASE_ADDRESS);
41 }
42 
qti_qtimer_get_usec(void)43 uint64_t qti_qtimer_get_usec(void)
44 {
45 	uint64_t ticks = qti_qtimer_get_raw();
46 
47 	return ((ticks * 10ULL) / QTIMER_FREQ_IN_100KHZ);
48 }
49 
50