1*4882a593Smuzhiyun #ifndef _HFI1_VNIC_H 2*4882a593Smuzhiyun #define _HFI1_VNIC_H 3*4882a593Smuzhiyun /* 4*4882a593Smuzhiyun * Copyright(c) 2017 - 2020 Intel Corporation. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This file is provided under a dual BSD/GPLv2 license. When using or 7*4882a593Smuzhiyun * redistributing this file, you may do so under either license. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * GPL LICENSE SUMMARY 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 12*4882a593Smuzhiyun * it under the terms of version 2 of the GNU General Public License as 13*4882a593Smuzhiyun * published by the Free Software Foundation. 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but 16*4882a593Smuzhiyun * WITHOUT ANY WARRANTY; without even the implied warranty of 17*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18*4882a593Smuzhiyun * General Public License for more details. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * BSD LICENSE 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 23*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 24*4882a593Smuzhiyun * are met: 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * - Redistributions of source code must retain the above copyright 27*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer. 28*4882a593Smuzhiyun * - Redistributions in binary form must reproduce the above copyright 29*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in 30*4882a593Smuzhiyun * the documentation and/or other materials provided with the 31*4882a593Smuzhiyun * distribution. 32*4882a593Smuzhiyun * - Neither the name of Intel Corporation nor the names of its 33*4882a593Smuzhiyun * contributors may be used to endorse or promote products derived 34*4882a593Smuzhiyun * from this software without specific prior written permission. 35*4882a593Smuzhiyun * 36*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 37*4882a593Smuzhiyun * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 38*4882a593Smuzhiyun * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 39*4882a593Smuzhiyun * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 40*4882a593Smuzhiyun * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 41*4882a593Smuzhiyun * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 42*4882a593Smuzhiyun * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 43*4882a593Smuzhiyun * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 44*4882a593Smuzhiyun * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 45*4882a593Smuzhiyun * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 46*4882a593Smuzhiyun * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 47*4882a593Smuzhiyun * 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #include <rdma/opa_vnic.h> 51*4882a593Smuzhiyun #include "hfi.h" 52*4882a593Smuzhiyun #include "sdma.h" 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define HFI1_VNIC_MAX_TXQ 16 55*4882a593Smuzhiyun #define HFI1_VNIC_MAX_PAD 12 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* L4 header definitions */ 58*4882a593Smuzhiyun #define HFI1_VNIC_L4_HDR_OFFSET OPA_VNIC_L2_HDR_LEN 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define HFI1_VNIC_GET_L4_HDR(data) \ 61*4882a593Smuzhiyun (*((u16 *)((u8 *)(data) + HFI1_VNIC_L4_HDR_OFFSET))) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define HFI1_VNIC_GET_VESWID(data) \ 64*4882a593Smuzhiyun (HFI1_VNIC_GET_L4_HDR(data) & 0xFFF) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* Service class */ 67*4882a593Smuzhiyun #define HFI1_VNIC_SC_OFFSET_LOW 6 68*4882a593Smuzhiyun #define HFI1_VNIC_SC_OFFSET_HI 7 69*4882a593Smuzhiyun #define HFI1_VNIC_SC_SHIFT 4 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define HFI1_VNIC_MAX_QUEUE 16 72*4882a593Smuzhiyun #define HFI1_NUM_VNIC_CTXT 8 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /** 75*4882a593Smuzhiyun * struct hfi1_vnic_sdma - VNIC per Tx ring SDMA information 76*4882a593Smuzhiyun * @dd - device data pointer 77*4882a593Smuzhiyun * @sde - sdma engine 78*4882a593Smuzhiyun * @vinfo - vnic info pointer 79*4882a593Smuzhiyun * @wait - iowait structure 80*4882a593Smuzhiyun * @stx - sdma tx request 81*4882a593Smuzhiyun * @state - vnic Tx ring SDMA state 82*4882a593Smuzhiyun * @q_idx - vnic Tx queue index 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun struct hfi1_vnic_sdma { 85*4882a593Smuzhiyun struct hfi1_devdata *dd; 86*4882a593Smuzhiyun struct sdma_engine *sde; 87*4882a593Smuzhiyun struct hfi1_vnic_vport_info *vinfo; 88*4882a593Smuzhiyun struct iowait wait; 89*4882a593Smuzhiyun struct sdma_txreq stx; 90*4882a593Smuzhiyun unsigned int state; 91*4882a593Smuzhiyun u8 q_idx; 92*4882a593Smuzhiyun bool pkts_sent; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /** 96*4882a593Smuzhiyun * struct hfi1_vnic_rx_queue - HFI1 VNIC receive queue 97*4882a593Smuzhiyun * @idx: queue index 98*4882a593Smuzhiyun * @vinfo: pointer to vport information 99*4882a593Smuzhiyun * @netdev: network device 100*4882a593Smuzhiyun * @napi: netdev napi structure 101*4882a593Smuzhiyun * @skbq: queue of received socket buffers 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun struct hfi1_vnic_rx_queue { 104*4882a593Smuzhiyun u8 idx; 105*4882a593Smuzhiyun struct hfi1_vnic_vport_info *vinfo; 106*4882a593Smuzhiyun struct net_device *netdev; 107*4882a593Smuzhiyun struct napi_struct napi; 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /** 111*4882a593Smuzhiyun * struct hfi1_vnic_vport_info - HFI1 VNIC virtual port information 112*4882a593Smuzhiyun * @dd: device data pointer 113*4882a593Smuzhiyun * @netdev: net device pointer 114*4882a593Smuzhiyun * @flags: state flags 115*4882a593Smuzhiyun * @lock: vport lock 116*4882a593Smuzhiyun * @num_tx_q: number of transmit queues 117*4882a593Smuzhiyun * @num_rx_q: number of receive queues 118*4882a593Smuzhiyun * @vesw_id: virtual switch id 119*4882a593Smuzhiyun * @rxq: Array of receive queues 120*4882a593Smuzhiyun * @stats: per queue stats 121*4882a593Smuzhiyun * @sdma: VNIC SDMA structure per TXQ 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun struct hfi1_vnic_vport_info { 124*4882a593Smuzhiyun struct hfi1_devdata *dd; 125*4882a593Smuzhiyun struct net_device *netdev; 126*4882a593Smuzhiyun unsigned long flags; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* Lock used around state updates */ 129*4882a593Smuzhiyun struct mutex lock; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun u8 num_tx_q; 132*4882a593Smuzhiyun u8 num_rx_q; 133*4882a593Smuzhiyun u16 vesw_id; 134*4882a593Smuzhiyun struct hfi1_vnic_rx_queue rxq[HFI1_NUM_VNIC_CTXT]; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun struct opa_vnic_stats stats[HFI1_VNIC_MAX_QUEUE]; 137*4882a593Smuzhiyun struct hfi1_vnic_sdma sdma[HFI1_VNIC_MAX_TXQ]; 138*4882a593Smuzhiyun }; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define v_dbg(format, arg...) \ 141*4882a593Smuzhiyun netdev_dbg(vinfo->netdev, format, ## arg) 142*4882a593Smuzhiyun #define v_err(format, arg...) \ 143*4882a593Smuzhiyun netdev_err(vinfo->netdev, format, ## arg) 144*4882a593Smuzhiyun #define v_info(format, arg...) \ 145*4882a593Smuzhiyun netdev_info(vinfo->netdev, format, ## arg) 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun /* vnic hfi1 internal functions */ 148*4882a593Smuzhiyun void hfi1_vnic_setup(struct hfi1_devdata *dd); 149*4882a593Smuzhiyun int hfi1_vnic_txreq_init(struct hfi1_devdata *dd); 150*4882a593Smuzhiyun void hfi1_vnic_txreq_deinit(struct hfi1_devdata *dd); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun void hfi1_vnic_bypass_rcv(struct hfi1_packet *packet); 153*4882a593Smuzhiyun void hfi1_vnic_sdma_init(struct hfi1_vnic_vport_info *vinfo); 154*4882a593Smuzhiyun bool hfi1_vnic_sdma_write_avail(struct hfi1_vnic_vport_info *vinfo, 155*4882a593Smuzhiyun u8 q_idx); 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* vnic rdma netdev operations */ 158*4882a593Smuzhiyun struct net_device *hfi1_vnic_alloc_rn(struct ib_device *device, 159*4882a593Smuzhiyun u8 port_num, 160*4882a593Smuzhiyun enum rdma_netdev_t type, 161*4882a593Smuzhiyun const char *name, 162*4882a593Smuzhiyun unsigned char name_assign_type, 163*4882a593Smuzhiyun void (*setup)(struct net_device *)); 164*4882a593Smuzhiyun int hfi1_vnic_send_dma(struct hfi1_devdata *dd, u8 q_idx, 165*4882a593Smuzhiyun struct hfi1_vnic_vport_info *vinfo, 166*4882a593Smuzhiyun struct sk_buff *skb, u64 pbc, u8 plen); 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun #endif /* _HFI1_VNIC_H */ 169