# Copyright (c) 2024 Tenstorrent
#
# SPDX-License-Identifier: Apache-2.0

config POSIX_API
	bool "POSIX APIs"
	depends on !NATIVE_APPLICATION
	select NATIVE_LIBC_INCOMPATIBLE
	select POSIX_BASE_DEFINITIONS # clock_gettime(), pthread_create(), sem_get(), etc
	select POSIX_AEP_REALTIME_MINIMAL # CLOCK_MONOTONIC, pthread_attr_setstack(), etc
	select POSIX_NETWORKING if NETWORKING # inet_ntoa(), socket(), etc
	imply EVENTFD # eventfd(), eventfd_read(), eventfd_write()
	imply POSIX_FD_MGMT # open(), close(), read(), write()
	imply POSIX_MESSAGE_PASSING # mq_open(), etc
	imply POSIX_MULTI_PROCESS # sleep(), getpid(), etc
	help
	  This option enables the required POSIX System Interfaces (base definitions), all of PSE51,
	  and some features found in PSE52.

	  Note: in the future, this option may be deprecated in favour of subprofiling options.

choice POSIX_AEP_CHOICE
	prompt "POSIX Subprofile"
	default POSIX_AEP_CHOICE_NONE
	help
	  This choice is intended to help users select the correct POSIX profile for their
	  application. Choices are based on IEEE 1003.13-2003 (now inactive / reserved) and
	  extrapolated to the more recent Subprofiling Option Groups in IEEE 1003.3-2017.

	  For more information, please refer to
	  https://standards.ieee.org/ieee/1003.13/3322/
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html

config POSIX_AEP_CHOICE_NONE
	bool "No pre-defined POSIX subprofile"
	help
	  No pre-defined POSIX profile is selected.

config POSIX_AEP_CHOICE_BASE
	bool "Base definitions (system interfaces)"
	depends on !NATIVE_APPLICATION
	select NATIVE_LIBC_INCOMPATIBLE
	select POSIX_BASE_DEFINITIONS
	help
	  Only enable the base definitions required for all POSIX systems.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap02.html#tag_02_01_03_01

config POSIX_AEP_CHOICE_PSE51
	bool "Minimal Realtime System Profile (PSE51)"
	depends on !NATIVE_APPLICATION
	select NATIVE_LIBC_INCOMPATIBLE
	select POSIX_BASE_DEFINITIONS
	select POSIX_AEP_REALTIME_MINIMAL
	help
	  PSE51 includes the POSIX Base Definitions (System Interfaces) as well as several Options and
	  Option Groups to facilitate device I/O, signals, mandatory configuration utilities, and
	  threading.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html

config POSIX_AEP_CHOICE_PSE52
	bool "Realtime Controller System Profile (PSE52)"
	depends on !NATIVE_APPLICATION
	select NATIVE_LIBC_INCOMPATIBLE
	select POSIX_BASE_DEFINITIONS
	select POSIX_AEP_REALTIME_MINIMAL
	select POSIX_AEP_REALTIME_CONTROLLER
	help
	  PSE52 includes the POSIX Base Definitions (System Interfaces) as well as all features of
	  PSE51. Additionally, it includes interfaces for file descriptor management, filesystem
	  support, support for message queues, and tracing.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html

config POSIX_AEP_CHOICE_PSE53
	bool "Dedicated Realtime System Profile (PSE53)"
	depends on !NATIVE_APPLICATION
	select NATIVE_LIBC_INCOMPATIBLE
	select POSIX_BASE_DEFINITIONS
	select POSIX_AEP_REALTIME_MINIMAL
	select POSIX_AEP_REALTIME_CONTROLLER
	select POSIX_AEP_REALTIME_DEDICATED
	help
	  PSE53 includes the POSIX Base Definitions (System Interfaces) as well as all features of
	  PSE52. Additionally, it includes interfaces for POSIX multi-processing, networking, pipes,
	  and prioritized I/O.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html

# TODO: PSE54: Multi-purpose Realtime System Profile

endchoice # POSIX_AEP_CHOICE

# Base Definitions (System Interfaces)
config POSIX_BASE_DEFINITIONS
	bool
	select POSIX_ASYNCHRONOUS_IO
	select POSIX_BARRIERS
	select POSIX_CLOCK_SELECTION
	# select POSIX_MAPPED_FILES
	# select POSIX_MEMORY_PROTECTION
	select POSIX_READER_WRITER_LOCKS
	select POSIX_REALTIME_SIGNALS
	select POSIX_SEMAPHORES
	select POSIX_SPIN_LOCKS
	select POSIX_THREAD_SAFE_FUNCTIONS
	select POSIX_THREADS
	select POSIX_TIMEOUTS
	select POSIX_TIMERS
	help
	  This option is not user configurable. It may be configured indirectly by selecting
	  CONFIG_POSIX_AEP_CHOICE_BASE=y.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap02.html#tag_02_01_03_01

config POSIX_AEP_REALTIME_MINIMAL
	bool
	# Option Groups
	select POSIX_DEVICE_IO
	select POSIX_SIGNALS
	select POSIX_SINGLE_PROCESS
	select XSI_THREADS_EXT
	# Options
	select POSIX_FSYNC
	# select POSIX_MEMLOCK
	# select POSIX_MEMLOCK_RANGE
	select POSIX_MONOTONIC_CLOCK
	# select POSIX_SHARED_MEMORY_OBJECTS
	select POSIX_SYNCHRONIZED_IO
	select POSIX_THREAD_ATTR_STACKADDR
	select POSIX_THREAD_ATTR_STACKSIZE
	select POSIX_THREAD_CPUTIME
	select POSIX_THREAD_PRIO_INHERIT
	select POSIX_THREAD_PRIO_PROTECT
	select POSIX_THREAD_PRIORITY_SCHEDULING
	# select POSIX_THREAD_SPORADIC_SERVER
	help
	  This option is not user configurable. It may be configured indirectly by selecting
	  CONFIG_POSIX_AEP_CHOICE_PSE51=y.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html

config POSIX_AEP_REALTIME_CONTROLLER
	bool
	# Option Groups
	select POSIX_FD_MGMT
	select POSIX_FILE_SYSTEM
	# Options
	select POSIX_MESSAGE_PASSING
	# select POSIX_TRACE
	# select POSIX_TRACE_EVENT_FILTER
	# select POSIX_TRACE_LOG
	help
	  This option is not user configurable. It may be configured indirectly by selecting
	  CONFIG_POSIX_AEP_CHOICE_PSE52=y.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html

config POSIX_AEP_REALTIME_DEDICATED
	bool
	# Option Groups
	select POSIX_MULTI_PROCESS
	select POSIX_NETWORKING
	# select POSIX_PIPE
	# select POSIX_SIGNAL_JUMP
	# Options
	select POSIX_CPUTIME
	# select POSIX_PRIORITIZED_IO
	select POSIX_PRIORITY_SCHEDULING
	select POSIX_RAW_SOCKETS
	# select POSIX_SPAWN
	# select POSIX_SPORADIC_SERVER
	help
	  This option is not user configurable. It may be configured indirectly by selecting
	  CONFIG_POSIX_AEP_CHOICE_PSE53=y.

	  For more information, please see
	  https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_subprofiles.html
