# 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 "Enable 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 "Enable base64 encoding and decoding"
	help
	  Enable base64 encoding and decoding functionality

config SYS_HEAP_VALIDATE
	bool "Enable internal heap validity checking"
	help
	  The sys_heap implementation is instrumented for extensive
	  internal validation.  Leave this off by default, unless
	  modifying the heap code or (maybe) when running in
	  environments that require sensitive detection of memory
	  corruption.

config SYS_HEAP_ALLOC_LOOPS
	int "Number of tries in the inner heap allocation loop"
	default 3
	help
	  The sys_heap allocator bounds the number of tries from the
	  smallest chunk level (the one that might not fit the
	  requested allocation) to maintain constant time performance.
	  Setting this to a high level will cause the heap to return
	  more successful allocations in situations of high
	  fragmentation, at the cost of potentially significant
	  (linear time) searching of the free list.  The default is
	  three, which results in an allocator with good statistical
	  properties ("most" allocations that fit will succeed) but
	  keeps the maximum runtime at a tight bound so that the heap
	  is useful in locked or ISR contexts.

choice
	prompt "Supported heap sizes"
	depends on !64BIT
	default SYS_HEAP_SMALL_ONLY if (SRAM_SIZE <= 256)
	default SYS_HEAP_AUTO
	help
	  Heaps using reduced-size chunk headers can accommodate so called
	  "small" heaps with a total size of 262136 bytes or less.

	  Heaps using full-size chunk headers can have a total size up to
	  16383 megabytes. The overhead is of course bigger.

	  On 32-bit system the tradeoff is selectable between:

	  - "small" heaps with low memory and runtime overhead;

	  - "big" heaps with bigger memory overhead even for small heaps;

	  - "auto" providing optimal memory overhead in all cases but with
	    a higher runtime overhead and somewhat bigger code footprint.

	  On 64-bit systems the "big" chunk header size conveniently provides
	  the needed alignment on returned memory allocations. Small chunk
	  headers would require alignment padding up to the big header size
	  anyway so "big" heap is the only option in that case.

config SYS_HEAP_SMALL_ONLY
	bool "Support for small heaps only"
	help
	  Select this to optimize the code and memory usage if all your
	  heaps are 262136 bytes or less.

config SYS_HEAP_BIG_ONLY
	bool "Support for big heaps only"
	help
	  Select this to optimize the code for big heaps only. This can
	  accommodate any heap size but memory usage won't be as
	  efficient with small sized heaps.

config SYS_HEAP_AUTO
	bool "Support for both small and big heaps at run time"
	help
	  This option optimizes memory usage for each heap according to
	  their size albeit with some overhead in code size and execution.

endchoice

config PRINTK_SYNC
	bool "Serialize printk() calls"
	default y if SMP && MP_NUM_CPUS > 1
	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 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.

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"
	select SYSTEM_CLOCK_DISABLE
	help
	  Enable the sys_reboot() API. Enabling this can drag in other subsystems
	  needed to perform a "safe" reboot (e.g. SYSTEM_CLOCK_DISABLE, to stop the
	  system clock before issuing a reset).

rsource "Kconfig.cbprintf"

endmenu
