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