devtime.c revision 963
1963Ssaidi@eecs.umich.edu/*
2963Ssaidi@eecs.umich.edu * Copyright (c) 2004 The Regents of The University of Michigan
3963Ssaidi@eecs.umich.edu * All rights reserved.
4963Ssaidi@eecs.umich.edu *
5963Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
6963Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
7963Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
8963Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
9963Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
10963Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
11963Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
12963Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
13963Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
14963Ssaidi@eecs.umich.edu * this software without specific prior written permission.
15963Ssaidi@eecs.umich.edu *
16963Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17963Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18963Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19963Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20963Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21963Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22963Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23963Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24963Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25963Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26963Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27963Ssaidi@eecs.umich.edu */
28963Ssaidi@eecs.umich.edu
29963Ssaidi@eecs.umich.edu#include <linux/module.h>
30963Ssaidi@eecs.umich.edu#include <linux/config.h>
31963Ssaidi@eecs.umich.edu#include <linux/moduleparam.h>
32963Ssaidi@eecs.umich.edu#include <linux/init.h>
33963Ssaidi@eecs.umich.edu#include <linux/fs.h>
34963Ssaidi@eecs.umich.edu#include <asm/uaccess.h>
35963Ssaidi@eecs.umich.edu#include <linux/kernel.h>
36963Ssaidi@eecs.umich.edu#include <asm/io.h>
37963Ssaidi@eecs.umich.edu#include <linux/netdevice.h>
38963Ssaidi@eecs.umich.edu
39963Ssaidi@eecs.umich.edu#ifdef __i386__
40963Ssaidi@eecs.umich.edu#include <asm/processor.h>
41963Ssaidi@eecs.umich.edu#include <asm/msr.h>
42963Ssaidi@eecs.umich.edu#endif
43963Ssaidi@eecs.umich.edu
44963Ssaidi@eecs.umich.edu#define DRIVER_AUTHOR "Ali Saidi"
45963Ssaidi@eecs.umich.edu#define DRIVER_DESC   "Interface to time uncacachable read and writes to device registers"
46963Ssaidi@eecs.umich.edu#define DRIVER_VER    "0.1"
47963Ssaidi@eecs.umich.edu
48963Ssaidi@eecs.umich.edustatic unsigned long devCnt, devSum, devSsq;
49963Ssaidi@eecs.umich.edustatic char *dataAddr = NULL;
50963Ssaidi@eecs.umich.edustatic int count = 0;
51963Ssaidi@eecs.umich.edu
52963Ssaidi@eecs.umich.edustatic inline uint32_t cycleCounter(uint32_t dep);
53963Ssaidi@eecs.umich.edu
54963Ssaidi@eecs.umich.edustatic int __init devtime_start(void)
55963Ssaidi@eecs.umich.edu{
56963Ssaidi@eecs.umich.edu    uint64_t addr;
57963Ssaidi@eecs.umich.edu        uint32_t t1, t2;
58963Ssaidi@eecs.umich.edu    uint32_t trash;
59963Ssaidi@eecs.umich.edu    int x;
60963Ssaidi@eecs.umich.edu
61963Ssaidi@eecs.umich.edu    struct net_device *dev;
62963Ssaidi@eecs.umich.edu
63963Ssaidi@eecs.umich.edu
64963Ssaidi@eecs.umich.edu    printk("Devtime Driver Version %s Loaded...\n", DRIVER_VER);
65963Ssaidi@eecs.umich.edu
66963Ssaidi@eecs.umich.edu    if ((dataAddr != 0) && (count != 0))
67963Ssaidi@eecs.umich.edu    {
68963Ssaidi@eecs.umich.edu        addr = simple_strtoull(dataAddr, NULL, 0);
69963Ssaidi@eecs.umich.edu
70963Ssaidi@eecs.umich.edu        devSum = 0;
71963Ssaidi@eecs.umich.edu        devCnt = count;
72963Ssaidi@eecs.umich.edu
73963Ssaidi@eecs.umich.edu        printk("Preparing to read %#llx %d times.\n", addr, count);
74963Ssaidi@eecs.umich.edu
75963Ssaidi@eecs.umich.edu        t1 = cycleCounter(trash);
76963Ssaidi@eecs.umich.edu        for (x=0; x < count; x++)
77963Ssaidi@eecs.umich.edu        {
78963Ssaidi@eecs.umich.edu            trash = readl(addr);
79963Ssaidi@eecs.umich.edu            t2 = cycleCounter(trash);
80963Ssaidi@eecs.umich.edu            devSum += t2 - t1;
81963Ssaidi@eecs.umich.edu            t1 = t2;
82963Ssaidi@eecs.umich.edu        }
83963Ssaidi@eecs.umich.edu
84963Ssaidi@eecs.umich.edu        printk("Read Address %#llx %ld times. Average latency %ld.\n", addr, devCnt, devSum/devCnt);
85963Ssaidi@eecs.umich.edu    } else {
86963Ssaidi@eecs.umich.edu        dev = dev_get_by_name("eth0");
87963Ssaidi@eecs.umich.edu        if (dev)
88963Ssaidi@eecs.umich.edu        {
89963Ssaidi@eecs.umich.edu            printk("Eth0: MemStart: %#lx MemEnd: %#lx I/O Addr: %#lx\n", dev->mem_start,
90963Ssaidi@eecs.umich.edu                    dev->mem_end, dev->base_addr);
91963Ssaidi@eecs.umich.edu            dev_put(dev);
92963Ssaidi@eecs.umich.edu        }
93963Ssaidi@eecs.umich.edu        dev = dev_get_by_name("eth1");
94963Ssaidi@eecs.umich.edu        if (dev)
95963Ssaidi@eecs.umich.edu        {
96963Ssaidi@eecs.umich.edu            printk("Eth1: MemStart: %#lx MemEnd: %#lx I/O Addr: %#lx\n", dev->mem_start,
97963Ssaidi@eecs.umich.edu                    dev->mem_end, dev->base_addr);
98963Ssaidi@eecs.umich.edu            dev_put(dev);
99963Ssaidi@eecs.umich.edu        }
100963Ssaidi@eecs.umich.edu
101963Ssaidi@eecs.umich.edu
102963Ssaidi@eecs.umich.edu        printk("Required information not supplied.\n");
103963Ssaidi@eecs.umich.edu    }
104963Ssaidi@eecs.umich.edu
105963Ssaidi@eecs.umich.edu    return 0;
106963Ssaidi@eecs.umich.edu}
107963Ssaidi@eecs.umich.edu
108963Ssaidi@eecs.umich.edu#ifdef __i386__
109963Ssaidi@eecs.umich.edu
110963Ssaidi@eecs.umich.edustatic inline uint32_t cycleCounter(uint32_t dep)
111963Ssaidi@eecs.umich.edu{
112963Ssaidi@eecs.umich.edu    uint32_t time;
113963Ssaidi@eecs.umich.edu    cpuid_eax(0);
114963Ssaidi@eecs.umich.edu    rdtscl(time);
115963Ssaidi@eecs.umich.edu    cpuid_eax(0);
116963Ssaidi@eecs.umich.edu    return time;
117963Ssaidi@eecs.umich.edu}
118963Ssaidi@eecs.umich.edu
119963Ssaidi@eecs.umich.edu#elif __alpha__
120963Ssaidi@eecs.umich.edu
121963Ssaidi@eecs.umich.eduinline uint32_t cycleCounter(uint32_t dep)
122963Ssaidi@eecs.umich.edu{
123963Ssaidi@eecs.umich.edu    uint32_t res;
124963Ssaidi@eecs.umich.edu    asm volatile ("rpcc %0, %1" : "=r"(res) : "r" (dep) : "memory");
125963Ssaidi@eecs.umich.edu    return res;
126963Ssaidi@eecs.umich.edu}
127963Ssaidi@eecs.umich.edu#else
128963Ssaidi@eecs.umich.edu#error Architecture NOT SUPPORTE
129963Ssaidi@eecs.umich.edu#endif
130963Ssaidi@eecs.umich.edu
131963Ssaidi@eecs.umich.edustatic void __exit devtime_end(void) {
132963Ssaidi@eecs.umich.edu    printk("Devtime Driver Version %s Unloaded...\n", DRIVER_VER);
133963Ssaidi@eecs.umich.edu}
134963Ssaidi@eecs.umich.edu
135963Ssaidi@eecs.umich.edu
136963Ssaidi@eecs.umich.edumodule_init(devtime_start);
137963Ssaidi@eecs.umich.edumodule_exit(devtime_end);
138963Ssaidi@eecs.umich.edu
139963Ssaidi@eecs.umich.eduMODULE_LICENSE("BSD");
140963Ssaidi@eecs.umich.eduMODULE_AUTHOR(DRIVER_AUTHOR);
141963Ssaidi@eecs.umich.eduMODULE_DESCRIPTION(DRIVER_DESC);
142963Ssaidi@eecs.umich.edumodule_param(dataAddr, charp, 0);
143963Ssaidi@eecs.umich.edumodule_param(count, int, 0);
144