Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright 2020-2024 NXP 3 : : */ 4 : : 5 : : #ifndef __ENETFEC_ETHDEV_H__ 6 : : #define __ENETFEC_ETHDEV_H__ 7 : : 8 : : #include <rte_ethdev.h> 9 : : 10 : : #define BD_LEN 49152 11 : : #define ENETFEC_TX_FR_SIZE 2048 12 : : #define ETH_HLEN RTE_ETHER_HDR_LEN 13 : : 14 : : /* full duplex */ 15 : : #define FULL_DUPLEX 0x00 16 : : 17 : : #define MAX_TX_BD_RING_SIZE 512 /* It should be power of 2 */ 18 : : #define MAX_RX_BD_RING_SIZE 512 19 : : #define PKT_MAX_BUF_SIZE 1984 20 : : #define OPT_FRAME_SIZE (PKT_MAX_BUF_SIZE << 16) 21 : : #define ENETFEC_MAX_RX_PKT_LEN 3000 22 : : 23 : : #define ENETFEC_NAME_PMD net_enetfec 24 : : 25 : : /* eth name size */ 26 : : #define ENETFEC_ETH_NAMESIZE 20 27 : : #define ENETFEC_MAC_SHIFT 16 28 : : /* mac addr reset */ 29 : : #define ENETFEC_MAC_RESET 0xFFFFFFFF 30 : : 31 : : /* FEC receive acceleration */ 32 : : #define ENETFEC_RACC_IPDIS RTE_BIT32(1) 33 : : #define ENETFEC_RACC_PRODIS RTE_BIT32(2) 34 : : #define ENETFEC_RACC_SHIFT16 RTE_BIT32(7) 35 : : #define ENETFEC_RACC_OPTIONS (ENETFEC_RACC_IPDIS | \ 36 : : ENETFEC_RACC_PRODIS) 37 : : 38 : : #define ENETFEC_PAUSE_FLAG_AUTONEG 0x1 39 : : #define ENETFEC_PAUSE_FLAG_ENABLE 0x2 40 : : 41 : : /* Pause frame field and FIFO threshold */ 42 : : #define ENETFEC_FCE RTE_BIT32(5) 43 : : #define ENETFEC_RSEM_V 0x84 44 : : #define ENETFEC_RSFL_V 16 45 : : #define ENETFEC_RAEM_V 0x8 46 : : #define ENETFEC_RAFL_V 0x8 47 : : #define ENETFEC_OPD_V 0xFFF0 48 : : 49 : : /* Extended buffer descriptor */ 50 : : #define ENETFEC_EXTENDED_BD 0 51 : : #define NUM_OF_BD_QUEUES 6 52 : : 53 : : #define __iomem 54 : : #if defined(RTE_ARCH_ARM) 55 : : #if defined(RTE_ARCH_64) 56 : : /* Flush */ 57 : : #define dccvac(p) { asm volatile("dc cvac, %0" : : "r"(p) : "memory"); } 58 : : #define dccvac_64(p) dccvac(p) 59 : : /* Invalidate(Not working on A35 core) */ 60 : : #define dcivac(p) { asm volatile("dc ivac, %0" : : "r"(p) : "memory"); } 61 : : #define dcivac_64(p) dcivac(p) 62 : : /* Flush and Invalidate */ 63 : : #define dccivac(p) { asm volatile("dc civac, %0" : : "r"(p) : "memory"); } 64 : : #define dccivac_64(p) dccivac(p) 65 : : 66 : : #else /* RTE_ARCH_32 */ 67 : : #define dccvac(p) RTE_SET_USED(p) 68 : : #define dccvac_64(p) dccvac(p) 69 : : #define dcivac(p) RTE_SET_USED(p) 70 : : #define dcivac_64(p) dcivac(p) 71 : : #define dccivac(p) RTE_SET_USED(p) 72 : : #define dccivac_64(p) dccivac(p) 73 : : #endif 74 : : 75 : : #else 76 : : #define dccvac(p) RTE_SET_USED(p) 77 : : #define dccvac_64(p) dccvac(p) 78 : : #define dcivac(p) RTE_SET_USED(p) 79 : : #define dcivac_64(p) dcivac(p) 80 : : #define dccivac(p) RTE_SET_USED(p) 81 : : #define dccivac_64(p) dccivac(p) 82 : : #endif 83 : : 84 : : /* 85 : : * ENETFEC can support 1 rx and tx queue.. 86 : : */ 87 : : 88 : : #define ENETFEC_MAX_Q 1 89 : : 90 : : #define writel(v, p) __extension__ ({*(volatile unsigned int *)(p) = (v); }) 91 : : #define readl(p) rte_read32(p) 92 : : 93 : : struct bufdesc { 94 : : uint16_t bd_datlen; /* buffer data length */ 95 : : uint16_t bd_sc; /* buffer control & status */ 96 : : uint32_t bd_bufaddr; /* buffer address */ 97 : : }; 98 : : 99 : : struct bufdesc_ex { 100 : : struct bufdesc desc; 101 : : uint32_t bd_esc; 102 : : uint32_t bd_prot; 103 : : uint32_t bd_bdu; 104 : : uint32_t ts; 105 : : uint16_t res0[4]; 106 : : }; 107 : : 108 : : struct bufdesc_prop { 109 : : int queue_id; 110 : : /* Addresses of Tx and Rx buffers */ 111 : : struct bufdesc *base; 112 : : struct bufdesc *last; 113 : : struct bufdesc *cur; 114 : : void __iomem *active_reg_desc; 115 : : uint64_t descr_baseaddr_p; 116 : : unsigned short ring_size; 117 : : unsigned char d_size; 118 : : unsigned char d_size_log2; 119 : : }; 120 : : 121 : : struct enetfec_priv_tx_q { 122 : : struct bufdesc_prop bd; 123 : : struct rte_mbuf *tx_mbuf[MAX_TX_BD_RING_SIZE]; 124 : : struct bufdesc *dirty_tx; 125 : : struct rte_mempool *pool; 126 : : struct enetfec_private *fep; 127 : : }; 128 : : 129 : : struct enetfec_priv_rx_q { 130 : : struct bufdesc_prop bd; 131 : : struct rte_mbuf *rx_mbuf[MAX_RX_BD_RING_SIZE]; 132 : : struct rte_mempool *pool; 133 : : struct enetfec_private *fep; 134 : : }; 135 : : 136 : : struct enetfec_private { 137 : : struct rte_eth_dev *dev; 138 : : struct rte_eth_stats stats; 139 : : int full_duplex; 140 : : int flag_pause; 141 : : int flag_csum; 142 : : uint32_t quirks; 143 : : uint32_t cbus_size; 144 : : uint32_t enetfec_e_cntl; 145 : : uint16_t max_rx_queues; 146 : : uint16_t max_tx_queues; 147 : : unsigned int total_tx_ring_size; 148 : : unsigned int total_rx_ring_size; 149 : : unsigned int reg_size; 150 : : unsigned int bd_size; 151 : : bool bufdesc_ex; 152 : : bool rgmii_txc_delay; 153 : : bool rgmii_rxc_delay; 154 : : void *hw_baseaddr_v; 155 : : void *bd_addr_v; 156 : : uint32_t hw_baseaddr_p; 157 : : uint32_t bd_addr_p; 158 : : uint32_t bd_addr_p_r[ENETFEC_MAX_Q]; 159 : : uint32_t bd_addr_p_t[ENETFEC_MAX_Q]; 160 : : void *dma_baseaddr_r[ENETFEC_MAX_Q]; 161 : : void *dma_baseaddr_t[ENETFEC_MAX_Q]; 162 : : struct enetfec_priv_rx_q *rx_queues[ENETFEC_MAX_Q]; 163 : : struct enetfec_priv_tx_q *tx_queues[ENETFEC_MAX_Q]; 164 : : }; 165 : : 166 : : static inline struct 167 : : bufdesc *enet_get_nextdesc(struct bufdesc *bdp, struct bufdesc_prop *bd) 168 : : { 169 : 0 : return (bdp >= bd->last) ? bd->base 170 [ # # # # : 0 : : (struct bufdesc *)(((uintptr_t)bdp) + bd->d_size); # # ] 171 : : } 172 : : 173 : : static inline struct 174 : : bufdesc *enet_get_prevdesc(struct bufdesc *bdp, struct bufdesc_prop *bd) 175 : : { 176 : 0 : return (bdp <= bd->base) ? bd->last 177 [ # # # # ]: 0 : : (struct bufdesc *)(((uintptr_t)bdp) - bd->d_size); 178 : : } 179 : : 180 : : static inline int 181 : : enet_get_bd_index(struct bufdesc *bdp, struct bufdesc_prop *bd) 182 : : { 183 : 0 : return ((const char *)bdp - (const char *)bd->base) >> bd->d_size_log2; 184 : : } 185 : : 186 : : uint16_t enetfec_recv_pkts(void *rxq1, struct rte_mbuf **rx_pkts, 187 : : uint16_t nb_pkts); 188 : : uint16_t enetfec_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, 189 : : uint16_t nb_pkts); 190 : : 191 : : #endif /*__ENETFEC_ETHDEV_H__*/