|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | #include "rv_timer.h" | 
|  |  | 
|  | #include "common.h" | 
|  | #include "rv_timer_regs.h" | 
|  |  | 
|  | #define RV_TIMER0_BASE_ADDR 0x40080000 | 
|  | #define HART_CFG_ADDR_GAP 0x100 | 
|  |  | 
|  | static const uint32_t NS_IN_S = 1000 * 1000 * 1000; | 
|  |  | 
|  | void rv_timer_set_us_tick(uint32_t hart) { | 
|  | uint32_t ticks_per_us = (uint32_t)((1000 * CLK_FIXED_FREQ_HZ) / NS_IN_S) - 1; | 
|  |  | 
|  | REG32(RV_TIMER_CFG0(0) + hart * 4) = | 
|  | (ticks_per_us & RV_TIMER_CFG0_PRESCALE_MASK) | | 
|  | (1 << RV_TIMER_CFG0_STEP_OFFSET); | 
|  | } | 
|  |  | 
|  | void rv_timer_set_cmp(uint32_t hart, uint64_t cmp) { | 
|  | REG32(RV_TIMER_COMPARE_UPPER0_0(0) + hart * HART_CFG_ADDR_GAP) = -1; | 
|  | REG32(RV_TIMER_COMPARE_LOWER0_0(0) + hart * HART_CFG_ADDR_GAP) = | 
|  | (uint32_t)cmp; | 
|  | REG32(RV_TIMER_COMPARE_UPPER0_0(0) + hart * HART_CFG_ADDR_GAP) = | 
|  | (uint32_t)(cmp >> 32); | 
|  | } | 
|  |  | 
|  | void rv_timer_ctrl(uint32_t hart, bool en) { | 
|  | REG32(RV_TIMER_CTRL(0)) = (en) ? SETBIT(REG32(RV_TIMER_CTRL(0)), hart) | 
|  | : CLRBIT(REG32(RV_TIMER_CTRL(0)), hart); | 
|  | } | 
|  |  | 
|  | void rv_timer_intr_enable(uint32_t hart, bool en) { | 
|  | REG32(RV_TIMER_INTR_ENABLE0(0)) = | 
|  | (en) ? SETBIT(REG32(RV_TIMER_INTR_ENABLE0(0)), hart) | 
|  | : CLRBIT(REG32(RV_TIMER_INTR_ENABLE0(0)), hart); | 
|  | } | 
|  |  | 
|  | void rv_timer_clr_all_intrs(void) { | 
|  | REG32(RV_TIMER_INTR_STATE0(0)) = REG32(RV_TIMER_INTR_STATE0(0)); | 
|  | } |