0001
0002
0003
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
0020
0021
0022
0023
0024
0025
0026
0027
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
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
0047
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
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
0075
0076
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
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