Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
0002 /*
0003  * Copyright(c) 2015 - 2018 Intel Corporation.
0004  */
0005 
0006 #ifndef _QP_H
0007 #define _QP_H
0008 #include <linux/hash.h>
0009 #include <rdma/rdmavt_qp.h>
0010 #include "verbs.h"
0011 #include "sdma.h"
0012 #include "verbs_txreq.h"
0013 
0014 extern unsigned int hfi1_qp_table_size;
0015 
0016 extern const struct rvt_operation_params hfi1_post_parms[];
0017 
0018 /*
0019  * Driver specific s_flags starting at bit 31 down to HFI1_S_MIN_BIT_MASK
0020  *
0021  * HFI1_S_AHG_VALID - ahg header valid on chip
0022  * HFI1_S_AHG_CLEAR - have send engine clear ahg state
0023  * HFI1_S_WAIT_PIO_DRAIN - qp waiting for PIOs to drain
0024  * HFI1_S_WAIT_TID_SPACE - a QP is waiting for TID resource
0025  * HFI1_S_WAIT_TID_RESP - waiting for a TID RDMA WRITE response
0026  * HFI1_S_WAIT_HALT - halt the first leg send engine
0027  * HFI1_S_MIN_BIT_MASK - the lowest bit that can be used by hfi1
0028  */
0029 #define HFI1_S_AHG_VALID         0x80000000
0030 #define HFI1_S_AHG_CLEAR         0x40000000
0031 #define HFI1_S_WAIT_PIO_DRAIN    0x20000000
0032 #define HFI1_S_WAIT_TID_SPACE    0x10000000
0033 #define HFI1_S_WAIT_TID_RESP     0x08000000
0034 #define HFI1_S_WAIT_HALT         0x04000000
0035 #define HFI1_S_MIN_BIT_MASK      0x01000000
0036 
0037 /*
0038  * overload wait defines
0039  */
0040 
0041 #define HFI1_S_ANY_WAIT_IO (RVT_S_ANY_WAIT_IO | HFI1_S_WAIT_PIO_DRAIN)
0042 #define HFI1_S_ANY_WAIT (HFI1_S_ANY_WAIT_IO | RVT_S_ANY_WAIT_SEND)
0043 #define HFI1_S_ANY_TID_WAIT_SEND (RVT_S_WAIT_SSN_CREDIT | RVT_S_WAIT_DMA)
0044 
0045 /*
0046  * Send if not busy or waiting for I/O and either
0047  * a RC response is pending or we can process send work requests.
0048  */
0049 static inline int hfi1_send_ok(struct rvt_qp *qp)
0050 {
0051     struct hfi1_qp_priv *priv = qp->priv;
0052 
0053     return !(qp->s_flags & (RVT_S_BUSY | HFI1_S_ANY_WAIT_IO)) &&
0054         (verbs_txreq_queued(iowait_get_ib_work(&priv->s_iowait)) ||
0055         (qp->s_flags & RVT_S_RESP_PENDING) ||
0056          !(qp->s_flags & RVT_S_ANY_WAIT_SEND));
0057 }
0058 
0059 /*
0060  * free_ahg - clear ahg from QP
0061  */
0062 static inline void clear_ahg(struct rvt_qp *qp)
0063 {
0064     struct hfi1_qp_priv *priv = qp->priv;
0065 
0066     priv->s_ahg->ahgcount = 0;
0067     qp->s_flags &= ~(HFI1_S_AHG_VALID | HFI1_S_AHG_CLEAR);
0068     if (priv->s_sde && qp->s_ahgidx >= 0)
0069         sdma_ahg_free(priv->s_sde, qp->s_ahgidx);
0070     qp->s_ahgidx = -1;
0071 }
0072 
0073 /**
0074  * hfi1_qp_wakeup - wake up on the indicated event
0075  * @qp: the QP
0076  * @flag: flag the qp on which the qp is stalled
0077  */
0078 void hfi1_qp_wakeup(struct rvt_qp *qp, u32 flag);
0079 
0080 struct sdma_engine *qp_to_sdma_engine(struct rvt_qp *qp, u8 sc5);
0081 struct send_context *qp_to_send_context(struct rvt_qp *qp, u8 sc5);
0082 
0083 void qp_iter_print(struct seq_file *s, struct rvt_qp_iter *iter);
0084 
0085 bool _hfi1_schedule_send(struct rvt_qp *qp);
0086 bool hfi1_schedule_send(struct rvt_qp *qp);
0087 
0088 void hfi1_migrate_qp(struct rvt_qp *qp);
0089 
0090 /*
0091  * Functions provided by hfi1 driver for rdmavt to use
0092  */
0093 void *qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp);
0094 void qp_priv_free(struct rvt_dev_info *rdi, struct rvt_qp *qp);
0095 unsigned free_all_qps(struct rvt_dev_info *rdi);
0096 void notify_qp_reset(struct rvt_qp *qp);
0097 int get_pmtu_from_attr(struct rvt_dev_info *rdi, struct rvt_qp *qp,
0098                struct ib_qp_attr *attr);
0099 void flush_qp_waiters(struct rvt_qp *qp);
0100 void notify_error_qp(struct rvt_qp *qp);
0101 void stop_send_queue(struct rvt_qp *qp);
0102 void quiesce_qp(struct rvt_qp *qp);
0103 u32 mtu_from_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, u32 pmtu);
0104 int mtu_to_path_mtu(u32 mtu);
0105 void hfi1_error_port_qps(struct hfi1_ibport *ibp, u8 sl);
0106 void hfi1_qp_unbusy(struct rvt_qp *qp, struct iowait_work *wait);
0107 #endif /* _QP_H */