Subject: attachment this time!
To: port-evbsh5@netbsd.org, Steve Woodford <scw@NetBSD.org>
From: Garrett D'Amore <garrett_damore@tadpole.com>
List: port-evbsh5
Date: 09/05/2006 12:00:27
This is a multi-part message in MIME format.
--------------010109030809030202000201
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

the timecounter patch is really attached this time!

-- 
Garrett D'Amore, Principal Software Engineer
Tadpole Computer / Computing Technologies Division,
General Dynamics C4 Systems
http://www.tadpolecomputer.com/
Phone: 951 325-2134  Fax: 951 325-2191


--------------010109030809030202000201
Content-Type: text/x-patch;
 name="sh5.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="sh5.diff"

Index: sys/arch/sh5/dev/tmu.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sh5/dev/tmu.c,v
retrieving revision 1.10
diff -d -p -u -r1.10 tmu.c
--- sys/arch/sh5/dev/tmu.c	11 Dec 2005 12:19:00 -0000	1.10
+++ sys/arch/sh5/dev/tmu.c	5 Sep 2006 18:57:03 -0000
@@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: tmu.c,v 1.10
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/conf.h>
+#include <sys/timetc.h>
 
 #include <machine/cpu.h>
 #include <machine/bus.h>
@@ -68,6 +69,7 @@ struct tmu_softc {
 	void *sc_clkih;
 	void *sc_statih;
 	u_int sc_ticksperms;
+	struct timecounter sc_tc;
 };
 
 static int tmumatch(struct device *, struct cfdata *, void *);
@@ -81,9 +83,10 @@ static struct tmu_softc *tmu_sc;
 
 
 static void tmu_start(void *, int, u_int);
-static long tmu_microtime(void *);
 static int tmu_clkint(void *);
 static int tmu_statint(void *);
+static void tmu_init_timecounter(struct tmu_softc *);
+static unsigned tmu_get_timecounter(struct timecounter *);
 
 
 /*ARGSUSED*/
@@ -177,8 +180,12 @@ tmuattach(struct device *parent, struct 
 	sc->sc_ca.ca_has_stat_clock = 0;
 	sc->sc_ca.ca_arg = sc;
 	sc->sc_ca.ca_start = tmu_start;
-	sc->sc_ca.ca_microtime = tmu_microtime;
 	clock_config(self, &sc->sc_ca, sh5_intr_evcnt(sc->sc_clkih));
+
+	/*
+	 * Attach to timecounters.
+	 */
+	tmu_init_timecounter(sc);
 }
 
 static void
@@ -225,24 +232,34 @@ tmu_start(void *arg, int which, u_int cl
 	}
 }
 
-static long
-tmu_microtime(void *arg)
+static void
+tmu_init_timecounter(struct tmu_softc *sc)
 {
-	struct tmu_softc *sc = arg;
-	u_int32_t tcnt, d;
 
-	tcnt = bus_space_read_4(sc->sc_bust, sc->sc_bush, TMU_REG_TCNT(0));
-	d = bus_space_read_4(sc->sc_bust, sc->sc_bush, TMU_REG_TCOR(0)) - tcnt;
+	sc->sc_tc.tc_priv = sc;
+	sc->sc_tc.tc_get_timecount = tmu_get_timecounter;
+	sc->sc_tc.tc_name = "tmu_pclock_4";
+	sc->sc_tc.tc_frequency = sc->sc_ca.ca_rate;
+	sc->sc_tc.tc_counter_mask = ~0;
+	sc->sc_tc.tc_quality = 0;
 
-	/*
-	 * Catch the common case of a 64MHz peripheral bus clock.
-	 * This turns an expensive integer division into a simple shift.
-	 */
-	if (sc->sc_ticksperms == 16000)
-		return ((long)(d >> 4));
+	bus_space_write_4(sc->sc_bust, sc->sc_bush, TMU_REG_TCNT(2), ~0);
+	bus_space_write_2(sc->sc_bust, sc->sc_bush, TMU_REG_TCR(2),
+	    TMU_TCR_TPSC_PDIV4 | TMU_TCR_CKEG_RISING);
+	/* start timer 2 running */
+	bus_space_write_1(sc->sc_bust, sc->sc_bush, TMU_REG_TSTR,
+	    bus_space_read_1(sc->sc_bust, sc->sc_bush, TMU_REG_TSTR) |
+	    TMU_TSTR(2));
+}
 
