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);
        }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to