/* * Copyright (c) 2019 Intel corporation * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include #include extern struct mipi_syst_handle log_syst_handle; extern void update_systh_platform_data( struct mipi_syst_handle *handle, const struct log_output *log_output, u32_t flag); /* * 0 MIPI_SYST_SEVERITY_MAX no assigned severity * 1 MIPI_SYST_SEVERITY_FATAL critical error level * 2 MIPI_SYST_SEVERITY_ERROR error message level * 3 MIPI_SYST_SEVERITY_WARNING warning message level * 4 MIPI_SYST_SEVERITY_INFO information message level * 5 MIPI_SYST_SEVERITY_USER1 user defined level 5 * 6 MIPI_SYST_SEVERITY_USER2 user defined level 6 * 7 MIPI_SYST_SEVERITY_DEBUG debug information level */ static u32_t level_to_syst_severity(u32_t level) { u32_t ret; switch (level) { case LOG_LEVEL_NONE: ret = 0U; break; case LOG_LEVEL_ERR: ret = 2U; break; case LOG_LEVEL_WRN: ret = 3U; break; case LOG_LEVEL_INF: ret = 4U; break; case LOG_LEVEL_DBG: ret = 7U; break; default: ret = 7U; break; } return ret; } static void std_print(struct log_msg *msg, const struct log_output *log_output) { const char *str = log_msg_str_get(msg); u32_t nargs = log_msg_nargs_get(msg); u32_t *args = alloca(sizeof(u32_t)*nargs); u32_t severity = level_to_syst_severity(log_msg_level_get(msg)); for (int i = 0; i < nargs; i++) { args[i] = log_msg_arg_get(msg, i); } switch (log_msg_nargs_get(msg)) { case 0: MIPI_SYST_PRINTF(&log_syst_handle, severity, str); break; case 1: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0]); break; case 2: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1]); break; case 3: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2]); break; case 4: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3]); break; case 5: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4]); break; case 6: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5]); break; case 7: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6]); break; case 8: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); break; case 9: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]); break; case 10: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]); break; case 11: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10]); break; case 12: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11]); break; case 13: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12]); break; case 14: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13]); break; case 15: MIPI_SYST_PRINTF(&log_syst_handle, severity, str, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14]); break; default: /* Unsupported number of arguments. */ __ASSERT_NO_MSG(true); break; } } static void raw_string_print(struct log_msg *msg, const struct log_output *log_output) { char buf[CONFIG_LOG_STRDUP_MAX_STRING + 1]; size_t length = CONFIG_LOG_STRDUP_MAX_STRING; u32_t severity = level_to_syst_severity(log_msg_level_get(msg)); log_msg_hexdump_data_get(msg, buf, &length, 0); buf[length] = '\0'; MIPI_SYST_PRINTF(&log_syst_handle, severity, buf); } static void hexdump_print(struct log_msg *msg, const struct log_output *log_output) { char buf[CONFIG_LOG_STRDUP_MAX_STRING + 1]; size_t length = CONFIG_LOG_STRDUP_MAX_STRING; u32_t severity = level_to_syst_severity(log_msg_level_get(msg)); log_msg_hexdump_data_get(msg, buf, &length, 0); MIPI_SYST_WRITE(&log_syst_handle, severity, 0x1A, buf, length); } void log_output_msg_syst_process(const struct log_output *log_output, struct log_msg *msg, u32_t flag) { u8_t level = (u8_t)log_msg_level_get(msg); bool raw_string = (level == LOG_LEVEL_INTERNAL_RAW_STRING); update_systh_platform_data(&log_syst_handle, log_output, flag); if (log_msg_is_std(msg)) { std_print(msg, log_output); } else if (raw_string) { raw_string_print(msg, log_output); } else { hexdump_print(msg, log_output); } } void log_output_string_syst_process(const struct log_output *log_output, struct log_msg_ids src_level, const char *fmt, va_list ap, u32_t flag) { u8_t str[CONFIG_LOG_STRDUP_MAX_STRING]; size_t length = CONFIG_LOG_STRDUP_MAX_STRING; u32_t severity = level_to_syst_severity((u32_t)src_level.level); length = vsnprintk(str, length, fmt, ap); str[length] = '\0'; update_systh_platform_data(&log_syst_handle, log_output, flag); MIPI_SYST_PRINTF(&log_syst_handle, severity, str); } void log_output_hexdump_syst_process(const struct log_output *log_output, struct log_msg_ids src_level, const u8_t *data, u32_t length, u32_t flag) { u32_t severity = level_to_syst_severity((u32_t)src_level.level); update_systh_platform_data(&log_syst_handle, log_output, flag); MIPI_SYST_WRITE(&log_syst_handle, severity, 0x1A, data, length); }