Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Jun 2019 15:15:38 +0000 (UTC)
From:      Ruslan Bukin <br@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r348615 - stable/12/sys/riscv/riscv
Message-ID:  <201906041515.x54FFcjm027701@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: br
Date: Tue Jun  4 15:15:37 2019
New Revision: 348615
URL: https://svnweb.freebsd.org/changeset/base/348615

Log:
  MFC r345581:
  
  Grab timer frequency from FDT.
  
  RISC-V timer has no dedicated DTS node and we have to get timer
  frequency from cpus node.
  
  Tested on Government Furnished Equipment (GFE) cores synthesized
  on Xilinx VCU118.
  
  Sponsored by:	DARPA, AFRL

Modified:
  stable/12/sys/riscv/riscv/timer.c

Modified: stable/12/sys/riscv/riscv/timer.c
==============================================================================
--- stable/12/sys/riscv/riscv/timer.c	Tue Jun  4 15:13:48 2019	(r348614)
+++ stable/12/sys/riscv/riscv/timer.c	Tue Jun  4 15:15:37 2019	(r348615)
@@ -61,7 +61,10 @@ __FBSDID("$FreeBSD$");
 #include <machine/trap.h>
 #include <machine/sbi.h>
 
-#define	DEFAULT_FREQ	10000000
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/openfirm.h>
 
 #define	TIMER_COUNTS		0x00
 #define	TIMER_MTIMECMP(cpu)	(cpu * 8)
@@ -157,6 +160,32 @@ riscv_timer_intr(void *arg)
 }
 
 static int
+riscv_timer_get_timebase(device_t dev, uint32_t *freq)
+{
+	phandle_t node;
+	int len;
+
+	node = OF_finddevice("/cpus");
+	if (node == -1) {
+		if (bootverbose)
+			device_printf(dev, "Can't find cpus node.\n");
+		return (ENXIO);
+	}
+
+	len = OF_getproplen(node, "timebase-frequency");
+	if (len != 4) {
+		if (bootverbose)
+			device_printf(dev,
+			    "Can't find timebase-frequency property.\n");
+		return (ENXIO);
+	}
+
+	OF_getencprop(node, "timebase-frequency", freq, len);
+
+	return (0);
+}
+
+static int
 riscv_timer_probe(device_t dev)
 {
 
@@ -176,10 +205,9 @@ riscv_timer_attach(device_t dev)
 		return (ENXIO);
 
 	if (device_get_unit(dev) != 0)
-		return ENXIO;
+		return (ENXIO);
 
-	sc->clkfreq = DEFAULT_FREQ;
-	if (sc->clkfreq == 0) {
+	if (riscv_timer_get_timebase(dev, &sc->clkfreq) != 0) {
 		device_printf(dev, "No clock frequency specified\n");
 		return (ENXIO);
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906041515.x54FFcjm027701>