msm_vidc_debug.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2020-2021,, The Linux Foundation. All rights reserved.
  4. */
  5. #ifndef __MSM_VIDC_DEBUG__
  6. #define __MSM_VIDC_DEBUG__
  7. #include <linux/errno.h>
  8. #include <linux/debugfs.h>
  9. #include <linux/delay.h>
  10. #include <linux/types.h>
  11. #include <linux/module.h>
  12. #include <linux/moduleparam.h>
  13. #ifndef VIDC_DBG_LABEL
  14. #define VIDC_DBG_LABEL "msm_vidc"
  15. #endif
  16. /* Allow only 6 prints/sec */
  17. #define VIDC_DBG_SESSION_RATELIMIT_INTERVAL (1 * HZ)
  18. #define VIDC_DBG_SESSION_RATELIMIT_BURST 6
  19. #define VIDC_DBG_TAG_INST VIDC_DBG_LABEL ": %4s: %s: "
  20. #define VIDC_DBG_TAG_CORE VIDC_DBG_LABEL ": %4s: %08x: %s: "
  21. #define FW_DBG_TAG VIDC_DBG_LABEL ": %6s: "
  22. #define DEFAULT_SID ((u32)-1)
  23. #ifndef MSM_VIDC_EMPTY_BRACE
  24. #define MSM_VIDC_EMPTY_BRACE {},
  25. #endif
  26. extern unsigned int msm_vidc_debug;
  27. extern bool msm_vidc_lossless_encode;
  28. extern bool msm_vidc_syscache_disable;
  29. extern int msm_vidc_clock_voting;
  30. extern bool msm_vidc_fw_dump;
  31. extern unsigned int msm_vidc_enable_bugon;
  32. /* To enable messages OR these values and
  33. * echo the result to debugfs file.
  34. *
  35. * To enable all messages set msm_vidc_debug = 0x101F
  36. */
  37. enum vidc_msg_prio {
  38. VIDC_ERR = 0x00000001,
  39. VIDC_HIGH = 0x00000002,
  40. VIDC_LOW = 0x00000004,
  41. VIDC_PERF = 0x00000008,
  42. VIDC_PKT = 0x00000010,
  43. VIDC_BUS = 0x00000020,
  44. VIDC_ENCODER = 0x00000100,
  45. VIDC_DECODER = 0x00000200,
  46. VIDC_PRINTK = 0x00001000,
  47. VIDC_FTRACE = 0x00002000,
  48. FW_LOW = 0x00010000,
  49. FW_MED = 0x00020000,
  50. FW_HIGH = 0x00040000,
  51. FW_ERROR = 0x00080000,
  52. FW_FATAL = 0x00100000,
  53. FW_PERF = 0x00200000,
  54. FW_PRINTK = 0x10000000,
  55. FW_FTRACE = 0x20000000,
  56. };
  57. #define FW_LOGSHIFT 16
  58. #define FW_LOGMASK 0x0FFF0000
  59. #define dprintk_inst(__level, __level_str, inst, __fmt, ...) \
  60. do { \
  61. if (inst && (msm_vidc_debug & (__level))) { \
  62. pr_info(VIDC_DBG_TAG_INST __fmt, \
  63. __level_str, \
  64. inst->debug_str, \
  65. ##__VA_ARGS__); \
  66. } \
  67. } while (0)
  68. #define i_vpr_e(inst, __fmt, ...) dprintk_inst(VIDC_ERR, "err ", inst, __fmt, ##__VA_ARGS__)
  69. #define i_vpr_i(inst, __fmt, ...) dprintk_inst(VIDC_HIGH, "high", inst, __fmt, ##__VA_ARGS__)
  70. #define i_vpr_h(inst, __fmt, ...) dprintk_inst(VIDC_HIGH, "high", inst, __fmt, ##__VA_ARGS__)
  71. #define i_vpr_l(inst, __fmt, ...) dprintk_inst(VIDC_LOW, "low ", inst, __fmt, ##__VA_ARGS__)
  72. #define i_vpr_p(inst, __fmt, ...) dprintk_inst(VIDC_PERF, "perf", inst, __fmt, ##__VA_ARGS__)
  73. #define i_vpr_t(inst, __fmt, ...) dprintk_inst(VIDC_PKT, "pkt ", inst, __fmt, ##__VA_ARGS__)
  74. #define i_vpr_b(inst, __fmt, ...) dprintk_inst(VIDC_BUS, "bus ", inst, __fmt, ##__VA_ARGS__)
  75. #define i_vpr_hp(inst, __fmt, ...) \
  76. dprintk_inst(VIDC_HIGH | VIDC_PERF, "high", inst, __fmt, ##__VA_ARGS__)
  77. #define dprintk_core(__level, __level_str, __fmt, ...) \
  78. do { \
  79. if (msm_vidc_debug & (__level)) { \
  80. pr_info(VIDC_DBG_TAG_CORE __fmt, \
  81. __level_str, \
  82. DEFAULT_SID, \
  83. "codec", \
  84. ##__VA_ARGS__); \
  85. } \
  86. } while (0)
  87. #define d_vpr_e(__fmt, ...) dprintk_core(VIDC_ERR, "err ", __fmt, ##__VA_ARGS__)
  88. #define d_vpr_h(__fmt, ...) dprintk_core(VIDC_HIGH, "high", __fmt, ##__VA_ARGS__)
  89. #define d_vpr_l(__fmt, ...) dprintk_core(VIDC_LOW, "low ", __fmt, ##__VA_ARGS__)
  90. #define d_vpr_p(__fmt, ...) dprintk_core(VIDC_PERF, "perf", __fmt, ##__VA_ARGS__)
  91. #define d_vpr_t(__fmt, ...) dprintk_core(VIDC_PKT, "pkt ", __fmt, ##__VA_ARGS__)
  92. #define d_vpr_b(__fmt, ...) dprintk_core(VIDC_BUS, "bus ", __fmt, ##__VA_ARGS__)
  93. #define dprintk_ratelimit(__level, __level_str, __fmt, ...) \
  94. do { \
  95. if (msm_vidc_check_ratelimit()) { \
  96. dprintk_core(__level, __level_str, __fmt, ##__VA_ARGS__); \
  97. } \
  98. } while (0)
  99. #define dprintk_firmware(__level, __fmt, ...) \
  100. do { \
  101. if (__level & FW_PRINTK) { \
  102. pr_info(FW_DBG_TAG __fmt, \
  103. "fw", \
  104. ##__VA_ARGS__); \
  105. } \
  106. } while (0)
  107. #define MSM_VIDC_FATAL(value) \
  108. do { \
  109. if (value) { \
  110. d_vpr_e("bug on\n"); \
  111. BUG_ON(value); \
  112. } \
  113. } while (0)
  114. enum msm_vidc_debugfs_event {
  115. MSM_VIDC_DEBUGFS_EVENT_ETB,
  116. MSM_VIDC_DEBUGFS_EVENT_EBD,
  117. MSM_VIDC_DEBUGFS_EVENT_FTB,
  118. MSM_VIDC_DEBUGFS_EVENT_FBD,
  119. };
  120. enum msm_vidc_bug_on_error {
  121. MSM_VIDC_BUG_ON_FATAL = BIT(0),
  122. MSM_VIDC_BUG_ON_NOC = BIT(1),
  123. MSM_VIDC_BUG_ON_WD_TIMEOUT = BIT(2),
  124. };
  125. struct dentry *msm_vidc_debugfs_init_drv(void);
  126. struct dentry *msm_vidc_debugfs_init_core(void *core);
  127. struct dentry *msm_vidc_debugfs_init_inst(void *inst,
  128. struct dentry *parent);
  129. void msm_vidc_debugfs_deinit_inst(void *inst);
  130. void msm_vidc_debugfs_update(void *inst,
  131. enum msm_vidc_debugfs_event e);
  132. int msm_vidc_check_ratelimit(void);
  133. void msm_vidc_show_stats(void *inst);
  134. #endif