/* 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 */