updated to work on all platforms (actually map sure that the physical
authorAli Saidi <saidi@eecs.umich.edu>
Mon, 5 Jul 2004 20:49:56 +0000 (16:49 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Mon, 5 Jul 2004 20:49:56 +0000 (16:49 -0400)
address we are trying to access is mapped before accessing it.)

--HG--
extra : convert_revision : 104341334a3d2bb812a6b0b6277ab353f8f9b39e

util/ccdrv/devtime.c

index e637116a4f17c6849bc385a3fa591b0a8957b563..5c17bf5ef74865cd1129c62800b920bae254f680 100644 (file)
@@ -34,6 +34,7 @@
 #include <asm/uaccess.h>
 #include <linux/kernel.h>
 #include <asm/io.h>
+#include <asm/page.h>
 #include <linux/netdevice.h>
 
 #ifdef __i386__
@@ -70,18 +71,34 @@ static int __init devtime_start(void)
         devSum = 0;
         devCnt = count;
 
-        printk("Preparing to read %#llx %d times.\n", addr, count);
-
-        t1 = cycleCounter(trash);
-        for (x=0; x < count; x++)
+        addr = ioremap(addr, PAGE_SIZE);
+        /**
+         * Make sure that the remapping actually worked. On alpha we have
+         * linear addressing, so its not a problem. But it can fail in x86
+         * if physical memory is mapped to this address.
+         */
+        if (addr)
         {
-            trash = readl(addr);
-            t2 = cycleCounter(trash);
-            devSum += t2 - t1;
-            t1 = t2;
+            printk("Preparing to read %#llx %d times.\n", addr, count);
+
+            t1 = cycleCounter(trash);
+            for (x=0; x < count; x++)
+            {
+                trash = readl(addr);
+                t2 = cycleCounter(trash);
+                devSum += t2 - t1;
+                t1 = t2;
+            }
+
+            /**
+             * Unmap the address.
+             */
+            iounmap(addr);
+
+            printk("Read Address %#llx %ld times. Average latency %ld.\n", addr, devCnt, devSum/devCnt);
         }
-
-        printk("Read Address %#llx %ld times. Average latency %ld.\n", addr, devCnt, devSum/devCnt);
+        else
+            printk("Unable to remap address. Please try again later.\n");
     } else {
         dev = dev_get_by_name("eth0");
         if (dev)
@@ -90,6 +107,7 @@ static int __init devtime_start(void)
                     dev->mem_end, dev->base_addr);
             dev_put(dev);
         }
+        dev = 0;
         dev = dev_get_by_name("eth1");
         if (dev)
         {