#ifndef UCP_RMA_H_
#define UCP_RMA_H_
#include <ucp/core/ucp_types.h>
#include <ucp/core/ucp_rkey.h>
#include <ucp/proto/proto_am.h>
#include <uct/api/uct.h>
#include <ucs/datastruct/ptr_map.h>
struct ucp_rma_proto {
const char *name;
uct_pending_callback_t progress_put;
uct_pending_callback_t progress_get;
};
struct ucp_amo_proto {
const char *name;
uct_pending_callback_t progress_fetch;
uct_pending_callback_t progress_post;
};
typedef union {
uint32_t reply32;
uint64_t reply64;
} ucp_atomic_reply_t;
typedef struct {
uint64_t address;
uint64_t ep_id;
ucs_memory_type_t mem_type;
} UCS_S_PACKED ucp_put_hdr_t;
typedef struct {
uint64_t ep_id;
} UCS_S_PACKED ucp_cmpl_hdr_t;
typedef struct {
uint64_t address;
uint64_t length;
ucp_request_hdr_t req;
ucs_memory_type_t mem_type;
} UCS_S_PACKED ucp_get_req_hdr_t;
typedef struct {
uint64_t req_id;
} UCS_S_PACKED ucp_rma_rep_hdr_t;
typedef struct {
uint64_t address;
ucp_request_hdr_t req;
uint8_t length;
uint8_t opcode;
} UCS_S_PACKED ucp_atomic_req_hdr_t;
extern ucp_rma_proto_t ucp_rma_basic_proto;
extern ucp_rma_proto_t ucp_rma_sw_proto;
extern ucp_amo_proto_t ucp_amo_basic_proto;
extern ucp_amo_proto_t ucp_amo_sw_proto;
extern const ucp_rma_proto_t *ucp_rma_proto_list[];
extern const ucp_amo_proto_t *ucp_amo_proto_list[];
ucs_status_t ucp_rma_request_advance(ucp_request_t *req, ssize_t frag_length,
ucs_status_t status,
ucs_ptr_map_key_t req_id);
void ucp_ep_flush_remote_completed(ucp_request_t *req);
void ucp_rma_sw_send_cmpl(ucp_ep_h ep);
#define UCP_RMA_PROTO_INIT_CHECK(_init_params, _op_id) \
if ((_init_params)->select_param->op_id != (_op_id)) { \
return UCS_ERR_UNSUPPORTED; \
}
#endif