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 _HFI1_VNIC_H
762306a36Sopenharmony_ci#define _HFI1_VNIC_H
862306a36Sopenharmony_ci#include <rdma/opa_vnic.h>
962306a36Sopenharmony_ci#include "hfi.h"
1062306a36Sopenharmony_ci#include "sdma.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define HFI1_VNIC_MAX_TXQ     16
1362306a36Sopenharmony_ci#define HFI1_VNIC_MAX_PAD     12
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* L4 header definitions */
1662306a36Sopenharmony_ci#define HFI1_VNIC_L4_HDR_OFFSET  OPA_VNIC_L2_HDR_LEN
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define HFI1_VNIC_GET_L4_HDR(data)   \
1962306a36Sopenharmony_ci	(*((u16 *)((u8 *)(data) + HFI1_VNIC_L4_HDR_OFFSET)))
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define HFI1_VNIC_GET_VESWID(data)   \
2262306a36Sopenharmony_ci	(HFI1_VNIC_GET_L4_HDR(data) & 0xFFF)
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* Service class */
2562306a36Sopenharmony_ci#define HFI1_VNIC_SC_OFFSET_LOW 6
2662306a36Sopenharmony_ci#define HFI1_VNIC_SC_OFFSET_HI  7
2762306a36Sopenharmony_ci#define HFI1_VNIC_SC_SHIFT      4
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define HFI1_VNIC_MAX_QUEUE 16
3062306a36Sopenharmony_ci#define HFI1_NUM_VNIC_CTXT 8
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/**
3362306a36Sopenharmony_ci * struct hfi1_vnic_sdma - VNIC per Tx ring SDMA information
3462306a36Sopenharmony_ci * @dd - device data pointer
3562306a36Sopenharmony_ci * @sde - sdma engine
3662306a36Sopenharmony_ci * @vinfo - vnic info pointer
3762306a36Sopenharmony_ci * @wait - iowait structure
3862306a36Sopenharmony_ci * @stx - sdma tx request
3962306a36Sopenharmony_ci * @state - vnic Tx ring SDMA state
4062306a36Sopenharmony_ci * @q_idx - vnic Tx queue index
4162306a36Sopenharmony_ci */
4262306a36Sopenharmony_cistruct hfi1_vnic_sdma {
4362306a36Sopenharmony_ci	struct hfi1_devdata *dd;
4462306a36Sopenharmony_ci	struct sdma_engine  *sde;
4562306a36Sopenharmony_ci	struct hfi1_vnic_vport_info *vinfo;
4662306a36Sopenharmony_ci	struct iowait wait;
4762306a36Sopenharmony_ci	struct sdma_txreq stx;
4862306a36Sopenharmony_ci	unsigned int state;
4962306a36Sopenharmony_ci	u8 q_idx;
5062306a36Sopenharmony_ci	bool pkts_sent;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/**
5462306a36Sopenharmony_ci * struct hfi1_vnic_rx_queue - HFI1 VNIC receive queue
5562306a36Sopenharmony_ci * @idx: queue index
5662306a36Sopenharmony_ci * @vinfo: pointer to vport information
5762306a36Sopenharmony_ci * @netdev: network device
5862306a36Sopenharmony_ci * @napi: netdev napi structure
5962306a36Sopenharmony_ci * @skbq: queue of received socket buffers
6062306a36Sopenharmony_ci */
6162306a36Sopenharmony_cistruct hfi1_vnic_rx_queue {
6262306a36Sopenharmony_ci	u8                           idx;
6362306a36Sopenharmony_ci	struct hfi1_vnic_vport_info *vinfo;
6462306a36Sopenharmony_ci	struct net_device           *netdev;
6562306a36Sopenharmony_ci	struct napi_struct           napi;
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/**
6962306a36Sopenharmony_ci * struct hfi1_vnic_vport_info - HFI1 VNIC virtual port information
7062306a36Sopenharmony_ci * @dd: device data pointer
7162306a36Sopenharmony_ci * @netdev: net device pointer
7262306a36Sopenharmony_ci * @flags: state flags
7362306a36Sopenharmony_ci * @lock: vport lock
7462306a36Sopenharmony_ci * @num_tx_q: number of transmit queues
7562306a36Sopenharmony_ci * @num_rx_q: number of receive queues
7662306a36Sopenharmony_ci * @vesw_id: virtual switch id
7762306a36Sopenharmony_ci * @rxq: Array of receive queues
7862306a36Sopenharmony_ci * @stats: per queue stats
7962306a36Sopenharmony_ci * @sdma: VNIC SDMA structure per TXQ
8062306a36Sopenharmony_ci */
8162306a36Sopenharmony_cistruct hfi1_vnic_vport_info {
8262306a36Sopenharmony_ci	struct hfi1_devdata *dd;
8362306a36Sopenharmony_ci	struct net_device   *netdev;
8462306a36Sopenharmony_ci	unsigned long        flags;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	/* Lock used around state updates */
8762306a36Sopenharmony_ci	struct mutex         lock;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	u8  num_tx_q;
9062306a36Sopenharmony_ci	u8  num_rx_q;
9162306a36Sopenharmony_ci	u16 vesw_id;
9262306a36Sopenharmony_ci	struct hfi1_vnic_rx_queue rxq[HFI1_NUM_VNIC_CTXT];
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	struct opa_vnic_stats  stats[HFI1_VNIC_MAX_QUEUE];
9562306a36Sopenharmony_ci	struct hfi1_vnic_sdma  sdma[HFI1_VNIC_MAX_TXQ];
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci#define v_dbg(format, arg...) \
9962306a36Sopenharmony_ci	netdev_dbg(vinfo->netdev, format, ## arg)
10062306a36Sopenharmony_ci#define v_err(format, arg...) \
10162306a36Sopenharmony_ci	netdev_err(vinfo->netdev, format, ## arg)
10262306a36Sopenharmony_ci#define v_info(format, arg...) \
10362306a36Sopenharmony_ci	netdev_info(vinfo->netdev, format, ## arg)
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci/* vnic hfi1 internal functions */
10662306a36Sopenharmony_civoid hfi1_vnic_setup(struct hfi1_devdata *dd);
10762306a36Sopenharmony_ciint hfi1_vnic_txreq_init(struct hfi1_devdata *dd);
10862306a36Sopenharmony_civoid hfi1_vnic_txreq_deinit(struct hfi1_devdata *dd);
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_civoid hfi1_vnic_bypass_rcv(struct hfi1_packet *packet);
11162306a36Sopenharmony_civoid hfi1_vnic_sdma_init(struct hfi1_vnic_vport_info *vinfo);
11262306a36Sopenharmony_cibool hfi1_vnic_sdma_write_avail(struct hfi1_vnic_vport_info *vinfo,
11362306a36Sopenharmony_ci				u8 q_idx);
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* vnic rdma netdev operations */
11662306a36Sopenharmony_cistruct net_device *hfi1_vnic_alloc_rn(struct ib_device *device,
11762306a36Sopenharmony_ci				      u32 port_num,
11862306a36Sopenharmony_ci				      enum rdma_netdev_t type,
11962306a36Sopenharmony_ci				      const char *name,
12062306a36Sopenharmony_ci				      unsigned char name_assign_type,
12162306a36Sopenharmony_ci				      void (*setup)(struct net_device *));
12262306a36Sopenharmony_ciint hfi1_vnic_send_dma(struct hfi1_devdata *dd, u8 q_idx,
12362306a36Sopenharmony_ci		       struct hfi1_vnic_vport_info *vinfo,
12462306a36Sopenharmony_ci		       struct sk_buff *skb, u64 pbc, u8 plen);
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci#endif /* _HFI1_VNIC_H */
127