Blame src/vma/ib/mlx5/ib_mlx5.h

Packit 6d2c1b
/*
Packit 6d2c1b
 * Copyright (c) 2001-2020 Mellanox Technologies, Ltd. All rights reserved.
Packit 6d2c1b
 *
Packit 6d2c1b
 * This software is available to you under a choice of one of two
Packit 6d2c1b
 * licenses.  You may choose to be licensed under the terms of the GNU
Packit 6d2c1b
 * General Public License (GPL) Version 2, available from the file
Packit 6d2c1b
 * COPYING in the main directory of this source tree, or the
Packit 6d2c1b
 * BSD license below:
Packit 6d2c1b
 *
Packit 6d2c1b
 *     Redistribution and use in source and binary forms, with or
Packit 6d2c1b
 *     without modification, are permitted provided that the following
Packit 6d2c1b
 *     conditions are met:
Packit 6d2c1b
 *
Packit 6d2c1b
 *      - Redistributions of source code must retain the above
Packit 6d2c1b
 *        copyright notice, this list of conditions and the following
Packit 6d2c1b
 *        disclaimer.
Packit 6d2c1b
 *
Packit 6d2c1b
 *      - Redistributions in binary form must reproduce the above
Packit 6d2c1b
 *        copyright notice, this list of conditions and the following
Packit 6d2c1b
 *        disclaimer in the documentation and/or other materials
Packit 6d2c1b
 *        provided with the distribution.
Packit 6d2c1b
 *
Packit 6d2c1b
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit 6d2c1b
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit 6d2c1b
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Packit 6d2c1b
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Packit 6d2c1b
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Packit 6d2c1b
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit 6d2c1b
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit 6d2c1b
 * SOFTWARE.
Packit 6d2c1b
 */
Packit 6d2c1b
Packit 6d2c1b
#ifndef SRC_VMA_IB_MLX5_H_
Packit 6d2c1b
#define SRC_VMA_IB_MLX5_H_
Packit 6d2c1b
Packit 6d2c1b
#if defined(DEFINED_DIRECT_VERBS)
Packit 6d2c1b
Packit 6d2c1b
#include <infiniband/verbs.h>
Packit 6d2c1b
Packit 6d2c1b
#if (DEFINED_DIRECT_VERBS == 2)
Packit 6d2c1b
#include <infiniband/mlx5_hw.h>
Packit 6d2c1b
#include "vma/ib/mlx5/ib_mlx5_hw.h"
Packit 6d2c1b
#elif (DEFINED_DIRECT_VERBS == 3)
Packit 6d2c1b
extern "C" {
Packit 6d2c1b
#include <infiniband/mlx5dv.h>
Packit 6d2c1b
}
Packit 6d2c1b
#include "vma/ib/mlx5/ib_mlx5_dv.h"
Packit 6d2c1b
#else
Packit 6d2c1b
#error "Unsupported Direct VERBS parameter"
Packit 6d2c1b
#endif
Packit 6d2c1b
Packit 6d2c1b
#include <utils/asm.h>
Packit 6d2c1b
#include <vma/util/vtypes.h>
Packit 6d2c1b
Packit 6d2c1b
/* ib/mlx5 layer is used by other VMA code that needs
Packit 6d2c1b
 * direct access to mlx5 resources.
Packit 6d2c1b
 * It hides differences in rdma-core(Upstream OFED) and mlx5(Mellanox OFED) 
Packit 6d2c1b
 * mlx5 provider implementations.
Packit 6d2c1b
 * rdma-core(Upstream OFED) structures/macro/enum etc are taken as basis
Packit 6d2c1b
 * inside this layer
Packit 6d2c1b
 */
Packit 6d2c1b
Packit 6d2c1b
Packit 6d2c1b
/**
Packit 6d2c1b
 * Get internal verbs information.
Packit 6d2c1b
 */
