testmmiotrace.c 1.8 KB

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