# Copyright (c) 2020-2021 Nordic Semiconductor (ASA)
# SPDX-License-Identifier: Apache-2.0

# Workaround for not being able to have commas in macro arguments
DT_CHOSEN_Z_IPC_SHM := zephyr,ipc_shm
DT_CHOSEN_Z_IPC := zephyr,ipc
DT_CHOSEN_Z_IPC_TX := zephyr,ipc_tx
DT_CHOSEN_Z_IPC_RX := zephyr,ipc_rx

config RPMSG_SERVICE_SINGLE_IPM_SUPPORT
	bool
	default $(dt_chosen_enabled,$(DT_CHOSEN_Z_IPC))
	help
	  This option must be selected when single IPM is used for
	  both TX and RX communication

config RPMSG_SERVICE_DUAL_IPM_SUPPORT
	bool
	default $(dt_chosen_enabled,$(DT_CHOSEN_Z_IPC_TX)) && \
		$(dt_chosen_enabled,$(DT_CHOSEN_Z_IPC_RX))
	help
	  This option must be selected when separate IPMs are used for
	  TX and RX communication

menuconfig RPMSG_SERVICE
	bool "RPMsg service for multiple users"
	select IPM
	select OPENAMP
	help
	  Enables support for a service that can be shared by multiple
	  users to establish RPMsg endpoints for given channel.

if RPMSG_SERVICE

config RPMSG_SERVICE_SHM_BASE_ADDRESS
	hex
	default "$(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_IPC_SHM))"
	help
	  This option specifies base address of the memory region to
	  be used for the OpenAMP IPC shared memory

config RPMSG_SERVICE_SHM_SIZE
	hex
	default "$(dt_chosen_reg_size_hex,$(DT_CHOSEN_Z_IPC_SHM))"
	help
	  This option specifies size of the memory region to be used
	  for the OpenAMP IPC shared memory

if RPMSG_SERVICE_SINGLE_IPM_SUPPORT

config RPMSG_SERVICE_IPM_NAME
	string
	default "$(dt_chosen_label,$(DT_CHOSEN_Z_IPC))"
	help
	  This option specifies the IPM device name to be used

endif # RPMSG_SERVICE_SINGLE_IPM_SUPPORT

if RPMSG_SERVICE_DUAL_IPM_SUPPORT

config RPMSG_SERVICE_IPM_TX_NAME
	string
	default "$(dt_chosen_label,$(DT_CHOSEN_Z_IPC_TX))"
	help
	  This option specifies the IPM device name to be used for
	  TX communication

config RPMSG_SERVICE_IPM_RX_NAME
	string
	default "$(dt_chosen_label,$(DT_CHOSEN_Z_IPC_RX))"
	help
	  This option specifies the IPM device name to be used for
	  RX communication

endif # RPMSG_SERVICE_DUAL_IPM_SUPPORT

choice RPMSG_SERVICE_MODE
	prompt "RPMsg Service mode"

config RPMSG_SERVICE_MODE_MASTER
	bool "RPMsg master"
	select OPENAMP_MASTER

config RPMSG_SERVICE_MODE_REMOTE
	bool "RPMsg remote"
	select OPENAMP_SLAVE

endchoice

config RPMSG_SERVICE_NUM_ENDPOINTS
	int "Max number of registered endpoints"
	default 2
	help
	  Maximal number of endpoints that can be registered for given
	  RPMsg service.

config RPMSG_SERVICE_WORK_QUEUE_STACK_SIZE
	int "Size of RX work queue stack"
	default 2048
	help
	  Size of stack used by work queue RX thread. This work queue is
	  created in the RPMsg Service backend module to prevent notifying
	  service users about received data from the system work queue.

config RPMSG_SERVICE_INIT_PRIORITY
	int "Initialization priority of RPMsg service"
	default 48
	help
	  The order of RPMsg Service initialization and endpoints registration
	  is important to avoid race conditions in RPMsg endpoints handshake.

	  If in doubt, do not modify this value.

config RPMSG_SERVICE_EP_REG_PRIORITY
	int "Initialization priority of modules registering RPMsg endpoints"
	default 47
	help
	  The endpoints must be registered before RPMsg Service is initialized.

	  If in doubt, do not modify this value.

module = RPMSG_SERVICE
module-str = RPMsg service and backend
source "subsys/logging/Kconfig.template.log_config"

endif # RPMSG_SERVICE
