From c15bf9b7929d77a4658fd53aca275421e0cf5702 Mon Sep 17 00:00:00 2001 From: X512 Date: Sun, 6 Jun 2021 23:02:03 +0900 Subject: [PATCH] kernel/arch/timer: implement for riscv64 Change-Id: Ia854b0048a86b1427e975f482325ed4d4df1a12a Reviewed-on: https://review.haiku-os.org/c/haiku/+/4061 Reviewed-by: Alex von Gluck IV --- .../system/arch/riscv64/arch_real_time_data.h | 3 +- src/system/kernel/arch/riscv64/arch_timer.cpp | 49 ++++++++++++++----- src/system/kernel/lib/arch/riscv64/Jamfile | 1 + 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/headers/private/system/arch/riscv64/arch_real_time_data.h b/headers/private/system/arch/riscv64/arch_real_time_data.h index 4d63960eed..2cc01f92ff 100644 --- a/headers/private/system/arch/riscv64/arch_real_time_data.h +++ b/headers/private/system/arch/riscv64/arch_real_time_data.h @@ -13,8 +13,7 @@ struct arch_real_time_data { bigtime_t system_time_offset; - uint32 system_time_conversion_factor; - uint32 _padding; + uint64 system_time_conversion_factor; }; #endif /* _KERNEL_ARCH_REAL_TIME_DATA_H */ diff --git a/src/system/kernel/arch/riscv64/arch_timer.cpp b/src/system/kernel/arch/riscv64/arch_timer.cpp index fc5193b4a4..3b0eda3260 100644 --- a/src/system/kernel/arch/riscv64/arch_timer.cpp +++ b/src/system/kernel/arch/riscv64/arch_timer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2019, Haiku Inc. All rights reserved. + * Copyright 2019-2021, Haiku Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -7,21 +7,54 @@ */ -#include -#include -#include +#include +#include #include +#include +#include +#include +#include +#include +#include + + +extern uint32 gPlatform1; +extern uint32 gPlatform2; void arch_timer_set_hardware_timer(bigtime_t timeout) { + // TODO: Read timer frequency from FDT + switch (gPlatform1) { + case kPlatform1Riscv: + MSyscall(kMSyscallSetTimer, true, + gClintRegs->mtime + timeout * 10); + break; + case kPlatform1Sbi: { + sbi_set_timer(CpuTime() + timeout); + break; + } + default: + ; + } } void arch_timer_clear_hardware_timer() { + switch (gPlatform1) { + case kPlatform1Riscv: + MSyscall(kMSyscallSetTimer, false); + break; + case kPlatform1Sbi: { + sbi_set_timer(CpuTime() + (uint64)10000000 * 3600); + break; + } + default: + ; + } } @@ -30,11 +63,3 @@ arch_init_timer(kernel_args *args) { return B_OK; } - - -bigtime_t -system_time(void) -{ - // TODO - return 0; -} diff --git a/src/system/kernel/lib/arch/riscv64/Jamfile b/src/system/kernel/lib/arch/riscv64/Jamfile index 7b143796e6..603763cf5d 100644 --- a/src/system/kernel/lib/arch/riscv64/Jamfile +++ b/src/system/kernel/lib/arch/riscv64/Jamfile @@ -10,6 +10,7 @@ SEARCH_SOURCE += [ FDirName $(librootSources) os arch generic ] ; KernelMergeObject kernel_os_arch_$(TARGET_ARCH).o : byteorder.S + system_time.cpp generic_atomic.cpp generic_system_time_nsecs.cpp