88 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
 | |
| /*
 | |
|  * Copyright(c) 2018 Intel Corporation.
 | |
|  *
 | |
|  */
 | |
| #ifndef _HFI1_OPFN_H
 | |
| #define _HFI1_OPFN_H
 | |
| 
 | |
| /**
 | |
|  * DOC: Omni Path Feature Negotion (OPFN)
 | |
|  *
 | |
|  * OPFN is a discovery protocol for Intel Omni-Path fabric that
 | |
|  * allows two RC QPs to negotiate a common feature that both QPs
 | |
|  * can support. Currently, the only OPA feature that OPFN
 | |
|  * supports is TID RDMA.
 | |
|  *
 | |
|  * Architecture
 | |
|  *
 | |
|  * OPFN involves the communication between two QPs on the HFI
 | |
|  * level on an Omni-Path fabric, and ULPs have no knowledge of
 | |
|  * OPFN at all.
 | |
|  *
 | |
|  * Implementation
 | |
|  *
 | |
|  * OPFN extends the existing IB RC protocol with the following
 | |
|  * changes:
 | |
|  * -- Uses Bit 24 (reserved) of DWORD 1 of Base Transport
 | |
|  *    Header (BTH1) to indicate that the RC QP supports OPFN;
 | |
|  * -- Uses a combination of RC COMPARE_SWAP opcode (0x13) and
 | |
|  *    the address U64_MAX (0xFFFFFFFFFFFFFFFF) as an OPFN
 | |
|  *    request; The 64-bit data carried with the request/response
 | |
|  *    contains the parameters for negotiation and will be
 | |
|  *    defined in tid_rdma.c file;
 | |
|  * -- Defines IB_WR_RESERVED3 as IB_WR_OPFN.
 | |
|  *
 | |
|  * The OPFN communication will be triggered when an RC QP
 | |
|  * receives a request with Bit 24 of BTH1 set. The responder QP
 | |
|  * will then post send an OPFN request with its local
 | |
|  * parameters, which will be sent to the requester QP once all
 | |
|  * existing requests on the responder QP side have been sent.
 | |
|  * Once the requester QP receives the OPFN request, it will
 | |
|  * keep a copy of the responder QP's parameters, and return a
 | |
|  * response packet with its own local parameters. The responder
 | |
|  * QP receives the response packet and keeps a copy of the requester
 | |
|  * QP's parameters. After this exchange, each side has the parameters
 | |
|  * for both sides and therefore can select the right parameters
 | |
|  * for future transactions
 | |
|  */
 | |
| 
 | |
| #include <linux/workqueue.h>
 | |
| #include <rdma/ib_verbs.h>
 | |
| #include <rdma/rdmavt_qp.h>
 | |
| 
 | |
| /* STL Verbs Extended */
 | |
| #define IB_BTHE_E_SHIFT           24
 | |
| #define HFI1_VERBS_E_ATOMIC_VADDR U64_MAX
 | |
| 
 | |
| enum hfi1_opfn_codes {
 | |
| 	STL_VERBS_EXTD_NONE = 0,
 | |
| 	STL_VERBS_EXTD_TID_RDMA,
 | |
| 	STL_VERBS_EXTD_MAX
 | |
| };
 | |
| 
 | |
| struct hfi1_opfn_data {
 | |
| 	u8 extended;
 | |
| 	u16 requested;
 | |
| 	u16 completed;
 | |
| 	enum hfi1_opfn_codes curr;
 | |
| 	/* serialize opfn function calls */
 | |
| 	spinlock_t lock;
 | |
| 	struct work_struct opfn_work;
 | |
| };
 | |
| 
 | |
| /* WR opcode for OPFN */
 | |
| #define IB_WR_OPFN IB_WR_RESERVED3
 | |
| 
 | |
| void opfn_send_conn_request(struct work_struct *work);
 | |
| void opfn_conn_response(struct rvt_qp *qp, struct rvt_ack_entry *e,
 | |
| 			struct ib_atomic_eth *ateth);
 | |
| void opfn_conn_reply(struct rvt_qp *qp, u64 data);
 | |
| void opfn_conn_error(struct rvt_qp *qp);
 | |
| void opfn_qp_init(struct rvt_qp *qp, struct ib_qp_attr *attr, int attr_mask);
 | |
| void opfn_trigger_conn_request(struct rvt_qp *qp, u32 bth1);
 | |
| int opfn_init(void);
 | |
| void opfn_exit(void);
 | |
| 
 | |
| #endif /* _HFI1_OPFN_H */
 |