162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright(c) 2017 - 2020 Intel Corporation. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _OPA_VNIC_H 762306a36Sopenharmony_ci#define _OPA_VNIC_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* 1062306a36Sopenharmony_ci * This file contains Intel Omni-Path (OPA) Virtual Network Interface 1162306a36Sopenharmony_ci * Controller (VNIC) specific declarations. 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <rdma/ib_verbs.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* 16 header bytes + 2 reserved bytes */ 1762306a36Sopenharmony_ci#define OPA_VNIC_L2_HDR_LEN (16 + 2) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define OPA_VNIC_L4_HDR_LEN 2 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define OPA_VNIC_HDR_LEN (OPA_VNIC_L2_HDR_LEN + \ 2262306a36Sopenharmony_ci OPA_VNIC_L4_HDR_LEN) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define OPA_VNIC_L4_ETHR 0x78 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define OPA_VNIC_ICRC_LEN 4 2762306a36Sopenharmony_ci#define OPA_VNIC_TAIL_LEN 1 2862306a36Sopenharmony_ci#define OPA_VNIC_ICRC_TAIL_LEN (OPA_VNIC_ICRC_LEN + OPA_VNIC_TAIL_LEN) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define OPA_VNIC_SKB_MDATA_LEN 4 3162306a36Sopenharmony_ci#define OPA_VNIC_SKB_MDATA_ENCAP_ERR 0x1 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* opa vnic rdma netdev's private data structure */ 3462306a36Sopenharmony_cistruct opa_vnic_rdma_netdev { 3562306a36Sopenharmony_ci struct rdma_netdev rn; /* keep this first */ 3662306a36Sopenharmony_ci /* followed by device private data */ 3762306a36Sopenharmony_ci char *dev_priv[]; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic inline void *opa_vnic_priv(const struct net_device *dev) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci struct rdma_netdev *rn = netdev_priv(dev); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci return rn->clnt_priv; 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic inline void *opa_vnic_dev_priv(const struct net_device *dev) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci struct opa_vnic_rdma_netdev *oparn = netdev_priv(dev); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci return oparn->dev_priv; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* opa_vnic skb meta data structure */ 5562306a36Sopenharmony_cistruct opa_vnic_skb_mdata { 5662306a36Sopenharmony_ci u8 vl; 5762306a36Sopenharmony_ci u8 entropy; 5862306a36Sopenharmony_ci u8 flags; 5962306a36Sopenharmony_ci u8 rsvd; 6062306a36Sopenharmony_ci} __packed; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/* OPA VNIC group statistics */ 6362306a36Sopenharmony_cistruct opa_vnic_grp_stats { 6462306a36Sopenharmony_ci u64 unicast; 6562306a36Sopenharmony_ci u64 mcastbcast; 6662306a36Sopenharmony_ci u64 untagged; 6762306a36Sopenharmony_ci u64 vlan; 6862306a36Sopenharmony_ci u64 s_64; 6962306a36Sopenharmony_ci u64 s_65_127; 7062306a36Sopenharmony_ci u64 s_128_255; 7162306a36Sopenharmony_ci u64 s_256_511; 7262306a36Sopenharmony_ci u64 s_512_1023; 7362306a36Sopenharmony_ci u64 s_1024_1518; 7462306a36Sopenharmony_ci u64 s_1519_max; 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cistruct opa_vnic_stats { 7862306a36Sopenharmony_ci /* standard netdev statistics */ 7962306a36Sopenharmony_ci struct rtnl_link_stats64 netstats; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci /* OPA VNIC statistics */ 8262306a36Sopenharmony_ci struct opa_vnic_grp_stats tx_grp; 8362306a36Sopenharmony_ci struct opa_vnic_grp_stats rx_grp; 8462306a36Sopenharmony_ci u64 tx_dlid_zero; 8562306a36Sopenharmony_ci u64 tx_drop_state; 8662306a36Sopenharmony_ci u64 rx_drop_state; 8762306a36Sopenharmony_ci u64 rx_runt; 8862306a36Sopenharmony_ci u64 rx_oversize; 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistatic inline bool rdma_cap_opa_vnic(struct ib_device *device) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci return !!(device->attrs.kernel_cap_flags & IBK_RDMA_NETDEV_OPA); 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#endif /* _OPA_VNIC_H */ 97