1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 2aaf4363eSJerin Jacob * Copyright(c) 2017 Cavium, Inc 3f7be70e5SJerin Jacob */ 4aaf4363eSJerin Jacob 5f7be70e5SJerin Jacob #ifndef __OCTEONTX_ETHDEV_H__ 6f7be70e5SJerin Jacob #define __OCTEONTX_ETHDEV_H__ 7f7be70e5SJerin Jacob 8f7be70e5SJerin Jacob #include <stdbool.h> 9f7be70e5SJerin Jacob 10f7be70e5SJerin Jacob #include <rte_common.h> 11ffc905f3SFerruh Yigit #include <rte_ethdev_driver.h> 12f7be70e5SJerin Jacob #include <rte_eventdev.h> 13f7be70e5SJerin Jacob #include <rte_mempool.h> 14f7be70e5SJerin Jacob #include <rte_memory.h> 15f7be70e5SJerin Jacob 16f7be70e5SJerin Jacob #include <octeontx_fpavf.h> 17f7be70e5SJerin Jacob 18f7be70e5SJerin Jacob #include "base/octeontx_bgx.h" 19f7be70e5SJerin Jacob #include "base/octeontx_pki_var.h" 20f7be70e5SJerin Jacob #include "base/octeontx_pkivf.h" 21f7be70e5SJerin Jacob #include "base/octeontx_pkovf.h" 22f7be70e5SJerin Jacob #include "base/octeontx_io.h" 23f7be70e5SJerin Jacob 24b4ec00a2SStephen Hemminger #define OCTEONTX_PMD net_octeontx 25f7be70e5SJerin Jacob #define OCTEONTX_VDEV_DEFAULT_MAX_NR_PORT 12 26f7be70e5SJerin Jacob #define OCTEONTX_VDEV_NR_PORT_ARG ("nr_port") 27f7be70e5SJerin Jacob #define OCTEONTX_MAX_NAME_LEN 32 28f7be70e5SJerin Jacob 29989d4926SPavan Nikhilesh #define OCTEONTX_MAX_BGX_PORTS 4 30989d4926SPavan Nikhilesh #define OCTEONTX_MAX_LMAC_PER_BGX 4 31989d4926SPavan Nikhilesh 323151e6a6SHarman Kalra #define OCCTX_RX_NB_SEG_MAX 6 338b42b07eSHarman Kalra #define OCCTX_INTR_POLL_INTERVAL_MS 1000 343151e6a6SHarman Kalra /* VLAN tag inserted by OCCTX_TX_VTAG_ACTION. 353151e6a6SHarman Kalra * In Tx space is always reserved for this in FRS. 363151e6a6SHarman Kalra */ 373151e6a6SHarman Kalra #define OCCTX_MAX_VTAG_INS 2 383151e6a6SHarman Kalra #define OCCTX_MAX_VTAG_ACT_SIZE (4 * OCCTX_MAX_VTAG_INS) 393151e6a6SHarman Kalra 403151e6a6SHarman Kalra /* HW config of frame size doesn't include FCS */ 413151e6a6SHarman Kalra #define OCCTX_MAX_HW_FRS 9212 423151e6a6SHarman Kalra #define OCCTX_MIN_HW_FRS 60 433151e6a6SHarman Kalra 443151e6a6SHarman Kalra /* ETH_HLEN+ETH_FCS+2*VLAN_HLEN */ 453151e6a6SHarman Kalra #define OCCTX_L2_OVERHEAD (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + \ 463151e6a6SHarman Kalra OCCTX_MAX_VTAG_ACT_SIZE) 47*e6ad69e4SSteve Yang #define OCCTX_L2_MAX_LEN (RTE_ETHER_MTU + OCCTX_L2_OVERHEAD) 483151e6a6SHarman Kalra 493151e6a6SHarman Kalra /* Since HW FRS includes NPC VTAG insertion space, user has reduced FRS */ 503151e6a6SHarman Kalra #define OCCTX_MAX_FRS \ 513151e6a6SHarman Kalra (OCCTX_MAX_HW_FRS + RTE_ETHER_CRC_LEN - OCCTX_MAX_VTAG_ACT_SIZE) 523151e6a6SHarman Kalra 533151e6a6SHarman Kalra #define OCCTX_MIN_FRS (OCCTX_MIN_HW_FRS + RTE_ETHER_CRC_LEN) 543151e6a6SHarman Kalra 553151e6a6SHarman Kalra #define OCCTX_MAX_MTU (OCCTX_MAX_FRS - OCCTX_L2_OVERHEAD) 563151e6a6SHarman Kalra 57100f6992SHarman Kalra #define OCTEONTX_RX_OFFLOADS ( \ 58100f6992SHarman Kalra DEV_RX_OFFLOAD_CHECKSUM | \ 59100f6992SHarman Kalra DEV_RX_OFFLOAD_SCTP_CKSUM | \ 60100f6992SHarman Kalra DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM | \ 61100f6992SHarman Kalra DEV_RX_OFFLOAD_SCATTER | \ 6285221a0cSHarman Kalra DEV_RX_OFFLOAD_SCATTER | \ 6356139e85SVamsi Attunuru DEV_RX_OFFLOAD_JUMBO_FRAME | \ 6456139e85SVamsi Attunuru DEV_RX_OFFLOAD_VLAN_FILTER) 6585221a0cSHarman Kalra 66100f6992SHarman Kalra #define OCTEONTX_TX_OFFLOADS ( \ 675cbe1848SHarman Kalra DEV_TX_OFFLOAD_MBUF_FAST_FREE | \ 68100f6992SHarman Kalra DEV_TX_OFFLOAD_MT_LOCKFREE | \ 69100f6992SHarman Kalra DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | \ 70100f6992SHarman Kalra DEV_TX_OFFLOAD_OUTER_UDP_CKSUM | \ 71100f6992SHarman Kalra DEV_TX_OFFLOAD_IPV4_CKSUM | \ 72100f6992SHarman Kalra DEV_TX_OFFLOAD_TCP_CKSUM | \ 73100f6992SHarman Kalra DEV_TX_OFFLOAD_UDP_CKSUM | \ 74100f6992SHarman Kalra DEV_TX_OFFLOAD_SCTP_CKSUM | \ 7585221a0cSHarman Kalra DEV_TX_OFFLOAD_MULTI_SEGS) 76a9287089SPavan Nikhilesh 77f7be70e5SJerin Jacob static inline struct octeontx_nic * 78f7be70e5SJerin Jacob octeontx_pmd_priv(struct rte_eth_dev *dev) 79f7be70e5SJerin Jacob { 80f7be70e5SJerin Jacob return dev->data->dev_private; 81f7be70e5SJerin Jacob } 82f7be70e5SJerin Jacob 83989d4926SPavan Nikhilesh extern uint16_t 84989d4926SPavan Nikhilesh rte_octeontx_pchan_map[OCTEONTX_MAX_BGX_PORTS][OCTEONTX_MAX_LMAC_PER_BGX]; 85989d4926SPavan Nikhilesh 8656139e85SVamsi Attunuru struct vlan_entry { 8756139e85SVamsi Attunuru TAILQ_ENTRY(vlan_entry) next; 8856139e85SVamsi Attunuru uint16_t vlan_id; 8956139e85SVamsi Attunuru }; 9056139e85SVamsi Attunuru 9156139e85SVamsi Attunuru TAILQ_HEAD(octeontx_vlan_filter_tbl, vlan_entry); 9256139e85SVamsi Attunuru 9356139e85SVamsi Attunuru struct octeontx_vlan_info { 9456139e85SVamsi Attunuru struct octeontx_vlan_filter_tbl fltr_tbl; 9556139e85SVamsi Attunuru uint8_t filter_on; 9656139e85SVamsi Attunuru }; 9756139e85SVamsi Attunuru 98241a6500SVamsi Attunuru struct octeontx_fc_info { 99241a6500SVamsi Attunuru enum rte_eth_fc_mode mode; /**< Link flow control mode */ 100241a6500SVamsi Attunuru enum rte_eth_fc_mode def_mode; 101241a6500SVamsi Attunuru uint16_t high_water; 102241a6500SVamsi Attunuru uint16_t low_water; 103241a6500SVamsi Attunuru uint16_t def_highmark; 104241a6500SVamsi Attunuru uint16_t def_lowmark; 105241a6500SVamsi Attunuru uint32_t rx_fifosz; 106241a6500SVamsi Attunuru }; 107241a6500SVamsi Attunuru 108f7be70e5SJerin Jacob /* Octeontx ethdev nic */ 109f7be70e5SJerin Jacob struct octeontx_nic { 110f7be70e5SJerin Jacob struct rte_eth_dev *dev; 111f7be70e5SJerin Jacob int node; 112f7be70e5SJerin Jacob int port_id; 113f7be70e5SJerin Jacob int port_ena; 114f7be70e5SJerin Jacob int base_ichan; 115f7be70e5SJerin Jacob int num_ichans; 116f7be70e5SJerin Jacob int base_ochan; 117f7be70e5SJerin Jacob int num_ochans; 118f7be70e5SJerin Jacob uint8_t evdev; 119f7be70e5SJerin Jacob uint8_t bpen; 120f7be70e5SJerin Jacob uint8_t fcs_strip; 121f7be70e5SJerin Jacob uint8_t bcast_mode; 122f7be70e5SJerin Jacob uint8_t mcast_mode; 123f7be70e5SJerin Jacob uint16_t num_tx_queues; 124f7be70e5SJerin Jacob uint64_t hwcap; 125a6d6f0afSPavan Nikhilesh uint8_t pko_vfid; 126f7be70e5SJerin Jacob uint8_t link_up; 127f7be70e5SJerin Jacob uint8_t duplex; 128f7be70e5SJerin Jacob uint8_t speed; 1293151e6a6SHarman Kalra uint16_t bgx_mtu; 130f7be70e5SJerin Jacob uint16_t mtu; 13135b2d13fSOlivier Matz uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; 132f7be70e5SJerin Jacob /* Rx port parameters */ 133f7be70e5SJerin Jacob struct { 134f7be70e5SJerin Jacob bool classifier_enable; 135f7be70e5SJerin Jacob bool hash_enable; 136f7be70e5SJerin Jacob bool initialized; 137f7be70e5SJerin Jacob } pki; 138f7be70e5SJerin Jacob 139f7be70e5SJerin Jacob uint16_t ev_queues; 140f7be70e5SJerin Jacob uint16_t ev_ports; 14185221a0cSHarman Kalra uint64_t rx_offloads; 14285221a0cSHarman Kalra uint16_t rx_offload_flags; 14385221a0cSHarman Kalra uint64_t tx_offloads; 14485221a0cSHarman Kalra uint16_t tx_offload_flags; 14556139e85SVamsi Attunuru struct octeontx_vlan_info vlan_info; 1468b42b07eSHarman Kalra int print_flag; 147241a6500SVamsi Attunuru struct octeontx_fc_info fc; 148f7be70e5SJerin Jacob } __rte_cache_aligned; 149f7be70e5SJerin Jacob 1507fe7c98fSJerin Jacob struct octeontx_txq { 1517fe7c98fSJerin Jacob uint16_t queue_id; 1527fe7c98fSJerin Jacob octeontx_dq_t dq; 1537fe7c98fSJerin Jacob struct rte_eth_dev *eth_dev; 1547fe7c98fSJerin Jacob } __rte_cache_aligned; 1557fe7c98fSJerin Jacob 156197438eeSJerin Jacob struct octeontx_rxq { 157197438eeSJerin Jacob uint16_t queue_id; 158197438eeSJerin Jacob uint16_t port_id; 159197438eeSJerin Jacob uint8_t evdev; 160197438eeSJerin Jacob struct rte_eth_dev *eth_dev; 161197438eeSJerin Jacob uint16_t ev_queues; 162197438eeSJerin Jacob uint16_t ev_ports; 16385221a0cSHarman Kalra struct rte_mempool *pool; 164197438eeSJerin Jacob } __rte_cache_aligned; 165197438eeSJerin Jacob 1667f4116bdSHarman Kalra void 1677f4116bdSHarman Kalra octeontx_set_tx_function(struct rte_eth_dev *dev); 16856139e85SVamsi Attunuru 16956139e85SVamsi Attunuru /* VLAN */ 1708b42b07eSHarman Kalra int octeontx_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx); 1718b42b07eSHarman Kalra int octeontx_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx); 17256139e85SVamsi Attunuru int octeontx_dev_vlan_offload_init(struct rte_eth_dev *dev); 17356139e85SVamsi Attunuru int octeontx_dev_vlan_offload_fini(struct rte_eth_dev *eth_dev); 17456139e85SVamsi Attunuru int octeontx_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask); 17556139e85SVamsi Attunuru int octeontx_dev_vlan_filter_set(struct rte_eth_dev *dev, 17656139e85SVamsi Attunuru uint16_t vlan_id, int on); 1778b42b07eSHarman Kalra int octeontx_dev_set_link_up(struct rte_eth_dev *eth_dev); 1788b42b07eSHarman Kalra int octeontx_dev_set_link_down(struct rte_eth_dev *eth_dev); 17956139e85SVamsi Attunuru 180241a6500SVamsi Attunuru /* Flow control */ 181241a6500SVamsi Attunuru int octeontx_dev_flow_ctrl_init(struct rte_eth_dev *dev); 182241a6500SVamsi Attunuru int octeontx_dev_flow_ctrl_fini(struct rte_eth_dev *dev); 183241a6500SVamsi Attunuru int octeontx_dev_flow_ctrl_get(struct rte_eth_dev *dev, 184241a6500SVamsi Attunuru struct rte_eth_fc_conf *fc_conf); 185241a6500SVamsi Attunuru int octeontx_dev_flow_ctrl_set(struct rte_eth_dev *dev, 186241a6500SVamsi Attunuru struct rte_eth_fc_conf *fc_conf); 187241a6500SVamsi Attunuru 188f7be70e5SJerin Jacob #endif /* __OCTEONTX_ETHDEV_H__ */ 189