1*a9643ea8Slogwang /* 2*a9643ea8Slogwang * BSD LICENSE 3*a9643ea8Slogwang * 4*a9643ea8Slogwang * Copyright (C) Cavium networks Ltd. 2016. 5*a9643ea8Slogwang * 6*a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 7*a9643ea8Slogwang * modification, are permitted provided that the following conditions 8*a9643ea8Slogwang * are met: 9*a9643ea8Slogwang * 10*a9643ea8Slogwang * * Redistributions of source code must retain the above copyright 11*a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 12*a9643ea8Slogwang * * Redistributions in binary form must reproduce the above copyright 13*a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in 14*a9643ea8Slogwang * the documentation and/or other materials provided with the 15*a9643ea8Slogwang * distribution. 16*a9643ea8Slogwang * * Neither the name of Cavium networks nor the names of its 17*a9643ea8Slogwang * contributors may be used to endorse or promote products derived 18*a9643ea8Slogwang * from this software without specific prior written permission. 19*a9643ea8Slogwang * 20*a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21*a9643ea8Slogwang * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*a9643ea8Slogwang * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23*a9643ea8Slogwang * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24*a9643ea8Slogwang * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25*a9643ea8Slogwang * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26*a9643ea8Slogwang * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27*a9643ea8Slogwang * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28*a9643ea8Slogwang * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29*a9643ea8Slogwang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30*a9643ea8Slogwang * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*a9643ea8Slogwang */ 32*a9643ea8Slogwang 33*a9643ea8Slogwang #ifndef __THUNDERX_NICVF_ETHDEV_H__ 34*a9643ea8Slogwang #define __THUNDERX_NICVF_ETHDEV_H__ 35*a9643ea8Slogwang 36*a9643ea8Slogwang #include <rte_ethdev.h> 37*a9643ea8Slogwang 38*a9643ea8Slogwang #define THUNDERX_NICVF_PMD_VERSION "1.0" 39*a9643ea8Slogwang #define THUNDERX_REG_BYTES 8 40*a9643ea8Slogwang 41*a9643ea8Slogwang #define NICVF_INTR_POLL_INTERVAL_MS 50 42*a9643ea8Slogwang #define NICVF_HALF_DUPLEX 0x00 43*a9643ea8Slogwang #define NICVF_FULL_DUPLEX 0x01 44*a9643ea8Slogwang #define NICVF_UNKNOWN_DUPLEX 0xff 45*a9643ea8Slogwang 46*a9643ea8Slogwang #define NICVF_RSS_OFFLOAD_PASS1 ( \ 47*a9643ea8Slogwang ETH_RSS_PORT | \ 48*a9643ea8Slogwang ETH_RSS_IPV4 | \ 49*a9643ea8Slogwang ETH_RSS_NONFRAG_IPV4_TCP | \ 50*a9643ea8Slogwang ETH_RSS_NONFRAG_IPV4_UDP | \ 51*a9643ea8Slogwang ETH_RSS_IPV6 | \ 52*a9643ea8Slogwang ETH_RSS_NONFRAG_IPV6_TCP | \ 53*a9643ea8Slogwang ETH_RSS_NONFRAG_IPV6_UDP) 54*a9643ea8Slogwang 55*a9643ea8Slogwang #define NICVF_RSS_OFFLOAD_TUNNEL ( \ 56*a9643ea8Slogwang ETH_RSS_VXLAN | \ 57*a9643ea8Slogwang ETH_RSS_GENEVE | \ 58*a9643ea8Slogwang ETH_RSS_NVGRE) 59*a9643ea8Slogwang 60*a9643ea8Slogwang #define NICVF_DEFAULT_RX_FREE_THRESH 224 61*a9643ea8Slogwang #define NICVF_DEFAULT_TX_FREE_THRESH 224 62*a9643ea8Slogwang #define NICVF_TX_FREE_MPOOL_THRESH 16 63*a9643ea8Slogwang #define NICVF_MAX_RX_FREE_THRESH 1024 64*a9643ea8Slogwang #define NICVF_MAX_TX_FREE_THRESH 1024 65*a9643ea8Slogwang 66*a9643ea8Slogwang #define VLAN_TAG_SIZE 4 /* 802.3ac tag */ 67*a9643ea8Slogwang 68*a9643ea8Slogwang static inline struct nicvf * 69*a9643ea8Slogwang nicvf_pmd_priv(struct rte_eth_dev *eth_dev) 70*a9643ea8Slogwang { 71*a9643ea8Slogwang return eth_dev->data->dev_private; 72*a9643ea8Slogwang } 73*a9643ea8Slogwang 74*a9643ea8Slogwang static inline uint64_t 75*a9643ea8Slogwang nicvf_mempool_phy_offset(struct rte_mempool *mp) 76*a9643ea8Slogwang { 77*a9643ea8Slogwang struct rte_mempool_memhdr *hdr; 78*a9643ea8Slogwang 79*a9643ea8Slogwang hdr = STAILQ_FIRST(&mp->mem_list); 80*a9643ea8Slogwang assert(hdr != NULL); 81*a9643ea8Slogwang return (uint64_t)((uintptr_t)hdr->addr - hdr->phys_addr); 82*a9643ea8Slogwang } 83*a9643ea8Slogwang 84*a9643ea8Slogwang static inline uint16_t 85*a9643ea8Slogwang nicvf_mbuff_meta_length(struct rte_mbuf *mbuf) 86*a9643ea8Slogwang { 87*a9643ea8Slogwang return (uint16_t)((uintptr_t)mbuf->buf_addr - (uintptr_t)mbuf); 88*a9643ea8Slogwang } 89*a9643ea8Slogwang 90*a9643ea8Slogwang /* 91*a9643ea8Slogwang * Simple phy2virt functions assuming mbufs are in a single huge page 92*a9643ea8Slogwang * V = P + offset 93*a9643ea8Slogwang * P = V - offset 94*a9643ea8Slogwang */ 95*a9643ea8Slogwang static inline uintptr_t 96*a9643ea8Slogwang nicvf_mbuff_phy2virt(phys_addr_t phy, uint64_t mbuf_phys_off) 97*a9643ea8Slogwang { 98*a9643ea8Slogwang return (uintptr_t)(phy + mbuf_phys_off); 99*a9643ea8Slogwang } 100*a9643ea8Slogwang 101*a9643ea8Slogwang static inline uintptr_t 102*a9643ea8Slogwang nicvf_mbuff_virt2phy(uintptr_t virt, uint64_t mbuf_phys_off) 103*a9643ea8Slogwang { 104*a9643ea8Slogwang return (phys_addr_t)(virt - mbuf_phys_off); 105*a9643ea8Slogwang } 106*a9643ea8Slogwang 107*a9643ea8Slogwang #endif /* __THUNDERX_NICVF_ETHDEV_H__ */ 108