mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-12-02 19:22:47 +00:00
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. Reviewed by: markj Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D19727
This commit is contained in:
parent
77c2fe20df
commit
61fef9e860
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=345581
@ -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)
|
||||
@ -156,6 +159,32 @@ riscv_timer_intr(void *arg)
|
||||
return (FILTER_HANDLED);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user