cam_debug_util.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2017-2021, The Linux Foundataion. All rights reserved.
  4. */
  5. #include <linux/io.h>
  6. #include <linux/slab.h>
  7. #include <linux/module.h>
  8. #include "cam_trace.h"
  9. #include "cam_debug_util.h"
  10. unsigned long long debug_mdl;
  11. module_param(debug_mdl, ullong, 0644);
  12. /* 0x0 - only logs, 0x1 - only trace, 0x2 - logs + trace */
  13. uint debug_type;
  14. module_param(debug_type, uint, 0644);
  15. uint debug_priority;
  16. module_param(debug_priority, uint, 0644);
  17. struct camera_debug_settings cam_debug;
  18. const struct camera_debug_settings *cam_debug_get_settings()
  19. {
  20. return &cam_debug;
  21. }
  22. static int cam_debug_parse_cpas_settings(const char *setting, u64 value)
  23. {
  24. if (!strcmp(setting, "camnoc_bw")) {
  25. cam_debug.cpas_settings.camnoc_bw = value;
  26. } else if (!strcmp(setting, "mnoc_hf_0_ab_bw")) {
  27. cam_debug.cpas_settings.mnoc_hf_0_ab_bw = value;
  28. } else if (!strcmp(setting, "mnoc_hf_0_ib_bw")) {
  29. cam_debug.cpas_settings.mnoc_hf_0_ib_bw = value;
  30. } else if (!strcmp(setting, "mnoc_hf_1_ab_bw")) {
  31. cam_debug.cpas_settings.mnoc_hf_1_ab_bw = value;
  32. } else if (!strcmp(setting, "mnoc_hf_1_ib_bw")) {
  33. cam_debug.cpas_settings.mnoc_hf_1_ib_bw = value;
  34. } else if (!strcmp(setting, "mnoc_sf_0_ab_bw")) {
  35. cam_debug.cpas_settings.mnoc_sf_0_ab_bw = value;
  36. } else if (!strcmp(setting, "mnoc_sf_0_ib_bw")) {
  37. cam_debug.cpas_settings.mnoc_sf_0_ib_bw = value;
  38. } else if (!strcmp(setting, "mnoc_sf_1_ab_bw")) {
  39. cam_debug.cpas_settings.mnoc_sf_1_ab_bw = value;
  40. } else if (!strcmp(setting, "mnoc_sf_1_ib_bw")) {
  41. cam_debug.cpas_settings.mnoc_sf_1_ib_bw = value;
  42. } else if (!strcmp(setting, "mnoc_sf_icp_ab_bw")) {
  43. cam_debug.cpas_settings.mnoc_sf_icp_ab_bw = value;
  44. } else if (!strcmp(setting, "mnoc_sf_icp_ib_bw")) {
  45. cam_debug.cpas_settings.mnoc_sf_icp_ib_bw = value;
  46. } else {
  47. CAM_ERR(CAM_UTIL, "Unsupported cpas sysfs entry");
  48. return -EINVAL;
  49. }
  50. return 0;
  51. }
  52. ssize_t cam_debug_sysfs_node_store(struct device *dev,
  53. struct device_attribute *attr, const char *buf, size_t count)
  54. {
  55. int rc = 0;
  56. char *local_buf = NULL, *local_buf_temp = NULL;
  57. char *driver;
  58. char *setting = NULL;
  59. char *value_str = NULL;
  60. u64 value;
  61. CAM_INFO(CAM_UTIL, "Sysfs debug attr name:[%s] buf:[%s] bytes:[%d]",
  62. attr->attr.name, buf, count);
  63. local_buf = kmemdup(buf, (count + sizeof(char)), GFP_KERNEL);
  64. local_buf_temp = local_buf;
  65. driver = strsep(&local_buf, "#");
  66. if (!driver) {
  67. CAM_ERR(CAM_UTIL,
  68. "Invalid input driver name buf:[%s], count:%d",
  69. buf, count);
  70. goto error;
  71. }
  72. setting = strsep(&local_buf, "=");
  73. if (!setting) {
  74. CAM_ERR(CAM_UTIL, "Invalid input setting buf:[%s], count:%d",
  75. buf, count);
  76. goto error;
  77. }
  78. value_str = strsep(&local_buf, "=");
  79. if (!value_str) {
  80. CAM_ERR(CAM_UTIL, "Invalid input value buf:[%s], count:%d",
  81. buf, count);
  82. goto error;
  83. }
  84. rc = kstrtou64(value_str, 0, &value);
  85. if (rc < 0) {
  86. CAM_ERR(CAM_UTIL, "Error converting value:[%s], buf:[%s]",
  87. value_str, buf);
  88. goto error;
  89. }
  90. CAM_INFO(CAM_UTIL,
  91. "Processing sysfs store for driver:[%s], setting:[%s], value:[%llu]",
  92. driver, setting, value);
  93. if (!strcmp(driver, "cpas")) {
  94. rc = cam_debug_parse_cpas_settings(setting, value);
  95. if (rc)
  96. goto error;
  97. } else {
  98. CAM_ERR(CAM_UTIL, "Unsupported driver in camera debug node");
  99. goto error;
  100. }
  101. kfree(local_buf_temp);
  102. return count;
  103. error:
  104. kfree(local_buf_temp);
  105. return -EPERM;
  106. }
  107. static inline void __cam_print_to_buffer(char *buf, const size_t buf_size, size_t *len,
  108. unsigned int tag, enum cam_debug_module_id module_id, const char *fmt, va_list args)
  109. {
  110. size_t buf_len = *len;
  111. buf_len += scnprintf(buf + buf_len, (buf_size - buf_len), "\n%-8s: %s:\t",
  112. CAM_LOG_TAG_NAME(tag), CAM_DBG_MOD_NAME(module_id));
  113. buf_len += vscnprintf(buf + buf_len, (buf_size - buf_len), fmt, args);
  114. *len = buf_len;
  115. }
  116. void cam_print_to_buffer(char *buf, const size_t buf_size, size_t *len, unsigned int tag,
  117. unsigned long long module_id, const char *fmt, ...)
  118. {
  119. va_list args;
  120. va_start(args, fmt);
  121. __cam_print_to_buffer(buf, buf_size, len, tag, module_id, fmt, args);
  122. va_end(args);
  123. }
  124. static void __cam_print_log(int type, const char *fmt, va_list args)
  125. {
  126. va_list args1, args2;
  127. va_copy(args1, args);
  128. va_copy(args2, args1);
  129. if ((type & CAM_PRINT_LOG) && (debug_type != 1))
  130. vprintk(fmt, args1);
  131. if ((type & CAM_PRINT_TRACE) && (debug_type != 0)) {
  132. /* skip the first character which is used by printk to identify the log level */
  133. trace_cam_log_debug(fmt + sizeof(KERN_INFO) - 1, &args2);
  134. }
  135. va_end(args2);
  136. va_end(args1);
  137. }
  138. void cam_print_log(int type, const char *fmt, ...)
  139. {
  140. va_list args;
  141. if (!type)
  142. return;
  143. va_start(args, fmt);
  144. __cam_print_log(type, fmt, args);
  145. va_end(args);
  146. }