msm_cvp_debug.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
  4. */
  5. #ifndef __MSM_CVP_DEBUG__
  6. #define __MSM_CVP_DEBUG__
  7. #include <linux/debugfs.h>
  8. #include <linux/delay.h>
  9. #include "msm_cvp_internal.h"
  10. #include "msm_cvp_events.h"
  11. #ifndef CVP_DBG_LABEL
  12. #define CVP_DBG_LABEL "msm_cvp"
  13. #endif
  14. #define CVP_DBG_TAG CVP_DBG_LABEL ": %4s: "
  15. /* To enable messages OR these values and
  16. * echo the result to debugfs file.
  17. *
  18. * To enable all messages set debug_level = 0x101F
  19. */
  20. enum cvp_msg_prio {
  21. CVP_ERR = 0x000001,
  22. CVP_WARN = 0x000002,
  23. CVP_INFO = 0x000004,
  24. CVP_CMD = 0x000008,
  25. CVP_PROF = 0x000010,
  26. CVP_PKT = 0x000020,
  27. CVP_MEM = 0x000040,
  28. CVP_SYNX = 0x000080,
  29. CVP_CORE = 0x000100,
  30. CVP_REG = 0x000200,
  31. CVP_PWR = 0x000400,
  32. CVP_DSP = 0x000800,
  33. CVP_FW = 0x001000,
  34. CVP_SESS = 0x002000,
  35. CVP_HFI = 0x004000,
  36. CVP_VM = 0x008000,
  37. CVP_DBG = CVP_MEM | CVP_SYNX | CVP_CORE | CVP_REG | CVP_CMD |
  38. CVP_PWR | CVP_DSP | CVP_SESS | CVP_HFI | CVP_PKT | CVP_VM,
  39. };
  40. enum cvp_msg_out {
  41. CVP_OUT_PRINTK = 0,
  42. };
  43. enum msm_cvp_debugfs_event {
  44. MSM_CVP_DEBUGFS_EVENT_ETB,
  45. MSM_CVP_DEBUGFS_EVENT_EBD,
  46. MSM_CVP_DEBUGFS_EVENT_FTB,
  47. MSM_CVP_DEBUGFS_EVENT_FBD,
  48. };
  49. extern int msm_cvp_debug;
  50. extern int msm_cvp_debug_out;
  51. extern int msm_cvp_fw_debug;
  52. extern int msm_cvp_fw_debug_mode;
  53. extern int msm_cvp_fw_low_power_mode;
  54. extern bool msm_cvp_fw_coverage;
  55. extern bool msm_cvp_auto_pil;
  56. extern bool msm_cvp_thermal_mitigation_disabled;
  57. extern bool msm_cvp_cacheop_disabled;
  58. extern int msm_cvp_clock_voting;
  59. extern bool msm_cvp_syscache_disable;
  60. extern bool msm_cvp_dsp_disable;
  61. extern bool msm_cvp_mmrm_enabled;
  62. extern bool msm_cvp_dcvs_disable;
  63. extern int msm_cvp_minidump_enable;
  64. extern int cvp_kernel_fence_enabled;
  65. extern int msm_cvp_hw_wd_recovery;
  66. #define dprintk(__level, __fmt, arg...) \
  67. do { \
  68. if (msm_cvp_debug & __level) { \
  69. if (msm_cvp_debug_out == CVP_OUT_PRINTK) { \
  70. pr_info(CVP_DBG_TAG __fmt, \
  71. get_debug_level_str(__level), \
  72. ## arg); \
  73. } \
  74. } \
  75. } while (0)
  76. /* dprintk_rl is designed for printing frequent recurring errors */
  77. #define dprintk_rl(__level, __fmt, arg...) \
  78. do { \
  79. if (msm_cvp_debug & __level) { \
  80. if (msm_cvp_debug_out == CVP_OUT_PRINTK) { \
  81. pr_info_ratelimited(CVP_DBG_TAG __fmt, \
  82. get_debug_level_str(__level), \
  83. ## arg); \
  84. } \
  85. } \
  86. } while (0)
  87. #define MSM_CVP_ERROR(value) \
  88. do { if (value) \
  89. dprintk(CVP_ERR, "BugOn"); \
  90. WARN_ON(value); \
  91. } while (0)
  92. struct dentry *msm_cvp_debugfs_init_drv(void);
  93. struct dentry *msm_cvp_debugfs_init_core(struct msm_cvp_core *core,
  94. struct dentry *parent);
  95. struct dentry *msm_cvp_debugfs_init_inst(struct msm_cvp_inst *inst,
  96. struct dentry *parent);
  97. void msm_cvp_debugfs_deinit_inst(struct msm_cvp_inst *inst);
  98. static inline char *get_debug_level_str(int level)
  99. {
  100. switch (level) {
  101. case CVP_ERR:
  102. return "err";
  103. case CVP_WARN:
  104. return "warn";
  105. case CVP_INFO:
  106. return "info";
  107. case CVP_CMD:
  108. return "cmd";
  109. case CVP_DBG:
  110. return "dbg";
  111. case CVP_PROF:
  112. return "prof";
  113. case CVP_PKT:
  114. return "pkt";
  115. case CVP_MEM:
  116. return "mem";
  117. case CVP_SYNX:
  118. return "synx";
  119. case CVP_CORE:
  120. return "core";
  121. case CVP_REG:
  122. return "reg";
  123. case CVP_PWR:
  124. return "pwr";
  125. case CVP_DSP:
  126. return "dsp";
  127. case CVP_FW:
  128. return "fw";
  129. case CVP_SESS:
  130. return "sess";
  131. case CVP_HFI:
  132. return "hfi";
  133. case CVP_VM:
  134. return "vm";
  135. default:
  136. return "???";
  137. }
  138. }
  139. static inline void show_stats(struct msm_cvp_inst *i)
  140. {
  141. int x;
  142. for (x = 0; x < MAX_PROFILING_POINTS; x++) {
  143. if (i->debug.pdata[x].name[0] &&
  144. (msm_cvp_debug & CVP_PROF)) {
  145. if (i->debug.samples) {
  146. dprintk(CVP_PROF, "%s averaged %d ms/sample\n",
  147. i->debug.pdata[x].name,
  148. i->debug.pdata[x].cumulative /
  149. i->debug.samples);
  150. }
  151. dprintk(CVP_PROF, "%s Samples: %d\n",
  152. i->debug.pdata[x].name,
  153. i->debug.samples);
  154. }
  155. }
  156. }
  157. static inline void msm_cvp_res_handle_fatal_hw_error(
  158. struct msm_cvp_platform_resources *resources,
  159. bool enable_fatal)
  160. {
  161. enable_fatal &= resources->debug_timeout;
  162. MSM_CVP_ERROR(enable_fatal);
  163. }
  164. static inline void msm_cvp_handle_hw_error(struct msm_cvp_core *core)
  165. {
  166. bool enable_fatal = true;
  167. /*
  168. * In current implementation user-initiated SSR triggers
  169. * a fatal error from hardware. However, there is no way
  170. * to know if fatal error is due to SSR or not. Handle
  171. * user SSR as non-fatal.
  172. */
  173. if (core->trigger_ssr) {
  174. core->trigger_ssr = false;
  175. enable_fatal = false;
  176. }
  177. /* CVP driver can decide FATAL handling of HW errors
  178. * based on multiple factors. This condition check will
  179. * be enhanced later.
  180. */
  181. msm_cvp_res_handle_fatal_hw_error(&core->resources, enable_fatal);
  182. }
  183. #endif