# 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 NOTIFY
	bool "Asynchronous Notifications"
	help
	  Use this API to support async transactions.

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

config CRC
	bool "Cyclic redundancy check (CRC) Support"
	default y
	help
	  Enable use of CRC.

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 ONOFF
	bool "On-Off Manager"
	select NOTIFY
	help
	  An on-off manager supports an arbitrary number of clients of a
	  service which has a binary state.  Example applications are power
	  rails, clocks, and binary device power management.

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
