met_drv.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #ifndef MET_DRV
  2. #define MET_DRV
  3. #include <linux/version.h>
  4. #include <linux/device.h>
  5. #include <linux/percpu.h>
  6. #include <linux/hardirq.h>
  7. extern int met_mode;
  8. #define MET_MODE_TRACE_CMD_OFFSET (1)
  9. #define MET_MODE_TRACE_CMD (1<<MET_MODE_TRACE_CMD_OFFSET)
  10. /*#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
  11. #define MET_PRINTK(FORMAT, args...) \
  12. do {\
  13. if (met_mode & MET_MODE_TRACE_CMD) \
  14. trace_printk("%s: " FORMAT, __func__, ##args); \
  15. else \
  16. trace_printk(FORMAT, ##args); \
  17. } while (0)
  18. #else*/
  19. #define MET_STRBUF_SIZE 1024
  20. DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_nmi);
  21. DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_irq);
  22. DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_sirq);
  23. DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf);
  24. #ifdef CONFIG_FTRACE
  25. #define TRACE_PUTS(p) \
  26. do { \
  27. trace_puts(pmet_strbuf);; \
  28. } while (0)
  29. #else
  30. #define TRACE_PUTS(p) do {} while (0)
  31. #endif
  32. #define MET_PRINTK(FORMAT, args...) \
  33. do { \
  34. char *pmet_strbuf; \
  35. preempt_disable(); \
  36. if (in_nmi()) \
  37. pmet_strbuf = per_cpu(met_strbuf_nmi, smp_processor_id()); \
  38. else if (in_irq()) \
  39. pmet_strbuf = per_cpu(met_strbuf_irq, smp_processor_id()); \
  40. else if (in_softirq()) \
  41. pmet_strbuf = per_cpu(met_strbuf_sirq, smp_processor_id()); \
  42. else \
  43. pmet_strbuf = per_cpu(met_strbuf, smp_processor_id()); \
  44. if (met_mode & MET_MODE_TRACE_CMD) \
  45. snprintf(pmet_strbuf, MET_STRBUF_SIZE, "%s: " FORMAT, __func__, ##args); \
  46. else \
  47. snprintf(pmet_strbuf, MET_STRBUF_SIZE, FORMAT, ##args); \
  48. TRACE_PUTS(pmet_strbuf); \
  49. preempt_enable_no_resched(); \
  50. } while (0)
  51. /*#endif*/
  52. #define MET_FTRACE_PRINTK(TRACE_NAME, args...) \
  53. do { \
  54. trace_##TRACE_NAME(args);; \
  55. } while (0)
  56. #define MET_TYPE_PMU 1
  57. #define MET_TYPE_BUS 2
  58. #define MET_TYPE_MISC 3
  59. struct metdevice {
  60. struct list_head list;
  61. int type;
  62. const char *name;
  63. struct module *owner;
  64. struct kobject *kobj;
  65. int (*create_subfs)(struct kobject *parent);
  66. void (*delete_subfs)(void);
  67. int mode;
  68. int cpu_related;
  69. int polling_interval;
  70. int polling_count_reload;
  71. int __percpu *polling_count;
  72. void (*start)(void);
  73. void (*stop)(void);
  74. int (*reset)(void);
  75. void (*timed_polling)(unsigned long long stamp, int cpu);
  76. void (*tagged_polling)(unsigned long long stamp, int cpu);
  77. int (*print_help)(char *buf, int len);
  78. int (*print_header)(char *buf, int len);
  79. int (*process_argument)(const char *arg, int len);
  80. struct list_head exlist; /* for linked list before register */
  81. void *reversed1;
  82. };
  83. int met_register(struct metdevice *met);
  84. int met_deregister(struct metdevice *met);
  85. int met_set_platform(const char *plf_name, int flag);
  86. int met_set_topology(const char *topology_name, int flag);
  87. int met_devlink_add(struct metdevice *met);
  88. int met_devlink_del(struct metdevice *met);
  89. int met_devlink_register_all(void);
  90. int met_devlink_deregister_all(void);
  91. int fs_reg(void);
  92. void fs_unreg(void);
  93. /******************************************************************************
  94. * Tracepoints
  95. ******************************************************************************/
  96. /*#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32)
  97. # error Kernels prior to 2.6.32 not supported
  98. #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
  99. # define MET_DEFINE_PROBE(probe_name, proto) \
  100. static void probe_##probe_name(PARAMS(proto))
  101. # define MET_REGISTER_TRACE(probe_name) \
  102. register_trace_##probe_name(probe_##probe_name)
  103. # define MET_UNREGISTER_TRACE(probe_name) \
  104. unregister_trace_##probe_name(probe_##probe_name)
  105. #else*/
  106. # define MET_DEFINE_PROBE(probe_name, proto) \
  107. static void probe_##probe_name(void *data, PARAMS(proto))
  108. # define MET_REGISTER_TRACE(probe_name) \
  109. register_trace_##probe_name(probe_##probe_name, NULL)
  110. # define MET_UNREGISTER_TRACE(probe_name) \
  111. unregister_trace_##probe_name(probe_##probe_name, NULL)
  112. /*#endif*/
  113. /* ====================== Tagging API ================================ */
  114. #define MAX_EVENT_CLASS 31
  115. #define MAX_TAGNAME_LEN 128
  116. #define MET_CLASS_ALL 0x80000000
  117. /* IOCTL commands of MET tagging */
  118. /*typedef*/ struct _mtag_cmd_t {
  119. unsigned int class_id;
  120. unsigned int value;
  121. unsigned int slen;
  122. char tname[MAX_TAGNAME_LEN];
  123. void *data;
  124. unsigned int size;
  125. } /*mtag_cmd_t*/;
  126. #define TYPE_START 1
  127. #define TYPE_END 2
  128. #define TYPE_ONESHOT 3
  129. #define TYPE_ENABLE 4
  130. #define TYPE_DISABLE 5
  131. #define TYPE_REC_SET 6
  132. #define TYPE_DUMP 7
  133. #define TYPE_DUMP_SIZE 8
  134. #define TYPE_DUMP_SAVE 9
  135. #define TYPE_USRDATA 10
  136. #define TYPE_DUMP_AGAIN 11
  137. /* Use 'm' as magic number */
  138. #define MTAG_IOC_MAGIC 'm'
  139. /* Please use a different 8-bit number in your code */
  140. #define MTAG_CMD_START _IOW(MTAG_IOC_MAGIC, TYPE_START, mtag_cmd_t)
  141. #define MTAG_CMD_END _IOW(MTAG_IOC_MAGIC, TYPE_END, mtag_cmd_t)
  142. #define MTAG_CMD_ONESHOT _IOW(MTAG_IOC_MAGIC, TYPE_ONESHOT, mtag_cmd_t)
  143. #define MTAG_CMD_ENABLE _IOW(MTAG_IOC_MAGIC, TYPE_ENABLE, int)
  144. #define MTAG_CMD_DISABLE _IOW(MTAG_IOC_MAGIC, TYPE_DISABLE, int)
  145. #define MTAG_CMD_REC_SET _IOW(MTAG_IOC_MAGIC, TYPE_REC_SET, int)
  146. #define MTAG_CMD_DUMP _IOW(MTAG_IOC_MAGIC, TYPE_DUMP, mtag_cmd_t)
  147. #define MTAG_CMD_DUMP_SIZE _IOWR(MTAG_IOC_MAGIC, TYPE_DUMP_SIZE, int)
  148. #define MTAG_CMD_DUMP_SAVE _IOW(MTAG_IOC_MAGIC, TYPE_DUMP_SAVE, mtag_cmd_t)
  149. #define MTAG_CMD_USRDATA _IOW(MTAG_IOC_MAGIC, TYPE_USRDATA, mtag_cmd_t)
  150. #define MTAG_CMD_DUMP_AGAIN _IOW(MTAG_IOC_MAGIC, TYPE_DUMP_AGAIN, void *)
  151. /* include file */
  152. #ifndef MET_USER_EVENT_SUPPORT
  153. #define met_tag_init() (0)
  154. #define met_tag_uninit() (0)
  155. #define met_tag_start(id, name) (0)
  156. #define met_tag_end(id, name) (0)
  157. #define met_tag_oneshot(id, name, value) (0)
  158. #define met_tag_userdata(pData) (0)
  159. #define met_tag_dump(id, name, data, length) (0)
  160. #define met_tag_disable(id) (0)
  161. #define met_tag_enable(id) (0)
  162. #define met_set_dump_buffer(size) (0)
  163. #define met_save_dump_buffer(pathname) (0)
  164. #define met_save_log(pathname) (0)
  165. #define met_record_on() (0)
  166. #define met_record_off() (0)
  167. #define met_show_bw_limiter() (0)
  168. #define met_reg_bw_limiter() (0)
  169. #else
  170. #include <linux/kernel.h>
  171. int __attribute__((weak)) met_tag_init(void);
  172. int __attribute__((weak)) met_tag_uninit(void);
  173. int __attribute__((weak)) met_tag_start(unsigned int class_id,
  174. const char *name);
  175. int __attribute__((weak)) met_tag_end(unsigned int class_id,
  176. const char *name);
  177. int __attribute__((weak)) met_tag_oneshot(unsigned int class_id,
  178. const char *name,
  179. unsigned int value);
  180. int met_tag_userdata(char *pData);
  181. int __attribute__((weak)) met_tag_dump(unsigned int class_id,
  182. const char *name,
  183. void *data,
  184. unsigned int length);
  185. int __attribute__((weak)) met_tag_disable(unsigned int class_id);
  186. int __attribute__((weak)) met_tag_enable(unsigned int class_id);
  187. int __attribute__((weak)) met_set_dump_buffer(int size);
  188. int __attribute__((weak)) met_save_dump_buffer(const char *pathname);
  189. int __attribute__((weak)) met_save_log(const char *pathname);
  190. int __attribute__((weak)) met_show_bw_limiter(void);
  191. int __attribute__((weak)) met_reg_bw_limiter(void *fp);
  192. #define met_record_on() tracing_on()
  193. #define met_record_off() tracing_off()
  194. #endif /* MET_USER_EVENT_SUPPORT */
  195. #endif /* MET_DRV */