Commit | Line | Data |
---|---|---|
8b7d89d0 PP |
1 | /* |
2 | * Written by Pekka Paalanen, 2008 <pq@iki.fi> | |
3 | */ | |
4 | #include <linux/module.h> | |
5 | #include <asm/io.h> | |
6 | ||
7 | extern void __iomem *ioremap_nocache_trace(unsigned long offset, | |
8 | unsigned long size); | |
9 | extern void iounmap_trace(volatile void __iomem *addr); | |
10 | ||
11 | #define MODULE_NAME "testmmiotrace" | |
12 | ||
13 | static unsigned long mmio_address; | |
14 | module_param(mmio_address, ulong, 0); | |
15 | MODULE_PARM_DESC(mmio_address, "Start address of the mapping of 16 kB."); | |
16 | ||
17 | static void do_write_test(void __iomem *p) | |
18 | { | |
19 | unsigned int i; | |
20 | for (i = 0; i < 256; i++) | |
21 | iowrite8(i, p + i); | |
22 | for (i = 1024; i < (5 * 1024); i += 2) | |
23 | iowrite16(i * 12 + 7, p + i); | |
24 | for (i = (5 * 1024); i < (16 * 1024); i += 4) | |
25 | iowrite32(i * 212371 + 13, p + i); | |
26 | } | |
27 | ||
28 | static void do_read_test(void __iomem *p) | |
29 | { | |
30 | unsigned int i; | |
31 | volatile unsigned int v; | |
32 | for (i = 0; i < 256; i++) | |
33 | v = ioread8(p + i); | |
34 | for (i = 1024; i < (5 * 1024); i += 2) | |
35 | v = ioread16(p + i); | |
36 | for (i = (5 * 1024); i < (16 * 1024); i += 4) | |
37 | v = ioread32(p + i); | |
38 | } | |
39 | ||
40 | static void do_test(void) | |
41 | { | |
42 | void __iomem *p = ioremap_nocache_trace(mmio_address, 0x4000); | |
43 | if (!p) { | |
0fd0e3da | 44 | pr_err(MODULE_NAME ": could not ioremap, aborting.\n"); |
8b7d89d0 PP |
45 | return; |
46 | } | |
47 | do_write_test(p); | |
48 | do_read_test(p); | |
49 | iounmap_trace(p); | |
50 | } | |
51 | ||
52 | static int __init init(void) | |
53 | { | |
54 | if (mmio_address == 0) { | |
0fd0e3da PP |
55 | pr_err(MODULE_NAME ": you have to use the module argument " |
56 | "mmio_address.\n"); | |
57 | pr_err(MODULE_NAME ": DO NOT LOAD THIS MODULE UNLESS" | |
8b7d89d0 PP |
58 | " YOU REALLY KNOW WHAT YOU ARE DOING!\n"); |
59 | return -ENXIO; | |
60 | } | |
61 | ||
0fd0e3da | 62 | pr_warning(MODULE_NAME ": WARNING: mapping 16 kB @ 0x%08lx " |
8b7d89d0 PP |
63 | "in PCI address space, and writing " |
64 | "rubbish in there.\n", mmio_address); | |
65 | do_test(); | |
66 | return 0; | |
67 | } | |
68 | ||
69 | static void __exit cleanup(void) | |
70 | { | |
0fd0e3da | 71 | pr_debug(MODULE_NAME ": unloaded.\n"); |
8b7d89d0 PP |
72 | } |
73 | ||
74 | module_init(init); | |
75 | module_exit(cleanup); | |
76 | MODULE_LICENSE("GPL"); |