#
# Copyright (c) 2016 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

menuconfig LOG
	bool "Logging"
	select PRINTK if USERSPACE
	help
	  Global switch for the logger, when turned off log calls will not be
	  compiled in.

if LOG

config LOG_RUNTIME_FILTERING
	bool "Enable runtime reconfiguration of the logger"
	depends on !LOG_FRONTEND
	help
	  Allow runtime configuration of maximal, independent severity
	  level for instance.

config LOG_DEFAULT_LEVEL
	int "Default log level"
	default 3
	range 0 4
	help
	  Sets log level for modules which don't specify it explicitly. When
	  set to 0 it means log will not be activated for those modules.
	  Levels are:

	  - 0 OFF, do not write by default
	  - 1 ERROR, default to only write LOG_LEVEL_ERR
	  - 2 WARNING, default to write LOG_LEVEL_WRN
	  - 3 INFO, default to write LOG_LEVEL_INFO
	  - 4 DEBUG, default to write LOG_LEVEL_DBG

config LOG_OVERRIDE_LEVEL
	int "Override lowest log level"
	default 0
	range 0 4
	help
	  Forces a minimum log level for all modules. Modules use their
	  specified level if it is greater than this option, otherwise they use
	  the level specified by this option instead of their default or
	  whatever was manually set.
	  Levels are:

	  - 0 OFF, do not override
	  - 1 ERROR, override to write LOG_LEVEL_ERR
	  - 2 WARNING, override to write LOG_LEVEL_WRN
	  - 3 INFO, override to write LOG_LEVEL_INFO
	  - 4 DEBUG, override to write LOG_LEVEL_DBG

config LOG_MAX_LEVEL
	int "Maximal log level compiled in the system"
	default 4
	range 0 4
	help
	  Forces a maximal log level for all modules. Modules saturates their
	  specified level if it is greater than this option, otherwise they use
	  the level specified by this option instead of their default or
	  whatever was manually set.
	  Levels are:

	  - 0 OFF, logging is turned off
	  - 1 ERROR, maximal level set to LOG_LEVEL_ERR
	  - 2 WARNING, maximal level set to LOG_LEVEL_WRN
	  - 3 INFO, maximal level set to LOG_LEVEL_INFO
	  - 4 DEBUG, maximal level set to LOG_LEVEL_DBG

menu "Prepend log message with function name"
	depends on !LOG_FRONTEND

config LOG_FUNC_NAME_PREFIX_ERR
	bool "Error messages prepended"

config LOG_FUNC_NAME_PREFIX_WRN
	bool "Warning messages prepended"

config LOG_FUNC_NAME_PREFIX_INF
	bool "Info messages prepended"

config LOG_FUNC_NAME_PREFIX_DBG
	bool "Debug messages prepended"
	default y

endmenu

config LOG_PRINTK
	bool "Enable processing of printk messages."
	help
	  LOG_PRINTK messages are formatted in place and logged unconditionally.

config LOG_PRINTK_MAX_STRING_LENGTH
	int "Maximum string length supported by LOG_PRINTK"
	depends on LOG_PRINTK
	depends on (!LOG_IMMEDIATE || USERSPACE)
	default 128
	help
	  Array is allocated on the stack.

config LOG_IMMEDIATE
	bool "Enable synchronous processing"
	help
	  When enabled log is processed in the context of the call. It impacts
	  performance of the system since time consuming operations are
	  performed in the context of the log entry (e.g. high priority
	  interrupt).Logger backends must support exclusive access to work
	  flawlessly in that mode because one log operation can be interrupted
	  by another one in the higher priority context.

config LOG_ENABLE_FANCY_OUTPUT_FORMATTING
	depends on !NEWLIB_LIBC && !ARCH_POSIX
	bool "Format strings with minimal libc _prf() instead of _vprintk()"
	help
	  Selecting this option will choose more robust _prf() function from
	  minimal libc for handling format strings instead of the _vprintk()
	  function. Choosing this option adds around ~3K flash and ~250 bytes on
	  stack.

if !LOG_IMMEDIATE

choice
	prompt "Log full strategy"

config LOG_MODE_OVERFLOW
	bool "Oldest logs are discarded"

config LOG_MODE_NO_OVERFLOW
	bool "New logs are dropped"

endchoice

config LOG_PROCESS_TRIGGER_THRESHOLD
	int "Amount of buffered logs which triggers processing thread."
	default 10
	help
	  When number of buffered messages reaches the threshold thread is waken
	  up. Log processing thread ID is provided during log initialization.
	  Set 0 to disable the feature. If LOG_PROCESS_THREAD is enabled then
	  this threshold is used by the internal thread.

config LOG_PROCESS_THREAD
	bool "Enable internal thread for log processing"
	depends on MULTITHREADING
	default y
	help
	  When enabled thread is created by the logger subsystem. Thread is
	  waken up periodically (see LOG_PROCESS_THREAD_SLEEP_MS) and whenever
	  number of buffered messages exceeds the threshold (see
	  LOG_PROCESS_TRIGGER_THR).

if LOG_PROCESS_THREAD

