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

menu "Frontends"

config LOG_FRONTEND_DICT_UART
	bool "UART dictionary frontend"
	select LOG_DICTIONARY_SUPPORT
	select MPSC_PBUF
	depends on UART_ASYNC_API || UART_INTERRUPT_DRIVEN
	imply LOG_FMT_SECTION
	imply LOG_FMT_SECTION_STRIP if !LOG_ALWAYS_RUNTIME
	help
	  Frontend sends data in binary dictionary mode.

if LOG_FRONTEND_DICT_UART

config LOG_FRONTEND_DICT_UART_BUFFER_SIZE
	int "Buffer size"
	default 1024
	help
	  Number of bytes dedicated for buffering data

config LOG_FRONTEND_DICT_UART_DROPPED_NOTIFY_PERIOD
	int "Dropped notification period"
	default 500
	help
	  Determines how often a report about dropped messages is printed. Given
	  in milliseconds.

endif

config LOG_FRONTEND_STMESP
	bool "Coresight STM frontend"
	imply ARM_ON_ENTER_CPU_IDLE_HOOK if LOG_FRONTEND_STMESP_FLUSH_COUNT > 0

if LOG_FRONTEND_STMESP

config LOG_FRONTEND_STMESP_DICT
	bool
	default y if !LOG_FRONTEND_STMESP_FSC
	select LOG_FRONTEND_OPT_API
	select LOG_DICTIONARY_DB
	imply LOG_FMT_SECTION
	imply LOG_FMT_SECTION_STRIP

config LOG_FRONTEND_STMESP_FSC
	bool "Send fully self-contained messages"
	select LOG_MSG_APPEND_RO_STRING_LOC if !(DEBUG_NRF_ETR || \
			SOC_NRF54H20_CPUPPR || SOC_NRF54H20_CPUFLPR)

config LOG_FRONTEND_STMESP_FLUSH_COUNT
	int "Number of flushing words"
	default 4
	help
	  Before going to sleep CPU shall write to STM some dummy data to ensure
	  that any buffered data goes to TPIU/ETR.

config LOG_FRONTEND_STMESP_EARLY_BUF_SIZE
	int "Buffer size to store early messages"
	default 0
	help
	  Frontend cannot write to STM if it is used with ETR buffer unless ETR is
	  initialized and memory is properly configured (privileges). Data is stored
	  in the buffer and flushed to the STMESP once the pipeline is ready.

config LOG_FRONTEND_STMESP_DICT_VER
	def_int 0

config LOG_FRONTEND_STMESP_TURBO_LOG
	bool "Optimize short_logs"
	select LOG_CUSTOM_HEADER
	default y if (DEBUG_NRF_ETR || SOC_NRF54H20_CPUPPR || SOC_NRF54H20_CPUFLPR) \
		     && LOG_FRONTEND_STMESP_FSC
	help
	  When enabled, then logging messages with 0 and 1 numeric argument are
	  optimized and handled much faster than others.

config LOG_FRONTEND_STMESP_TURBO_DROP_OTHERS
	bool "Drop all logs except turbo logs"
	help
	  Option can be enabled for memory constraint cases to remove all logging
	  related code except turbo logs.

config LOG_FRONTEND_STMESP_TURBO_LOG_BASE
	def_int 32768

config LOG_FRONTEND_STPESP_TURBO_SOURCE_PORT_ID
	def_int 65535
	depends on LOG_FRONTEND_STMESP_TURBO_LOG

config LOG_FRONTEND_STMESP_GUARANTEED_ACCESS
	bool "Use STMESP guaranteed access"
	help
	  When enabled, accessing STMESP registers will stall if write cannot be
	  performed (e.g. ETR buffer is full).

config LOG_FRONTEND_STMESP_MSG_END_TIMESTAMP
	bool "Generate timestamp and marker at message end"
	help
	  Generate a zero data byte with timestamp and marker at message end,
	  instead of generating a timestamp and marker at message start and
	  a flag at end. This can be used to maintain compatibility with
	  certain decoders.

endif # LOG_FRONTEND_STMESP

config LOG_FRONTEND_STMESP_DEMUX
	bool "Demultiplexer of logging packets from STM stream"
	select MPSC_PBUF
	help
	  Module demultiplexes messages encoded in STPv2 stream. Messages may
	  be interleaved because they may come from multiple cores (majors).
	  There are 3 types of messages: logging, tracepoints and HW events.

if LOG_FRONTEND_STMESP_DEMUX

config LOG_FRONTEND_STMESP_DEMUX_ACTIVE_PACKETS
	int "Active packets"
	default 12

config LOG_FRONTEND_STMESP_DEMUX_BUFFER_SIZE
	int "Buffer size"
	default 1024

config LOG_FRONTEND_STMESP_DEMUX_MAX_UTILIZATION
	bool "Track maximum utilization"

config LOG_FRONTEND_STMESP_DEMUX_GC_TIMEOUT
	int "Message timeout (in milliseconds)"
	default 100
	help
	  If log message is not completed within that time frame it is discarded.

endif # LOG_FRONTEND_STMESP_DEMUX

config LOG_FRONTEND_STMESP_FLUSH_PORT_ID
	def_int 0
	depends on LOG_FRONTEND_STMESP_DEMUX || LOG_FRONTEND_STMESP

config LOG_FRONTEND_STMESP_TP_CHAN_BASE
	def_int 255
	depends on LOG_FRONTEND_STMESP_DEMUX || LOG_FRONTEND_STMESP
	help
	  Do not change this value as it is aligned with host decoder (nrfutil trace).


endmenu
