svn commit: r305208 - in head/sys: boot/fdt/dts/riscv riscv/riscv
Ruslan Bukin
br at FreeBSD.org
Thu Sep 1 14:58:12 UTC 2016
Author: br
Date: Thu Sep 1 14:58:11 2016
New Revision: 305208
URL: https://svnweb.freebsd.org/changeset/base/305208
Log:
o Separate rtc and timecmp registers: they are different across
RISC-V cpu implementations.
o Update RocketChip device tree source (DTS).
We now support latest verison of RocketChip synthesized on
Xilinx FPGA (Zedboard).
RocketChip is an implementation of RISC-V processor written on
Chisel hardware construction language.
Sponsored by: DARPA, AFRL
Sponsored by: HEIF5
Modified:
head/sys/boot/fdt/dts/riscv/rocket.dts
head/sys/boot/fdt/dts/riscv/spike.dts
head/sys/riscv/riscv/timer.c
Modified: head/sys/boot/fdt/dts/riscv/rocket.dts
==============================================================================
--- head/sys/boot/fdt/dts/riscv/rocket.dts Thu Sep 1 14:57:06 2016 (r305207)
+++ head/sys/boot/fdt/dts/riscv/rocket.dts Thu Sep 1 14:58:11 2016 (r305208)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2016 Ruslan Bukin <br at bsdpad.com>
+ * Copyright (c) 2015-2016 Ruslan Bukin <br at bsdpad.com>
* All rights reserved.
*
* Portions of this software were developed by SRI International and the
@@ -37,8 +37,8 @@
/dts-v1/;
/ {
- model = "UC Berkeley Spike Simulator RV64I";
- compatible = "riscv,rv64i";
+ model = "RocketChip RV64";
+ compatible = "riscv,rv64";
#address-cells = <1>;
#size-cells = <1>;
#interrupt-cells = <1>;
@@ -49,8 +49,8 @@
cpu at 0 {
device_type = "cpu";
- compatible = "riscv,rv64i";
- reg = <0x40002000>;
+ compatible = "riscv,rv64";
+ reg = <0x0>;
};
};
@@ -59,13 +59,17 @@
};
memory {
+ /*
+ * This is not used currently.
+ * We take information from sbi_query_memory.
+ */
device_type = "memory";
- reg = <0x0 0x10000000>; /* 256MB at 0x0 */
+ reg = <0x80000000 0x10000000>; /* 256MB at 0x80000000 */
};
soc {
- #address-cells = <2>;
- #size-cells = <2>;
+ #address-cells = <1>;
+ #size-cells = <1>;
#interrupt-cells = <1>;
compatible = "simple-bus";
@@ -78,7 +82,9 @@
timer0: timer at 0 {
compatible = "riscv,timer";
- interrupts = < 1 >;
+ reg = < 0x4400bff8 0x0008 >, /* rtc */
+ < 0x44004000 0x1000 >; /* timecmp */
+ interrupts = < 5 >;
interrupt-parent = < &pic0 >;
clock-frequency = < 1000000 >;
};
Modified: head/sys/boot/fdt/dts/riscv/spike.dts
==============================================================================
--- head/sys/boot/fdt/dts/riscv/spike.dts Thu Sep 1 14:57:06 2016 (r305207)
+++ head/sys/boot/fdt/dts/riscv/spike.dts Thu Sep 1 14:58:11 2016 (r305208)
@@ -50,13 +50,13 @@
cpu at 0 {
device_type = "cpu";
compatible = "riscv,rv64";
- reg = <0x40001000>;
+ reg = <0x0>;
};
cpu at 1 {
device_type = "cpu";
compatible = "riscv,rv64";
- reg = <0x40002000>;
+ reg = <0x0>;
};
};
@@ -88,7 +88,8 @@
timer0: timer at 0 {
compatible = "riscv,timer";
- reg = < 0x40000000 0x100 >;
+ reg = < 0x40000000 0x0008 >, /* rtc */
+ < 0x40000008 0x1000 >; /* timecmp */
interrupts = < 5 >;
interrupt-parent = < &pic0 >;
clock-frequency = < 1000000 >;
Modified: head/sys/riscv/riscv/timer.c
==============================================================================
--- head/sys/riscv/riscv/timer.c Thu Sep 1 14:57:06 2016 (r305207)
+++ head/sys/riscv/riscv/timer.c Thu Sep 1 14:58:11 2016 (r305208)
@@ -69,7 +69,7 @@ __FBSDID("$FreeBSD$");
#define DEFAULT_FREQ 1000000
#define TIMER_COUNTS 0x00
-#define TIMER_MTIMECMP(cpu) (0x08 + (cpu * 8))
+#define TIMER_MTIMECMP(cpu) (cpu * 8)
#define READ8(_sc, _reg) \
bus_space_read_8(_sc->bst, _sc->bsh, _reg)
@@ -77,9 +77,11 @@ __FBSDID("$FreeBSD$");
bus_space_write_8(_sc->bst, _sc->bsh, _reg, _val)
struct riscv_tmr_softc {
- struct resource *res[2];
+ struct resource *res[3];
bus_space_tag_t bst;
bus_space_handle_t bsh;
+ bus_space_tag_t bst_timecmp;
+ bus_space_handle_t bsh_timecmp;
void *ih;
uint32_t clkfreq;
struct eventtimer et;
@@ -89,6 +91,7 @@ static struct riscv_tmr_softc *riscv_tmr
static struct resource_spec timer_spec[] = {
{ SYS_RES_MEMORY, 0, RF_ACTIVE },
+ { SYS_RES_MEMORY, 1, RF_ACTIVE },
{ SYS_RES_IRQ, 0, RF_ACTIVE },
{ -1, 0 }
};
@@ -107,8 +110,11 @@ static struct timecounter riscv_tmr_time
static long
get_counts(struct riscv_tmr_softc *sc)
{
+ uint64_t counts;
+
+ counts = READ8(sc, TIMER_COUNTS);
- return (READ8(sc, TIMER_COUNTS));
+ return (counts);
}
static unsigned
@@ -134,7 +140,8 @@ riscv_tmr_start(struct eventtimer *et, s
counts = ((uint32_t)et->et_frequency * first) >> 32;
counts += READ8(sc, TIMER_COUNTS);
cpu = PCPU_GET(cpuid);
- WRITE8(sc, TIMER_MTIMECMP(cpu), counts);
+ bus_space_write_8(sc->bst_timecmp, sc->bsh_timecmp,
+ TIMER_MTIMECMP(cpu), counts);
csr_set(sie, SIE_STIE);
sbi_set_timer(counts);
@@ -225,11 +232,13 @@ riscv_tmr_attach(device_t dev)
/* Memory interface */
sc->bst = rman_get_bustag(sc->res[0]);
sc->bsh = rman_get_bushandle(sc->res[0]);
+ sc->bst_timecmp = rman_get_bustag(sc->res[1]);
+ sc->bsh_timecmp = rman_get_bushandle(sc->res[1]);
riscv_tmr_sc = sc;
/* Setup IRQs handler */
- error = bus_setup_intr(dev, sc->res[1], INTR_TYPE_CLK,
+ error = bus_setup_intr(dev, sc->res[2], INTR_TYPE_CLK,
riscv_tmr_intr, NULL, sc, &sc->ih);
if (error) {
device_printf(dev, "Unable to alloc int resource.\n");
More information about the svn-src-all
mailing list