cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vnic.h (3450B)


      1/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
      2/*
      3 * Copyright(c) 2017 - 2020 Intel Corporation.
      4 */
      5
      6#ifndef _HFI1_VNIC_H
      7#define _HFI1_VNIC_H
      8#include <rdma/opa_vnic.h>
      9#include "hfi.h"
     10#include "sdma.h"
     11
     12#define HFI1_VNIC_MAX_TXQ     16
     13#define HFI1_VNIC_MAX_PAD     12
     14
     15/* L4 header definitions */
     16#define HFI1_VNIC_L4_HDR_OFFSET  OPA_VNIC_L2_HDR_LEN
     17
     18#define HFI1_VNIC_GET_L4_HDR(data)   \
     19	(*((u16 *)((u8 *)(data) + HFI1_VNIC_L4_HDR_OFFSET)))
     20
     21#define HFI1_VNIC_GET_VESWID(data)   \
     22	(HFI1_VNIC_GET_L4_HDR(data) & 0xFFF)
     23
     24/* Service class */
     25#define HFI1_VNIC_SC_OFFSET_LOW 6
     26#define HFI1_VNIC_SC_OFFSET_HI  7
     27#define HFI1_VNIC_SC_SHIFT      4
     28
     29#define HFI1_VNIC_MAX_QUEUE 16
     30#define HFI1_NUM_VNIC_CTXT 8
     31
     32/**
     33 * struct hfi1_vnic_sdma - VNIC per Tx ring SDMA information
     34 * @dd - device data pointer
     35 * @sde - sdma engine
     36 * @vinfo - vnic info pointer
     37 * @wait - iowait structure
     38 * @stx - sdma tx request
     39 * @state - vnic Tx ring SDMA state
     40 * @q_idx - vnic Tx queue index
     41 */
     42struct hfi1_vnic_sdma {
     43	struct hfi1_devdata *dd;
     44	struct sdma_engine  *sde;
     45	struct hfi1_vnic_vport_info *vinfo;
     46	struct iowait wait;
     47	struct sdma_txreq stx;
     48	unsigned int state;
     49	u8 q_idx;
     50	bool pkts_sent;
     51};
     52
     53/**
     54 * struct hfi1_vnic_rx_queue - HFI1 VNIC receive queue
     55 * @idx: queue index
     56 * @vinfo: pointer to vport information
     57 * @netdev: network device
     58 * @napi: netdev napi structure
     59 * @skbq: queue of received socket buffers
     60 */
     61struct hfi1_vnic_rx_queue {
     62	u8                           idx;
     63	struct hfi1_vnic_vport_info *vinfo;
     64	struct net_device           *netdev;
     65	struct napi_struct           napi;
     66};
     67
     68/**
     69 * struct hfi1_vnic_vport_info - HFI1 VNIC virtual port information
     70 * @dd: device data pointer
     71 * @netdev: net device pointer
     72 * @flags: state flags
     73 * @lock: vport lock
     74 * @num_tx_q: number of transmit queues
     75 * @num_rx_q: number of receive queues
     76 * @vesw_id: virtual switch id
     77 * @rxq: Array of receive queues
     78 * @stats: per queue stats
     79 * @sdma: VNIC SDMA structure per TXQ
     80 */
     81struct hfi1_vnic_vport_info {
     82	struct hfi1_devdata *dd;
     83	struct net_device   *netdev;
     84	unsigned long        flags;
     85
     86	/* Lock used around state updates */
     87	struct mutex         lock;
     88
     89	u8  num_tx_q;
     90	u8  num_rx_q;
     91	u16 vesw_id;
     92	struct hfi1_vnic_rx_queue rxq[HFI1_NUM_VNIC_CTXT];
     93
     94	struct opa_vnic_stats  stats[HFI1_VNIC_MAX_QUEUE];
     95	struct hfi1_vnic_sdma  sdma[HFI1_VNIC_MAX_TXQ];
     96};
     97
     98#define v_dbg(format, arg...) \
     99	netdev_dbg(vinfo->netdev, format, ## arg)
    100#define v_err(format, arg...) \
    101	netdev_err(vinfo->netdev, format, ## arg)
    102#define v_info(format, arg...) \
    103	netdev_info(vinfo->netdev, format, ## arg)
    104
    105/* vnic hfi1 internal functions */
    106void hfi1_vnic_setup(struct hfi1_devdata *dd);
    107int hfi1_vnic_txreq_init(struct hfi1_devdata *dd);
    108void hfi1_vnic_txreq_deinit(struct hfi1_devdata *dd);
    109
    110void hfi1_vnic_bypass_rcv(struct hfi1_packet *packet);
    111void hfi1_vnic_sdma_init(struct hfi1_vnic_vport_info *vinfo);
    112bool hfi1_vnic_sdma_write_avail(struct hfi1_vnic_vport_info *vinfo,
    113				u8 q_idx);
    114
    115/* vnic rdma netdev operations */
    116struct net_device *hfi1_vnic_alloc_rn(struct ib_device *device,
    117				      u32 port_num,
    118				      enum rdma_netdev_t type,
    119				      const char *name,
    120				      unsigned char name_assign_type,
    121				      void (*setup)(struct net_device *));
    122int hfi1_vnic_send_dma(struct hfi1_devdata *dd, u8 q_idx,
    123		       struct hfi1_vnic_vport_info *vinfo,
    124		       struct sk_buff *skb, u64 pbc, u8 plen);
    125
    126#endif /* _HFI1_VNIC_H */