# Copyright (c) 2021 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

menu "Backends"

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

if LOG_BACKEND_UART

config LOG_BACKEND_UART_ASYNC
	bool "Use UART Asynchronous API"
	depends on UART_ASYNC_API
	depends on !LOG_BACKEND_UART_OUTPUT_DICTIONARY_HEX

config LOG_BACKEND_UART_BUFFER_SIZE
	int "Number of bytes to buffer in RAM before flushing"
	default 32 if LOG_BACKEND_UART_ASYNC
	default 1
	help
	  Sets the number of bytes which can be buffered in RAM before log_output_flush
	  is automatically called on the backend.

backend = UART
backend-str = uart
source "subsys/logging/Kconfig.template.log_format_config"

if LOG_BACKEND_UART_OUTPUT_DICTIONARY

choice
	prompt "Dictionary mode output format"
	default LOG_BACKEND_UART_OUTPUT_DICTIONARY_BIN

config LOG_BACKEND_UART_OUTPUT_DICTIONARY_BIN
	bool "Dictionary (binary)"
	help
	  Dictionary-based logging output in binary.

config LOG_BACKEND_UART_OUTPUT_DICTIONARY_HEX
	bool "Dictionary (hexadecimal)"
	help
	  Dictionary-based logging output in hexadecimal. Supported only for UART backend.

endchoice

endif # LOG_BACKEND_UART_OUTPUT_DICTIONARY

endif # LOG_BACKEND_UART

config LOG_BACKEND_SWO
	bool "Serial Wire Output (SWO) backend"
	depends on HAS_SWO
	select LOG_OUTPUT
	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.

backend = SWO
backend-str = swo
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_SWO

config LOG_BACKEND_RTT
	bool "Segger J-Link RTT backend"
	depends on USE_SEGGER_RTT
	default y if !SHELL_BACKEND_RTT
	select SEGGER_RTT_CUSTOM_LOCKING
	select LOG_OUTPUT
	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 LOG_BACKEND_RTT_MODE
	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.

config LOG_BACKEND_RTT_MODE_OVERWRITE
	bool "Overwrite messages if up-buffer full"
	help
	  If there is not enough space in up-buffer for a message overwrite
	  oldest one.

endchoice

backend = RTT
backend-str = rtt
source "subsys/logging/Kconfig.template.log_format_config"

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

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.

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

# 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 && RTT_CONSOLE
	select LOG_PRINTK

endif # LOG_BACKEND_RTT

config LOG_BACKEND_SPINEL
	bool "OpenThread dedicated Spinel protocol backend"
	depends on !LOG_BACKEND_UART
	depends on NET_L2_OPENTHREAD
	select LOG_OUTPUT
	help
	  When enabled, backend will use OpenThread dedicated SPINEL protocol for logging.
	  This protocol is byte oriented and wraps given messages into serial frames.
	  Backend should be enabled only to OpenThread purposes and when UART backend is disabled
	  or works on another UART device to avoid interference.

if LOG_BACKEND_SPINEL

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

backend = SPINEL
backend-str = spinel
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_SPINEL

config LOG_BACKEND_NATIVE_POSIX
	bool "Native backend"
	depends on ARCH_POSIX
	default y if !SERIAL
	select LOG_OUTPUT
	help
	  Enable backend in native_posix

if LOG_BACKEND_NATIVE_POSIX

backend = NATIVE_POSIX
backend-str = native_posix
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_NATIVE_POSIX

config LOG_BACKEND_XTENSA_SIM
	bool "Xtensa simulator backend"
	depends on SOC_XTENSA_SAMPLE_CONTROLLER || SOC_FAMILY_INTEL_ADSP
	default y if SOC_XTENSA_SAMPLE_CONTROLLER
	select LOG_OUTPUT
	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).

if LOG_BACKEND_XTENSA_SIM

backend = XTENSA_SIM
backend-str = xtensa_sim
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_XTENSA_SIM

# Immediate mode cannot be used with network backend as it would cause the sent
# rsyslog message to be malformed.
config LOG_BACKEND_NET
	bool "Networking backend"
	depends on NETWORKING && NET_UDP && !LOG_MODE_IMMEDIATE
	select NET_CONTEXT_NET_PKT_POOL
	select LOG_OUTPUT
	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.

config LOG_BACKEND_NET_AUTOSTART
	bool "Automatically start networking backend"
	default y if NET_CONFIG_NEED_IPV4 || NET_CONFIG_NEED_IPV6
	help
	  When enabled automatically start the networking backend on
	  application start. If no routes to the logging server are available
	  on application startup, this must be set to n and the backend must be
	  started by the application later on. Otherwise the logging
	  thread might block.

