Subject: untested timecounter & todr support for playstation2
To: None <port-playstation2@netbsd.org>
From: Garrett D'Amore <garrett_damore@tadpole.com>
List: port-playstation2
Date: 09/13/2006 14:18:41
This is a multi-part message in MIME format.
--------------020600050402050601060905
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Attached is my attempt to provide timecounters and generic todr (get
only, no set) support for the playstation2 port.  I don't have a
playstation2 that can run NetBSD (no dev kit), and I don't have the
cross-tools installed, so I have not even compile-tested this.  But it
should be a big help if anyone wants to take it as a starting off point
-- in the best case it will Just Work (maybe 55% chance of that), most
likely there will be some compile nits that I've busted (40% chance),
and worst case is its totally wrong and needs to be redesigned.  (5%).

Anyway,  the diffs are attached.  If anyone can compile, test, and
commit them, I'd be grateful.

-- 
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


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

Index: sys/arch/playstation2/conf/files.playstation2
===================================================================
RCS file: /cvsroot/src/sys/arch/playstation2/conf/files.playstation2,v
retrieving revision 1.15
diff -d -p -u -r1.15 files.playstation2
--- sys/arch/playstation2/conf/files.playstation2	11 Dec 2005 12:18:34 -0000	1.15
+++ sys/arch/playstation2/conf/files.playstation2	13 Sep 2006 21:15:44 -0000
@@ -23,6 +23,7 @@ file arch/playstation2/playstation2/cloc
 file arch/playstation2/playstation2/disksubr.c		disk
 file arch/playstation2/playstation2/machdep.c
 file arch/playstation2/playstation2/sifbios.c
+file arch/mips/mips/mips3_clock.c
 
 
 file dev/kloader.c					kloader
Index: sys/arch/playstation2/include/types.h
===================================================================
RCS file: /cvsroot/src/sys/arch/playstation2/include/types.h,v
retrieving revision 1.2
diff -d -p -u -r1.2 types.h
--- sys/arch/playstation2/include/types.h	2 Jan 2002 12:38:46 -0000	1.2
+++ sys/arch/playstation2/include/types.h	13 Sep 2006 21:15:44 -0000
@@ -3,6 +3,8 @@
 #include <mips/types.h>
 
 #define	__HAVE_GENERIC_SOFT_INTERRUPTS
+#define	__HAVE_GENERIC_TODR
+#define	__HAVE_TIMECOUNTER
 
 #if defined(_KERNEL) && defined(MIPS3_5900)
 typedef int int128_t __attribute__((__mode__(TI)));
Index: sys/arch/playstation2/playstation2/clock.c
===================================================================
RCS file: /cvsroot/src/sys/arch/playstation2/playstation2/clock.c,v
retrieving revision 1.4
diff -d -p -u -r1.4 clock.c
--- sys/arch/playstation2/playstation2/clock.c	8 Mar 2006 23:46:24 -0000	1.4
+++ sys/arch/playstation2/playstation2/clock.c	13 Sep 2006 21:15:44 -0000
@@ -49,61 +49,28 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.
 
 #include <playstation2/ee/timervar.h>
 
-#define MINYEAR		2001	/* "today" */
-
-static void get_bootinfo_tod(struct clock_ymdhms *);
+static int get_bootinfo_tod(todr_chip_handle_t, struct clock_ymdhms *);
 
 void
 cpu_initclocks()
 {
+	struct todr_chip_handle	todr = {
+		.todr_gettime_ymdhms = get_bootinfo_tod;
+	};
+
+	/*
+	 *  PS2 R5900 CPU clock is 294.912 MHz = (1 << 15) * 9 * 1000
+	 */
+	curcpu()->ci_cpu_freq = 294912000;
 
 	hz = 100;
 
 	/* Install clock interrupt */
 	timer_clock_init();
-}
-
-void
-inittodr(time_t base)
-{
-	struct clock_ymdhms dt;
-	time_t rtc;
-	int s;
-	
-	get_bootinfo_tod(&dt);
-	
-	rtc = clock_ymdhms_to_secs(&dt);
 
-	if (rtc < base ||
-	    dt.dt_year < MINYEAR || dt.dt_year > 2037 ||
-	    dt.dt_mon < 1 || dt.dt_mon > 12 ||
-	    dt.dt_wday > 6 ||
-	    dt.dt_day < 1 || dt.dt_day > 31 ||
-	    dt.dt_hour > 23 || dt.dt_min > 59 || dt.dt_sec > 59) {
-		/*
-		 * Believe the time in the file system for lack of
-		 * anything better, resetting the RTC.
-		 */
-		s = splclock();
-		time.tv_sec = base;
-		time.tv_usec = 0;
-		splx(s);
-		printf("WARNING: preposterous clock chip time\n");
-		resettodr();
-		printf(" -- CHECK AND RESET THE DATE!\n");
-		return;
-	}
-
-	s = splclock();
-	time.tv_sec = rtc + rtc_offset * 60;
-	time.tv_usec = 0;
-	splx(s);
-}
+	todr_attach(&todr);
 
-void
-resettodr()
-{
-	/* NetBSD kernel can't access PS2 RTC module. nothing to do */
+	mips3_init_tc();
 }
 
 void
@@ -112,65 +79,8 @@ setstatclockrate(int arg)
 	/* not yet */
 }
 
-/*
- * Return the best possible estimate of the time in the timeval to
- * which tv points.
- */
-void
-microtime(struct timeval *tvp)
-{
-	int s = splclock();
-	static struct timeval lasttime;
-
-	*tvp = time;
-
-	if (tvp->tv_usec >= 1000000) {
-		tvp->tv_usec -= 1000000;
-		tvp->tv_sec++;
-	}
-
-	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);
-}
-
-/*
- *  Wait at least `n' usec. (max 15 sec)
- *  PS2 R5900 CPU clock is 294.912 MHz = (1 << 15) * 9 * 1000
- */
-void
-delay(unsigned usec)
-{
-	u_int32_t r0, r1, r2;
-	u_int64_t n;
-	int overlap;
-
-	r0 = mips3_cp0_count_read();
-	n = (((u_int64_t)usec * 294912) / 1000) + (u_int64_t)r0;
-
-	overlap = n  > 0xffffffff;
-	r2 = (u_int32_t)(overlap ? 0xffffffff : n);
-
-	do {
-		r1 = mips3_cp0_count_read();
-	} while (r1 < r2 && r1 > r0);
-
-	if (overlap) {
-		r0 = r1;
-		r2 = (u_int32_t)(n - 0xffffffff);
-		do {
-			r1 = mips3_cp0_count_read();
-		} while (r1 < r2 && r1 > r0);
-	}
-}
-
-static void
-get_bootinfo_tod(struct clock_ymdhms *dt)
+static int
+get_bootinfo_tod(todr_chip_handle_t tch, struct clock_ymdhms *dt)
 {
 	time_t utc;
 	struct bootinfo_rtc *rtc = 
@@ -192,4 +102,5 @@ get_bootinfo_tod(struct clock_ymdhms *dt
 	    dt->dt_mon, dt->dt_day, dt->dt_hour, dt->dt_min, dt->dt_sec,
 	    rtc_offset);
 #endif
+	return 0;
 }

--------------020600050402050601060905--