summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sbi/sbi_timer.h2
-rw-r--r--lib/sbi/sbi_timer.c15
2 files changed, 10 insertions, 7 deletions
diff --git a/include/sbi/sbi_timer.h b/include/sbi/sbi_timer.h
index ac48e2b8..ac2c7be5 100644
--- a/include/sbi/sbi_timer.h
+++ b/include/sbi/sbi_timer.h
@@ -78,8 +78,10 @@ u64 sbi_timer_get_delta(void);
/** Set timer delta value for current HART */
void sbi_timer_set_delta(ulong delta);
+#if __riscv_xlen == 32
/** Set upper 32-bits of timer delta value for current HART */
void sbi_timer_set_delta_upper(ulong delta_upper);
+#endif
/** Start timer event for current HART */
void sbi_timer_event_start(u64 next_event);
diff --git a/lib/sbi/sbi_timer.c b/lib/sbi/sbi_timer.c
index 7b618de1..32955183 100644
--- a/lib/sbi/sbi_timer.c
+++ b/lib/sbi/sbi_timer.c
@@ -114,20 +114,21 @@ u64 sbi_timer_get_delta(void)
void sbi_timer_set_delta(ulong delta)
{
- u64 *time_delta = sbi_scratch_offset_ptr(sbi_scratch_thishart_ptr(),
- time_delta_off);
+ ulong *time_delta = sbi_scratch_offset_ptr(sbi_scratch_thishart_ptr(),
+ time_delta_off);
- *time_delta = (u64)delta;
+ *time_delta = delta;
}
+#if __riscv_xlen == 32
void sbi_timer_set_delta_upper(ulong delta_upper)
{
- u64 *time_delta = sbi_scratch_offset_ptr(sbi_scratch_thishart_ptr(),
- time_delta_off);
+ ulong *time_delta = sbi_scratch_offset_ptr(sbi_scratch_thishart_ptr(),
+ time_delta_off);
- *time_delta &= 0xffffffffULL;
- *time_delta |= ((u64)delta_upper << 32);
+ *(time_delta + 1) = delta_upper;
}
+#endif
void sbi_timer_event_start(u64 next_event)
{