|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 1/4] xen/riscv: introduce preinit_xen_time()
preinit_xen_time() does two things:
1. Parse timebase-frequency properpy of /cpus node to initialize
cpu_khz variable.
2. Initialize xen_start_clock_cycles with the current time counter
value.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
Changes in v2:
- Update SPDX tag for time.c
- s/read_mostly/__ro_after_init for boot_count variable.
- Add declaration of boot_count to asm/time.h.
- Rename boot_count to xen_start_clock_cycles.
- Stray double blank in the defintion of timer_ids.
- s/u32/uint32_t.
- Drop full stop.
- Update the commit message.
- s/__initconst/__initconstrel for timer_ids[].
---
xen/arch/riscv/Makefile | 1 +
xen/arch/riscv/include/asm/time.h | 5 ++++
xen/arch/riscv/setup.c | 2 ++
xen/arch/riscv/stubs.c | 2 --
xen/arch/riscv/time.c | 39 +++++++++++++++++++++++++++++++
5 files changed, 47 insertions(+), 2 deletions(-)
create mode 100644 xen/arch/riscv/time.c
diff --git a/xen/arch/riscv/Makefile b/xen/arch/riscv/Makefile
index b0c8270a99..82016a957a 100644
--- a/xen/arch/riscv/Makefile
+++ b/xen/arch/riscv/Makefile
@@ -9,6 +9,7 @@ obj-y += setup.o
obj-y += shutdown.o
obj-y += smp.o
obj-y += stubs.o
+obj-y += time.o
obj-y += traps.o
obj-y += vm_event.o
diff --git a/xen/arch/riscv/include/asm/time.h
b/xen/arch/riscv/include/asm/time.h
index fc1572e9b4..c24745508b 100644
--- a/xen/arch/riscv/include/asm/time.h
+++ b/xen/arch/riscv/include/asm/time.h
@@ -5,6 +5,9 @@
#include <xen/bug.h>
#include <asm/csr.h>
+/* Clock cycles count at Xen startup */
+extern unsigned long xen_start_clock_cycles;
+
struct vcpu;
static inline void force_update_vcpu_system_time(struct vcpu *v)
@@ -19,6 +22,8 @@ static inline cycles_t get_cycles(void)
return csr_read(CSR_TIME);
}
+void preinit_xen_time(void);
+
#endif /* ASM__RISCV__TIME_H */
/*
diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c
index b0e587678e..836ad16fed 100644
--- a/xen/arch/riscv/setup.c
+++ b/xen/arch/riscv/setup.c
@@ -126,6 +126,8 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
riscv_fill_hwcap();
+ preinit_xen_time();
+
printk("All set up\n");
machine_halt();
diff --git a/xen/arch/riscv/stubs.c b/xen/arch/riscv/stubs.c
index 5951b0ce91..caa133de84 100644
--- a/xen/arch/riscv/stubs.c
+++ b/xen/arch/riscv/stubs.c
@@ -27,8 +27,6 @@ nodemask_t __read_mostly node_online_map = { { [0] = 1UL } };
/* time.c */
-unsigned long __ro_after_init cpu_khz; /* CPU clock frequency in kHz. */
-
s_time_t get_s_time(void)
{
BUG_ON("unimplemented");
diff --git a/xen/arch/riscv/time.c b/xen/arch/riscv/time.c
new file mode 100644
index 0000000000..ae8efa3c59
--- /dev/null
+++ b/xen/arch/riscv/time.c
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#include <xen/device_tree.h>
+#include <xen/init.h>
+#include <xen/lib.h>
+#include <xen/sections.h>
+
+unsigned long __ro_after_init cpu_khz; /* CPU clock frequency in kHz. */
+unsigned long __ro_after_init xen_start_clock_cycles;
+
+static __initdata struct dt_device_node *timer;
+
+/* Set up the timer on the boot CPU (early init function) */
+static void __init preinit_dt_xen_time(void)
+{
+ static const struct dt_device_match __initconstrel timer_ids[] =
+ {
+ DT_MATCH_PATH("/cpus"),
+ { /* sentinel */ },
+ };
+ uint32_t rate;
+
+ timer = dt_find_matching_node(NULL, timer_ids);
+ if ( !timer )
+ panic("Unable to find a compatible timer in the device tree\n");
+
+ dt_device_set_used_by(timer, DOMID_XEN);
+
+ if ( !dt_property_read_u32(timer, "timebase-frequency", &rate) )
+ panic("Unable to find clock frequency\n");
+
+ cpu_khz = rate / 1000;
+}
+
+void __init preinit_xen_time(void)
+{
+ preinit_dt_xen_time();
+
+ xen_start_clock_cycles = get_cycles();
+}
--
2.48.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |