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