/*
 **************************************************************************
 * Copyright (c) 2014, 2016-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_cmn.h
 *	NSS Common Message Structure and APIs
 */

#ifndef __NSS_CMN_H
#define __NSS_CMN_H

/**
 * @addtogroup nss_common_subsystem
 * @{
 */

/**
 * Interface Number 1 Valid 7 Core 8 Type 16 Index
 */
typedef int32_t nss_if_num_t;
#define NSS_IF_IS_TYPE_DYNAMIC(if_num)		(if_num != -1)
#define NSS_IF_IS_VALID(if_num)		(if_num < NSS_MAX_NET_INTERFACES)

/**
 * @struct nss_ctx_instance
 *	Forward declaration for structure that contains instance data for each
 *	NSS core. Contents of structure are private to the NSS driver.
 */
struct nss_ctx_instance;

/*
 * The first 8 bits of an interfaces number is representing the core_id,
 * 0 means local core.
 */

#define NSS_CORE_ID_SHIFT 24		/**< Number of bits to shift a core local interface number. */

/**
 * Macro that appends the core identifier to an interface number.
 */
#define NSS_INTERFACE_NUM_APPEND_COREID(nss_ctx, interface) ((interface) | ((nss_ctx->id + 1) << NSS_CORE_ID_SHIFT))

/**
 * Macro to obtain a core local interface number.
 */
#define NSS_INTERFACE_NUM_GET(interface) ((interface) & 0xffffff)

/**
 * Macro to obtain an interface core number.
 */
#define NSS_INTERFACE_NUM_GET_COREID(interface) ((interface >> NSS_CORE_ID_SHIFT) & 0xff)

/*
 * Common enumerations.
 */

/**
 * nss_tx_status_t
 *	Tx command failure results.
 *
 * Types starting with NSS_TX_FAILURE_SYNC_ are only used by synchronous messages.
 */
typedef enum {
	NSS_TX_SUCCESS = 0,
	NSS_TX_FAILURE,
	NSS_TX_FAILURE_QUEUE,
	NSS_TX_FAILURE_NOT_READY,
	NSS_TX_FAILURE_TOO_LARGE,
	NSS_TX_FAILURE_TOO_SHORT,
	NSS_TX_FAILURE_NOT_SUPPORTED,
	NSS_TX_FAILURE_BAD_PARAM,
	NSS_TX_FAILURE_NOT_ENABLED,
	NSS_TX_FAILURE_SYNC_BAD_PARAM,
	NSS_TX_FAILURE_SYNC_TIMEOUT,
	NSS_TX_FAILURE_SYNC_FW_ERR,
	NSS_TX_FAILURE_MAX,
} nss_tx_status_t;

/**
 * nss_state_t
 *	Initialization states.
 */
typedef enum {
	NSS_STATE_UNINITIALIZED = 0,
	NSS_STATE_INITIALIZED
} nss_state_t;

/**
 * nss_core_id_t
 *	NSS core IDs.
 */
typedef enum {
	NSS_CORE_0 = 0,
	NSS_CORE_1,
	NSS_CORE_MAX
} nss_core_id_t;

/**
 * nss_cb_register_status_t
 *	Callback registration states.
 */
typedef enum {
	NSS_CB_REGISTER_SUCCESS = 0,
	NSS_CB_REGISTER_FAILED,
} nss_cb_register_status_t;

/**
 * nss_cb_unregister_status_t
 *	Callback deregistration states.
 */
typedef enum {
	NSS_CB_UNREGISTER_SUCCESS = 0,
	NSS_CB_UNREGISTER_FAILED,
} nss_cb_unregister_status_t;

/**
 * nss_cmn_response
 *	Responses for a common message.
 */
enum nss_cmn_response {
	NSS_CMN_RESPONSE_ACK,
	NSS_CMN_RESPONSE_EVERSION,
	NSS_CMN_RESPONSE_EINTERFACE,
	NSS_CMN_RESPONSE_ELENGTH,
	NSS_CMN_RESPONSE_EMSG,
	NSS_CMN_RESPONSE_NOTIFY,
	NSS_CMN_RESPONSE_LAST
};

/**
 * Array of log messages for common NSS responses.
 */
extern int8_t *nss_cmn_response_str[NSS_CMN_RESPONSE_LAST];

/**
 * nss_cmn_msg
 *	Common message information.
 */
struct nss_cmn_msg {
	uint16_t version;	/**< Version ID for the main message format. */
	uint16_t len;		/**< Length of the message, excluding the header. */
	uint32_t interface;	/**< Primary key for all messages. */
	enum nss_cmn_response response;
			/**< Primary response. All messages must specify one of these responses. */

	uint32_t type;	/**< Decentralized request number used to match response numbers. */
	uint32_t error;	/**< Decentralized specific error message (response == EMSG). */

	/**
	 * Padding used to start the callback from a 64-bit boundary. This field can be reused.
	 */
	uint32_t reserved;

