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

verbs.h (13290B)


      1/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
      2/*
      3 * Copyright(c) 2015 - 2018 Intel Corporation.
      4 */
      5
      6#ifndef HFI1_VERBS_H
      7#define HFI1_VERBS_H
      8
      9#include <linux/types.h>
     10#include <linux/seqlock.h>
     11#include <linux/kernel.h>
     12#include <linux/interrupt.h>
     13#include <linux/kref.h>
     14#include <linux/workqueue.h>
     15#include <linux/kthread.h>
     16#include <linux/completion.h>
     17#include <linux/slab.h>
     18#include <rdma/ib_pack.h>
     19#include <rdma/ib_user_verbs.h>
     20#include <rdma/ib_mad.h>
     21#include <rdma/ib_hdrs.h>
     22#include <rdma/rdma_vt.h>
     23#include <rdma/rdmavt_qp.h>
     24#include <rdma/rdmavt_cq.h>
     25
     26struct hfi1_ctxtdata;
     27struct hfi1_pportdata;
     28struct hfi1_devdata;
     29struct hfi1_packet;
     30
     31#include "iowait.h"
     32#include "tid_rdma.h"
     33#include "opfn.h"
     34
     35#define HFI1_MAX_RDMA_ATOMIC     16
     36
     37/*
     38 * Increment this value if any changes that break userspace ABI
     39 * compatibility are made.
     40 */
     41#define HFI1_UVERBS_ABI_VERSION       2
     42
     43/* IB Performance Manager status values */
     44#define IB_PMA_SAMPLE_STATUS_DONE       0x00
     45#define IB_PMA_SAMPLE_STATUS_STARTED    0x01
     46#define IB_PMA_SAMPLE_STATUS_RUNNING    0x02
     47
     48/* Mandatory IB performance counter select values. */
     49#define IB_PMA_PORT_XMIT_DATA   cpu_to_be16(0x0001)
     50#define IB_PMA_PORT_RCV_DATA    cpu_to_be16(0x0002)
     51#define IB_PMA_PORT_XMIT_PKTS   cpu_to_be16(0x0003)
     52#define IB_PMA_PORT_RCV_PKTS    cpu_to_be16(0x0004)
     53#define IB_PMA_PORT_XMIT_WAIT   cpu_to_be16(0x0005)
     54
     55#define HFI1_VENDOR_IPG		cpu_to_be16(0xFFA0)
     56
     57#define IB_DEFAULT_GID_PREFIX	cpu_to_be64(0xfe80000000000000ULL)
     58#define OPA_BTH_MIG_REQ		BIT(31)
     59
     60#define RC_OP(x) IB_OPCODE_RC_##x
     61#define UC_OP(x) IB_OPCODE_UC_##x
     62
     63/* flags passed by hfi1_ib_rcv() */
     64enum {
     65	HFI1_HAS_GRH = (1 << 0),
     66};
     67
     68#define LRH_16B_BYTES (sizeof_field(struct hfi1_16b_header, lrh))
     69#define LRH_16B_DWORDS (LRH_16B_BYTES / sizeof(u32))
     70#define LRH_9B_BYTES (sizeof_field(struct ib_header, lrh))
     71#define LRH_9B_DWORDS (LRH_9B_BYTES / sizeof(u32))
     72
     73/* 24Bits for qpn, upper 8Bits reserved */
     74struct opa_16b_mgmt {
     75	__be32 dest_qpn;
     76	__be32 src_qpn;
     77};
     78
     79struct hfi1_16b_header {
     80	u32 lrh[4];
     81	union {
     82		struct {
     83			struct ib_grh grh;
     84			struct ib_other_headers oth;
     85		} l;
     86		struct ib_other_headers oth;
     87		struct opa_16b_mgmt mgmt;
     88	} u;
     89} __packed;
     90
     91struct hfi1_opa_header {
     92	union {
     93		struct ib_header ibh; /* 9B header */
     94		struct hfi1_16b_header opah; /* 16B header */
     95	};
     96	u8 hdr_type; /* 9B or 16B */
     97} __packed;
     98
     99struct hfi1_ahg_info {
    100	u32 ahgdesc[2];
    101	u16 tx_flags;
    102	u8 ahgcount;
    103	u8 ahgidx;
    104};
    105
    106struct hfi1_sdma_header {
    107	__le64 pbc;
    108	struct hfi1_opa_header hdr;
    109} __packed;
    110
    111/*
    112 * hfi1 specific data structures that will be hidden from rvt after the queue
    113 * pair is made common
    114 */
    115struct hfi1_qp_priv {
    116	struct hfi1_ahg_info *s_ahg;              /* ahg info for next header */
    117	struct sdma_engine *s_sde;                /* current sde */
    118	struct send_context *s_sendcontext;       /* current sendcontext */
    119	struct hfi1_ctxtdata *rcd;                /* QP's receive context */
    120	struct page **pages;                      /* for TID page scan */
    121	u32 tid_enqueue;                          /* saved when tid waited */
    122	u8 s_sc;		                  /* SC[0..4] for next packet */
    123	struct iowait s_iowait;
    124	struct timer_list s_tid_timer;            /* for timing tid wait */
    125	struct timer_list s_tid_retry_timer;      /* for timing tid ack */
    126	struct list_head tid_wait;                /* for queueing tid space */
    127	struct hfi1_opfn_data opfn;
    128	struct tid_flow_state flow_state;
    129	struct tid_rdma_qp_params tid_rdma;
    130	struct rvt_qp *owner;
    131	u16 s_running_pkt_size;
    132	u8 hdr_type; /* 9B or 16B */
    133	struct rvt_sge_state tid_ss;       /* SGE state pointer for 2nd leg */
    134	atomic_t n_requests;               /* # of TID RDMA requests in the */
    135					   /* queue */
    136	atomic_t n_tid_requests;            /* # of sent TID RDMA requests */
    137	unsigned long tid_timer_timeout_jiffies;
    138	unsigned long tid_retry_timeout_jiffies;
    139
    140	/* variables for the TID RDMA SE state machine */
    141	u8 s_state;
    142	u8 s_retry;
    143	u8 rnr_nak_state;       /* RNR NAK state */
    144	u8 s_nak_state;
    145	u32 s_nak_psn;
    146	u32 s_flags;
    147	u32 s_tid_cur;
    148	u32 s_tid_head;
    149	u32 s_tid_tail;
    150	u32 r_tid_head;     /* Most recently added TID RDMA request */
    151	u32 r_tid_tail;     /* the last completed TID RDMA request */
    152	u32 r_tid_ack;      /* the TID RDMA request to be ACK'ed */
    153	u32 r_tid_alloc;    /* Request for which we are allocating resources */
    154	u32 pending_tid_w_segs; /* Num of pending tid write segments */
    155	u32 pending_tid_w_resp; /* Num of pending tid write responses */
    156	u32 alloc_w_segs;       /* Number of segments for which write */
    157			       /* resources have been allocated for this QP */
    158
    159	/* For TID RDMA READ */
    160	u32 tid_r_reqs;         /* Num of tid reads requested */
    161	u32 tid_r_comp;         /* Num of tid reads completed */
    162	u32 pending_tid_r_segs; /* Num of pending tid read segments */
    163	u16 pkts_ps;            /* packets per segment */
    164	u8 timeout_shift;       /* account for number of packets per segment */
    165
    166	u32 r_next_psn_kdeth;
    167	u32 r_next_psn_kdeth_save;
    168	u32 s_resync_psn;
    169	u8 sync_pt;           /* Set when QP reaches sync point */
    170	u8 resync;
    171};
    172
    173#define HFI1_QP_WQE_INVALID   ((u32)-1)
    174
    175struct hfi1_swqe_priv {
    176	struct tid_rdma_request tid_req;
    177	struct rvt_sge_state ss;  /* Used for TID RDMA READ Request */
    178};
    179
    180struct hfi1_ack_priv {
    181	struct rvt_sge_state ss;               /* used for TID WRITE RESP */
    182	struct tid_rdma_request tid_req;
    183};
    184
    185/*
    186 * This structure is used to hold commonly lookedup and computed values during
    187 * the send engine progress.
    188 */
    189struct iowait_work;
    190struct hfi1_pkt_state {
    191	struct hfi1_ibdev *dev;
    192	struct hfi1_ibport *ibp;
    193	struct hfi1_pportdata *ppd;
    194	struct verbs_txreq *s_txreq;
    195	struct iowait_work *wait;
    196	unsigned long flags;
    197	unsigned long timeout;
    198	unsigned long timeout_int;
    199	int cpu;
    200	u8 opcode;
    201	bool in_thread;
    202	bool pkts_sent;
    203};
    204
    205#define HFI1_PSN_CREDIT  16
    206
    207struct hfi1_opcode_stats {
    208	u64 n_packets;          /* number of packets */
    209	u64 n_bytes;            /* total number of bytes */
    210};
    211
    212struct hfi1_opcode_stats_perctx {
    213	struct hfi1_opcode_stats stats[256];
    214};
    215
    216static inline void inc_opstats(
    217	u32 tlen,
    218	struct hfi1_opcode_stats *stats)
    219{
    220#ifdef CONFIG_DEBUG_FS
    221	stats->n_bytes += tlen;
    222	stats->n_packets++;
    223#endif
    224}
    225
    226struct hfi1_ibport {
    227	struct rvt_qp __rcu *qp[2];
    228	struct rvt_ibport rvp;
    229
    230	/* the first 16 entries are sl_to_vl for !OPA */
    231	u8 sl_to_sc[32];
    232	u8 sc_to_sl[32];
    233};
    234
    235struct hfi1_ibdev {
    236	struct rvt_dev_info rdi; /* Must be first */
    237
    238	/* QP numbers are shared by all IB ports */
    239	/* protect txwait list */
    240	seqlock_t txwait_lock ____cacheline_aligned_in_smp;
    241	struct list_head txwait;        /* list for wait verbs_txreq */
    242	struct list_head memwait;       /* list for wait kernel memory */
    243	struct kmem_cache *verbs_txreq_cache;
    244	u64 n_txwait;
    245	u64 n_kmem_wait;
    246	u64 n_tidwait;
    247
    248	/* protect iowait lists */
    249	seqlock_t iowait_lock ____cacheline_aligned_in_smp;
    250	u64 n_piowait;
    251	u64 n_piodrain;
    252	struct timer_list mem_timer;
    253
    254#ifdef CONFIG_DEBUG_FS
    255	/* per HFI debugfs */
    256	struct dentry *hfi1_ibdev_dbg;
    257	/* per HFI symlinks to above */
    258	struct dentry *hfi1_ibdev_link;
    259#ifdef CONFIG_FAULT_INJECTION
    260	struct fault *fault;
    261#endif
    262#endif
    263};
    264
    265static inline struct hfi1_ibdev *to_idev(struct ib_device *ibdev)
    266{
    267	struct rvt_dev_info *rdi;
    268
    269	rdi = container_of(ibdev, struct rvt_dev_info, ibdev);
    270	return container_of(rdi, struct hfi1_ibdev, rdi);
    271}
    272
    273static inline struct rvt_qp *iowait_to_qp(struct iowait *s_iowait)
    274{
    275	struct hfi1_qp_priv *priv;
    276
    277	priv = container_of(s_iowait, struct hfi1_qp_priv, s_iowait);
    278	return priv->owner;
    279}
    280
    281/*
    282 * This must be called with s_lock held.
    283 */
    284void hfi1_bad_pkey(struct hfi1_ibport *ibp, u32 key, u32 sl,
    285		   u32 qp1, u32 qp2, u32 lid1, u32 lid2);
    286void hfi1_cap_mask_chg(struct rvt_dev_info *rdi, u32 port_num);
    287void hfi1_sys_guid_chg(struct hfi1_ibport *ibp);
    288void hfi1_node_desc_chg(struct hfi1_ibport *ibp);
    289int hfi1_process_mad(struct ib_device *ibdev, int mad_flags, u32 port,
    290		     const struct ib_wc *in_wc, const struct ib_grh *in_grh,
    291		     const struct ib_mad *in_mad, struct ib_mad *out_mad,
    292		     size_t *out_mad_size, u16 *out_mad_pkey_index);
    293
    294/*
    295 * The PSN_MASK and PSN_SHIFT allow for
    296 * 1) comparing two PSNs
    297 * 2) returning the PSN with any upper bits masked
    298 * 3) returning the difference between to PSNs
    299 *
    300 * The number of significant bits in the PSN must
    301 * necessarily be at least one bit less than
    302 * the container holding the PSN.
    303 */
    304#define PSN_MASK 0x7FFFFFFF
    305#define PSN_SHIFT 1
    306#define PSN_MODIFY_MASK 0xFFFFFF
    307
    308/*
    309 * Compare two PSNs
    310 * Returns an integer <, ==, or > than zero.
    311 */
    312static inline int cmp_psn(u32 a, u32 b)
    313{
    314	return (((int)a) - ((int)b)) << PSN_SHIFT;
    315}
    316
    317/*
    318 * Return masked PSN
    319 */
    320static inline u32 mask_psn(u32 a)
    321{
    322	return a & PSN_MASK;
    323}
    324
    325/*
    326 * Return delta between two PSNs
    327 */
    328static inline u32 delta_psn(u32 a, u32 b)
    329{
    330	return (((int)a - (int)b) << PSN_SHIFT) >> PSN_SHIFT;
    331}
    332
    333static inline struct tid_rdma_request *wqe_to_tid_req(struct rvt_swqe *wqe)
    334{
    335	return &((struct hfi1_swqe_priv *)wqe->priv)->tid_req;
    336}
    337
    338static inline struct tid_rdma_request *ack_to_tid_req(struct rvt_ack_entry *e)
    339{
    340	return &((struct hfi1_ack_priv *)e->priv)->tid_req;
    341}
    342
    343/*
    344 * Look through all the active flows for a TID RDMA request and find
    345 * the one (if it exists) that contains the specified PSN.
    346 */
    347static inline u32 __full_flow_psn(struct flow_state *state, u32 psn)
    348{
    349	return mask_psn((state->generation << HFI1_KDETH_BTH_SEQ_SHIFT) |
    350			(psn & HFI1_KDETH_BTH_SEQ_MASK));
    351}
    352
    353static inline u32 full_flow_psn(struct tid_rdma_flow *flow, u32 psn)
    354{
    355	return __full_flow_psn(&flow->flow_state, psn);
    356}
    357
    358struct verbs_txreq;
    359void hfi1_put_txreq(struct verbs_txreq *tx);
    360
    361int hfi1_verbs_send(struct rvt_qp *qp, struct hfi1_pkt_state *ps);
    362
    363void hfi1_cnp_rcv(struct hfi1_packet *packet);
    364
    365void hfi1_uc_rcv(struct hfi1_packet *packet);
    366
    367void hfi1_rc_rcv(struct hfi1_packet *packet);
    368
    369void hfi1_rc_hdrerr(
    370	struct hfi1_ctxtdata *rcd,
    371	struct hfi1_packet *packet,
    372	struct rvt_qp *qp);
    373
    374u8 ah_to_sc(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr);
    375
    376void hfi1_rc_verbs_aborted(struct rvt_qp *qp, struct hfi1_opa_header *opah);
    377void hfi1_rc_send_complete(struct rvt_qp *qp, struct hfi1_opa_header *opah);
    378
    379void hfi1_ud_rcv(struct hfi1_packet *packet);
    380
    381int hfi1_lookup_pkey_idx(struct hfi1_ibport *ibp, u16 pkey);
    382
    383void hfi1_migrate_qp(struct rvt_qp *qp);
    384
    385int hfi1_check_modify_qp(struct rvt_qp *qp, struct ib_qp_attr *attr,
    386			 int attr_mask, struct ib_udata *udata);
    387
    388void hfi1_modify_qp(struct rvt_qp *qp, struct ib_qp_attr *attr,
    389		    int attr_mask, struct ib_udata *udata);
    390void hfi1_restart_rc(struct rvt_qp *qp, u32 psn, int wait);
    391int hfi1_setup_wqe(struct rvt_qp *qp, struct rvt_swqe *wqe,
    392		   bool *call_send);
    393
    394extern const u32 rc_only_opcode;
    395extern const u32 uc_only_opcode;
    396
    397int hfi1_ruc_check_hdr(struct hfi1_ibport *ibp, struct hfi1_packet *packet);
    398
    399u32 hfi1_make_grh(struct hfi1_ibport *ibp, struct ib_grh *hdr,
    400		  const struct ib_global_route *grh, u32 hwords, u32 nwords);
    401
    402void hfi1_make_ruc_header(struct rvt_qp *qp, struct ib_other_headers *ohdr,
    403			  u32 bth0, u32 bth1, u32 bth2, int middle,
    404			  struct hfi1_pkt_state *ps);
    405
    406bool hfi1_schedule_send_yield(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
    407			      bool tid);
    408
    409void _hfi1_do_send(struct work_struct *work);
    410
    411void hfi1_do_send_from_rvt(struct rvt_qp *qp);
    412
    413void hfi1_do_send(struct rvt_qp *qp, bool in_thread);
    414
    415void hfi1_send_rc_ack(struct hfi1_packet *packet, bool is_fecn);
    416
    417int hfi1_make_rc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps);
    418
    419int hfi1_make_uc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps);
    420
    421int hfi1_make_ud_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps);
    422
    423int hfi1_register_ib_device(struct hfi1_devdata *);
    424
    425void hfi1_unregister_ib_device(struct hfi1_devdata *);
    426
    427void hfi1_kdeth_eager_rcv(struct hfi1_packet *packet);
    428
    429void hfi1_kdeth_expected_rcv(struct hfi1_packet *packet);
    430
    431void hfi1_ib_rcv(struct hfi1_packet *packet);
    432
    433void hfi1_16B_rcv(struct hfi1_packet *packet);
    434
    435unsigned hfi1_get_npkeys(struct hfi1_devdata *);
    436
    437int hfi1_verbs_send_dma(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
    438			u64 pbc);
    439
    440int hfi1_verbs_send_pio(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
    441			u64 pbc);
    442
    443static inline bool opa_bth_is_migration(struct ib_other_headers *ohdr)
    444{
    445	return ohdr->bth[1] & cpu_to_be32(OPA_BTH_MIG_REQ);
    446}
    447
    448void hfi1_wait_kmem(struct rvt_qp *qp);
    449
    450static inline void hfi1_trdma_send_complete(struct rvt_qp *qp,
    451					    struct rvt_swqe *wqe,
    452					    enum ib_wc_status status)
    453{
    454	trdma_clean_swqe(qp, wqe);
    455	rvt_send_complete(qp, wqe, status);
    456}
    457
    458extern const enum ib_wc_opcode ib_hfi1_wc_opcode[];
    459
    460extern const u8 hdr_len_by_opcode[];
    461
    462extern const int ib_rvt_state_ops[];
    463
    464extern __be64 ib_hfi1_sys_image_guid;    /* in network order */
    465
    466extern unsigned int hfi1_max_cqes;
    467
    468extern unsigned int hfi1_max_cqs;
    469
    470extern unsigned int hfi1_max_qp_wrs;
    471
    472extern unsigned int hfi1_max_qps;
    473
    474extern unsigned int hfi1_max_sges;
    475
    476extern unsigned int hfi1_max_mcast_grps;
    477
    478extern unsigned int hfi1_max_mcast_qp_attached;
    479
    480extern unsigned int hfi1_max_srqs;
    481
    482extern unsigned int hfi1_max_srq_sges;
    483
    484extern unsigned int hfi1_max_srq_wrs;
    485
    486extern unsigned short piothreshold;
    487
    488extern const u32 ib_hfi1_rnr_table[];
    489
    490#endif                          /* HFI1_VERBS_H */