xref: /openbmc/u-boot/cmd/log.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2d5f61f27SSimon Glass /*
3d5f61f27SSimon Glass  * Copyright (c) 2017 Google, Inc
4d5f61f27SSimon Glass  * Written by Simon Glass <sjg@chromium.org>
5d5f61f27SSimon Glass  */
6d5f61f27SSimon Glass 
7d5f61f27SSimon Glass #include <common.h>
8d5f61f27SSimon Glass #include <command.h>
9d5f61f27SSimon Glass #include <dm.h>
10d5f61f27SSimon Glass #include <log.h>
11d5f61f27SSimon Glass 
12ad0e5039SSimon Glass static char log_fmt_chars[LOGF_COUNT] = "clFLfm";
13ad0e5039SSimon Glass 
do_log_level(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])14d5f61f27SSimon Glass static int do_log_level(cmd_tbl_t *cmdtp, int flag, int argc,
15d5f61f27SSimon Glass 			char * const argv[])
16d5f61f27SSimon Glass {
17d5f61f27SSimon Glass 	if (argc > 1)
18d5f61f27SSimon Glass 		gd->default_log_level = simple_strtol(argv[1], NULL, 10);
19d5f61f27SSimon Glass 	else
20d5f61f27SSimon Glass 		printf("Default log level: %d\n", gd->default_log_level);
21d5f61f27SSimon Glass 
22d5f61f27SSimon Glass 	return 0;
23d5f61f27SSimon Glass }
24d5f61f27SSimon Glass 
do_log_format(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])25ad0e5039SSimon Glass static int do_log_format(cmd_tbl_t *cmdtp, int flag, int argc,
26ad0e5039SSimon Glass 			 char * const argv[])
27ad0e5039SSimon Glass {
28ad0e5039SSimon Glass 	int i;
29ad0e5039SSimon Glass 
30ad0e5039SSimon Glass 	if (argc > 1) {
31ad0e5039SSimon Glass 		const char *str = argv[1];
32ad0e5039SSimon Glass 
33ad0e5039SSimon Glass 		if (!strcmp(str, "default")) {
34ad0e5039SSimon Glass 			gd->log_fmt = LOGF_DEFAULT;
35ad0e5039SSimon Glass 		} else if (!strcmp(str, "all")) {
36ad0e5039SSimon Glass 			gd->log_fmt = LOGF_ALL;
37ad0e5039SSimon Glass 		} else {
38ad0e5039SSimon Glass 			gd->log_fmt = 0;
39ad0e5039SSimon Glass 			for (; *str; str++) {
40ad0e5039SSimon Glass 				char *ptr = strchr(log_fmt_chars, *str);
41ad0e5039SSimon Glass 
42ad0e5039SSimon Glass 				if (!ptr) {
43ad0e5039SSimon Glass 					printf("Invalid log char '%c'\n", *str);
44ad0e5039SSimon Glass 					return CMD_RET_FAILURE;
45ad0e5039SSimon Glass 				}
46ad0e5039SSimon Glass 				gd->log_fmt |= 1 << (ptr - log_fmt_chars);
47ad0e5039SSimon Glass 			}
48ad0e5039SSimon Glass 		}
49ad0e5039SSimon Glass 	} else {
50ad0e5039SSimon Glass 		printf("Log format: ");
51ad0e5039SSimon Glass 		for (i = 0; i < LOGF_COUNT; i++) {
52ad0e5039SSimon Glass 			if (gd->log_fmt & (1 << i))
53ad0e5039SSimon Glass 				printf("%c", log_fmt_chars[i]);
54ad0e5039SSimon Glass 		}
55ad0e5039SSimon Glass 		printf("\n");
56ad0e5039SSimon Glass 	}
57ad0e5039SSimon Glass 
58ad0e5039SSimon Glass 	return 0;
59ad0e5039SSimon Glass }
60ad0e5039SSimon Glass 
do_log_rec(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])613fd24fa9SSimon Glass static int do_log_rec(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
623fd24fa9SSimon Glass {
633fd24fa9SSimon Glass 	enum log_category_t cat;
643fd24fa9SSimon Glass 	enum log_level_t level;
653fd24fa9SSimon Glass 	const char *file;
663fd24fa9SSimon Glass 	uint line;
673fd24fa9SSimon Glass 	const char *func;
683fd24fa9SSimon Glass 	const char *msg;
693fd24fa9SSimon Glass 	char *end;
703fd24fa9SSimon Glass 
713fd24fa9SSimon Glass 	if (argc < 7)
723fd24fa9SSimon Glass 		return CMD_RET_USAGE;
733fd24fa9SSimon Glass 	cat = log_get_cat_by_name(argv[1]);
743fd24fa9SSimon Glass 	level = simple_strtoul(argv[2], &end, 10);
753fd24fa9SSimon Glass 	if (end == argv[2]) {
763fd24fa9SSimon Glass 		level = log_get_level_by_name(argv[2]);
773fd24fa9SSimon Glass 
783fd24fa9SSimon Glass 		if (level == LOGL_NONE) {
793fd24fa9SSimon Glass 			printf("Invalid log level '%s'\n", argv[2]);
803fd24fa9SSimon Glass 			return CMD_RET_USAGE;
813fd24fa9SSimon Glass 		}
823fd24fa9SSimon Glass 	}
833fd24fa9SSimon Glass 	if (level >= LOGL_MAX) {
843fd24fa9SSimon Glass 		printf("Invalid log level %u\n", level);
853fd24fa9SSimon Glass 		return CMD_RET_USAGE;
863fd24fa9SSimon Glass 	}
873fd24fa9SSimon Glass 	file = argv[3];
883fd24fa9SSimon Glass 	line = simple_strtoul(argv[4], NULL, 10);
893fd24fa9SSimon Glass 	func = argv[5];
903fd24fa9SSimon Glass 	msg = argv[6];
913fd24fa9SSimon Glass 	if (_log(cat, level, file, line, func, "%s\n", msg))
923fd24fa9SSimon Glass 		return CMD_RET_FAILURE;
933fd24fa9SSimon Glass 
943fd24fa9SSimon Glass 	return 0;
953fd24fa9SSimon Glass }
963fd24fa9SSimon Glass 
97d5f61f27SSimon Glass static cmd_tbl_t log_sub[] = {
98d5f61f27SSimon Glass 	U_BOOT_CMD_MKENT(level, CONFIG_SYS_MAXARGS, 1, do_log_level, "", ""),
99ef11ed82SSimon Glass #ifdef CONFIG_LOG_TEST
100ef11ed82SSimon Glass 	U_BOOT_CMD_MKENT(test, 2, 1, do_log_test, "", ""),
101ef11ed82SSimon Glass #endif
102ad0e5039SSimon Glass 	U_BOOT_CMD_MKENT(format, CONFIG_SYS_MAXARGS, 1, do_log_format, "", ""),
1033fd24fa9SSimon Glass 	U_BOOT_CMD_MKENT(rec, CONFIG_SYS_MAXARGS, 1, do_log_rec, "", ""),
104d5f61f27SSimon Glass };
105d5f61f27SSimon Glass 
do_log(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])106d5f61f27SSimon Glass static int do_log(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
107d5f61f27SSimon Glass {
108d5f61f27SSimon Glass 	cmd_tbl_t *cp;
109d5f61f27SSimon Glass 
110d5f61f27SSimon Glass 	if (argc < 2)
111d5f61f27SSimon Glass 		return CMD_RET_USAGE;
112d5f61f27SSimon Glass 
113d5f61f27SSimon Glass 	/* drop initial "log" arg */
114d5f61f27SSimon Glass 	argc--;
115d5f61f27SSimon Glass 	argv++;
116d5f61f27SSimon Glass 
117d5f61f27SSimon Glass 	cp = find_cmd_tbl(argv[0], log_sub, ARRAY_SIZE(log_sub));
118d5f61f27SSimon Glass 	if (cp)
119d5f61f27SSimon Glass 		return cp->cmd(cmdtp, flag, argc, argv);
120d5f61f27SSimon Glass 
121d5f61f27SSimon Glass 	return CMD_RET_USAGE;
122d5f61f27SSimon Glass }
123d5f61f27SSimon Glass 
124d5f61f27SSimon Glass #ifdef CONFIG_SYS_LONGHELP
125d5f61f27SSimon Glass static char log_help_text[] =
126d5f61f27SSimon Glass 	"level - get/set log level\n"
127ef11ed82SSimon Glass #ifdef CONFIG_LOG_TEST
128ef11ed82SSimon Glass 	"log test - run log tests\n"
129ef11ed82SSimon Glass #endif
130ad0e5039SSimon Glass 	"log format <fmt> - set log output format. <fmt> is a string where\n"
131ad0e5039SSimon Glass 	"\teach letter indicates something that should be displayed:\n"
132ad0e5039SSimon Glass 	"\tc=category, l=level, F=file, L=line number, f=function, m=msg\n"
1333fd24fa9SSimon Glass 	"\tor 'default', equivalent to 'fm', or 'all' for all\n"
1343fd24fa9SSimon Glass 	"log rec <category> <level> <file> <line> <func> <message> - "
1353fd24fa9SSimon Glass 		"output a log record"
136d5f61f27SSimon Glass 	;
137d5f61f27SSimon Glass #endif
138d5f61f27SSimon Glass 
139d5f61f27SSimon Glass U_BOOT_CMD(
140d5f61f27SSimon Glass 	log, CONFIG_SYS_MAXARGS, 1, do_log,
141d5f61f27SSimon Glass 	"log system", log_help_text
142d5f61f27SSimon Glass );
143