verbs.h 12.8 KB
Newer Older
M
Mike Marciniszyn 已提交
1
/*
2
 * Copyright(c) 2015 - 2018 Intel Corporation.
M
Mike Marciniszyn 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
 *
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
 *
 * GPL LICENSE SUMMARY
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * BSD LICENSE
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  - Neither the name of Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef HFI1_VERBS_H
#define HFI1_VERBS_H

#include <linux/types.h>
#include <linux/seqlock.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/kref.h>
#include <linux/workqueue.h>
#include <linux/kthread.h>
#include <linux/completion.h>
59
#include <linux/slab.h>
M
Mike Marciniszyn 已提交
60 61 62
#include <rdma/ib_pack.h>
#include <rdma/ib_user_verbs.h>
#include <rdma/ib_mad.h>
63
#include <rdma/ib_hdrs.h>
64
#include <rdma/rdma_vt.h>
65
#include <rdma/rdmavt_qp.h>
66
#include <rdma/rdmavt_cq.h>
M
Mike Marciniszyn 已提交
67 68 69 70 71 72 73

struct hfi1_ctxtdata;
struct hfi1_pportdata;
struct hfi1_devdata;
struct hfi1_packet;

#include "iowait.h"
74
#include "tid_rdma.h"
75
#include "opfn.h"
M
Mike Marciniszyn 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

#define HFI1_MAX_RDMA_ATOMIC     16

/*
 * Increment this value if any changes that break userspace ABI
 * compatibility are made.
 */
#define HFI1_UVERBS_ABI_VERSION       2

/* IB Performance Manager status values */
#define IB_PMA_SAMPLE_STATUS_DONE       0x00
#define IB_PMA_SAMPLE_STATUS_STARTED    0x01
#define IB_PMA_SAMPLE_STATUS_RUNNING    0x02

/* Mandatory IB performance counter select values. */
#define IB_PMA_PORT_XMIT_DATA   cpu_to_be16(0x0001)
#define IB_PMA_PORT_RCV_DATA    cpu_to_be16(0x0002)
#define IB_PMA_PORT_XMIT_PKTS   cpu_to_be16(0x0003)
#define IB_PMA_PORT_RCV_PKTS    cpu_to_be16(0x0004)
#define IB_PMA_PORT_XMIT_WAIT   cpu_to_be16(0x0005)

#define HFI1_VENDOR_IPG		cpu_to_be16(0xFFA0)

#define IB_DEFAULT_GID_PREFIX	cpu_to_be64(0xfe80000000000000ULL)
100
#define OPA_BTH_MIG_REQ		BIT(31)
M
Mike Marciniszyn 已提交
101

102 103 104
#define RC_OP(x) IB_OPCODE_RC_##x
#define UC_OP(x) IB_OPCODE_UC_##x

M
Mike Marciniszyn 已提交
105 106 107 108 109
/* flags passed by hfi1_ib_rcv() */
enum {
	HFI1_HAS_GRH = (1 << 0),
};

110 111 112 113 114
#define LRH_16B_BYTES (FIELD_SIZEOF(struct hfi1_16b_header, lrh))
#define LRH_16B_DWORDS (LRH_16B_BYTES / sizeof(u32))
#define LRH_9B_BYTES (FIELD_SIZEOF(struct ib_header, lrh))
#define LRH_9B_DWORDS (LRH_9B_BYTES / sizeof(u32))

115 116 117 118 119 120
/* 24Bits for qpn, upper 8Bits reserved */
struct opa_16b_mgmt {
	__be32 dest_qpn;
	__be32 src_qpn;
};

121 122 123 124 125 126 127 128
struct hfi1_16b_header {
	u32 lrh[4];
	union {
		struct {
			struct ib_grh grh;
			struct ib_other_headers oth;
		} l;
		struct ib_other_headers oth;
129
		struct opa_16b_mgmt mgmt;
130 131 132
	} u;
} __packed;

133 134 135 136 137 138 139 140
struct hfi1_opa_header {
	union {
		struct ib_header ibh; /* 9B header */
		struct hfi1_16b_header opah; /* 16B header */
	};
	u8 hdr_type; /* 9B or 16B */
} __packed;

141
struct hfi1_ahg_info {
M
Mike Marciniszyn 已提交
142 143 144 145 146 147
	u32 ahgdesc[2];
	u16 tx_flags;
	u8 ahgcount;
	u8 ahgidx;
};

148
struct hfi1_sdma_header {
M
Mike Marciniszyn 已提交
149
	__le64 pbc;
150
	struct hfi1_opa_header hdr;
M
Mike Marciniszyn 已提交
151 152
} __packed;

