1 /* 2 * Written by Pekka Paalanen, 2008 <pq@iki.fi> 3 */ 4 #include <linux/module.h> 5 #include <linux/io.h> 6 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; 27 for (i = 0; i < 256; i++) 28 ioread8(p + i); 29 for (i = 1024; i < (5 * 1024); i += 2) 30 ioread16(p + i); 31 for (i = (5 * 1024); i < (16 * 1024); i += 4) 32 ioread32(p + i); 33 } 34 35 static void do_test(void) 36 { 37 void __iomem *p = ioremap_nocache(mmio_address, 0x4000); 38 if (!p) { 39 pr_err(MODULE_NAME ": could not ioremap, aborting.\n"); 40 return; 41 } 42 do_write_test(p); 43 do_read_test(p); 44 iounmap(p); 45 } 46 47 static int __init init(void) 48 { 49 if (mmio_address == 0) { 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" 53 " YOU REALLY KNOW WHAT YOU ARE DOING!\n"); 54 return -ENXIO; 55 } 56 57 pr_warning(MODULE_NAME ": WARNING: mapping 16 kB @ 0x%08lx " 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 { 66 pr_debug(MODULE_NAME ": unloaded.\n"); 67 } 68 69 module_init(init); 70 module_exit(cleanup); 71 MODULE_LICENSE("GPL"); 72