testmmiotrace.c 1.6 KB

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