Packit 6d2c1b
int vma_ib_mlx5dv_init_obj(struct mlx5dv_obj *obj, uint64_t type);
Packit 6d2c1b
Packit 6d2c1b
enum {
Packit 6d2c1b
   VMA_IB_MLX5_QP_FLAGS_USE_UNDERLAY = 0x01
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
enum {
Packit 6d2c1b
	VMA_IB_MLX5_CQ_SET_CI    = 0,
Packit 6d2c1b
	VMA_IB_MLX5_CQ_ARM_DB    = 1
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
/* Queue pair */
Packit 6d2c1b
typedef struct vma_ib_mlx5_qp {
Packit 6d2c1b
	struct ibv_qp *qp;
Packit 6d2c1b
	uint32_t qpn;
Packit 6d2c1b
	uint32_t flags;
Packit 6d2c1b
	struct ibv_qp_cap cap;
Packit 6d2c1b
	struct {
Packit 6d2c1b
		volatile uint32_t *dbrec;
Packit 6d2c1b
		void *buf;
Packit 6d2c1b
		uint32_t wqe_cnt;
Packit 6d2c1b
		uint32_t stride;
Packit 6d2c1b
	} sq;
Packit 6d2c1b
	struct {
Packit 6d2c1b
		volatile uint32_t *dbrec;
Packit 6d2c1b
		void *buf;
Packit 6d2c1b
		uint32_t wqe_cnt;
Packit 6d2c1b
		uint32_t stride;
Packit 6d2c1b
		uint32_t wqe_shift;
Packit 6d2c1b
		unsigned head;
Packit 6d2c1b
		unsigned tail;
Packit 6d2c1b
	} rq;
Packit 6d2c1b
	struct {
Packit 6d2c1b
		void *reg;
Packit 6d2c1b
		uint32_t size;
Packit 6d2c1b
		uint32_t offset;
Packit 6d2c1b
	} bf;
Packit 6d2c1b
} vma_ib_mlx5_qp_t;
Packit 6d2c1b
Packit 6d2c1b
/* Completion queue */
Packit 6d2c1b
typedef struct vma_ib_mlx5_cq {
Packit 6d2c1b
	struct ibv_cq      *cq;
Packit 6d2c1b
	void               *cq_buf;
Packit 6d2c1b
	unsigned           cq_num;
Packit 6d2c1b
	unsigned           cq_ci;
Packit 6d2c1b
	unsigned           cq_sn;
Packit 6d2c1b
	unsigned           cqe_count;
Packit 6d2c1b
	unsigned           cqe_size;
Packit 6d2c1b
	unsigned           cqe_size_log;
Packit 6d2c1b
	volatile uint32_t  *dbrec;
Packit 6d2c1b
	void               *uar;
Packit 6d2c1b
} vma_ib_mlx5_cq_t;
Packit 6d2c1b
Packit 6d2c1b
int vma_ib_mlx5_get_qp(struct ibv_qp *qp, vma_ib_mlx5_qp_t *mlx5_qp, uint32_t flags = 0);
Packit 6d2c1b
int vma_ib_mlx5_post_recv(vma_ib_mlx5_qp_t *mlx5_qp, struct ibv_recv_wr *wr, struct ibv_recv_wr **bad_wr);
Packit 6d2c1b
Packit 6d2c1b
int vma_ib_mlx5_get_cq(struct ibv_cq *cq, vma_ib_mlx5_cq_t *mlx5_cq);
Packit 6d2c1b
int vma_ib_mlx5_req_notify_cq(vma_ib_mlx5_cq_t *mlx5_cq, int solicited);
Packit 6d2c1b
void vma_ib_mlx5_get_cq_event(vma_ib_mlx5_cq_t *mlx5_cq, int count);
Packit 6d2c1b
Packit 6d2c1b
#endif /* DEFINED_DIRECT_VERBS */
Packit 6d2c1b
Packit 6d2c1b
#endif /* SRC_VMA_IB_MLX5_H_ */