123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- // SPDX-License-Identifier: GPL-2.0-only
- /*
- * Copyright (c) 2017-2020, The Linux Foundataion. All rights reserved.
- */
- #include <linux/io.h>
- #include <linux/slab.h>
- #include <linux/module.h>
- #include "cam_debug_util.h"
- static uint debug_mdl;
- module_param(debug_mdl, uint, 0644);
- struct camera_debug_settings cam_debug;
- const struct camera_debug_settings *cam_debug_get_settings()
- {
- return &cam_debug;
- }
- static int cam_debug_parse_cpas_settings(const char *setting, u64 value)
- {
- if (!strcmp(setting, "camnoc_bw")) {
- cam_debug.cpas_settings.camnoc_bw = value;
- } else if (!strcmp(setting, "mnoc_hf_0_ab_bw")) {
- cam_debug.cpas_settings.mnoc_hf_0_ab_bw = value;
- } else if (!strcmp(setting, "mnoc_hf_0_ib_bw")) {
- cam_debug.cpas_settings.mnoc_hf_0_ib_bw = value;
- } else if (!strcmp(setting, "mnoc_hf_1_ab_bw")) {
- cam_debug.cpas_settings.mnoc_hf_1_ab_bw = value;
- } else if (!strcmp(setting, "mnoc_hf_1_ib_bw")) {
- cam_debug.cpas_settings.mnoc_hf_1_ib_bw = value;
- } else if (!strcmp(setting, "mnoc_sf_0_ab_bw")) {
- cam_debug.cpas_settings.mnoc_sf_0_ab_bw = value;
- } else if (!strcmp(setting, "mnoc_sf_0_ib_bw")) {
- cam_debug.cpas_settings.mnoc_sf_0_ib_bw = value;
- } else if (!strcmp(setting, "mnoc_sf_1_ab_bw")) {
- cam_debug.cpas_settings.mnoc_sf_1_ab_bw = value;
- } else if (!strcmp(setting, "mnoc_sf_1_ib_bw")) {
- cam_debug.cpas_settings.mnoc_sf_1_ib_bw = value;
- } else if (!strcmp(setting, "mnoc_sf_icp_ab_bw")) {
- cam_debug.cpas_settings.mnoc_sf_icp_ab_bw = value;
- } else if (!strcmp(setting, "mnoc_sf_icp_ib_bw")) {
- cam_debug.cpas_settings.mnoc_sf_icp_ib_bw = value;
- } else {
- CAM_ERR(CAM_UTIL, "Unsupported cpas sysfs entry");
- return -EINVAL;
- }
- return 0;
- }
- ssize_t cam_debug_sysfs_node_store(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t count)
- {
- int rc = 0;
- char *local_buf = NULL, *local_buf_temp = NULL;
- char *driver;
- char *setting = NULL;
- char *value_str = NULL;
- u64 value;
- CAM_INFO(CAM_UTIL, "Sysfs debug attr name:[%s] buf:[%s] bytes:[%d]",
- attr->attr.name, buf, count);
- local_buf = kmemdup(buf, (count + sizeof(char)), GFP_KERNEL);
- local_buf_temp = local_buf;
- driver = strsep(&local_buf, "#");
- if (!driver) {
- CAM_ERR(CAM_UTIL,
- "Invalid input driver name buf:[%s], count:%d",
- buf, count);
- goto error;
- }
- setting = strsep(&local_buf, "=");
- if (!setting) {
- CAM_ERR(CAM_UTIL, "Invalid input setting buf:[%s], count:%d",
- buf, count);
- goto error;
- }
- value_str = strsep(&local_buf, "=");
- if (!value_str) {
- CAM_ERR(CAM_UTIL, "Invalid input value buf:[%s], count:%d",
- buf, count);
- goto error;
- }
- rc = kstrtou64(value_str, 0, &value);
- if (rc < 0) {
- CAM_ERR(CAM_UTIL, "Error converting value:[%s], buf:[%s]",
- value_str, buf);
- goto error;
- }
- CAM_INFO(CAM_UTIL,
- "Processing sysfs store for driver:[%s], setting:[%s], value:[%llu]",
- driver, setting, value);
- if (!strcmp(driver, "cpas")) {
- rc = cam_debug_parse_cpas_settings(setting, value);
- if (rc)
- goto error;
- } else {
- CAM_ERR(CAM_UTIL, "Unsupported driver in camera debug node");
- goto error;
- }
- kfree(local_buf_temp);
- return count;
- error:
- kfree(local_buf_temp);
- return -EPERM;
- }
- const char *cam_get_module_name(unsigned int module_id)
- {
- const char *name = NULL;
- switch (module_id) {
- case CAM_CDM:
- name = "CAM-CDM";
- break;
- case CAM_CORE:
- name = "CAM-CORE";
- break;
- case CAM_CRM:
- name = "CAM-CRM";
- break;
- case CAM_CPAS:
- name = "CAM-CPAS";
- break;
- case CAM_ISP:
- name = "CAM-ISP";
- break;
- case CAM_SENSOR:
- name = "CAM-SENSOR";
- break;
- case CAM_SMMU:
- name = "CAM-SMMU";
- break;
- case CAM_SYNC:
- name = "CAM-SYNC";
- break;
- case CAM_ICP:
- name = "CAM-ICP";
- break;
- case CAM_JPEG:
- name = "CAM-JPEG";
- break;
- case CAM_FD:
- name = "CAM-FD";
- break;
- case CAM_LRME:
- name = "CAM-LRME";
- break;
- case CAM_FLASH:
- name = "CAM-FLASH";
- break;
- case CAM_ACTUATOR:
- name = "CAM-ACTUATOR";
- break;
- case CAM_CCI:
- name = "CAM-CCI";
- break;
- case CAM_CSIPHY:
- name = "CAM-CSIPHY";
- break;
- case CAM_EEPROM:
- name = "CAM-EEPROM";
- break;
- case CAM_UTIL:
- name = "CAM-UTIL";
- break;
- case CAM_CTXT:
- name = "CAM-CTXT";
- break;
- case CAM_HFI:
- name = "CAM-HFI";
- break;
- case CAM_OIS:
- name = "CAM-OIS";
- break;
- case CAM_IRQ_CTRL:
- name = "CAM-IRQ-CTRL";
- break;
- case CAM_MEM:
- name = "CAM-MEM";
- break;
- case CAM_PERF:
- name = "CAM-PERF";
- break;
- case CAM_REQ:
- name = "CAM-REQ";
- break;
- case CAM_CUSTOM:
- name = "CAM-CUSTOM";
- case CAM_OPE:
- name = "CAM-OPE";
- break;
- case CAM_PRESIL:
- name = "CAM-PRESIL";
- break;
- default:
- name = "CAM";
- break;
- }
- return name;
- }
- void cam_debug_log(unsigned int module_id, const char *func, const int line,
- const char *fmt, ...)
- {
- char str_buffer[STR_BUFFER_MAX_LENGTH];
- va_list args;
- va_start(args, fmt);
- if (debug_mdl & module_id) {
- vsnprintf(str_buffer, STR_BUFFER_MAX_LENGTH, fmt, args);
- pr_info("CAM_DBG: %s: %s: %d: %s\n",
- cam_get_module_name(module_id),
- func, line, str_buffer);
- }
- va_end(args);
- }
|