	nss_ptr_t cb;		/**< Contains the callback pointer. */
#ifndef __LP64__
	uint32_t padding1;	/**< Padding used to fit 64 bits. Do not reuse. */
#endif
	nss_ptr_t app_data;	/**< Contains the application data. */
#ifndef __LP64__
	uint32_t padding2;	/**< Padding used to fit 64 bits. Do not reuse. */
#endif
};

/**
 * nss_cmn_node_stats
 *	Common per-node statistics.
 */
struct nss_cmn_node_stats {
	uint32_t rx_packets;			/**< Number of packets received. */
	uint32_t rx_bytes;			/**< Number of bytes received. */
	uint32_t tx_packets;			/**< Number of packets transmitted. */
	uint32_t tx_bytes;			/**< Number of bytes transmitted. */
	uint32_t rx_dropped[NSS_MAX_NUM_PRI];	/**< Packets dropped on receive due to queue full. */
};

/**
 * nss_cmn_get_msg_len
 *	Gets the message length of a host-to-NSS message.
 *
 * @datatypes
 * nss_cmn_get_msg_len
 *
 * @param[in] ncm  Pointer to the common message.
 *
 * @return
 * Length of the message specified in the argument to this function.
 */
static inline uint32_t nss_cmn_get_msg_len(struct nss_cmn_msg *ncm)
{
	return ncm->len + sizeof(struct nss_cmn_msg);
}

#ifdef __KERNEL__ /* only for kernel to use. */

/**
 * nss_cmn_msg_init
 *	Initializes the common area of an asynchronous host-to-NSS message.
 *
 * @datatypes
 * nss_cmn_msg
 *
 * @param[in,out] ncm       Pointer to the common message.
 * @param[in]     if_num    NSS interface number.
 * @param[in]     type      Type of message.
 * @param[in]     len       Size of the payload.
 * @param[in]     cb        Pointer to the callback function.
 * @param[in]     app_data  Pointer to the application context for this message.
 *
 * @return
 * None.
 */
extern void nss_cmn_msg_init(struct nss_cmn_msg *ncm, uint32_t if_num, uint32_t type, uint32_t len,
	void *cb, void *app_data);

/**
 * nss_cmn_msg_sync_init
 *	Initializes the common message of a synchronous host-to-NSS message.
 *
 * @datatypes
 * nss_cmn_msg
 *
 * @param[in,out] ncm     Pointer to the common message.
 * @param[in]     if_num  NSS interface number.
 * @param[in]     type    Type of message.
 * @param[in]     len     Size of the payload.
 *
 * @return
 * None.
 */
extern void nss_cmn_msg_sync_init(struct nss_cmn_msg *ncm, uint32_t if_num, uint32_t type,  uint32_t len);

/**
 * nss_cmn_get_interface_number
 *	Gets the interface number.
 *
 * @datatypes
 * nss_ctx_instance \n
 * net_device
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] dev      Pointer to the OS network device pointer.
 *
 * @return
 * Interface number.
 */
extern int32_t nss_cmn_get_interface_number(struct nss_ctx_instance *nss_ctx, struct net_device *dev);

/**
 * nss_cmn_get_interface_number_by_dev
 *	Gets the interface number of a device.
 *
 * @datatypes
 * net_device
 *
 * @param[in] dev  Pointer to the OS network device pointer.
 *
 * @return
 * Interface number, or -1 on failure.
 */
extern int32_t nss_cmn_get_interface_number_by_dev(struct net_device *dev);

/**
 * nss_cmn_get_interface_number_by_dev_and_type
 *	Gets the interface number by a device and its type.
 *
 * @datatypes
 * net_device
 *
 * @param[in] dev   Pointer to the OS network device pointer.
 * @param[in] type  Type of this interface.
 *
 * @return
 * Interface number, or -1 on failure.
 */
extern int32_t nss_cmn_get_interface_number_by_dev_and_type(struct net_device *dev, uint32_t type);

/**
 * nss_cmn_interface_is_redirect
 *	Determines if the interface number is a redirect interface.
 *
 * @param[in] nss_ctx        Pointer to the NSS context.
 * @param[in] interface_num  NSS interface number.
 *
 * @return
 * TRUE if the number is a redirect interface. Otherwise FALSE.
 */
extern bool nss_cmn_interface_is_redirect(struct nss_ctx_instance *nss_ctx, int32_t interface_num);

/**
 * nss_cmn_append_core_id
 * 	Append core ID on NSS interface number.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx   Pointer to the NSS context.
 * @param[in] if_num    NSS interface number.
 *
 * @return
 * Interface number with core ID.
 */
extern int nss_cmn_append_core_id(struct nss_ctx_instance *nss_ctx, int if_num);

/**
 * nss_cmn_get_interface_dev
 *	Gets an interface device pointer.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] if_num   NSS interface number.
 *
 * @return
 * Interface device pointer.
 */
