blob: 4b40d05bbe40d8e1449a6d51aa1d44b2bb609a95 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/*
* Copyright (c) 2022, Microsoft Corporation. All rights reserved.
*/
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdatomic.h>
#include <util/compiler.h>
#include <util/util.h>
#include <sys/mman.h>
#include <infiniband/driver.h>
#include <infiniband/kern-abi.h>
#include <rdma/mana-abi.h>
#include <kernel-abi/mana-abi.h>
#include "mana.h"
int manadv_set_context_attr(struct ibv_context *ibv_ctx,
enum manadv_set_ctx_attr_type type, void *attr)
{
struct mana_context *ctx = to_mctx(ibv_ctx);
int ret;
switch (type) {
case MANADV_CTX_ATTR_BUF_ALLOCATORS:
ctx->extern_alloc = *((struct manadv_ctx_allocators *)attr);
ret = 0;
break;
default:
verbs_err(verbs_get_ctx(ibv_ctx),
"Unsupported context type %d\n", type);
ret = EOPNOTSUPP;
}
return ret;
}
int manadv_init_obj(struct manadv_obj *obj, uint64_t obj_type)
{
if (obj_type & ~(MANADV_OBJ_QP | MANADV_OBJ_CQ | MANADV_OBJ_RWQ))
return EINVAL;
if (obj_type & MANADV_OBJ_QP) {
struct ibv_qp *ibqp = obj->qp.in;
struct mana_qp *qp =
container_of(ibqp, struct mana_qp, ibqp.qp);
struct ibv_context *context = ibqp->context;
struct mana_context *ctx = to_mctx(context);
obj->qp.out->sq_buf = qp->raw_qp.send_buf;
obj->qp.out->sq_count = qp->raw_qp.send_wqe_count;
obj->qp.out->sq_size = qp->raw_qp.send_buf_size;
obj->qp.out->sq_id = qp->raw_qp.sqid;
obj->qp.out->tx_vp_offset = qp->raw_qp.tx_vp_offset;
obj->qp.out->db_page = ctx->db_page;
}
if (obj_type & MANADV_OBJ_CQ) {
struct ibv_cq *ibcq = obj->cq.in;
struct mana_cq *cq = container_of(ibcq, struct mana_cq, ibcq);
obj->cq.out->buf = cq->buf;
obj->cq.out->count = cq->cqe;
obj->cq.out->cq_id = cq->cqid;
}
if (obj_type & MANADV_OBJ_RWQ) {
struct ibv_wq *ibwq = obj->rwq.in;
struct mana_wq *wq = container_of(ibwq, struct mana_wq, ibwq);
struct ibv_context *context = ibwq->context;
struct mana_context *ctx = to_mctx(context);
obj->rwq.out->buf = wq->buf;
obj->rwq.out->count = wq->wqe;
obj->rwq.out->size = wq->buf_size;
obj->rwq.out->wq_id = wq->wqid;
obj->rwq.out->db_page = ctx->db_page;
}
return 0;
}