1 | /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ |
2 | /* |
3 | * Copyright(c) 2018 Intel Corporation. |
4 | * |
5 | */ |
6 | #ifndef _HFI1_OPFN_H |
7 | #define _HFI1_OPFN_H |
8 | |
9 | /** |
10 | * DOC: Omni Path Feature Negotion (OPFN) |
11 | * |
12 | * OPFN is a discovery protocol for Intel Omni-Path fabric that |
13 | * allows two RC QPs to negotiate a common feature that both QPs |
14 | * can support. Currently, the only OPA feature that OPFN |
15 | * supports is TID RDMA. |
16 | * |
17 | * Architecture |
18 | * |
19 | * OPFN involves the communication between two QPs on the HFI |
20 | * level on an Omni-Path fabric, and ULPs have no knowledge of |
21 | * OPFN at all. |
22 | * |
23 | * Implementation |
24 | * |
25 | * OPFN extends the existing IB RC protocol with the following |
26 | * changes: |
27 | * -- Uses Bit 24 (reserved) of DWORD 1 of Base Transport |
28 | * Header (BTH1) to indicate that the RC QP supports OPFN; |
29 | * -- Uses a combination of RC COMPARE_SWAP opcode (0x13) and |
30 | * the address U64_MAX (0xFFFFFFFFFFFFFFFF) as an OPFN |
31 | * request; The 64-bit data carried with the request/response |
32 | * contains the parameters for negotiation and will be |
33 | * defined in tid_rdma.c file; |
34 | * -- Defines IB_WR_RESERVED3 as IB_WR_OPFN. |
35 | * |
36 | * The OPFN communication will be triggered when an RC QP |
37 | * receives a request with Bit 24 of BTH1 set. The responder QP |
38 | * will then post send an OPFN request with its local |
39 | * parameters, which will be sent to the requester QP once all |
40 | * existing requests on the responder QP side have been sent. |
41 | * Once the requester QP receives the OPFN request, it will |
42 | * keep a copy of the responder QP's parameters, and return a |
43 | * response packet with its own local parameters. The responder |
44 | * QP receives the response packet and keeps a copy of the requester |
45 | * QP's parameters. After this exchange, each side has the parameters |
46 | * for both sides and therefore can select the right parameters |
47 | * for future transactions |
48 | */ |
49 | |
50 | #include <linux/workqueue.h> |
51 | #include <rdma/ib_verbs.h> |
52 | #include <rdma/rdmavt_qp.h> |
53 | |
54 | /* STL Verbs Extended */ |
55 | #define IB_BTHE_E_SHIFT 24 |
56 | #define HFI1_VERBS_E_ATOMIC_VADDR U64_MAX |
57 | |
58 | enum hfi1_opfn_codes { |
59 | STL_VERBS_EXTD_NONE = 0, |
60 | STL_VERBS_EXTD_TID_RDMA, |
61 | STL_VERBS_EXTD_MAX |
62 | }; |
63 | |
64 | struct hfi1_opfn_data { |
65 | u8 extended; |
66 | u16 requested; |
67 | u16 completed; |
68 | enum hfi1_opfn_codes curr; |
69 | /* serialize opfn function calls */ |
70 | spinlock_t lock; |
71 | struct work_struct opfn_work; |
72 | }; |
73 | |
74 | /* WR opcode for OPFN */ |
75 | #define IB_WR_OPFN IB_WR_RESERVED3 |
76 | |
77 | void opfn_send_conn_request(struct work_struct *work); |
78 | void opfn_conn_response(struct rvt_qp *qp, struct rvt_ack_entry *e, |
79 | struct ib_atomic_eth *ateth); |
80 | void opfn_conn_reply(struct rvt_qp *qp, u64 data); |
81 | void opfn_conn_error(struct rvt_qp *qp); |
82 | void opfn_qp_init(struct rvt_qp *qp, struct ib_qp_attr *attr, int attr_mask); |
83 | void opfn_trigger_conn_request(struct rvt_qp *qp, u32 bth1); |
84 | int opfn_init(void); |
85 | void opfn_exit(void); |
86 | |
87 | #endif /* _HFI1_OPFN_H */ |
88 | |