| /* |
| ************************************************************************** |
| * 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 */ |