modified devtime to print out raw data
--HG-- extra : convert_revision : 5ad673d6f684acaffeb61db794f7e2ac099ba99d
This commit is contained in:
parent
ef16b46484
commit
c2e5caf360
1 changed files with 38 additions and 21 deletions
|
@ -46,7 +46,6 @@
|
||||||
#define DRIVER_DESC "Interface to time uncacachable read and writes to device registers"
|
#define DRIVER_DESC "Interface to time uncacachable read and writes to device registers"
|
||||||
#define DRIVER_VER "0.1"
|
#define DRIVER_VER "0.1"
|
||||||
|
|
||||||
static unsigned long devCnt, devSum, devSsq;
|
|
||||||
static char *dataAddr = NULL;
|
static char *dataAddr = NULL;
|
||||||
static int count = 0;
|
static int count = 0;
|
||||||
|
|
||||||
|
@ -55,35 +54,43 @@ static inline uint32_t cycleCounter(uint32_t dep);
|
||||||
static int __init devtime_start(void)
|
static int __init devtime_start(void)
|
||||||
{
|
{
|
||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
uint32_t t1, t2;
|
uint32_t t1, t2;
|
||||||
uint32_t trash;
|
uint32_t trash;
|
||||||
int x;
|
int x;
|
||||||
|
uint32_t *times;
|
||||||
|
uint32_t num = 0;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
|
||||||
|
|
||||||
printk("Devtime Driver Version %s Loaded...\n", DRIVER_VER);
|
printk("Devtime Driver Version %s Loaded...\n", DRIVER_VER);
|
||||||
|
|
||||||
if (dataAddr != 0 && count != 0) {
|
if ((dataAddr != 0) && (count != 0))
|
||||||
|
{
|
||||||
addr = simple_strtoull(dataAddr, NULL, 0);
|
addr = simple_strtoull(dataAddr, NULL, 0);
|
||||||
|
|
||||||
devSum = 0;
|
|
||||||
devCnt = count;
|
|
||||||
|
|
||||||
addr = ioremap(addr, PAGE_SIZE);
|
addr = ioremap(addr, PAGE_SIZE);
|
||||||
/**
|
/**
|
||||||
* Make sure that the remapping actually worked. On alpha we have
|
* Make sure that the remapping actually worked. On alpha we have
|
||||||
* linear addressing, so its not a problem. But it can fail in x86
|
* linear addressing, so its not a problem. But it can fail in x86
|
||||||
* if physical memory is mapped to this address.
|
* if physical memory is mapped to this address.
|
||||||
*/
|
*/
|
||||||
if (addr) {
|
times = kmalloc(sizeof(uint32_t) * count, GFP_USER);
|
||||||
|
if (!times)
|
||||||
|
{
|
||||||
|
printk("Could not allocate memory... Try again later.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr)
|
||||||
|
{
|
||||||
printk("Preparing to read %#llx %d times.\n", addr, count);
|
printk("Preparing to read %#llx %d times.\n", addr, count);
|
||||||
|
|
||||||
t1 = cycleCounter(trash);
|
t1 = cycleCounter(trash);
|
||||||
for (x = 0; x < count; x++) {
|
for (x=0; x < count; x++)
|
||||||
|
{
|
||||||
trash = readl(addr);
|
trash = readl(addr);
|
||||||
t2 = cycleCounter(trash);
|
t2 = cycleCounter(trash);
|
||||||
devSum += t2 - t1;
|
times[num++] = t2 - t1;
|
||||||
t1 = t2;
|
t1 = t2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,26 +99,37 @@ static int __init devtime_start(void)
|
||||||
*/
|
*/
|
||||||
iounmap(addr);
|
iounmap(addr);
|
||||||
|
|
||||||
printk("Read Address %#llx %ld times. Average latency %ld.\n",
|
printk("Measurements:\n");
|
||||||
addr, devCnt, devSum/devCnt);
|
for (x = 0; x < count; x++)
|
||||||
|
{
|
||||||
|
printk("%d ", times[x]);
|
||||||
|
if (((x+1) % 10) == 0)
|
||||||
|
printk("\n");
|
||||||
|
}
|
||||||
|
printk("\nDone.\n");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printk("Unable to remap address. Please try again later.\n");
|
printk("Unable to remap address. Please try again later.\n");
|
||||||
} else {
|
} else {
|
||||||
dev = dev_get_by_name("eth0");
|
dev = dev_get_by_name("eth0");
|
||||||
if (dev) {
|
if (dev)
|
||||||
printk("Eth0: MemStart: %#lx MemEnd: %#lx I/O Addr: %#lx\n",
|
{
|
||||||
dev->mem_start, dev->mem_end, dev->base_addr);
|
printk("Eth0: MemStart: %#lx MemEnd: %#lx I/O Addr: %#lx\n", dev->mem_start,
|
||||||
|
dev->mem_end, dev->base_addr);
|
||||||
dev_put(dev);
|
dev_put(dev);
|
||||||
}
|
}
|
||||||
dev = 0;
|
dev = 0;
|
||||||
dev = dev_get_by_name("eth1");
|
dev = dev_get_by_name("eth1");
|
||||||
if (dev) {
|
if (dev)
|
||||||
printk("Eth1: MemStart: %#lx MemEnd: %#lx I/O Addr: %#lx\n",
|
{
|
||||||
dev->mem_start, dev->mem_end, dev->base_addr);
|
printk("Eth1: MemStart: %#lx MemEnd: %#lx I/O Addr: %#lx\n", dev->mem_start,
|
||||||
|
dev->mem_end, dev->base_addr);
|
||||||
dev_put(dev);
|
dev_put(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
printk("Required information not supplied.\n");
|
printk("Required information not supplied.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,8 +159,7 @@ inline uint32_t cycleCounter(uint32_t dep)
|
||||||
#error Architecture NOT SUPPORTE
|
#error Architecture NOT SUPPORTE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void __exit devtime_end(void)
|
static void __exit devtime_end(void) {
|
||||||
{
|
|
||||||
printk("Devtime Driver Version %s Unloaded...\n", DRIVER_VER);
|
printk("Devtime Driver Version %s Unloaded...\n", DRIVER_VER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +167,7 @@ static void __exit devtime_end(void)
|
||||||
module_init(devtime_start);
|
module_init(devtime_start);
|
||||||
module_exit(devtime_end);
|
module_exit(devtime_end);
|
||||||
|
|
||||||
MODULE_LICENSE("BSD");
|
MODULE_LICENSE("Dual BSD/GPL");
|
||||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||||
module_param(dataAddr, charp, 0);
|
module_param(dataAddr, charp, 0);
|
||||||
|
|
Loading…
Reference in a new issue