Adds ndelay() to parlib
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 10 May 2013 00:54:16 +0000 (17:54 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 10 May 2013 00:54:16 +0000 (17:54 -0700)
user/parlib/include/timing.h
user/parlib/timing.c

index e05af6e..8474038 100644 (file)
@@ -3,6 +3,7 @@
 #include <stdint.h>
 
 void udelay(uint64_t usec);
+void ndelay(uint64_t nsec);
 uint64_t udiff(uint64_t begin, uint64_t end);
 uint64_t ndiff(uint64_t begin, uint64_t end);
 
index 0efc5f7..fea7e29 100644 (file)
@@ -2,19 +2,31 @@
 #include <ros/procinfo.h>
 #include <arch/arch.h>
 #include <stdio.h>
+#include <tsc-compat.h>
 
 void udelay(uint64_t usec)
 {
        uint64_t start, end, now;
 
        start = read_tsc();
-    end = start + (__procinfo.tsc_freq * usec) / 1000000;
-       if (end == 0) printf("This is terribly wrong \n");
+    end = start + (get_tsc_freq() * usec) / 1000000;
+       do {
+        cpu_relax();
+        now = read_tsc();
+       } while (now < end || (now > start && end < start));
+}
+
+/* Not super accurate, due to overheads of reading tsc and looping */
+void ndelay(uint64_t nsec)
+{
+       uint64_t start, end, now;
+
+       start = read_tsc();
+    end = start + (get_tsc_freq() * nsec) / 1000000000;
        do {
         cpu_relax();
         now = read_tsc();
        } while (now < end || (now > start && end < start));
-       return;
 }
 
 /* Difference between the ticks in microseconds */