svn commit: r244287 - projects/calloutng/sys/x86/isa

Alexander Motin mav at FreeBSD.org
Sun Dec 16 11:16:14 UTC 2012


Author: mav
Date: Sun Dec 16 11:16:13 2012
New Revision: 244287
URL: http://svnweb.freebsd.org/changeset/base/244287

Log:
  Mostly out of fun, teach i8254 eventtimer driver to program only LSB for
  very short time intervals (<214us).  This allows to get less then 22us
  usleep(1) time from this anscient timer.  It is even better then HPET time
  now, just with much higher CPU usage.

Modified:
  projects/calloutng/sys/x86/isa/clock.c

Modified: projects/calloutng/sys/x86/isa/clock.c
==============================================================================
--- projects/calloutng/sys/x86/isa/clock.c	Sun Dec 16 10:12:40 2012	(r244286)
+++ projects/calloutng/sys/x86/isa/clock.c	Sun Dec 16 11:16:13 2012	(r244287)
@@ -125,6 +125,7 @@ struct attimer_softc {
 static struct attimer_softc *attimer_sc = NULL;
 
 static int timer0_period = -2;
+static int timer0_last = 0xffff;
 
 /* Values for timerX_state: */
 #define	RELEASED	0
@@ -433,11 +434,17 @@ set_i8254_freq(int mode, uint32_t period
 		outb(TIMER_CNTR0, new_count >> 8);
 		break;
 	case MODE_ONESHOT:
+		if (new_count < 256 && timer0_last < 256) {
+			outb(TIMER_MODE, TIMER_SEL0 | TIMER_INTTC | TIMER_LSB);
+			outb(TIMER_CNTR0, new_count & 0xff);
+			break;
+		}
 		outb(TIMER_MODE, TIMER_SEL0 | TIMER_INTTC | TIMER_16BIT);
 		outb(TIMER_CNTR0, new_count & 0xff);
 		outb(TIMER_CNTR0, new_count >> 8);
 		break;
 	}
+	timer0_last = new_count;
 out:
 	mtx_unlock_spin(&clock_lock);
 }


More information about the svn-src-projects mailing list