153 154 155 156 157
/*
 * hfi1 specific data structures that will be hidden from rvt after the queue
 * pair is made common
 */
struct hfi1_qp_priv {
158
	struct hfi1_ahg_info *s_ahg;              /* ahg info for next header */
159 160
	struct sdma_engine *s_sde;                /* current sde */
	struct send_context *s_sendcontext;       /* current sendcontext */
161
	struct hfi1_ctxtdata *rcd;                /* QP's receive context */
162
	struct page **pages;                      /* for TID page scan */
K
Kaike Wan 已提交
163
	u32 tid_enqueue;                          /* saved when tid waited */
164
	u8 s_sc;		                  /* SC[0..4] for next packet */
165
	struct iowait s_iowait;
K
Kaike Wan 已提交
166
	struct list_head tid_wait;                /* for queueing tid space */
167
	struct hfi1_opfn_data opfn;
K
Kaike Wan 已提交
168
	struct tid_flow_state flow_state;
169
	struct tid_rdma_qp_params tid_rdma;
170
	struct rvt_qp *owner;
171
	u8 hdr_type; /* 9B or 16B */
172 173 174
	unsigned long tid_timer_timeout_jiffies;
	u16 pkts_ps;            /* packets per segment */
	u8 timeout_shift;       /* account for number of packets per segment */
M
Mike Marciniszyn 已提交
175 176
};

177 178 179 180 181 182 183 184
struct hfi1_swqe_priv {
	struct tid_rdma_request tid_req;
};

struct hfi1_ack_priv {
	struct tid_rdma_request tid_req;
};

185 186 187 188
/*
 * This structure is used to hold commonly lookedup and computed values during
 * the send engine progress.
 */
189
struct iowait_work;
190 191 192 193
struct hfi1_pkt_state {
	struct hfi1_ibdev *dev;
	struct hfi1_ibport *ibp;
	struct hfi1_pportdata *ppd;
194
	struct verbs_txreq *s_txreq;
195
	struct iowait_work *wait;
196
	unsigned long flags;
197 198 199
	unsigned long timeout;
	unsigned long timeout_int;
	int cpu;
200
	u8 opcode;
201
	bool in_thread;
202
	bool pkts_sent;
203 204
};

M
Mike Marciniszyn 已提交
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
#define HFI1_PSN_CREDIT  16

struct hfi1_opcode_stats {
	u64 n_packets;          /* number of packets */
	u64 n_bytes;            /* total number of bytes */
};

struct hfi1_opcode_stats_perctx {
	struct hfi1_opcode_stats stats[256];
};

static inline void inc_opstats(
	u32 tlen,
	struct hfi1_opcode_stats *stats)
{
#ifdef CONFIG_DEBUG_FS
	stats->n_bytes += tlen;
	stats->n_packets++;
#endif
}

struct hfi1_ibport {
227
	struct rvt_qp __rcu *qp[2];
228 229
	struct rvt_ibport rvp;

M
Mike Marciniszyn 已提交
230 231 232 233 234 235
	/* the first 16 entries are sl_to_vl for !OPA */
	u8 sl_to_sc[32];
	u8 sc_to_sl[32];
};

struct hfi1_ibdev {
236
	struct rvt_dev_info rdi; /* Must be first */
M
Mike Marciniszyn 已提交
237 238

	/* QP numbers are shared by all IB ports */
239 240
	/* protect txwait list */
	seqlock_t txwait_lock ____cacheline_aligned_in_smp;
M
Mike Marciniszyn 已提交
241 242 243
	struct list_head txwait;        /* list for wait verbs_txreq */
	struct list_head memwait;       /* list for wait kernel memory */
	struct kmem_cache *verbs_txreq_cache;
244 245
	u64 n_txwait;
	u64 n_kmem_wait;
M
Mike Marciniszyn 已提交
246

247 248
	/* protect iowait lists */
	seqlock_t iowait_lock ____cacheline_aligned_in_smp;
M
Mike Marciniszyn 已提交
249
	u64 n_piowait;
250
	u64 n_piodrain;
251
	struct timer_list mem_timer;
M
Mike Marciniszyn 已提交
252 253 254 255 256 257

#ifdef CONFIG_DEBUG_FS
	/* per HFI debugfs */
	struct dentry *hfi1_ibdev_dbg;
	/* per HFI symlinks to above */
	struct dentry *hfi1_ibdev_link;
258
#ifdef CONFIG_FAULT_INJECTION
259
	struct fault *fault;
260
#endif
M
Mike Marciniszyn 已提交
261 262 263 264 265
#endif
};

