/*
 **************************************************************************
 * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all copies.
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 **************************************************************************
 */

/**
 * @file nss_c2c_tx.h
 *	NSS core-to-core transmission interface definitions.
 */

#ifndef __NSS_C2C_TX_H
#define __NSS_C2C_TX_H

/**
 * @addtogroup nss_c2c_tx_subsystem
 * @{
 */

/**
 * nss_c2c_tx_msg_type
 *	Supported message types.
 */
enum nss_c2c_tx_msg_type {
	NSS_C2C_TX_MSG_TYPE_STATS,		/**< Statistics synchronization. */
	NSS_C2C_TX_MSG_TYPE_TX_MAP,		/**< Open engine synchronization. */
	NSS_C2C_TX_MSG_TYPE_PERFORMANCE_TEST,	/**< Performance test. */
	NSS_C2C_TX_MSG_TYPE_MAX			/**< Maximum message type. */
};

/**
 * nss_c2c_tx_msg_error
 *	Message error types.
 */
enum nss_c2c_tx_msg_error {
	NSS_C2C_TX_MSG_ERROR_NONE,		/**< No error. */
	NSS_C2C_TX_MSG_ERROR_INVAL_OP,		/**< Invalid operation. */
	NSS_C2C_TX_MSG_ERROR_INVALID_TEST_ID,	/**< Invalid test ID. */
	NSS_C2C_TX_MSG_ERROR_MAX		/**< Maximum error type. */
};

/**
 * nss_c2c_tx_test_type
 *	Supported core-to core transmission tests.
 */
enum nss_c2c_tx_test_type {
	NSS_C2C_TX_TEST_TYPE_SIMPLE = 1,
			/**< Tests the performance of simple pbufs. */
	NSS_C2C_TX_TEST_TYPE_SG_CHAIN,
			/**< Tests the performance of scatter-gather chain pbufs. */
	NSS_C2C_TX_TEST_TYPE_SG_REF,
			/**< Tests the performance of scatter-gather pbuf that has references. */
	NSS_C2C_TX_TEST_TYPE_SG_REFED,
			/**< Tests the performance of referenced pbuf. */
	NSS_C2C_TX_TEST_TYPE_MAX
			/**< Maximum message type. */
};

/**
 * nss_c2c_tx_stats_types
 *	Core-to-core transmission node statistics.
 */
enum nss_c2c_tx_stats_types {
	NSS_C2C_TX_STATS_PBUF_SIMPLE = NSS_STATS_NODE_MAX,
						/**< Number of received simple pbufs. */
	NSS_C2C_TX_STATS_PBUF_SG,		/**< Number of scatter-gather pbufs received. */
	NSS_C2C_TX_STATS_PBUF_RETURNING,	/**< Number of returning scatter-gather pbufs. */
	NSS_C2C_TX_STATS_MAX,			/**< Maximum message type. */
};

/**
 * nss_c2c_tx_stats_notification
 *	Core-to-core transmission statistics structure.
 */
struct nss_c2c_tx_stats_notification {
	uint32_t core_id;			/**< Core ID. */
	uint64_t stats[NSS_C2C_TX_STATS_MAX];	/**< Core-to-core transmission statistics. */
};

#ifdef __KERNEL__ /* only kernel will use. */
/**
 * nss_c2c_tx_map
 *	Core-to-core transmission queue address and interrupt address.
 */
struct nss_c2c_tx_map {
	uint32_t tx_map;		/**< Peer core core-to-core receiver queue start address. */
	uint32_t c2c_intr_addr;		/**< Peer core core-to-core interrupt register address. */
};

/**
 * nss_c2c_tx_stats
 *	The NSS core-to-core transmission node statistics structure.
 */
struct nss_c2c_tx_stats {
	struct nss_cmn_node_stats node_stats;
					/**< Common node statistics for core-to-core transmissions. */
	uint32_t pbuf_simple;		/**< Number of received simple pbuf. */
	uint32_t pbuf_sg;		/**< Number of scattered/gathered pbuf received. */
	uint32_t pbuf_returning;	/**< Number of returning scattered/gathered pbuf. */
};

/**
 * nss_c2c_tx_test
 *	Start performance test for the given test ID.
 */
struct nss_c2c_tx_test {
	uint32_t test_id;		/**< ID of the core-to-core communication test. */
};

/**
 * nss_c2c_tx_msg
 *	Message structure to send/receive core-to-core transmission commands.
 */
struct nss_c2c_tx_msg {
	struct nss_cmn_msg cm;			/**< Common message header. */

	/**
	 * Payload of a NSS core-to-core transmission rule or statistics message.
	 */
	union {
		struct nss_c2c_tx_map map;	/**< Core-to-core transmissions memory map. */
		struct nss_c2c_tx_stats stats;	/**< Core-to-core transmissions statistics. */
		struct nss_c2c_tx_test test;	/**< Core-to-core performance test. */
	} msg;					/**< Message payload. */
};

