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

menu "OS Support Library"

config JSON_LIBRARY
	bool "Build JSON library"
	help
	  Build a minimal JSON parsing/encoding library. Used by sample
	  applications such as the NATS client.

config RING_BUFFER
	bool "Ring buffers"
	help
	  Enable usage of ring buffers. This is similar to kernel FIFOs but ring
	  buffers manage their own buffer memory and can store arbitrary data.
	  For optimal performance, use buffer sizes that are a power of 2.

config BASE64
	bool "Base64 encoding and decoding"
	help
	  Enable base64 encoding and decoding functionality

config PRINTK_SYNC
	bool "Serialize printk() calls"
	default y if SMP && MP_NUM_CPUS > 1 && !(EFI_CONSOLE && LOG)
	help
	  When true, a spinlock will be taken around the output from a
	  single printk() call, preventing the output data from
	  interleaving with concurrent usage from another CPU or an
	  preempting interrupt.

config MPSC_PBUF
	bool "Multi producer, single consumer packet buffer"
	select TIMEOUT_64BIT
	help
	  Enable usage of mpsc packet buffer. Packet buffer is capable of
	  storing variable length packets in a circular way and operate directly
	  on the buffer memory.

config SPSC_PBUF
	bool "Single producer, single consumer packet buffer"
	help
	  Enable usage of spsc packet buffer. Packet buffer is capable of
	  storing variable length packets in a circular way and operate directly
	  on the buffer memory.

if SPSC_PBUF

choice SPSC_PBUF_CACHE_HANDLING
	prompt "Cache handling"
	default SPSC_PBUF_CACHE_ALWAYS if SPSC_PBUF_USE_CACHE && !SPSC_PBUF_NO_CACHE
	default SPSC_PBUF_CACHE_NEVER if !SPSC_PBUF_USE_CACHE && SPSC_PBUF_NO_CACHE
	default SPSC_PBUF_CACHE_FLAG

config SPSC_PBUF_CACHE_FLAG
	bool "Use cache flag"
	help
	  Use instance specific configuration flag for cache handling.

config SPSC_PBUF_CACHE_ALWAYS
	bool "Always handle cache"
	help
	  Handle cache writeback and invalidation for all instances. Option used
	  to avoid runtime check and thus reduce memory footprint.

config SPSC_PBUF_CACHE_NEVER
	bool "Never handle cache"
	help
	  Discar cache handling for all instances. Option used to avoid runtime
	  check and thus reduce memory footprint.

endchoice

config SPSC_PBUF_USE_CACHE
	bool

config SPSC_PBUF_NO_CACHE
	bool

if SPSC_PBUF_CACHE_FLAG || SPSC_PBUF_CACHE_ALWAYS

config SPSC_PBUF_REMOTE_DCACHE_LINE
	int "Remote cache line size"
	default 32
	help
	  If a packet buffer is used for data sharing between two cores then
	  this value should be set to the data cache line size of the remote core.
	  If local data cache line is detected at runtime then it should be
	  maximum of local and remote line size.

endif # SPSC_PBUF_CACHE_FLAG || SPSC_PBUF_CACHE_ALWAYS

config SPSC_PBUF_UTILIZATION
	bool "Track maximum utilization"
	help
	  When enabled, maximum utilization is tracked which can be used to
	  determine the size of the packet buffer.

endif # SPSC_PBUF

config SHARED_MULTI_HEAP
	bool "Shared multi-heap manager"
	help
	  Enable support for a shared multi-heap manager that uses the
	  multi-heap allocator to manage a set of reserved memory regions with
	  different capabilities / attributes (cacheable, non-cacheable,
	  etc...) defined in the DT.

config WINSTREAM
	bool "Lockless shared memory window byte stream"
	help
	  Winstream is a byte stream IPC for use in shared memory
	  "windows", generally for transmit to non-Zephyr contexts that
	  can't share Zephyr APIs or data structures.

if WINSTREAM
config WINSTREAM_STDLIB_MEMCOPY
	bool "Use standard memcpy() in winstream"
	help
	  The sys_winstream utility is sometimes used in early boot
	  environments before the standard library is usable.  By
	  default it uses a simple internal bytewise memcpy().  Set
	  this to use the one from the standard library.
endif

if MPSC_PBUF
config MPSC_CLEAR_ALLOCATED
	bool "Clear allocated packet"
	help
	  When enabled packet space is zeroed before returning from allocation.
endif

config REBOOT
	bool "Reboot functionality"
	help
	  Enable the sys_reboot() API. Enabling this can drag in other subsystems
	  needed to perform a "safe" reboot (e.g. to stop the system clock before
	  issuing a reset).

config UTF8
	bool "UTF-8 string operation supported"
	help
	  Enable the utf8 API. The API implements functions to specifically
	  handle UTF-8 encoded strings.

rsource "Kconfig.cbprintf"

rsource "Kconfig.heap"

endmenu
