blob: 4b29f3b0ee01b7a5900366f82457c793795129f5 [file] [log] [blame]
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +02001/*
Pekka Paalanenfab852a2009-03-01 16:09:14 +02002 * Written by Pekka Paalanen, 2008-2009 <pq@iki.fi>
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +02003 */
4#include <linux/module.h>
Pekka Paalanen970e6fa2008-05-12 21:21:03 +02005#include <linux/io.h>
Pekka Paalanen9e57fb32008-09-16 22:00:34 +03006#include <linux/mmiotrace.h>
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +02007
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +02008#define MODULE_NAME "testmmiotrace"
9
10static unsigned long mmio_address;
11module_param(mmio_address, ulong, 0);
12MODULE_PARM_DESC(mmio_address, "Start address of the mapping of 16 kB.");
13
Pekka Paalanenfab852a2009-03-01 16:09:14 +020014static unsigned v16(unsigned i)
15{
16 return i * 12 + 7;
17}
18
19static unsigned v32(unsigned i)
20{
21 return i * 212371 + 13;
22}
23
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020024static void do_write_test(void __iomem *p)
25{
26 unsigned int i;
Pekka Paalanen9e57fb32008-09-16 22:00:34 +030027 mmiotrace_printk("Write test.\n");
Pekka Paalanenfab852a2009-03-01 16:09:14 +020028
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020029 for (i = 0; i < 256; i++)
30 iowrite8(i, p + i);
Pekka Paalanenfab852a2009-03-01 16:09:14 +020031
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020032 for (i = 1024; i < (5 * 1024); i += 2)
Pekka Paalanenfab852a2009-03-01 16:09:14 +020033 iowrite16(v16(i), p + i);
34
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020035 for (i = (5 * 1024); i < (16 * 1024); i += 4)
Pekka Paalanenfab852a2009-03-01 16:09:14 +020036 iowrite32(v32(i), p + i);
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020037}
38
39static void do_read_test(void __iomem *p)
40{
41 unsigned int i;
Pekka Paalanenfab852a2009-03-01 16:09:14 +020042 unsigned errs[3] = { 0 };
Pekka Paalanen9e57fb32008-09-16 22:00:34 +030043 mmiotrace_printk("Read test.\n");
Pekka Paalanenfab852a2009-03-01 16:09:14 +020044
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020045 for (i = 0; i < 256; i++)
Pekka Paalanenfab852a2009-03-01 16:09:14 +020046 if (ioread8(p + i) != i)
47 ++errs[0];
48
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020049 for (i = 1024; i < (5 * 1024); i += 2)
Pekka Paalanenfab852a2009-03-01 16:09:14 +020050 if (ioread16(p + i) != v16(i))
51 ++errs[1];
52
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020053 for (i = (5 * 1024); i < (16 * 1024); i += 4)
Pekka Paalanenfab852a2009-03-01 16:09:14 +020054 if (ioread32(p + i) != v32(i))
55 ++errs[2];
56
57 mmiotrace_printk("Read errors: 8-bit %d, 16-bit %d, 32-bit %d.\n",
58 errs[0], errs[1], errs[2]);
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020059}
60
61static void do_test(void)
62{
Pekka Paalanend61fc442008-05-12 21:20:57 +020063 void __iomem *p = ioremap_nocache(mmio_address, 0x4000);
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020064 if (!p) {
Pekka Paalanen0fd0e3d2008-05-12 21:20:57 +020065 pr_err(MODULE_NAME ": could not ioremap, aborting.\n");
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020066 return;
67 }
Pekka Paalanen9e57fb32008-09-16 22:00:34 +030068 mmiotrace_printk("ioremap returned %p.\n", p);
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020069 do_write_test(p);
70 do_read_test(p);
Pekka Paalanend61fc442008-05-12 21:20:57 +020071 iounmap(p);
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020072}
73
74static int __init init(void)
75{
76 if (mmio_address == 0) {
Pekka Paalanen0fd0e3d2008-05-12 21:20:57 +020077 pr_err(MODULE_NAME ": you have to use the module argument "
78 "mmio_address.\n");
79 pr_err(MODULE_NAME ": DO NOT LOAD THIS MODULE UNLESS"
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020080 " YOU REALLY KNOW WHAT YOU ARE DOING!\n");
81 return -ENXIO;
82 }
83
Pekka Paalanen0fd0e3d2008-05-12 21:20:57 +020084 pr_warning(MODULE_NAME ": WARNING: mapping 16 kB @ 0x%08lx "
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020085 "in PCI address space, and writing "
86 "rubbish in there.\n", mmio_address);
87 do_test();
88 return 0;
89}
90
91static void __exit cleanup(void)
92{
Pekka Paalanen0fd0e3d2008-05-12 21:20:57 +020093 pr_debug(MODULE_NAME ": unloaded.\n");
Pekka Paalanen8b7d89d2008-05-12 21:20:56 +020094}
95
96module_init(init);
97module_exit(cleanup);
98MODULE_LICENSE("GPL");