static inline struct hfi1_ibdev *to_idev(struct ib_device *ibdev)
{
266 267 268 269
	struct rvt_dev_info *rdi;

	rdi = container_of(ibdev, struct rvt_dev_info, ibdev);
	return container_of(rdi, struct hfi1_ibdev, rdi);
M
Mike Marciniszyn 已提交
270 271
}

272
static inline struct rvt_qp *iowait_to_qp(struct iowait *s_iowait)
273 274 275 276 277 278 279
{
	struct hfi1_qp_priv *priv;

	priv = container_of(s_iowait, struct hfi1_qp_priv, s_iowait);
	return priv->owner;
}

M
Mike Marciniszyn 已提交
280 281 282
/*
 * This must be called with s_lock held.
 */
283
void hfi1_bad_pkey(struct hfi1_ibport *ibp, u32 key, u32 sl,
D
Don Hiatt 已提交
284
		   u32 qp1, u32 qp2, u32 lid1, u32 lid2);
285
void hfi1_cap_mask_chg(struct rvt_dev_info *rdi, u8 port_num);
M
Mike Marciniszyn 已提交
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
void hfi1_sys_guid_chg(struct hfi1_ibport *ibp);
void hfi1_node_desc_chg(struct hfi1_ibport *ibp);
int hfi1_process_mad(struct ib_device *ibdev, int mad_flags, u8 port,
		     const struct ib_wc *in_wc, const struct ib_grh *in_grh,
		     const struct ib_mad_hdr *in_mad, size_t in_mad_size,
		     struct ib_mad_hdr *out_mad, size_t *out_mad_size,
		     u16 *out_mad_pkey_index);

/*
 * The PSN_MASK and PSN_SHIFT allow for
 * 1) comparing two PSNs
 * 2) returning the PSN with any upper bits masked
 * 3) returning the difference between to PSNs
 *
 * The number of significant bits in the PSN must
 * necessarily be at least one bit less than
 * the container holding the PSN.
 */
#define PSN_MASK 0x7FFFFFFF
#define PSN_SHIFT 1
#define PSN_MODIFY_MASK 0xFFFFFF

/*
 * Compare two PSNs
 * Returns an integer <, ==, or > than zero.
 */
static inline int cmp_psn(u32 a, u32 b)
{
314
	return (((int)a) - ((int)b)) << PSN_SHIFT;
M
Mike Marciniszyn 已提交
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
}

/*
 * Return masked PSN
 */
static inline u32 mask_psn(u32 a)
{
	return a & PSN_MASK;
}

/*
 * Return delta between two PSNs
 */
static inline u32 delta_psn(u32 a, u32 b)
{
	return (((int)a - (int)b) << PSN_SHIFT) >> PSN_SHIFT;
}

333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
/*
 * Look through all the active flows for a TID RDMA request and find
 * the one (if it exists) that contains the specified PSN.
 */
static inline u32 __full_flow_psn(struct flow_state *state, u32 psn)
{
	return mask_psn((state->generation << HFI1_KDETH_BTH_SEQ_SHIFT) |
			(psn & HFI1_KDETH_BTH_SEQ_MASK));
}

static inline u32 full_flow_psn(struct tid_rdma_flow *flow, u32 psn)
{
	return __full_flow_psn(&flow->flow_state, psn);
}

M
Mike Marciniszyn 已提交
348 349 350
struct verbs_txreq;
void hfi1_put_txreq(struct verbs_txreq *tx);

351
int hfi1_verbs_send(struct rvt_qp *qp, struct hfi1_pkt_state *ps);
M
Mike Marciniszyn 已提交
352 353 354 355 356 357 358 359 360

void hfi1_cnp_rcv(struct hfi1_packet *packet);

void hfi1_uc_rcv(struct hfi1_packet *packet);

void hfi1_rc_rcv(struct hfi1_packet *packet);

void hfi1_rc_hdrerr(
	struct hfi1_ctxtdata *rcd,
361
	struct hfi1_packet *packet,
362
	struct rvt_qp *qp);
M
Mike Marciniszyn 已提交
363

364
u8 ah_to_sc(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr);
M
Mike Marciniszyn 已提交
365

366
void hfi1_rc_send_complete(struct rvt_qp *qp, struct hfi1_opa_header *opah);
M
Mike Marciniszyn 已提交
367 368 369 370 371

void hfi1_ud_rcv(struct hfi1_packet *packet);

int hfi1_lookup_pkey_idx(struct hfi1_ibport *ibp, u16 pkey);

