/* * Copyright (c) 2018 Western Digital Corporation or its affiliates. * * Authors: * Anup Patel * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #if __riscv_xlen == 32 u64 get_ticks(void) { u32 lo, hi, tmp; __asm__ __volatile__ ( "1:\n" "rdtimeh %0\n" "rdtime %1\n" "rdtimeh %2\n" "bne %0, %2, 1b" : "=&r" (hi), "=&r" (lo), "=&r" (tmp)); return ((u64)hi << 32) | lo; } #else u64 get_ticks(void) { unsigned long n; __asm__ __volatile__ ( "rdtime %0" : "=r" (n)); return n; } #endif u64 sbi_timer_value(struct sbi_scratch *scratch) { struct sbi_platform *plat = sbi_platform_ptr(scratch); if (sbi_platform_has_mmio_timer_value(plat)) return sbi_platform_timer_value(plat); else return get_ticks(); } void sbi_timer_event_stop(struct sbi_scratch *scratch, u32 hartid) { sbi_platform_timer_event_stop(sbi_platform_ptr(scratch), hartid); } void sbi_timer_event_start(struct sbi_scratch *scratch, u32 hartid, u64 next_event) { sbi_platform_timer_event_start(sbi_platform_ptr(scratch), hartid, next_event); csr_clear(mip, MIP_STIP); csr_set(mie, MIP_MTIP); } void sbi_timer_process(struct sbi_scratch *scratch, u32 hartid) { csr_clear(mie, MIP_MTIP); csr_set(mip, MIP_STIP); } int sbi_timer_warm_init(struct sbi_scratch *scratch, u32 hartid) { return sbi_platform_warm_timer_init(sbi_platform_ptr(scratch), hartid); } int sbi_timer_cold_init(struct sbi_scratch *scratch) { return sbi_platform_cold_timer_init(sbi_platform_ptr(scratch)); }