2026-01-29 22:25:33 +08:00

98 lines
2.5 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2024 Huawei Technologies Co., Ltd */
#ifndef ROCE_MR_H
#define ROCE_MR_H
#include <rdma/ib_verbs.h>
#include <rdma/ib_umem.h>
#include <linux/pci.h>
#include <linux/dma-mapping.h>
#include <linux/vmalloc.h>
#include "hinic3_rdma.h"
#include "roce.h"
#include "roce_compat.h"
#include "roce_pd.h"
#include "roce_user.h"
#include "hmm_mr.h"
#include "hmm_comp.h"
#include "hinic3_hmm.h"
#define ROCE3_MR_DEFAULT_ACCESS \
(IB_ACCESS_REMOTE_READ | IB_ACCESS_REMOTE_WRITE | \
IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_ATOMIC)
#define ROCE3_MR_PAGES_ALIGN 64
#define ROCE3_MIN_PAGE 2
#define FRMR_PAGE_SIZE 4096
struct roce3_sig_ctx {
/* recorded when submitting WR */
struct ib_sig_attrs sig_attrs;
/* Get information configuration from CQE when polling CQE */
struct ib_sig_err sig_err_item;
/* Indicates whether the status is checked */
bool sig_status_checked;
/* Indicates if an error exists */
bool sig_err_exists;
/* Count the number of wrong CQEs */
u32 sig_err_count;
};
struct roce3_mr {
/* mr structure provided by ofed */
struct ib_mr ibmr;
/* Maintain the structure where the user-mode allocated buffer */
struct ib_umem *umem;
/* mr structure provided by rdma component */
struct rdma_mr rdmamr;
/* Record signature related information */
struct roce3_sig_ctx sig;
/* Whether the logo contains signature information */
bool signature_en;
__be64 *pages;
u32 npages;
u32 max_pages;
size_t page_map_size;
dma_addr_t page_map;
};
struct roce3_mw {
/* mw structure provided by ofed */
struct ib_mw ibmw;
/* mw structure provided by rdma component */
struct rdma_mw rdmamw;
};
/* through ibmroce3_e_mr */
static inline struct roce3_mr *to_roce3_mr(const struct ib_mr *ibmr)
{
return container_of(ibmr, struct roce3_mr, ibmr);
}
/* through ibmroce3_e_mw */
static inline struct roce3_mw *to_roce3_mw(const struct ib_mw *ibmw)
{
return container_of(ibmw, struct roce3_mw, ibmw);
}
/* through rdmam find roce3_mr */
static inline struct roce3_mr *rdma_mr_to_roce3_mr(const struct rdma_mr *rdmamr)
{
return container_of(rdmamr, struct roce3_mr, rdmamr);
}
int roce3_alloc_tpt(struct roce3_device *rdev, struct rdma_mr *mr, u32 npages, u32 page_shift);
void roce3_free_tpt(struct roce3_device *rdev, struct rdma_mr *mr);
void roce3_set_rdma_mr(struct rdma_mr *mr, enum rdma_mr_type mr_type,
u32 pdn, u64 iova, u64 size, u32 access);
int roce3_user_mr_reg(struct roce3_device *rdev, struct roce3_mr *mr, u32 pdn, u64 virt_addr,
u64 length, int access);
#endif // __ROCE_MR_H_