1fc0ec740SApeksha Gupta /* SPDX-License-Identifier: BSD-3-Clause 2fc0ec740SApeksha Gupta * Copyright 2020-2021 NXP 3fc0ec740SApeksha Gupta */ 4fc0ec740SApeksha Gupta 5fc0ec740SApeksha Gupta #ifndef __ENETFEC_ETHDEV_H__ 6fc0ec740SApeksha Gupta #define __ENETFEC_ETHDEV_H__ 7fc0ec740SApeksha Gupta 8b84fdd39SApeksha Gupta #include <rte_ethdev.h> 9b84fdd39SApeksha Gupta 10ecae7157SApeksha Gupta #define BD_LEN 49152 11ecae7157SApeksha Gupta #define ENETFEC_TX_FR_SIZE 2048 12ecae7157SApeksha Gupta #define ETH_HLEN RTE_ETHER_HDR_LEN 13ecae7157SApeksha Gupta 14b84fdd39SApeksha Gupta /* full duplex */ 15b84fdd39SApeksha Gupta #define FULL_DUPLEX 0x00 16b84fdd39SApeksha Gupta 17bb5b5bf1SApeksha Gupta #define MAX_TX_BD_RING_SIZE 512 /* It should be power of 2 */ 18bb5b5bf1SApeksha Gupta #define MAX_RX_BD_RING_SIZE 512 19b84fdd39SApeksha Gupta #define PKT_MAX_BUF_SIZE 1984 20b84fdd39SApeksha Gupta #define OPT_FRAME_SIZE (PKT_MAX_BUF_SIZE << 16) 21bb5b5bf1SApeksha Gupta #define ENETFEC_MAX_RX_PKT_LEN 3000 22b84fdd39SApeksha Gupta 23bb5b5bf1SApeksha Gupta #define __iomem 24ecae7157SApeksha Gupta #if defined(RTE_ARCH_ARM) 25ecae7157SApeksha Gupta #if defined(RTE_ARCH_64) 26ecae7157SApeksha Gupta #define dcbf(p) { asm volatile("dc cvac, %0" : : "r"(p) : "memory"); } 27ecae7157SApeksha Gupta #define dcbf_64(p) dcbf(p) 28ecae7157SApeksha Gupta 29ecae7157SApeksha Gupta #else /* RTE_ARCH_32 */ 30ecae7157SApeksha Gupta #define dcbf(p) RTE_SET_USED(p) 31ecae7157SApeksha Gupta #define dcbf_64(p) dcbf(p) 32ecae7157SApeksha Gupta #endif 33ecae7157SApeksha Gupta 34ecae7157SApeksha Gupta #else 35ecae7157SApeksha Gupta #define dcbf(p) RTE_SET_USED(p) 36ecae7157SApeksha Gupta #define dcbf_64(p) dcbf(p) 37ecae7157SApeksha Gupta #endif 38ecae7157SApeksha Gupta 39fc0ec740SApeksha Gupta /* 40fc0ec740SApeksha Gupta * ENETFEC can support 1 rx and tx queue.. 41fc0ec740SApeksha Gupta */ 42fc0ec740SApeksha Gupta 43fc0ec740SApeksha Gupta #define ENETFEC_MAX_Q 1 44fc0ec740SApeksha Gupta 45*93998f3cSTyler Retzlaff #define writel(v, p) __extension__ ({*(volatile unsigned int *)(p) = (v); }) 46b84fdd39SApeksha Gupta #define readl(p) rte_read32(p) 47b84fdd39SApeksha Gupta 48bb5b5bf1SApeksha Gupta struct bufdesc { 49bb5b5bf1SApeksha Gupta uint16_t bd_datlen; /* buffer data length */ 50bb5b5bf1SApeksha Gupta uint16_t bd_sc; /* buffer control & status */ 51bb5b5bf1SApeksha Gupta uint32_t bd_bufaddr; /* buffer address */ 52bb5b5bf1SApeksha Gupta }; 53bb5b5bf1SApeksha Gupta 54bb5b5bf1SApeksha Gupta struct bufdesc_ex { 55bb5b5bf1SApeksha Gupta struct bufdesc desc; 56bb5b5bf1SApeksha Gupta uint32_t bd_esc; 57bb5b5bf1SApeksha Gupta uint32_t bd_prot; 58bb5b5bf1SApeksha Gupta uint32_t bd_bdu; 59bb5b5bf1SApeksha Gupta uint32_t ts; 60bb5b5bf1SApeksha Gupta uint16_t res0[4]; 61bb5b5bf1SApeksha Gupta }; 62bb5b5bf1SApeksha Gupta 63bb5b5bf1SApeksha Gupta struct bufdesc_prop { 64bb5b5bf1SApeksha Gupta int queue_id; 65bb5b5bf1SApeksha Gupta /* Addresses of Tx and Rx buffers */ 66bb5b5bf1SApeksha Gupta struct bufdesc *base; 67bb5b5bf1SApeksha Gupta struct bufdesc *last; 68bb5b5bf1SApeksha Gupta struct bufdesc *cur; 69bb5b5bf1SApeksha Gupta void __iomem *active_reg_desc; 70bb5b5bf1SApeksha Gupta uint64_t descr_baseaddr_p; 71bb5b5bf1SApeksha Gupta unsigned short ring_size; 72bb5b5bf1SApeksha Gupta unsigned char d_size; 73bb5b5bf1SApeksha Gupta unsigned char d_size_log2; 74bb5b5bf1SApeksha Gupta }; 75bb5b5bf1SApeksha Gupta 76bb5b5bf1SApeksha Gupta struct enetfec_priv_tx_q { 77bb5b5bf1SApeksha Gupta struct bufdesc_prop bd; 78bb5b5bf1SApeksha Gupta struct rte_mbuf *tx_mbuf[MAX_TX_BD_RING_SIZE]; 79bb5b5bf1SApeksha Gupta struct bufdesc *dirty_tx; 80bb5b5bf1SApeksha Gupta struct rte_mempool *pool; 81bb5b5bf1SApeksha Gupta struct enetfec_private *fep; 82bb5b5bf1SApeksha Gupta }; 83bb5b5bf1SApeksha Gupta 84bb5b5bf1SApeksha Gupta struct enetfec_priv_rx_q { 85bb5b5bf1SApeksha Gupta struct bufdesc_prop bd; 86bb5b5bf1SApeksha Gupta struct rte_mbuf *rx_mbuf[MAX_RX_BD_RING_SIZE]; 87bb5b5bf1SApeksha Gupta struct rte_mempool *pool; 88bb5b5bf1SApeksha Gupta struct enetfec_private *fep; 89bb5b5bf1SApeksha Gupta }; 90bb5b5bf1SApeksha Gupta 91fc0ec740SApeksha Gupta struct enetfec_private { 92fc0ec740SApeksha Gupta struct rte_eth_dev *dev; 93ecae7157SApeksha Gupta struct rte_eth_stats stats; 94b84fdd39SApeksha Gupta int full_duplex; 95b84fdd39SApeksha Gupta int flag_pause; 96c75b9c3aSApeksha Gupta int flag_csum; 97b84fdd39SApeksha Gupta uint32_t quirks; 98b84fdd39SApeksha Gupta uint32_t cbus_size; 99b84fdd39SApeksha Gupta uint32_t enetfec_e_cntl; 100b84fdd39SApeksha Gupta uint16_t max_rx_queues; 101b84fdd39SApeksha Gupta uint16_t max_tx_queues; 102bb5b5bf1SApeksha Gupta unsigned int total_tx_ring_size; 103bb5b5bf1SApeksha Gupta unsigned int total_rx_ring_size; 104b84fdd39SApeksha Gupta unsigned int reg_size; 105b84fdd39SApeksha Gupta unsigned int bd_size; 106b84fdd39SApeksha Gupta bool bufdesc_ex; 107b84fdd39SApeksha Gupta bool rgmii_txc_delay; 108b84fdd39SApeksha Gupta bool rgmii_rxc_delay; 109b84fdd39SApeksha Gupta void *hw_baseaddr_v; 110b84fdd39SApeksha Gupta void *bd_addr_v; 111b84fdd39SApeksha Gupta uint32_t hw_baseaddr_p; 112b84fdd39SApeksha Gupta uint32_t bd_addr_p; 113b84fdd39SApeksha Gupta uint32_t bd_addr_p_r[ENETFEC_MAX_Q]; 114b84fdd39SApeksha Gupta uint32_t bd_addr_p_t[ENETFEC_MAX_Q]; 115b84fdd39SApeksha Gupta void *dma_baseaddr_r[ENETFEC_MAX_Q]; 116b84fdd39SApeksha Gupta void *dma_baseaddr_t[ENETFEC_MAX_Q]; 117bb5b5bf1SApeksha Gupta struct enetfec_priv_rx_q *rx_queues[ENETFEC_MAX_Q]; 118bb5b5bf1SApeksha Gupta struct enetfec_priv_tx_q *tx_queues[ENETFEC_MAX_Q]; 119fc0ec740SApeksha Gupta }; 120fc0ec740SApeksha Gupta 121bb5b5bf1SApeksha Gupta static inline struct 122bb5b5bf1SApeksha Gupta bufdesc *enet_get_nextdesc(struct bufdesc *bdp, struct bufdesc_prop *bd) 123bb5b5bf1SApeksha Gupta { 124bb5b5bf1SApeksha Gupta return (bdp >= bd->last) ? bd->base 125bb5b5bf1SApeksha Gupta : (struct bufdesc *)(((uintptr_t)bdp) + bd->d_size); 126bb5b5bf1SApeksha Gupta } 127bb5b5bf1SApeksha Gupta 128bb5b5bf1SApeksha Gupta static inline struct 129bb5b5bf1SApeksha Gupta bufdesc *enet_get_prevdesc(struct bufdesc *bdp, struct bufdesc_prop *bd) 130bb5b5bf1SApeksha Gupta { 131bb5b5bf1SApeksha Gupta return (bdp <= bd->base) ? bd->last 132bb5b5bf1SApeksha Gupta : (struct bufdesc *)(((uintptr_t)bdp) - bd->d_size); 133bb5b5bf1SApeksha Gupta } 134bb5b5bf1SApeksha Gupta 135bb5b5bf1SApeksha Gupta static inline int 136bb5b5bf1SApeksha Gupta enet_get_bd_index(struct bufdesc *bdp, struct bufdesc_prop *bd) 137bb5b5bf1SApeksha Gupta { 138bb5b5bf1SApeksha Gupta return ((const char *)bdp - (const char *)bd->base) >> bd->d_size_log2; 139bb5b5bf1SApeksha Gupta } 140bb5b5bf1SApeksha Gupta 141ecae7157SApeksha Gupta uint16_t enetfec_recv_pkts(void *rxq1, struct rte_mbuf **rx_pkts, 142ecae7157SApeksha Gupta uint16_t nb_pkts); 143ecae7157SApeksha Gupta uint16_t enetfec_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, 144ecae7157SApeksha Gupta uint16_t nb_pkts); 145ecae7157SApeksha Gupta 146fc0ec740SApeksha Gupta #endif /*__ENETFEC_ETHDEV_H__*/ 147