372
void hfi1_migrate_qp(struct rvt_qp *qp);
M
Mike Marciniszyn 已提交
373

374 375 376 377 378
int hfi1_check_modify_qp(struct rvt_qp *qp, struct ib_qp_attr *attr,
			 int attr_mask, struct ib_udata *udata);

void hfi1_modify_qp(struct rvt_qp *qp, struct ib_qp_attr *attr,
		    int attr_mask, struct ib_udata *udata);
379
void hfi1_restart_rc(struct rvt_qp *qp, u32 psn, int wait);
380 381
int hfi1_setup_wqe(struct rvt_qp *qp, struct rvt_swqe *wqe,
		   bool *call_send);
I
Ira Weiny 已提交
382

383 384 385
extern const u32 rc_only_opcode;
extern const u32 uc_only_opcode;

386
int hfi1_ruc_check_hdr(struct hfi1_ibport *ibp, struct hfi1_packet *packet);
M
Mike Marciniszyn 已提交
387 388

u32 hfi1_make_grh(struct hfi1_ibport *ibp, struct ib_grh *hdr,
389
		  const struct ib_global_route *grh, u32 hwords, u32 nwords);
M
Mike Marciniszyn 已提交
390

391
void hfi1_make_ruc_header(struct rvt_qp *qp, struct ib_other_headers *ohdr,
392
			  u32 bth0, u32 bth1, u32 bth2, int middle,
393
			  struct hfi1_pkt_state *ps);
M
Mike Marciniszyn 已提交
394

395 396
void _hfi1_do_send(struct work_struct *work);

397 398 399
void hfi1_do_send_from_rvt(struct rvt_qp *qp);

void hfi1_do_send(struct rvt_qp *qp, bool in_thread);
M
Mike Marciniszyn 已提交
400

401
void hfi1_send_rc_ack(struct hfi1_packet *packet, bool is_fecn);
M
Mike Marciniszyn 已提交
402

403
int hfi1_make_rc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps);
M
Mike Marciniszyn 已提交
404

405
int hfi1_make_uc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps);
M
Mike Marciniszyn 已提交
406

407
int hfi1_make_ud_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps);
M
Mike Marciniszyn 已提交
408 409 410 411 412 413 414

int hfi1_register_ib_device(struct hfi1_devdata *);

void hfi1_unregister_ib_device(struct hfi1_devdata *);

void hfi1_ib_rcv(struct hfi1_packet *packet);

415 416
void hfi1_16B_rcv(struct hfi1_packet *packet);

M
Mike Marciniszyn 已提交
417 418
unsigned hfi1_get_npkeys(struct hfi1_devdata *);

419
int hfi1_verbs_send_dma(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
420
			u64 pbc);
M
Mike Marciniszyn 已提交
421

422
int hfi1_verbs_send_pio(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
423
			u64 pbc);
M
Mike Marciniszyn 已提交
424

425 426 427 428 429
static inline bool opa_bth_is_migration(struct ib_other_headers *ohdr)
{
	return ohdr->bth[1] & cpu_to_be32(OPA_BTH_MIG_REQ);
}

430 431 432 433 434 435 436 437 438 439
void hfi1_wait_kmem(struct rvt_qp *qp);

static inline void hfi1_trdma_send_complete(struct rvt_qp *qp,
					    struct rvt_swqe *wqe,
					    enum ib_wc_status status)
{
	trdma_clean_swqe(qp, wqe);
	rvt_send_complete(qp, wqe, status);
}

M
Mike Marciniszyn 已提交
440 441 442 443
extern const enum ib_wc_opcode ib_hfi1_wc_opcode[];

extern const u8 hdr_len_by_opcode[];

444
extern const int ib_rvt_state_ops[];
M
Mike Marciniszyn 已提交
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467

extern __be64 ib_hfi1_sys_image_guid;    /* in network order */

extern unsigned int hfi1_max_cqes;

extern unsigned int hfi1_max_cqs;

extern unsigned int hfi1_max_qp_wrs;

extern unsigned int hfi1_max_qps;

extern unsigned int hfi1_max_sges;

extern unsigned int hfi1_max_mcast_grps;

extern unsigned int hfi1_max_mcast_qp_attached;

extern unsigned int hfi1_max_srqs;

extern unsigned int hfi1_max_srq_sges;

extern unsigned int hfi1_max_srq_wrs;

468 469
extern unsigned short piothreshold;

M
Mike Marciniszyn 已提交
470 471 472
extern const u32 ib_hfi1_rnr_table[];

#endif                          /* HFI1_VERBS_H */