drivers/infiniband/hw/erdma/erdma_verbs.c
Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/erdma/erdma_verbs.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/infiniband/hw/erdma/erdma_verbs.c- Extension
.c- Size
- 57985 bytes
- Lines
- 2300
- Domain
- Driver Families
- Bucket
- drivers/infiniband
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/vmalloc.hnet/addrconf.hrdma/erdma-abi.hrdma/iter.hrdma/uverbs_ioctl.herdma.herdma_cm.herdma_verbs.h
Detected Declarations
enum countersfunction assemble_qbuf_mtt_for_cmdfunction create_qp_cmdfunction regmr_cmdfunction create_cq_cmdfunction erdma_alloc_idxfunction erdma_free_idxfunction erdma_user_mmap_entry_insertfunction erdma_query_devicefunction erdma_query_gidfunction erdma_query_portfunction erdma_get_port_immutablefunction erdma_alloc_pdfunction erdma_dealloc_pdfunction erdma_flush_workerfunction erdma_qp_validate_capfunction erdma_qp_validate_attrfunction free_kernel_qpfunction init_kernel_qpfunction erdma_fill_bottom_mttfunction erdma_unmap_page_listfunction erdma_destroy_mtt_buf_dma_addrsfunction erdma_destroy_scatter_mttfunction erdma_init_middle_mttfunction vmalloc_to_dma_addrsfunction erdma_create_mtt_buf_dma_addrsfunction erdma_destroy_mttfunction get_mtt_entriesfunction put_mtt_entriesfunction erdma_map_user_dbrecordsfunction erdma_unmap_user_dbrecordsfunction init_user_qpfunction free_user_qpfunction erdma_create_qpfunction erdma_create_stagfunction erdma_set_pagefunction erdma_map_mr_sgfunction erdma_dereg_mrfunction erdma_destroy_cqfunction erdma_destroy_qpfunction erdma_qp_get_reffunction erdma_qp_put_reffunction erdma_mmapfunction erdma_mmap_freefunction alloc_db_resourcesfunction free_db_resourcesfunction erdma_uctx_user_mmap_entries_removefunction erdma_alloc_ucontext
Annotated Snippet
if (uctx->ext_db.enable) {
req.sq_cqn_mtt_cfg |=
FIELD_PREP(ERDMA_CMD_CREATE_QP_DB_CFG_MASK, 1);
req.db_cfg =
FIELD_PREP(ERDMA_CMD_CREATE_QP_SQDB_CFG_MASK,
uctx->ext_db.sdb_off) |
FIELD_PREP(ERDMA_CMD_CREATE_QP_RQDB_CFG_MASK,
uctx->ext_db.rdb_off);
}
}
err = erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), &resp0, &resp1,
true);
if (!err && erdma_device_iwarp(dev))
qp->attrs.iwarp.cookie =
FIELD_GET(ERDMA_CMDQ_CREATE_QP_RESP_COOKIE_MASK, resp0);
return err;
}
static int regmr_cmd(struct erdma_dev *dev, struct erdma_mr *mr)
{
struct erdma_pd *pd = to_epd(mr->ibmr.pd);
u32 mtt_level = ERDMA_MR_MTT_0LEVEL;
struct erdma_cmdq_reg_mr_req req;
erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_RDMA, CMDQ_OPCODE_REG_MR);
if (mr->type == ERDMA_MR_TYPE_FRMR ||
mr->mem.page_cnt > ERDMA_MAX_INLINE_MTT_ENTRIES) {
if (mr->mem.mtt->continuous) {
req.phy_addr[0] = mr->mem.mtt->buf_dma;
mtt_level = ERDMA_MR_MTT_1LEVEL;
} else {
req.phy_addr[0] = mr->mem.mtt->dma_addrs[0];
mtt_level = mr->mem.mtt->level;
}
} else if (mr->type != ERDMA_MR_TYPE_DMA) {
memcpy(req.phy_addr, mr->mem.mtt->buf,
MTT_SIZE(mr->mem.page_cnt));
}
req.cfg0 = FIELD_PREP(ERDMA_CMD_MR_VALID_MASK, mr->valid) |
FIELD_PREP(ERDMA_CMD_MR_KEY_MASK, mr->ibmr.lkey & 0xFF) |
FIELD_PREP(ERDMA_CMD_MR_MPT_IDX_MASK, mr->ibmr.lkey >> 8);
req.cfg1 = FIELD_PREP(ERDMA_CMD_REGMR_PD_MASK, pd->pdn) |
FIELD_PREP(ERDMA_CMD_REGMR_TYPE_MASK, mr->type) |
FIELD_PREP(ERDMA_CMD_REGMR_RIGHT_MASK, mr->access);
req.cfg2 = FIELD_PREP(ERDMA_CMD_REGMR_PAGESIZE_MASK,
ilog2(mr->mem.page_size)) |
FIELD_PREP(ERDMA_CMD_REGMR_MTT_LEVEL_MASK, mtt_level) |
FIELD_PREP(ERDMA_CMD_REGMR_MTT_CNT_MASK, mr->mem.page_cnt);
if (mr->type == ERDMA_MR_TYPE_DMA)
goto post_cmd;
if (mr->type == ERDMA_MR_TYPE_NORMAL) {
req.start_va = mr->mem.va;
req.size = mr->mem.len;
}
if (!mr->mem.mtt->continuous && mr->mem.mtt->level > 1) {
req.cfg0 |= FIELD_PREP(ERDMA_CMD_MR_VERSION_MASK, 1);
req.cfg2 |= FIELD_PREP(ERDMA_CMD_REGMR_MTT_PAGESIZE_MASK,
PAGE_SHIFT - ERDMA_HW_PAGE_SHIFT);
req.size_h = upper_32_bits(mr->mem.len);
req.mtt_cnt_h = mr->mem.page_cnt >> 20;
}
post_cmd:
return erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL,
true);
}
static int create_cq_cmd(struct erdma_ucontext *uctx, struct erdma_cq *cq)
{
struct erdma_dev *dev = to_edev(cq->ibcq.device);
struct erdma_cmdq_create_cq_req req;
struct erdma_mem *mem;
u32 page_size;
erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_RDMA,
CMDQ_OPCODE_CREATE_CQ);
req.cfg0 = FIELD_PREP(ERDMA_CMD_CREATE_CQ_CQN_MASK, cq->cqn) |
FIELD_PREP(ERDMA_CMD_CREATE_CQ_DEPTH_MASK, ilog2(cq->depth));
req.cfg1 = FIELD_PREP(ERDMA_CMD_CREATE_CQ_EQN_MASK, cq->assoc_eqn);
if (rdma_is_kernel_res(&cq->ibcq.res)) {
page_size = SZ_32M;
Annotation
- Immediate include surface: `linux/vmalloc.h`, `net/addrconf.h`, `rdma/erdma-abi.h`, `rdma/iter.h`, `rdma/uverbs_ioctl.h`, `erdma.h`, `erdma_cm.h`, `erdma_verbs.h`.
- Detected declarations: `enum counters`, `function assemble_qbuf_mtt_for_cmd`, `function create_qp_cmd`, `function regmr_cmd`, `function create_cq_cmd`, `function erdma_alloc_idx`, `function erdma_free_idx`, `function erdma_user_mmap_entry_insert`, `function erdma_query_device`, `function erdma_query_gid`.
- Atlas domain: Driver Families / drivers/infiniband.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.