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