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