-	/* Otherwise, need to do things the hard way */
-	return ((long)((d * 1000) / sc->sc_ticksperms));
+static unsigned
+tmu_get_timecounter(struct timecounter *tc)
+{
+	struct tmu_softc *sc = tc->tc_priv;
+	unsigned	count;
+
+	count = bus_space_read_4(sc->sc_bust, sc->sc_bush, TMU_REG_TCNT(2));
+	return (~count);
 }
 
 static int
Index: sys/arch/sh5/include/types.h
===================================================================
RCS file: /cvsroot/src/sys/arch/sh5/include/types.h,v
retrieving revision 1.13
diff -d -p -u -r1.13 types.h
--- sys/arch/sh5/include/types.h	5 Sep 2006 07:34:54 -0000	1.13
+++ sys/arch/sh5/include/types.h	5 Sep 2006 18:57:03 -0000
@@ -81,6 +81,7 @@ typedef	volatile __int64_t	__cpu_simple_
 #define	__HAVE_SYSCALL_INTERN
 #define	__HAVE_FUNCTION_DESCRIPTORS
 #define	__HAVE_GENERIC_TODR
+#define	__HAVE_TIMECOUNTER
 
 #if defined(_KERNEL)
 #define	__HAVE_RAS
Index: sys/arch/sh5/sh5/clockvar.h
===================================================================
RCS file: /cvsroot/src/sys/arch/sh5/sh5/clockvar.h,v
retrieving revision 1.3
diff -d -p -u -r1.3 clockvar.h
--- sys/arch/sh5/sh5/clockvar.h	11 Dec 2005 12:19:02 -0000	1.3
+++ sys/arch/sh5/sh5/clockvar.h	5 Sep 2006 18:57:03 -0000
@@ -45,7 +45,6 @@ struct clock_attach_args {
 	int	ca_has_stat_clock;	/* Non-zero if supports stat clock */
 	void	*ca_arg;		/* Back-end cookie */
 	void	(*ca_start)(void *, int, u_int);	/* Start/Reset timer */
-	long	(*ca_microtime)(void *);	/* uS since last hardclock() */
 };
 
 /*
Index: sys/arch/sh5/sh5/pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sh5/sh5/pmap.c,v
retrieving revision 1.43
diff -d -p -u -r1.43 pmap.c
--- sys/arch/sh5/sh5/pmap.c	24 Dec 2005 22:45:36 -0000	1.43
+++ sys/arch/sh5/sh5/pmap.c	5 Sep 2006 18:57:03 -0000
@@ -1294,7 +1294,7 @@ pmap_create(void)
 static void
 pmap_pinit(pmap_t pm)
 {
-	u_int entropy = (sh5_getctc() >> 2) + (u_int)time.tv_sec;
+	u_int entropy = (sh5_getctc() >> 2) + (u_int)time_second;
 	int i;
 
 	pm->pm_refs = 1;
Index: sys/arch/sh5/sh5/sh5_clock.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sh5/sh5/sh5_clock.c,v
retrieving revision 1.10
diff -d -p -u -r1.10 sh5_clock.c
--- sys/arch/sh5/sh5/sh5_clock.c	5 Sep 2006 07:34:54 -0000	1.10
+++ sys/arch/sh5/sh5/sh5_clock.c	5 Sep 2006 18:57:03 -0000
@@ -198,37 +198,3 @@ clock_statint(struct clockframe *cf)
 	 */
 	(*clock_args->ca_start)(clock_args->ca_arg, CLK_STATCLOCK, newint);
 }
-
-/*
- * Return the best possible estimate of the time in the timeval
- * to which tvp points.  We do this by returning the current time
- * plus the amount of time, in uSec, since the last clock interrupt
- * (clock_args->ca_microtime()) was handled.
- *
- * Check that this time is no less than any previously-reported time,
- * which could happen around the time of a clock adjustment.  Just for fun,
- * we guarantee that the time will be greater than the value obtained by a
- * previous call.
- */
-
-void
-microtime(struct timeval *tvp)
-{
-	int s = splhigh();
-	static struct timeval lasttime;
-
-	*tvp = time;
-	tvp->tv_usec += (*clock_args->ca_microtime)(clock_args->ca_arg);
-	while (tvp->tv_usec >= 1000000) {
-		tvp->tv_sec++;
-		tvp->tv_usec -= 1000000;
-	}
-	if (tvp->tv_sec == lasttime.tv_sec &&
-	    tvp->tv_usec <= lasttime.tv_usec &&
-	    (tvp->tv_usec = lasttime.tv_usec + 1) >= 1000000) {
-		tvp->tv_sec++;
-		tvp->tv_usec -= 1000000;
-	}
-	lasttime = *tvp;
-	splx(s);
-}

--------------010109030809030202000201--