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