backend = NET
backend-str = net
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_NET

config LOG_BACKEND_ADSP
	bool "Intel ADSP buffer backend"
	depends on SOC_FAMILY_INTEL_ADSP
	select LOG_OUTPUT
	help
	  Enable backend for the host trace protocol of the Intel ADSP
	  family of audio processors

if LOG_BACKEND_ADSP

backend = ADSP
backend-str = adsp
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_ADSP

config LOG_BACKEND_ADSP_HDA
	bool "Intel ADSP HDA backend"
	depends on SOC_FAMILY_INTEL_ADSP && DMA && DMA_INTEL_ADSP_HDA_HOST_OUT
	select LOG_OUTPUT
	help
	  Provide a logging backend which writes to a buffer and
	  periodically flushes to hardware using ringbuffer like
	  semantics provided by DMA_INTEL_ADSP_HDA.

if LOG_BACKEND_ADSP_HDA

backend = ADSP_HDA
backend-str = adsp_hda
source "subsys/logging/Kconfig.template.log_format_config"

config LOG_BACKEND_ADSP_HDA_SIZE
	int "Size of ring buffer"
	range 128 8192
	default 4096
	help
	  Sets the ring buffer size cAVS HDA uses for logging. Effectively
	  determines how many log messages may be written to in a period of time.
	  The period of time is decided by how often to inform the hardware of
	  writes to the buffer.

config LOG_BACKEND_ADSP_HDA_FLUSH_TIME
	int "Time in milliseconds to periodically flush writes to hardware"
	range 1 10000
	default 500
	help
	    The Intel ADSP HDA backend periodically writes out its buffer contents
	    to hardware by informing the DMA hardware the contents of the ring
	    buffer.

config LOG_BACKEND_ADSP_HDA_CAVSTOOL
	bool "Log backend is to be used with cavstool"
	help
		Use cavstool understood IPC messages to inform setup and logging of
		HDA messages.

config LOG_BACKEND_ADSP_HDA_PADDING
	bool "Log backend should pad the buffer with \0 characters when flushing"
	help
		HDA requires transfers be 128 byte aligned such that a partial message may
		never make it across unless padded with \0 characters to the next 128 byte
		aligned address. This may or may not work depending on the log format
		being used but should certainly work with text based logging.

endif # LOG_BACKEND_ADSP_HDA

config LOG_BACKEND_ADSP_MTRACE
	bool "Intel ADSP mtrace backend"
	depends on SOC_FAMILY_INTEL_ADSP
	select LOG_OUTPUT
	help
	  Provide a logging backend which writes to SRAM window
	  using the SOF Linux driver mtrace buffer layout.

if LOG_BACKEND_ADSP_MTRACE

backend = ADSP_MTRACE
backend-str = adsp_mtrace
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_ADSP_MTRACE

config LOG_BACKEND_FS
	bool "File system backend"
	depends on FILE_SYSTEM
	select LOG_OUTPUT
	help
	  When enabled, backend is using the configured file system to output logs.
	  As the file system must be mounted for the logging to work, it must be
	  either configured for auto-mount or manually mounted by the application.
	  Log messages are discarded as long as the file system is not mounted.

if LOG_BACKEND_FS

backend = FS
backend-str = fs
source "subsys/logging/Kconfig.template.log_format_config"

config LOG_BACKEND_FS_OVERWRITE
	bool "Old log files overwrite"
	default y
	help
	  When enabled backend overwrites oldest log files.
	  In other case, when memory is full, new messages are dropped.

config LOG_BACKEND_FS_FILE_PREFIX
	string "Log file name prefix"
	default "log."
	help
	  User defined name of log files saved in the file system.
	  The prefix is followed by the number of log file.

config LOG_BACKEND_FS_DIR
	string "Log directory"
	default "/lfs1"
	help
	  Directory to which log files will be written.

config LOG_BACKEND_FS_FILE_SIZE
	int "User defined log file size"
	default 4096
	range 128 1073741824
	help
	  Max log file size (in bytes).

config LOG_BACKEND_FS_FILES_LIMIT
	int "Max number of files containing logs"
	default 10
	help
	  Limit of number of files with logs. It is also limited by
	  size of file system partition.

endif # LOG_BACKEND_FS

config LOG_BACKEND_EFI_CONSOLE
	bool "EFI_CONSOLE backend"
	depends on X86_EFI_CONSOLE
	select LOG_OUTPUT
	default y if !UART_CONSOLE
	help
	  When enabled backend is using EFI CONSOLE to output logs.

if LOG_BACKEND_EFI_CONSOLE

backend = EFI_CON
backend-str = efi_console
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_EFI_CONSOLE

endmenu