extern struct net_device *nss_cmn_get_interface_dev(struct nss_ctx_instance *nss_ctx, uint32_t if_num);

/**
 * nss_cmn_get_state
 *	Obtains the NSS state.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 *
 * @return
 * NSS state that indicates whether the NSS core is initialized. For possible values, see nss_state_t.
 */
extern nss_state_t nss_cmn_get_state(struct nss_ctx_instance *nss_ctx);

/**
 * Callback function for queue decongestion messages.
 *
 * @param[in] app_data  Pointer to the application context for this message.
 */
typedef void (*nss_cmn_queue_decongestion_callback_t)(void *app_data);

/**
 * nss_cmn_register_queue_decongestion
 *	Registers a queue for a decongestion event.
 *
 * The callback function is called with the spinlock held. The function should avoid deadlocks
 * caused by attempting to acquire multiple spinlocks.

 * @datatypes
 * nss_ctx_instance \n
 * nss_cmn_queue_decongestion_callback_t
 *
 * @param[in,out] nss_ctx         Pointer to the NSS context.
 * @param[in]     event_callback  Callback for the message.
 * @param[in]     app_data        Pointer to the application context to be returned in the
 *                                callback.
 *
 * @return
 * #NSS_CB_REGISTER_SUCCESS if registration is successful.
 * @par
 * Otherwise, #NSS_CB_REGISTER_FAILED.
 */
extern nss_cb_register_status_t nss_cmn_register_queue_decongestion(struct nss_ctx_instance *nss_ctx, nss_cmn_queue_decongestion_callback_t event_callback, void *app_data);

/**
 * nss_cmn_unregister_queue_decongestion
 *	Deregisters a queue from receiving a decongestion event.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_cmn_queue_decongestion_callback_t
 *
 * @param[in,out] nss_ctx         Pointer to the NSS context.
 * @param[in]     event_callback  Callback for the message.
 *
 * @return
 * #NSS_CB_REGISTER_SUCCESS if registration is successful.
 * @par
 * Otherwise, #NSS_CB_REGISTER_FAILED.
 *
 * @dependencies
 * The callback function must have been previously registered.
 */
extern nss_cb_unregister_status_t nss_cmn_unregister_queue_decongestion(struct nss_ctx_instance *nss_ctx, nss_cmn_queue_decongestion_callback_t event_callback);

/**
 * Callback function for packets with service code.
 *
 * @param[in] app_data  Pointer to the application context for this message.
 * @param[in] nbuf      Pointer to the socket buffer.
 */
typedef void (*nss_cmn_service_code_callback_t)(void *app_data, struct sk_buff *nbuf);

/**
 * nss_cmn_register_service_code
 *	Registers a callback for a service code.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_cmn_service_code_callback_t
 *
 * @param[in,out] nss_ctx         Pointer to the NSS context.
 * @param[in]     cb              Callback for the message.
 * @param[in]     service_code    Service code found attached to the packet.
 * @param[in]     app_data        Pointer to the application context to be returned in the
 *                                callback.
 *
 * @return
 * #NSS_CB_REGISTER_SUCCESS if registration is successful.
 * @par
 * Otherwise, #NSS_CB_REGISTER_FAILED.
 */
extern nss_cb_register_status_t nss_cmn_register_service_code(struct nss_ctx_instance *nss_ctx, nss_cmn_service_code_callback_t cb, uint8_t service_code, void *app_data);

/**
 * nss_cmn_unregister_service_code
 *	Deregisters a callback for the given service code.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_cmn_service_code_callback_t
 *
 * @param[in,out] nss_ctx         Pointer to the NSS context.
 * @param[in]     cb              Callback for the message.
 * @param[in]     service_code    Service code found attached to the packet.
 *
 * @return
 * #NSS_CB_REGISTER_SUCCESS if registration is successful.
 * @par
 * Otherwise, #NSS_CB_REGISTER_FAILED.
 *
 * @dependencies
 * The callback function must have been previously registered.
 */
extern nss_cb_unregister_status_t nss_cmn_unregister_service_code(struct nss_ctx_instance *nss_ctx, nss_cmn_service_code_callback_t cb, uint8_t service_code);

/**
 * nss_cmn_get_nss_enabled
 *	Checks whether the NSS mode is supported on the platform.
 *
 * @return
 * TRUE if NSS is supported. \n
 * Otherwise, FALSE.
 */
extern bool nss_cmn_get_nss_enabled(void);

/**
 * nss_cmn_rx_dropped_sum
 *	Sums dropped packet count of all NSS pnode queues.
 *
 * @datatypes
 * nss_cmn_node_stats \n
 *
 * @param[in] node_stats  Pointer to node statistics.
 *
 * @return
 * Total dropped packets count.
 */
extern uint32_t nss_cmn_rx_dropped_sum(struct nss_cmn_node_stats *node_stats);

#endif /* __KERNEL__ */

/**
 * @}
 */

#endif /* __NSS_CMN_MSG_H */
