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

qib_verbs.h (12574B)


      1/*
      2 * Copyright (c) 2012 - 2018 Intel Corporation.  All rights reserved.
      3 * Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved.
      4 * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved.
      5 *
      6 * This software is available to you under a choice of one of two
      7 * licenses.  You may choose to be licensed under the terms of the GNU
      8 * General Public License (GPL) Version 2, available from the file
      9 * COPYING in the main directory of this source tree, or the
     10 * OpenIB.org BSD license below:
     11 *
     12 *     Redistribution and use in source and binary forms, with or
     13 *     without modification, are permitted provided that the following
     14 *     conditions are met:
     15 *
     16 *      - Redistributions of source code must retain the above
     17 *        copyright notice, this list of conditions and the following
     18 *        disclaimer.
     19 *
     20 *      - Redistributions in binary form must reproduce the above
     21 *        copyright notice, this list of conditions and the following
     22 *        disclaimer in the documentation and/or other materials
     23 *        provided with the distribution.
     24 *
     25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
     29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
     30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     32 * SOFTWARE.
     33 */
     34
     35#ifndef QIB_VERBS_H
     36#define QIB_VERBS_H
     37
     38#include <linux/types.h>
     39#include <linux/spinlock.h>
     40#include <linux/kernel.h>
     41#include <linux/interrupt.h>
     42#include <linux/kref.h>
     43#include <linux/workqueue.h>
     44#include <linux/kthread.h>
     45#include <linux/completion.h>
     46#include <rdma/ib_pack.h>
     47#include <rdma/ib_user_verbs.h>
     48#include <rdma/ib_hdrs.h>
     49#include <rdma/rdmavt_qp.h>
     50#include <rdma/rdmavt_cq.h>
     51
     52struct qib_ctxtdata;
     53struct qib_pportdata;
     54struct qib_devdata;
     55struct qib_verbs_txreq;
     56
     57#define QIB_MAX_RDMA_ATOMIC     16
     58#define QIB_GUIDS_PER_PORT	5
     59#define QIB_PSN_SHIFT		8
     60
     61/*
     62 * Increment this value if any changes that break userspace ABI
     63 * compatibility are made.
     64 */
     65#define QIB_UVERBS_ABI_VERSION       2
     66
     67/* IB Performance Manager status values */
     68#define IB_PMA_SAMPLE_STATUS_DONE       0x00
     69#define IB_PMA_SAMPLE_STATUS_STARTED    0x01
     70#define IB_PMA_SAMPLE_STATUS_RUNNING    0x02
     71
     72/* Mandatory IB performance counter select values. */
     73#define IB_PMA_PORT_XMIT_DATA   cpu_to_be16(0x0001)
     74#define IB_PMA_PORT_RCV_DATA    cpu_to_be16(0x0002)
     75#define IB_PMA_PORT_XMIT_PKTS   cpu_to_be16(0x0003)
     76#define IB_PMA_PORT_RCV_PKTS    cpu_to_be16(0x0004)
     77#define IB_PMA_PORT_XMIT_WAIT   cpu_to_be16(0x0005)
     78
     79#define QIB_VENDOR_IPG		cpu_to_be16(0xFFA0)
     80
     81#define IB_DEFAULT_GID_PREFIX	cpu_to_be64(0xfe80000000000000ULL)
     82
     83/* Values for set/get portinfo VLCap OperationalVLs */
     84#define IB_VL_VL0       1
     85#define IB_VL_VL0_1     2
     86#define IB_VL_VL0_3     3
     87#define IB_VL_VL0_7     4
     88#define IB_VL_VL0_14    5
     89
     90static inline int qib_num_vls(int vls)
     91{
     92	switch (vls) {
     93	default:
     94	case IB_VL_VL0:
     95		return 1;
     96	case IB_VL_VL0_1:
     97		return 2;
     98	case IB_VL_VL0_3:
     99		return 4;
    100	case IB_VL_VL0_7:
    101		return 8;
    102	case IB_VL_VL0_14:
    103		return 15;
    104	}
    105}
    106
    107struct qib_pio_header {
    108	__le32 pbc[2];
    109	struct ib_header hdr;
    110} __packed;
    111
    112/*
    113 * qib specific data structure that will be hidden from rvt after the queue pair
    114 * is made common.
    115 */
    116struct qib_qp_priv {
    117	struct ib_header *s_hdr;        /* next packet header to send */
    118	struct list_head iowait;        /* link for wait PIO buf */
    119	atomic_t s_dma_busy;
    120	struct qib_verbs_txreq *s_tx;
    121	struct work_struct s_work;
    122	wait_queue_head_t wait_dma;
    123	struct rvt_qp *owner;
    124};
    125
    126#define QIB_PSN_CREDIT  16
    127
    128struct qib_opcode_stats {
    129	u64 n_packets;          /* number of packets */
    130	u64 n_bytes;            /* total number of bytes */
    131};
    132
    133struct qib_opcode_stats_perctx {
    134	struct qib_opcode_stats stats[128];
    135};
    136
    137struct qib_pma_counters {
    138	u64 n_unicast_xmit;     /* total unicast packets sent */
    139	u64 n_unicast_rcv;      /* total unicast packets received */
    140	u64 n_multicast_xmit;   /* total multicast packets sent */
    141	u64 n_multicast_rcv;    /* total multicast packets received */
    142};
    143
    144struct qib_ibport {
    145	struct rvt_ibport rvp;
    146	struct rvt_ah *smi_ah;
    147	__be64 guids[QIB_GUIDS_PER_PORT	- 1];	/* writable GUIDs */
    148	struct qib_pma_counters __percpu *pmastats;
    149	u64 z_unicast_xmit;     /* starting count for PMA */
    150	u64 z_unicast_rcv;      /* starting count for PMA */
    151	u64 z_multicast_xmit;   /* starting count for PMA */
    152	u64 z_multicast_rcv;    /* starting count for PMA */
    153	u64 z_symbol_error_counter;             /* starting count for PMA */
    154	u64 z_link_error_recovery_counter;      /* starting count for PMA */
    155	u64 z_link_downed_counter;              /* starting count for PMA */
    156	u64 z_port_rcv_errors;                  /* starting count for PMA */
    157	u64 z_port_rcv_remphys_errors;          /* starting count for PMA */
    158	u64 z_port_xmit_discards;               /* starting count for PMA */
    159	u64 z_port_xmit_data;                   /* starting count for PMA */
    160	u64 z_port_rcv_data;                    /* starting count for PMA */
    161	u64 z_port_xmit_packets;                /* starting count for PMA */
    162	u64 z_port_rcv_packets;                 /* starting count for PMA */
    163	u32 z_local_link_integrity_errors;      /* starting count for PMA */
    164	u32 z_excessive_buffer_overrun_errors;  /* starting count for PMA */
    165	u32 z_vl15_dropped;                     /* starting count for PMA */
    166	u8 sl_to_vl[16];
    167};
    168
    169struct qib_ibdev {
    170	struct rvt_dev_info rdi;
    171
    172	struct list_head piowait;       /* list for wait PIO buf */
    173	struct list_head dmawait;	/* list for wait DMA */
    174	struct list_head txwait;        /* list for wait qib_verbs_txreq */
    175	struct list_head memwait;       /* list for wait kernel memory */
    176	struct list_head txreq_free;
    177	struct timer_list mem_timer;
    178	struct qib_pio_header *pio_hdrs;
    179	dma_addr_t pio_hdrs_phys;
    180
    181	u32 n_piowait;
    182	u32 n_txwait;
    183
    184#ifdef CONFIG_DEBUG_FS
    185	/* per HCA debugfs */
    186	struct dentry *qib_ibdev_dbg;
    187#endif
    188};
    189
    190struct qib_verbs_counters {
    191	u64 symbol_error_counter;
    192	u64 link_error_recovery_counter;
    193	u64 link_downed_counter;
    194	u64 port_rcv_errors;
    195	u64 port_rcv_remphys_errors;
    196	u64 port_xmit_discards;
    197	u64 port_xmit_data;
    198	u64 port_rcv_data;
    199	u64 port_xmit_packets;
    200	u64 port_rcv_packets;
    201	u32 local_link_integrity_errors;
    202	u32 excessive_buffer_overrun_errors;
    203	u32 vl15_dropped;
    204};
    205
    206static inline struct qib_ibdev *to_idev(struct ib_device *ibdev)
    207{
    208	struct rvt_dev_info *rdi;
    209
    210	rdi = container_of(ibdev, struct rvt_dev_info, ibdev);
    211	return container_of(rdi, struct qib_ibdev, rdi);
    212}
    213
    214/*
    215 * Send if not busy or waiting for I/O and either
    216 * a RC response is pending or we can process send work requests.
    217 */
    218static inline int qib_send_ok(struct rvt_qp *qp)
    219{
    220	return !(qp->s_flags & (RVT_S_BUSY | RVT_S_ANY_WAIT_IO)) &&
    221		(qp->s_hdrwords || (qp->s_flags & RVT_S_RESP_PENDING) ||
    222		 !(qp->s_flags & RVT_S_ANY_WAIT_SEND));
    223}
    224
    225bool _qib_schedule_send(struct rvt_qp *qp);
    226bool qib_schedule_send(struct rvt_qp *qp);
    227
    228static inline int qib_pkey_ok(u16 pkey1, u16 pkey2)
    229{
    230	u16 p1 = pkey1 & 0x7FFF;
    231	u16 p2 = pkey2 & 0x7FFF;
    232
    233	/*
    234	 * Low 15 bits must be non-zero and match, and
    235	 * one of the two must be a full member.
    236	 */
    237	return p1 && p1 == p2 && ((__s16)pkey1 < 0 || (__s16)pkey2 < 0);
    238}
    239
    240void qib_bad_pkey(struct qib_ibport *ibp, u32 key, u32 sl,
    241		  u32 qp1, u32 qp2, __be16 lid1, __be16 lid2);
    242void qib_cap_mask_chg(struct rvt_dev_info *rdi, u32 port_num);
    243void qib_sys_guid_chg(struct qib_ibport *ibp);
    244void qib_node_desc_chg(struct qib_ibport *ibp);
    245int qib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
    246		    const struct ib_wc *in_wc, const struct ib_grh *in_grh,
    247		    const struct ib_mad *in, struct ib_mad *out,
    248		    size_t *out_mad_size, u16 *out_mad_pkey_index);
    249void qib_notify_create_mad_agent(struct rvt_dev_info *rdi, int port_idx);
    250void qib_notify_free_mad_agent(struct rvt_dev_info *rdi, int port_idx);
    251
    252/*
    253 * Compare the lower 24 bits of the two values.
    254 * Returns an integer <, ==, or > than zero.
    255 */
    256static inline int qib_cmp24(u32 a, u32 b)
    257{
    258	return (((int) a) - ((int) b)) << 8;
    259}
    260
    261int qib_snapshot_counters(struct qib_pportdata *ppd, u64 *swords,
    262			  u64 *rwords, u64 *spkts, u64 *rpkts,
    263			  u64 *xmit_wait);
    264
    265int qib_get_counters(struct qib_pportdata *ppd,
    266		     struct qib_verbs_counters *cntrs);
    267
    268/*
    269 * Functions provided by qib driver for rdmavt to use
    270 */
    271unsigned qib_free_all_qps(struct rvt_dev_info *rdi);
    272void *qib_qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp);
    273void qib_qp_priv_free(struct rvt_dev_info *rdi, struct rvt_qp *qp);
    274void qib_notify_qp_reset(struct rvt_qp *qp);
    275int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
    276		  enum ib_qp_type type, u32 port);
    277void qib_restart_rc(struct rvt_qp *qp, u32 psn, int wait);
    278#ifdef CONFIG_DEBUG_FS
    279
    280void qib_qp_iter_print(struct seq_file *s, struct rvt_qp_iter *iter);
    281
    282#endif
    283
    284unsigned qib_pkt_delay(u32 plen, u8 snd_mult, u8 rcv_mult);
    285
    286void qib_verbs_sdma_desc_avail(struct qib_pportdata *ppd, unsigned avail);
    287
    288void qib_put_txreq(struct qib_verbs_txreq *tx);
    289
    290int qib_verbs_send(struct rvt_qp *qp, struct ib_header *hdr,
    291		   u32 hdrwords, struct rvt_sge_state *ss, u32 len);
    292
    293void qib_uc_rcv(struct qib_ibport *ibp, struct ib_header *hdr,
    294		int has_grh, void *data, u32 tlen, struct rvt_qp *qp);
    295
    296void qib_rc_rcv(struct qib_ctxtdata *rcd, struct ib_header *hdr,
    297		int has_grh, void *data, u32 tlen, struct rvt_qp *qp);
    298
    299int qib_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr);
    300
    301int qib_check_send_wqe(struct rvt_qp *qp, struct rvt_swqe *wqe,
    302		       bool *call_send);
    303
    304struct ib_ah *qib_create_qp0_ah(struct qib_ibport *ibp, u16 dlid);
    305
    306void qib_rc_rnr_retry(unsigned long arg);
    307
    308void qib_rc_send_complete(struct rvt_qp *qp, struct ib_header *hdr);
    309
    310int qib_post_ud_send(struct rvt_qp *qp, const struct ib_send_wr *wr);
    311
    312void qib_ud_rcv(struct qib_ibport *ibp, struct ib_header *hdr,
    313		int has_grh, void *data, u32 tlen, struct rvt_qp *qp);
    314
    315void mr_rcu_callback(struct rcu_head *list);
    316
    317void qib_migrate_qp(struct rvt_qp *qp);
    318
    319int qib_ruc_check_hdr(struct qib_ibport *ibp, struct ib_header *hdr,
    320		      int has_grh, struct rvt_qp *qp, u32 bth0);
    321
    322u32 qib_make_grh(struct qib_ibport *ibp, struct ib_grh *hdr,
    323		 const struct ib_global_route *grh, u32 hwords, u32 nwords);
    324
    325void qib_make_ruc_header(struct rvt_qp *qp, struct ib_other_headers *ohdr,
    326			 u32 bth0, u32 bth2);
    327
    328void _qib_do_send(struct work_struct *work);
    329
    330void qib_do_send(struct rvt_qp *qp);
    331
    332void qib_send_rc_ack(struct rvt_qp *qp);
    333
    334int qib_make_rc_req(struct rvt_qp *qp, unsigned long *flags);
    335
    336int qib_make_uc_req(struct rvt_qp *qp, unsigned long *flags);
    337
    338int qib_make_ud_req(struct rvt_qp *qp, unsigned long *flags);
    339
    340int qib_register_ib_device(struct qib_devdata *);
    341
    342void qib_unregister_ib_device(struct qib_devdata *);
    343
    344void qib_ib_rcv(struct qib_ctxtdata *, void *, void *, u32);
    345
    346void qib_ib_piobufavail(struct qib_devdata *);
    347
    348unsigned qib_get_npkeys(struct qib_devdata *);
    349
    350unsigned qib_get_pkey(struct qib_ibport *, unsigned);
    351
    352extern const enum ib_wc_opcode ib_qib_wc_opcode[];
    353
    354/*
    355 * Below  HCA-independent IB PhysPortState values, returned
    356 * by the f_ibphys_portstate() routine.
    357 */
    358#define IB_PHYSPORTSTATE_SLEEP 1
    359#define IB_PHYSPORTSTATE_POLL 2
    360#define IB_PHYSPORTSTATE_DISABLED 3
    361#define IB_PHYSPORTSTATE_CFG_TRAIN 4
    362#define IB_PHYSPORTSTATE_LINKUP 5
    363#define IB_PHYSPORTSTATE_LINK_ERR_RECOVER 6
    364#define IB_PHYSPORTSTATE_CFG_DEBOUNCE 8
    365#define IB_PHYSPORTSTATE_CFG_IDLE 0xB
    366#define IB_PHYSPORTSTATE_RECOVERY_RETRAIN 0xC
    367#define IB_PHYSPORTSTATE_RECOVERY_WAITRMT 0xE
    368#define IB_PHYSPORTSTATE_RECOVERY_IDLE 0xF
    369#define IB_PHYSPORTSTATE_CFG_ENH 0x10
    370#define IB_PHYSPORTSTATE_CFG_WAIT_ENH 0x13
    371
    372extern const int ib_rvt_state_ops[];
    373
    374extern __be64 ib_qib_sys_image_guid;    /* in network order */
    375
    376extern unsigned int ib_rvt_lkey_table_size;
    377
    378extern unsigned int ib_qib_max_cqes;
    379
    380extern unsigned int ib_qib_max_cqs;
    381
    382extern unsigned int ib_qib_max_qp_wrs;
    383
    384extern unsigned int ib_qib_max_qps;
    385
    386extern unsigned int ib_qib_max_sges;
    387
    388extern unsigned int ib_qib_max_mcast_grps;
    389
    390extern unsigned int ib_qib_max_mcast_qp_attached;
    391
    392extern unsigned int ib_qib_max_srqs;
    393
    394extern unsigned int ib_qib_max_srq_sges;
    395
    396extern unsigned int ib_qib_max_srq_wrs;
    397
    398extern const u32 ib_qib_rnr_table[];
    399
    400extern const struct rvt_operation_params qib_post_parms[];
    401
    402#endif                          /* QIB_VERBS_H */