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-Ortizvoid 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-Ortizuint64_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-Ortizuint64_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