/**
 * nss_c2c_tx_register_handler
 *	Registers the core-to-core transmissions message handler.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 *
 * @return
 * None.
 */
void nss_c2c_tx_register_handler(struct nss_ctx_instance *nss_ctx);

/**
 * Callback function for receiving core-to-core transmissions messages.
 *
 * @datatypes
 * nss_c2c_tx_msg
 *
 * @param[in] app_data  Pointer to the application context of the message.
 * @param[in] msg       Pointer to the message data.
 */
typedef void (*nss_c2c_tx_msg_callback_t)(void *app_data, struct nss_c2c_tx_msg *msg);

/**
 * nss_c2c_tx_tx_msg
 *	Transmits a core-to-core transmissions message to the NSS.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_c2c_tx_msg
 *
 * @param[in] nss_ctx   Pointer to the NSS context.
 * @param[in] nctm      Pointer to the message data.
 *
 * @return
 * Status of the transmit operation.
 */
extern nss_tx_status_t nss_c2c_tx_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_c2c_tx_msg *nctm);

/**
 * nss_c2c_tx_msg_init
 *	Initializes core-to-core transmissions messages.
 *
 * @datatypes
 * nss_c2c_tx_msg \n
 * nss_c2c_tx_msg_callback_t
 *
 * @param[in]     nct       Pointer to the NSS interface message.
 * @param[in]     if_num    NSS interface number.
 * @param[in]     type      Type of message.
 * @param[in]     len       Size of the payload.
 * @param[in]     cb        Callback function for the message.
 * @param[in]     app_data  Pointer to the application context of the message.
 *
 * @return
 * None.
 */
extern void nss_c2c_tx_msg_init(struct nss_c2c_tx_msg *nct, uint16_t if_num, uint32_t type, uint32_t len,
			nss_c2c_tx_msg_callback_t cb, void *app_data);

/**
 * nss_c2c_tx_notify_register
 *	Registers a notifier callback for core-to-core transmission messages with the NSS.
 *
 * @datatypes
 * nss_c2c_tx_msg_callback_t
 *
 * @param[in] core      NSS core number index to the notifier callback table.
 * @param[in] cb        Callback function for the message.
 * @param[in] app_data  Pointer to the application context of the message.
 *
 * @return
 * Pointer to the NSS core context.
 */
struct nss_ctx_instance *nss_c2c_tx_notify_register(int core, nss_c2c_tx_msg_callback_t cb, void *app_data);

/**
 * nss_c2c_tx_notify_unregister
 *	Deregisters a core-to-core transmission message notifier callback from the NSS.
 *
 * @param[in] core NSS core number index to the notifier callback table.
 *
 * @return
 * None.
 *
 * @dependencies
 * The notifier callback must have been previously registered.
 */
void nss_c2c_tx_notify_unregister(int core);

/**
 * nss_c2c_tx_msg_cfg_map
 *	Sends core-to-core transmissions map to NSS
 *
 * @datatypes
 * nss_ctx_instance \n
 *
 * @param[in] nss_ctx   Pointer to the NSS context.
 * @param[in] tx_map    Peer core core-to-core receiver queue start address.
 * @param[in] c2c_addr  Peer core core-to-core interrupt register address.
 *
 * @return
 * Status of the transmit operation.
 */
extern nss_tx_status_t nss_c2c_tx_msg_cfg_map(struct nss_ctx_instance *nss_ctx, uint32_t tx_map, uint32_t c2c_addr);

/**
 * nss_c2c_tx_register_sysctl
 *     Registers the core-to-core transmission sysctl entries to the sysctl tree.
 *
 * @return
 * None.
 */
extern void nss_c2c_tx_register_sysctl(void);

/**
 * nss_c2c_tx_unregister_sysctl
 *     Deregisters the core-to-core transmission sysctl entries from the sysctl tree.
 *
 * @return
 * None.
 *
 * @dependencies
 * The system control must have been previously registered.
 */
extern void nss_c2c_tx_unregister_sysctl(void);

/**
 * nss_c2c_tx_init
 *	Initializes the core-to-core transmission.
 *
 * @return
 * None.
 */
void nss_c2c_tx_init(void);

/**
 * nss_c2c_tx_stats_register_notifier
 *	Registers a statistics notifier.
 *
 * @datatypes
 * notifier_block
 *
 * @param[in] nb Notifier block.
 *
 * @return
 * 0 on success or -2 on failure.
 */
extern int nss_c2c_tx_stats_register_notifier(struct notifier_block *nb);

/**
 * nss_c2c_tx_stats_unregister_notifier
 *	Deregisters a statistics notifier.
 *
 * @datatypes
 * notifier_block
 *
 * @param[in] nb Notifier block.
 *
 * @return
 * 0 on success or -2 on failure.
 */
extern int nss_c2c_tx_stats_unregister_notifier(struct notifier_block *nb);
#endif /*__KERNEL__ */

/**
 * @}
 */

#endif /* __NSS_C2C_TX_H */
