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