blob: c2c81c8729794bd6124742741ab0159b880f69b7 [file] [log] [blame]
/*
**************************************************************************
* Copyright (c) 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_edma.h
* NSS EDMA interface definitions.
*/
#ifndef __NSS_EDMA_H
#define __NSS_EDMA_H
/**
* @addtogroup nss_edma_subsystem
* @{
*/
/*
* NSS EDMA port and ring defines
*/
#define NSS_EDMA_NUM_PORTS_MAX 256
/**< Maximum number of EDMA ports. */
#define NSS_EDMA_NUM_RX_RING_MAX 16
/**< Maximum number of physical EDMA Rx rings. */
#define NSS_EDMA_NUM_RXFILL_RING_MAX 8
/**< Maximum number of physical EDMA Rx fill rings. */
#define NSS_EDMA_NUM_TX_RING_MAX 24
/**< Maximum number of physical EDMA Tx rings. */
#define NSS_EDMA_NUM_TXCMPL_RING_MAX 8
/**< Maximum number of physical EDMA Tx complete rings. */
#define NSS_EDMA_STATS_MSG_MAX_PORTS 16
/**< Maximum ports processed per statistics message. */
/**
* nss_edma_metadata_types
* Message types for EDMA requests and responses.
*/
enum nss_edma_metadata_types {
NSS_METADATA_TYPE_EDMA_PORT_STATS_SYNC,
NSS_METADATA_TYPE_EDMA_RING_STATS_SYNC,
NSS_METADATA_TYPE_EDMA_ERR_STATS_SYNC,
NSS_METADATA_TYPE_EDMA_MAX
};
/**
* nss_edma_port_t
* EDMA port types.
*/
enum nss_edma_port_t {
NSS_EDMA_PORT_PHYSICAL,
NSS_EDMA_PORT_VIRTUAL,
NSS_EDMA_PORT_TYPE_MAX
};
/**
* nss_edma_stats_tx_t
* Types of EDMA Tx ring statistics.
*/
enum nss_edma_stats_tx_t {
NSS_EDMA_STATS_TX_ERR,
NSS_EDMA_STATS_TX_DROPPED,
NSS_EDMA_STATS_TX_DESC,
NSS_EDMA_STATS_TX_MAX
};
/**
* nss_edma_stats_rx_t
* Types of EDMA Rx ring statistics.
*/
enum nss_edma_stats_rx_t {
NSS_EDMA_STATS_RX_CSUM_ERR,
NSS_EDMA_STATS_RX_DESC,
NSS_EDMA_STATS_RX_QOS_ERR,
NSS_EDMA_STATS_RX_SRC_PORT_INVALID,
NSS_EDMA_STATS_RX_SRC_IF_INVALID,
NSS_EDMA_STATS_RX_MAX
};
/**
* nss_edma_stats_txcmpl_t
* Types of EDMA Tx complete statistics.
*/
enum nss_edma_stats_txcmpl_t {
NSS_EDMA_STATS_TXCMPL_DESC,
NSS_EDMA_STATS_TXCMPL_MAX
};
/**
* nss_edma_stats_rxfill_t
* Types of EDMA Rx fill statistics.
*/
enum nss_edma_stats_rxfill_t {
NSS_EDMA_STATS_RXFILL_DESC,
NSS_EDMA_STATS_RXFILL_MAX
};
/**
* nss_edma_port_ring_map_t
* Port to EDMA ring map.
*/
enum nss_edma_port_ring_map_t {
NSS_EDMA_PORT_RX_RING,
NSS_EDMA_PORT_TX_RING,
NSS_EDMA_PORT_RING_MAP_MAX
};
/**
* nss_edma_err_t
* Types of EDMA error statistics.
*/
enum nss_edma_err_t {
NSS_EDMA_AXI_RD_ERR,
NSS_EDMA_AXI_WR_ERR,
NSS_EDMA_RX_DESC_FIFO_FULL_ERR,
NSS_EDMA_RX_BUF_SIZE_ERR,
NSS_EDMA_TX_SRAM_FULL_ERR,
NSS_EDMA_TX_CMPL_BUF_FULL_ERR,
NSS_EDMA_PKT_LEN_LA64K_ERR,
NSS_EDMA_PKT_LEN_LE33_ERR,
NSS_EDMA_DATA_LEN_ERR,
NSS_EDMA_ALLOC_FAIL_CNT,
NSS_EDMA_QOS_INVAL_DST_DROPS,
NSS_EDMA_ERR_STATS_MAX
};
/**
* nss_edma_rx_ring_stats
* EDMA Rx ring statistics.
*/
struct nss_edma_rx_ring_stats {
uint32_t rx_csum_err; /**< Number of Rx checksum errors. */
uint32_t desc_cnt; /**< Number of descriptors processed. */
uint32_t qos_err; /**< Number of QoS errors. */
uint32_t rx_src_port_invalid; /**< Number of source port invalid errors. */
uint32_t rx_src_if_invalid; /**< Number of source interface invalid errors. */
};
/**
* nss_edma_tx_ring_stats
* EDMA Tx ring statistics.
*/
struct nss_edma_tx_ring_stats {
uint32_t tx_err; /**< Number of Tx errors. */
uint32_t tx_dropped; /**< Number of Tx dropped packets. */
uint32_t desc_cnt; /**< Number of descriptors processed. */
};
/**
* nss_edma_rxfill_ring_stats
* EDMA Rx fill ring statistics.
*/
struct nss_edma_rxfill_ring_stats {
uint32_t desc_cnt; /**< Number of descriptors processed. */
};
/**
* nss_edma_txcmpl_ring_stats
* EDMA Tx complete ring statistics.
*/
struct nss_edma_txcmpl_ring_stats {
uint32_t desc_cnt; /**< Number of descriptors processed. */
};
/**
* nss_edma_port_stats
* Statistics for each EDMA port.
*/
struct nss_edma_port_stats {
struct nss_cmn_node_stats node_stats; /**< Common node statistics. */
enum nss_edma_port_t port_type; /**< Type of port. */
uint16_t edma_rx_ring; /**< Rx ring statistics. */
uint16_t edma_tx_ring; /**< Tx ring statistics. */
};
/**
* nss_edma_port_stats_sync
* Statistics for a group of EDMA ports.
*/
struct nss_edma_port_stats_sync {
uint16_t start_port; /**< Starting index of the subset. */
uint16_t end_port; /**< Ending index of the subset. */
struct nss_edma_port_stats port_stats[];
/**< Subset of EDMA port statistics. */
};
/**
* nss_edma_ring_stats_sync
* EDMA ring statistics.
*/
struct nss_edma_ring_stats_sync {
struct nss_edma_tx_ring_stats tx_ring[NSS_EDMA_NUM_TX_RING_MAX];
/**< EDMA Tx ring statistics. */
struct nss_edma_rx_ring_stats rx_ring[NSS_EDMA_NUM_RX_RING_MAX];
/**< EDMA Rx ring statistics. */
struct nss_edma_txcmpl_ring_stats txcmpl_ring[NSS_EDMA_NUM_TXCMPL_RING_MAX];
/**< EDMA Tx complete ring statistics. */
struct nss_edma_rxfill_ring_stats rxfill_ring[NSS_EDMA_NUM_RXFILL_RING_MAX];
/**< EDMA Rx fill ring statistics. */
};
/**
* nss_edma_misc_err_stats
* EDMA error statistics.
*/
struct nss_edma_misc_err_stats {
uint32_t axi_rd_err; /**< EDMA AXI read error. */
uint32_t axi_wr_err; /**< EDMA AXI write error. */
uint32_t rx_desc_fifo_full_err; /**< EDMA receive descriptor FIFO full error. */
uint32_t rx_buf_size_err; /**< EDMA receive buffer size error. */
uint32_t tx_sram_full_err; /**< EDMA transmit SRAM full error. */
uint32_t tx_cmpl_buf_full_err; /**< EDMA transmit completion buffer full error. */
uint32_t pkt_len_la64k_err; /**< EDMA packet length greater than 64k error. */
uint32_t pkt_len_le33_err; /**< EDMA packet length smaller than 33b error. */
uint32_t data_len_err; /**< EDMA data length error. */
uint32_t alloc_fail_cnt; /**< EDMA number of times the allocation of pbuf for statistics failed. */
uint32_t qos_inval_dst_drops; /**< EDMA number of QoS packet dropped due to invalid destination. */
};
/**
* nss_edma_err_stats_sync
* Message for error statistics.
*/
struct nss_edma_err_stats_sync {
struct nss_edma_misc_err_stats msg_err_stats; /**< Message for error statistics. */
};
/**
* nss_edma_msg
* Data for sending and receiving EDMA messages (to synchronize with
* the firmware EDMA).
*/
struct nss_edma_msg {
struct nss_cmn_msg cm; /**< Common message header. */
/**
* Payload of an EDMA message.
*/
union {
struct nss_edma_port_stats_sync port_stats;
/**< EDMA port statistics message payload. */
struct nss_edma_ring_stats_sync ring_stats;
/**< EDMA ring statistics message payload. */
struct nss_edma_err_stats_sync err_stats;
/**< EDMA error statistics message payload. */
} msg; /**< EDMA message payload. */
};
/**
* nss_edma_port_info
* NSS EDMA port statistics.
*/
struct nss_edma_port_info {
uint64_t port_stats[NSS_STATS_NODE_MAX]; /**< EDMA port statistics. */
uint64_t port_type; /**< EDMA port type. */
uint64_t port_ring_map[NSS_EDMA_PORT_RING_MAP_MAX]; /**< EDMA ring statistics. */
};
/**
* nss_edma_stats
* NSS EDMA node statistics.
*/
struct nss_edma_stats {
struct nss_edma_port_info port[NSS_EDMA_NUM_PORTS_MAX];
/**< EDMA port statistics. */
uint64_t tx_stats[NSS_EDMA_NUM_TX_RING_MAX][NSS_EDMA_STATS_TX_MAX];
/**< Physical EDMA Tx ring statistics. */
uint64_t rx_stats[NSS_EDMA_NUM_RX_RING_MAX][NSS_EDMA_STATS_RX_MAX];
/**< Physical EDMA Rx ring statistics. */
uint64_t txcmpl_stats[NSS_EDMA_NUM_TXCMPL_RING_MAX][NSS_EDMA_STATS_TXCMPL_MAX];
/**< Physical EDMA Tx complete statistics. */
uint64_t rxfill_stats[NSS_EDMA_NUM_RXFILL_RING_MAX][NSS_EDMA_STATS_RXFILL_MAX];
/**< Physical EDMA Rx fill statistics. */
uint64_t misc_err[NSS_EDMA_ERR_STATS_MAX];
/**< EDMA error complete statistics. */
};
#ifdef __KERNEL__
/**
* Callback function for receiving EDMA messages.
*
* @datatypes
* nss_edma_msg
*
* @param[in] app_data Pointer to the application context for this message.
* @param[in] msg Pointer to the message data.
*/
typedef void (*nss_edma_msg_callback_t)(void *app_data, struct nss_edma_msg *msg);
/**
* nss_edma_notify_register
* Registers a callback notifier with the NSS for sending and receiving messages.
*
* @datatypes
* nss_edma_msg_callback_t
*
* @param[in] cb Callback function for the message.
* @param[in] app_data Pointer to the application context for this message.
*
* @return
* Pointer to the NSS core context.
*/
extern struct nss_ctx_instance *nss_edma_notify_register(nss_edma_msg_callback_t cb, void *app_data);
/**
* nss_edma_notify_unregister
* Deregisters a callback notifier from the NSS.
*
* @return
* None.
*
* @dependencies
* The callback notifier must have been previously registered.
*/
extern void nss_edma_notify_unregister(void);
/**
* nss_edma_get_stats
* Sends EDMA statistics to NSS clients.
*
* @param[in] stats EDMA statistics to be sent to netlink.
* @param[in] port_id EDMA port ID.
*
* @return
* None.
*/
void nss_edma_get_stats(uint64_t *stats, int port_id);
/**
* nss_edma_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_edma_stats_register_notifier(struct notifier_block *nb);
/**
* nss_edma_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_edma_stats_unregister_notifier(struct notifier_block *nb);
#endif /* __KERNEL__ */
/**
* @}
*/
#endif /* __NSS_EDMA_H */