mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.8 KiB
87 lines
2.8 KiB
/* 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 */
|
|
|