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

menu "Heap and Memory Allocation"

config SYS_HEAP_VALIDATE
	bool "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.

config SYS_HEAP_RUNTIME_STATS
	bool "System heap runtime statistics"
	help
	  Gather system heap runtime statistics.

config SYS_HEAP_LISTENER
	bool "sys_heap event notifications"
	select HEAP_LISTENER
	help
	  This allows application to listen for sys_heap events,
	  such as memory allocation and de-allocation.

config HEAP_LISTENER
	bool
	help
	  Hidden option to enable API for registering and notifying
	  listeners of certain events related to a heap usage,
	  such as the heap resize.

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 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 SYS_MEM_BLOCKS
	bool "(Yet Another) Memory Blocks Allocator"
	help
	  This enables support for memory block allocator where:
	  () All memory blocks have a single fixed size.
	  () Multiple blocks can be allocated or freed at the same time.
	  () A group of blocks allocated together may not be contiguous.
	     This is useful for operations such as scatter-gather DMA
	     transfers.
	  () Bookkeeping of allocated blocks is done outside of
	     the associated buffer (unlike memory slab). This allows
	     the buffer to reside in memory regions where these can be
	     powered down to conserve energy.

config SYS_MEM_BLOCKS_LISTENER
	bool "Memory Blocks Allocator event notifications"
	depends on SYS_MEM_BLOCKS
	select HEAP_LISTENER
	help
	  This allows application to listen for memory blocks allocator
	  events, such as memory allocation and de-allocation.

config SYS_MEM_BLOCKS_RUNTIME_STATS
	bool "Memory blocks runtime statistics"
	depends on SYS_MEM_BLOCKS
	help
	  This option enables the tracking and reporting of the memory
	  blocks statistics related to the current and maximum number
	  of allocations in a given memory block.

endmenu