config LOG_PROCESS_THREAD_SLEEP_MS
	int "Set internal log processing thread sleep period"
	default 1000
	help
	  Log processing thread sleeps for requested period given in
	  milliseconds. When waken up, thread process any buffered messages.

config LOG_PROCESS_THREAD_STACK_SIZE
	int "Stack size for the internal log processing thread"
	default 2048 if COVERAGE_GCOV
	default 1024 if NO_OPTIMIZATIONS
	default 1024 if XTENSA
	default 768
	help
	  Set the internal stack size for log processing thread.

endif # LOG_PROCESS_THREAD

config LOG_BUFFER_SIZE
	int "Number of bytes dedicated for the logger internal buffer."
	default 1024
	range 128 65536
	help
	  Number of bytes dedicated for the logger internal buffer.

config LOG_DETECT_MISSED_STRDUP
	bool "Detect missed handling of transient strings"
	default y if !LOG_IMMEDIATE
	help
	  If enabled, logger will assert and log error message is it detects
	  that string format specifier (%s) and string address which is not from
	  read only memory section and not from pool used for string duplicates.
	  String argument must be duplicated in that case using log_strdup().
	  Detection is performed during log processing thus it does not impact
	  logging timing.

config LOG_STRDUP_MAX_STRING
	int "Longest string that can be duplicated using log_strdup()"
	default 46 if NETWORKING
	default 32
	help
	  Longer strings are truncated.

config LOG_STRDUP_BUF_COUNT
	int "Number of buffers in the pool used by log_strdup()"
	default 4
	help
	  Number of calls to log_strdup() which can be pending before flushed
	  to output. If "<log_strdup alloc failed>" message is seen in the log
	  output, it means this value is too small and should be increased.
	  Each entry takes CONFIG_LOG_STRDUP_MAX_STRING bytes of memory plus
	  some additional fixed overhead.

config LOG_STRDUP_POOL_PROFILING
	bool "Enable profiling of pool used for log_strdup()"
	help
	  When enabled, maximal utilization of the pool is tracked. It can
	  be read out using shell command.

endif # !LOG_IMMEDIATE

config LOG_DOMAIN_ID
	int "Domain ID"
	default 0
	range 0 7
	help
	  In multicore system each application/core must have unique domain ID.

config LOG_CMDS
	bool "Enable shell commands"
	depends on SHELL
	default y if SHELL

config LOG_FRONTEND
	bool "Enable frontend"
	default n
	select LOG_IMMEDIATE
	help
	  When enabled, logs are redirected to a custom frontend instead
	  of being processed by the logger.

config LOG_BACKEND_UART
	bool "Enable UART backend"
	depends on UART_CONSOLE
	default y if !SHELL_BACKEND_SERIAL
	help
	  When enabled backend is using UART to output logs.

config LOG_BACKEND_SWO
	bool "Enable Serial Wire Output (SWO) backend"
	depends on HAS_SWO
	help
	  When enabled, backend will use SWO for logging.

if LOG_BACKEND_SWO

config LOG_BACKEND_SWO_FREQ_HZ
	int "Set SWO output frequency"
	default 0
	help
	  Set SWO output frequency. Value 0 will select maximum frequency
	  supported by the given MCU. Not all debug probes support high
	  frequency SWO operation. In this case the frequency has to be set
	  manually.

	  SWO value defined by this option will be configured at boot. Most SWO
	  viewer programs will configure SWO frequency when attached to the
	  debug probe. Such configuration will persist only until the device
	  reset. To ensure flawless operation the frequency configured here and
	  by the SWO viewer program has to match.

endif # LOG_BACKEND_SWO

config LOG_BACKEND_RTT
	bool "Enable Segger J-Link RTT backend"
	depends on USE_SEGGER_RTT
	default y if !SHELL_BACKEND_RTT
	help
	  When enabled, backend will use RTT for logging. This backend works on a per
	  message basis. Only a whole message (terminated with a carriage return: '\r')
	  is transferred to up-buffer at once depending on available space and
	  selected mode.
	  In panic mode backend always blocks and waits until there is space
	  in up-buffer for a message and message is transferred to host.

if LOG_BACKEND_RTT

choice
	prompt "Logger behavior"
	default LOG_BACKEND_RTT_MODE_BLOCK

config LOG_BACKEND_RTT_MODE_DROP
	bool "Drop messages that do not fit in up-buffer."
	help
	  If there is not enough space in up-buffer for a message, drop it.
	  Number of dropped messages will be logged.
	  Increase up-buffer size helps to reduce dropping of messages.

config LOG_BACKEND_RTT_MODE_BLOCK
	bool "Block until message is transferred to host."
	help
	  Waits until there is enough space in the up-buffer for a message.

endchoice

if LOG_BACKEND_RTT_MODE_DROP

config LOG_BACKEND_RTT_MESSAGE_SIZE
	int "Size of internal buffer for storing messages."
	range 32 256
	default 128
	help
	  This option defines maximum message size transferable to up-buffer.

endif # LOG_BACKEND_RTT_MODE_DROP

if LOG_BACKEND_RTT_MODE_BLOCK

config LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE
	int "Size of the output buffer"
	default 16
	help
	  Buffer is used by log_output module for preparing output data (e.g.
	  string formatting).

config LOG_BACKEND_RTT_RETRY_CNT
	int "Number of retries"
	default 4
	help
	  Number of TX retries before dropping the data and assuming that
	  RTT session is inactive.

config LOG_BACKEND_RTT_RETRY_DELAY_MS
	int "Delay between TX retries in milliseconds"
	default 5
	help
	  Sleep period between TX retry attempts. During RTT session, host pulls
	  data periodically. Period starts from 1-2 milliseconds and can be
	  increased if traffic on RTT increases (also from host to device). In
	  case of heavy traffic data can be lost and it may be necessary to
	  increase delay or number of retries.

endif # LOG_BACKEND_RTT_MODE_BLOCK

config LOG_BACKEND_RTT_BUFFER
	int "Buffer number used for logger output."
	range 0 SEGGER_RTT_MAX_NUM_UP_BUFFERS
	default 0
	help
	  Select index of up-buffer used for logger output, by default it uses
	  terminal up-buffer and its settings.

if LOG_BACKEND_RTT_BUFFER > 0

config LOG_BACKEND_RTT_BUFFER_SIZE
	int "Size of reserved up-buffer for logger output."
	default 1024
	help
	  Specify reserved size of up-buffer used for logger output.

endif # LOG_BACKEND_RTT_BUFFER


# Enable processing of printk calls using log if terminal buffer is used.
# Same buffer is used by RTT console. If printk would go through RTT console
# that will lead to corruption of RTT data which is not protected against being
# interrupted by an interrupt.
config LOG_BACKEND_RTT_FORCE_PRINTK
	bool
	default y if LOG_BACKEND_RTT_BUFFER = 0
	select LOG_PRINTK

endif # LOG_BACKEND_RTT

config LOG_BACKEND_NATIVE_POSIX
	bool "Enable native backend"
	depends on ARCH_POSIX
	help
	  Enable backend in native_posix

config LOG_BACKEND_QEMU_X86_64
	bool "Enable QEMU x86_64 backend"
	depends on BOARD_QEMU_X86_64
	help
	  Enable backend for qemu_x86_64 board

config LOG_BACKEND_XTENSA_SIM
	bool "Enable xtensa simulator backend"
	depends on SOC_XTENSA_SAMPLE_CONTROLLER
	help
	  Enable backend in xtensa simulator

config LOG_BACKEND_XTENSA_OUTPUT_BUFFER_SIZE
	int "Size of the output buffer"
	default 16
	depends on LOG_BACKEND_XTENSA_SIM
	help
	  Buffer is used by log_output module for preparing output data (e.g.
	  string formatting).

config LOG_BACKEND_NET
	bool "Enable networking backend"
	depends on NETWORKING
	select NET_CONTEXT_NET_PKT_POOL
	help
	  Send syslog messages to network server.
	  See RFC 5424 (syslog protocol) and RFC 5426 (syslog over UDP)
	  specifications for details.

if LOG_BACKEND_NET

config LOG_BACKEND_NET_SERVER
	string "Syslog server IP address"
	help
	  This can be either IPv4 or IPv6 address.
	  Server listen UDP port number can be configured here too.
	  Following syntax is supported:
	  192.0.2.1:514
	  192.0.2.42
	  [2001:db8::1]:514
	  [2001:db8::2]
	  2001:db::42

config LOG_BACKEND_NET_MAX_BUF
	int "How many network buffers to allocate for sending messages"
	range 3 256
	default 3
	help
	  Each syslog message should fit into a network packet that will be
	  sent to server. This number tells how many syslog messages can be
	  in transit to the server.

config LOG_BACKEND_NET_MAX_BUF_SIZE
	int "Max syslog message size"
	range 64 1180
	default 1180 if NET_IPV6
	default 480 if NET_IPV4
	default 256
	help
	  As each syslog message needs to fit to UDP packet, set this value
	  so that messages are not truncated.
	  The RFC 5426 recommends that for IPv4 the size is 480 octets and for
	  IPv6 the size is 1180 octets. As each buffer will use RAM, the value
	  should be selected so that typical messages will fit the buffer.

endif # LOG_BACKEND_NET

config LOG_BACKEND_SHOW_COLOR
	bool "Enable colors in the backend"
	depends on LOG_BACKEND_UART || LOG_BACKEND_NATIVE_POSIX || LOG_BACKEND_RTT \
	           || LOG_BACKEND_SWO || LOG_BACKEND_XTENSA_SIM
	default y
	help
	  When enabled selected backend prints errors in red and warning in yellow.

config LOG_BACKEND_FORMAT_TIMESTAMP
	bool "Enable timestamp formatting in the backend"
	depends on LOG_BACKEND_UART || LOG_BACKEND_NATIVE_POSIX || LOG_BACKEND_RTT \
	           || LOG_BACKEND_SWO || LOG_BACKEND_XTENSA_SIM
	default y
	help
	  When enabled timestamp is formatted to hh:mm:ss:ms,us.

endif # LOG
