extern int dbg_snapshot_post_reboot(char *cmd);
extern int dbg_snapshot_set_hardlockup(int);
extern int dbg_snapshot_get_hardlockup(void);
+extern int dbg_snapshot_set_debug_level(const char *);
+extern int dbg_snapshot_get_debug_level(void);
extern unsigned int dbg_snapshot_get_item_size(char *);
extern unsigned int dbg_snapshot_get_item_paddr(char *);
extern unsigned long dbg_snapshot_get_item_vaddr(char *);
#define dbg_snapshot_post_reboot(a) do { } while(0)
#define dbg_snapshot_set_hardlockup(a) do { } while(0)
#define dbg_snapshot_get_hardlockup() do { } while(0)
+#define dbg_snapshot_set_debug_level(a) do { } while(0)
+#define dbg_snapshot_get_debug_level() do { } while(0)
#define dbg_snapshot_check_crash_key(a,b) do { } while(0)
#define dbg_snapshot_dm(a,b,c,d,e) do { } while(0)
#define dbg_snapshot_panic_handler_safe() do { } while(0)
#define dbg_snapshot_hook_hardlockup_exit() do { } while(0)
#define dbg_snapshot_binder(a,b,c) do { } while(0)
-
static inline unsigned int dbg_snapshot_get_item_size(char *name)
{
return 0;
default n
config DEBUG_SNAPSHOT_LINUX_BUILD
- bool
+ bool "May be built in LINUX environment"
depends on DEBUG_SNAPSHOT
default y
+config DEBUG_SNAPSHOT_USER_MODE
+ bool "Enable User Mode, Most of debug feature are disabled"
+ depends on DEBUG_SNAPSHOT
+ default n
+
config DEBUG_SNAPSHOT_CALLSTACK
int "shown callstack level"
depends on DEBUG_SNAPSHOT
config DEBUG_SNAPSHOT_MINIMIZED_MODE
bool "Support minimized feature configuration"
- depends on DEBUG_SNAPSHOT
+ depends on DEBUG_SNAPSHOT_USER_MODE
default n
extern struct dbg_snapshot_helper_ops *dss_soc_ops;
-
/* SoC Specific define, This will be removed */
#define DSS_REG_MCT_ADDR (0)
#define DSS_REG_MCT_SIZE (0)
#define DSS_REG_UART_ADDR (0)
#define DSS_REG_UART_SIZE (0)
+#define DSS_DEBUG_LEVEL_NONE (-1)
+#define DSS_DEBUG_LEVEL_LOW (0)
+#define DSS_DEBUG_LEVEL_MID (1)
+
typedef int (*dss_initcall_t)(const struct device_node *);
struct dbg_snapshot_base {
int hardlockup_detected;
int allcorelockup_detected;
int no_wdt_dev;
+ int debug_level;
};
};
#endif
+const char *debug_level_val[] = {
+ "low",
+ "mid",
+};
+
struct dbg_snapshot_item dss_items[] = {
{"header", {0, 0, 0, false, false}, NULL ,NULL, 0, },
{"log_kernel", {0, 0, 0, false, false}, NULL ,NULL, 0, },
/* Variable for assigning virtual address base */
static size_t g_dbg_snapshot_vaddr_base = DSS_FIXED_VIRT_BASE;
+int dbg_snapshot_set_debug_level(const char *level)
+{
+ int i;
+
+ if (!level)
+ goto out;
+
+ for (i = 0; i < ARRAY_SIZE(debug_level_val); i++) {
+ if (!strncmp(level, debug_level_val[i],
+ strlen(debug_level_val[i]))) {
+ dss_desc.debug_level = i;
+ goto out;
+ }
+ }
+#if !IS_ENABLED(CONFIG_DEBUG_SNAPSHOT_USER_MODE)
+ dss_desc.debug_level = DSS_DEBUG_LEVEL_MID;
+#else
+ dss_desc.debug_level = DSS_DEBUG_LEVEL_LOW;
+#endif
+
+out:
+ return 0;
+}
+
+int dbg_snapshot_get_debug_level(void)
+{
+ return dss_desc.debug_level;
+}
+
int dbg_snapshot_set_enable(const char *name, int en)
{
struct dbg_snapshot_item *item = NULL;
static int dbg_snapshot_init_dt_parse(struct device_node *np)
{
int ret = 0;
- struct device_node *sfr_dump_np = of_get_child_by_name(np, "dump-info");
+ struct device_node *sfr_dump_np;
+ const char *debug_level;
+ if (of_property_read_u32(np, "use_multistage_wdt_irq",
+ &dss_desc.multistage_wdt_irq)) {
+ dss_desc.multistage_wdt_irq = 0;
+ pr_err("debug-snapshot: no support multistage_wdt\n");
+ }
+
+ if (of_property_read_string(np, "debug_level", &debug_level)) {
+ /*
+ * if failed to get debug_level in device tree
+ * debug_level should be followed kernel configuration policy
+ */
+#if !IS_ENABLED(CONFIG_DEBUG_SNAPSHOT_USER_MODE)
+ dss_desc.debug_level = DSS_DEBUG_LEVEL_MID;
+#else
+ dss_desc.debug_level = DSS_DEBUG_LEVEL_LOW;
+#endif
+ } else {
+ dbg_snapshot_set_debug_level(debug_level);
+ }
+ pr_info("debug-snapshot: debug_level [%s]\n",
+ debug_level_val[dss_desc.debug_level]);
+
+ sfr_dump_np = of_get_child_by_name(np, "dump-info");
if (!sfr_dump_np) {
pr_err("debug-snapshot: failed to get dump-info node\n");
ret = -ENODEV;
if (ret < 0)
dbg_snapshot_set_enable("log_sfr", false);
- if (of_property_read_u32(np, "use_multistage_wdt_irq",
- &dss_desc.multistage_wdt_irq)) {
- dss_desc.multistage_wdt_irq = 0;
- pr_err("debug-snapshot: no support multistage_wdt\n");
- ret = -EINVAL;
- }
-
of_node_put(np);
return ret;
}