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

203 lines
5.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2024 Huawei Technologies Co., Ltd */
#ifndef HINIC_RDMA_H__
#define HINIC_RDMA_H__
#define RDMA_ROCE_ENABLE 1
#define RDMA_IWARP_ENABLE 1
#define RDMA_ROCE_DISABLE 0
#define RDMA_IWARP_DISABLE 0
#define RDMA_MPT_DISABLED 0 /* has no mpt entry */
#define RDMA_MPT_EN_SW 1 /* has mpt, state INVALID */
#define RDMA_MPT_EN_HW 2 /* has mpt, state FREE or VALID */
#define RDMA_MPT_FIX_BUG_LKEY 0
struct mutex;
struct tag_cqm_qpc_mpt;
struct tag_cqm_object;
struct net_device;
struct rdma_gid_entry;
#include "hinic3_cqm.h"
enum mtt_check_type_e {
MTT_CHECK_TYPE_0 = 0,
MTT_CHECK_TYPE_1
};
enum mtt_data_type_e {
MTT_DMTT_TYPE = 0,
MTT_CMTT_TYPE
};
enum rdma_ib_access {
RDMA_IB_ACCESS_LOCAL_WRITE = 1,
RDMA_IB_ACCESS_REMOTE_WRITE = (1 << 1),
RDMA_IB_ACCESS_REMOTE_READ = (1 << 2),
RDMA_IB_ACCESS_REMOTE_ATOMIC = (1 << 3),
RDMA_IB_ACCESS_MW_BIND = (1 << 4),
RDMA_IB_ACCESS_ZERO_BASED = (1 << 5),
RDMA_IB_ACCESS_ON_DEMAND = (1 << 6),
};
struct rdma_gid_entry {
union {
u8 raw[16];
struct {
__be64 subnet_prefix;
__be64 interface_id;
} global;
};
union {
struct {
u32 rsvd : 7;
u32 is_vroce : 1;
u32 cvlan : 12; /* 内层vlan customer vlan */
u32 svlan : 12; /* 外层vlan */
} bs;
u32 value;
} dw4;
union {
u32 hdr_len_value;
};
union {
struct {
/* 0:没有vlan 1一层vlan 2: 2层vlan 3stag */
u16 tag : 2;
u16 tunnel : 1; // rsvd for ppe, don't use. 'tunnel'
u16 gid_type : 2;
u16 ppe_rsvd1 : 1;
u16 outer_tag : 2; // rsvd for ppe, don't use. 'outer_tag'
u16 ppe_rsvd3 : 1; // rsvd for ppe, don't use. 'stag'
u16 gid_update : 1;
u16 rsvd : 6;
} bs;
u16 value;
} dw6_h;
u8 smac[6];
};
struct rdma_comp_resource {
struct mutex mutex; /* gid_entry使用的互斥量 */
__be64 node_guid; /* 与ibdev中的node_guid一致 */
struct rdma_gid_entry **gid_table; /* gid_entry在rdma组件初始化时分配内存 */
};
struct rdma_mpt {
u32 mpt_index; /* 封装cqm提供的mpt_index */
void *vaddr; /* 封装cqm提供的mpt_entry的虚拟地址 */
void *mpt_object; /* 封装的cqm提供的指针 */
};
struct rdma_mtt_seg {
u32 offset; /* 分配连续索引的首个索引 */
u32 order; /* mtt索引个数为1<<order每个索引对应一个mtt entry */
void *vaddr; /* mtt_seg第一个MTT的起始虚拟地址 */
dma_addr_t paddr; /* mtt_seg第一个MTT的起始物理地址 */
};
struct rdma_mtt {
/* mtt的级数,该值为0时表示不使用mtt做地址转换 */
u32 mtt_layers;
u32 mtt_page_shift; /* MTT的页大小 */
u32 buf_page_shift; /* buffer页大小 */
dma_addr_t mtt_paddr; /* 写入context中的物理地址 */
__be64 *mtt_vaddr; /* 写入context中的虚拟地址 */
struct rdma_mtt_seg **mtt_seg; /* 指向多级mtt */
enum mtt_data_type_e mtt_type;
};
enum rdma_mr_type {
RDMA_DMA_MR = 0,
RDMA_USER_MR = 1,
RDMA_FRMR = 2,
RDMA_FMR = 3,
RDMA_PHYS_MR = 4,
RDMA_RSVD_LKEY = 5,
RDMA_SIG_MR = 6,
RDMA_INDIRECT_MR = 8,
RDMA_ODP_IMPLICIT_MR = 9,
RDMA_ODP_EXPLICIT_MR = 10,
};
struct rdma_mr {
struct rdma_mpt mpt;
struct rdma_mtt mtt;
u64 iova; /* mr指向内存的起始地址(虚拟地址,ZBVA时为0) */
u64 size; /* mr指向内存的大小 */
u32 key; /* mr对应的key */
u32 pdn; /* mr绑定的pdn */
u32 access; /* mr的访问权限 */
int enabled; /* mr的状态,DISABLE、EN_SW、EN_HW */
int mr_type; /* mr类型 */
u32 block_size;
};
enum rdma_mw_type {
RDMA_MW_TYPE_1 = 1,
RDMA_MW_TYPE_2 = 2
};
struct rdma_mw {
struct rdma_mpt mpt;
u32 key; /* mw对应的key */
u32 pdn; /* mw绑定的pdn */
enum rdma_mw_type type; /* mw的类型,type1,type2 */
int enabled; /* mw的状态 */
};
struct rdma_fmr {
struct rdma_mr mr;
u32 max_pages; /* fmr的最大映射页个数 */
u32 max_maps; /* fmr的最大映射次数 */
u32 maps; /* fmr的当前映射次数 */
u32 page_shift; /* fmr指定的页偏移 */
};
struct rdma_rdmarc {
u32 offset; /* 分配连续索引的首个索引 */
u32 order; /* 分配的rdmarc的order,代表了个数 */
u32 ext_order; /* 包含rc表和扩展表的个数 */
dma_addr_t dma_addr;
void *vaddr;
};
int roce3_rdma_pd_alloc(void *hwdev, u32 *pdn);
void roce3_rdma_pd_free(void *hwdev, u32 pdn);
int roce3_rdma_enable_mw_mpt(void *hwdev, struct rdma_mw *mw, u32 service_type);
int roce3_rdma_disable_mw_mpt(void *hwdev, struct rdma_mw *mw, u32 service_type);
int roce3_rdma_map_phys_fmr(void *hwdev, struct rdma_fmr *fmr, u64 *page_list,
int npages, u64 iova, u32 service_type);
int roce3_rdma_unmap_fmr(void *hwdev, struct rdma_fmr *fmr, u32 service_type);
int roce3_rdma_rdmarc_alloc(void *hwdev, u32 num, struct rdma_rdmarc *rdmarc);
void roce3_rdma_rdmarc_free(void *hwdev, struct rdma_rdmarc *rdmarc);
int roce3_rdma_update_gid_mac(void *hwdev, u32 port, struct rdma_gid_entry *gid_entry);
int roce3_rdma_update_gid(void *hwdev, u32 port, u32 update_index,
struct rdma_gid_entry *gid_entry);
int roce3_rdma_reset_gid_table(void *hwdev, u32 port);
int roce3_rdma_get_gid(void *hwdev, u32 port, u32 gid_index, struct rdma_gid_entry *gid);
/* 该接口在pf初始化时调用 */
int roce3_rdma_init_resource(void *hwdev);
/* 该接口在pf卸载时调用 */
void roce3_rdma_cleanup_resource(void *hwdev);
#endif /* HINIC_RDMA_H__ */