ftrace.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * Simple kernel driver to link kernel Ftrace and an STM device
  3. * Copyright (c) 2016, Linaro Ltd.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms and conditions of the GNU General Public License,
  7. * version 2, as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * STM Ftrace will be registered as a trace_export.
  15. */
  16. #include <linux/module.h>
  17. #include <linux/stm.h>
  18. #include <linux/trace.h>
  19. #define STM_FTRACE_NR_CHANNELS 1
  20. #define STM_FTRACE_CHAN 0
  21. static int stm_ftrace_link(struct stm_source_data *data);
  22. static void stm_ftrace_unlink(struct stm_source_data *data);
  23. static struct stm_ftrace {
  24. struct stm_source_data data;
  25. struct trace_export ftrace;
  26. } stm_ftrace = {
  27. .data = {
  28. .name = "ftrace",
  29. .nr_chans = STM_FTRACE_NR_CHANNELS,
  30. .link = stm_ftrace_link,
  31. .unlink = stm_ftrace_unlink,
  32. },
  33. };
  34. /**
  35. * stm_ftrace_write() - write data to STM via 'stm_ftrace' source
  36. * @buf: buffer containing the data packet
  37. * @len: length of the data packet
  38. */
  39. static void notrace
  40. stm_ftrace_write(const void *buf, unsigned int len)
  41. {
  42. stm_source_write(&stm_ftrace.data, STM_FTRACE_CHAN, buf, len);
  43. }
  44. static int stm_ftrace_link(struct stm_source_data *data)
  45. {
  46. struct stm_ftrace *sf = container_of(data, struct stm_ftrace, data);
  47. sf->ftrace.write = stm_ftrace_write;
  48. return register_ftrace_export(&sf->ftrace);
  49. }
  50. static void stm_ftrace_unlink(struct stm_source_data *data)
  51. {
  52. struct stm_ftrace *sf = container_of(data, struct stm_ftrace, data);
  53. unregister_ftrace_export(&sf->ftrace);
  54. }
  55. static int __init stm_ftrace_init(void)
  56. {
  57. int ret;
  58. ret = stm_source_register_device(NULL, &stm_ftrace.data);
  59. if (ret)
  60. pr_err("Failed to register stm_source - ftrace.\n");
  61. return ret;
  62. }
  63. static void __exit stm_ftrace_exit(void)
  64. {
  65. stm_source_unregister_device(&stm_ftrace.data);
  66. }
  67. module_init(stm_ftrace_init);
  68. module_exit(stm_ftrace_exit);
  69. MODULE_LICENSE("GPL v2");
  70. MODULE_DESCRIPTION("stm_ftrace driver");
  71. MODULE_AUTHOR("Chunyan Zhang <zhang.chunyan@linaro.org>");