[PATCH v3 7/7] lib: utils: Use fdt_cpu_get_timebase_frequency()

Samuel Holland samuel.holland at sifive.com
Wed Oct 14 04:30:24 PDT 2026


Since fdt_cpu_init() already extracted /cpus/timebase-frequency from the
DT, use the cached value instead of parsing the DT again.

The logic should otherwise be equivalent.

Signed-off-by: Samuel Holland <samuel.holland at sifive.com>
---

Changes in v3:
 - Also update platform/generic/openhwgroup/ariane.c

 include/sbi_utils/fdt/fdt_helper.h       |  2 --
 lib/utils/fdt/fdt_helper.c               | 21 ---------------------
 lib/utils/timer/fdt_timer_mtimer.c       |  7 ++++---
 lib/utils/timer/fdt_timer_plmt.c         |  8 +++++---
 platform/generic/openhwgroup/ariane.c    |  7 ++++---
 platform/generic/openhwgroup/openpiton.c |  7 ++++---
 6 files changed, 17 insertions(+), 35 deletions(-)

diff --git a/include/sbi_utils/fdt/fdt_helper.h b/include/sbi_utils/fdt/fdt_helper.h
index 263e07c7..d66c5fe9 100644
--- a/include/sbi_utils/fdt/fdt_helper.h
+++ b/include/sbi_utils/fdt/fdt_helper.h
@@ -49,8 +49,6 @@ int fdt_parse_hart_id(const void *fdt, int cpu_offset, u32 *hartid);
 
 int fdt_parse_cbom_block_size(const void *fdt, int cpu_offset, unsigned long  *cbom_block_size);
 
-int fdt_parse_timebase_frequency(const void *fdt, unsigned long *freq);
-
 int fdt_parse_isa_extensions_all_harts(const void *fdt);
 
 int fdt_parse_gaisler_uart_node(const void *fdt, int nodeoffset,
diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c
index 9dc1c863..545b8804 100644
--- a/lib/utils/fdt/fdt_helper.c
+++ b/lib/utils/fdt/fdt_helper.c
@@ -294,27 +294,6 @@ int fdt_parse_cbom_block_size(const void *fdt, int cpu_offset, unsigned long *cb
 	return 0;
 }
 
-int fdt_parse_timebase_frequency(const void *fdt, unsigned long *freq)
-{
-	const fdt32_t *val;
-	int len, cpus_offset;
-
-	if (!fdt || !freq)
-		return SBI_EINVAL;
-
-	cpus_offset = fdt_path_offset(fdt, "/cpus");
-	if (cpus_offset < 0)
-		return cpus_offset;
-
-	val = fdt_getprop(fdt, cpus_offset, "timebase-frequency", &len);
-	if (len > 0 && val)
-		*freq = fdt32_to_cpu(*val);
-	else
-		return SBI_ENOENT;
-
-	return 0;
-}
-
 #define RISCV_ISA_EXT_NAME_LEN_MAX	32
 
 static int fdt_parse_isa_one_hart(const char *isa, unsigned long *extensions)
diff --git a/lib/utils/timer/fdt_timer_mtimer.c b/lib/utils/timer/fdt_timer_mtimer.c
index d5520fad..97b1ed1f 100644
--- a/lib/utils/timer/fdt_timer_mtimer.c
+++ b/lib/utils/timer/fdt_timer_mtimer.c
@@ -11,6 +11,7 @@
 #include <sbi/sbi_error.h>
 #include <sbi/sbi_heap.h>
 #include <sbi/sbi_list.h>
+#include <sbi_utils/fdt/fdt_cpu.h>
 #include <sbi_utils/fdt/fdt_helper.h>
 #include <sbi_utils/timer/fdt_timer.h>
 #include <sbi_utils/timer/aclint_mtimer.h>
@@ -56,10 +57,10 @@ static int timer_mtimer_cold_init(const void *fdt, int nodeoff,
 	mt->has_64bit_mmio = true;
 	mt->has_shared_mtime = false;
 
-	rc = fdt_parse_timebase_frequency(fdt, &mt->mtime_freq);
-	if (rc) {
+	mt->mtime_freq = fdt_cpu_get_timebase_frequency();
+	if (!mt->mtime_freq) {
 		sbi_free(mtn);
-		return rc;
+		return SBI_ENOENT;
 	}
 
 	if (is_clint) { /* SiFive CLINT */
diff --git a/lib/utils/timer/fdt_timer_plmt.c b/lib/utils/timer/fdt_timer_plmt.c
index 1e146689..23ca8f3d 100644
--- a/lib/utils/timer/fdt_timer_plmt.c
+++ b/lib/utils/timer/fdt_timer_plmt.c
@@ -7,6 +7,8 @@
  *   Yu Chien Peter Lin <peterlin at andestech.com>
  */
 
+#include <sbi/sbi_error.h>
+#include <sbi_utils/fdt/fdt_cpu.h>
 #include <sbi_utils/fdt/fdt_helper.h>
 #include <sbi_utils/timer/fdt_timer.h>
 #include <sbi_utils/timer/andes_plmt.h>
@@ -27,9 +29,9 @@ static int fdt_plmt_cold_timer_init(const void *fdt, int nodeoff,
 	plmt.time_val = (u64 *)plmt_base;
 	plmt.time_cmp = (u64 *)(plmt_base + 0x8);
 
-	rc = fdt_parse_timebase_frequency(fdt, &plmt.timer_freq);
-	if (rc)
-		return rc;
+	plmt.timer_freq = fdt_cpu_get_timebase_frequency();
+	if (!plmt.timer_freq)
+		return SBI_ENOENT;
 
 	rc = plmt_cold_timer_init(&plmt);
 	if (rc)
diff --git a/platform/generic/openhwgroup/ariane.c b/platform/generic/openhwgroup/ariane.c
index ce2f5512..6da4a171 100644
--- a/platform/generic/openhwgroup/ariane.c
+++ b/platform/generic/openhwgroup/ariane.c
@@ -5,6 +5,7 @@
  */
 
 #include <platform_override.h>
+#include <sbi_utils/fdt/fdt_cpu.h>
 #include <sbi_utils/fdt/fdt_helper.h>
 #include <sbi_utils/fdt/fdt_fixup.h>
 #include <sbi_utils/ipi/aclint_mswi.h>
@@ -61,8 +62,8 @@ static int ariane_early_init(bool cold_boot)
 {
 	const void *fdt;
 	struct plic_data plic_data = plic;
-	unsigned long aclint_freq;
 	uint64_t clint_addr;
+	u32 aclint_freq;
 	int rc;
 
 	if (!cold_boot)
@@ -74,8 +75,8 @@ static int ariane_early_init(bool cold_boot)
 
 	fdt = fdt_get_address();
 
-	rc = fdt_parse_timebase_frequency(fdt, &aclint_freq);
-	if (!rc)
+	aclint_freq = fdt_cpu_get_timebase_frequency();
+	if (aclint_freq)
 		mtimer.mtime_freq = aclint_freq;
 
 	rc = fdt_parse_compat_addr(fdt, &clint_addr, "riscv,clint0");
diff --git a/platform/generic/openhwgroup/openpiton.c b/platform/generic/openhwgroup/openpiton.c
index 1d098da7..21bdb076 100644
--- a/platform/generic/openhwgroup/openpiton.c
+++ b/platform/generic/openhwgroup/openpiton.c
@@ -4,6 +4,7 @@
  */
 
 #include <platform_override.h>
+#include <sbi_utils/fdt/fdt_cpu.h>
 #include <sbi_utils/fdt/fdt_helper.h>
 #include <sbi_utils/fdt/fdt_fixup.h>
 #include <sbi_utils/ipi/aclint_mswi.h>
@@ -62,8 +63,8 @@ static int openpiton_early_init(bool cold_boot)
 {
 	const void *fdt;
 	struct plic_data plic_data = plic;
-	unsigned long aclint_freq;
 	uint64_t clint_addr;
+	u32 aclint_freq;
 	int rc;
 
 	if (!cold_boot)
@@ -78,8 +79,8 @@ static int openpiton_early_init(bool cold_boot)
 	if (!rc)
 		plic = plic_data;
 
-	rc = fdt_parse_timebase_frequency(fdt, &aclint_freq);
-	if (!rc)
+	aclint_freq = fdt_cpu_get_timebase_frequency();
+	if (aclint_freq)
 		mtimer.mtime_freq = aclint_freq;
 
 	rc = fdt_parse_compat_addr(fdt, &clint_addr, "riscv,clint0");
-- 
2.52.0




More information about the opensbi mailing list