drivers/infiniband/hw/irdma/uk.c
Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/irdma/uk.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/infiniband/hw/irdma/uk.c- Extension
.c- Size
- 51947 bytes
- Lines
- 1929
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
osdep.hdefs.huser.hirdma.h
Detected Declarations
function irdma_set_fragmentfunction irdma_set_fragment_gen_1function irdma_nop_1function irdma_clr_wqesfunction irdma_uk_qp_post_wrfunction irdma_uk_rdma_writefunction irdma_uk_atomic_fetch_addfunction irdma_uk_atomic_compare_swapfunction irdma_uk_srq_post_receivefunction irdma_uk_rdma_readfunction irdma_uk_sendfunction irdma_set_mw_bind_wqe_gen_1function irdma_copy_inline_data_gen_1function irdma_inline_data_size_to_quanta_gen_1function irdma_set_mw_bind_wqefunction irdma_copy_inline_datafunction irdma_inline_data_size_to_quantafunction irdma_uk_inline_rdma_writefunction irdma_uk_inline_sendfunction irdma_uk_stag_local_invalidatefunction irdma_uk_post_receivefunction irdma_uk_cq_resizefunction irdma_uk_cq_set_resized_cntfunction irdma_uk_cq_request_notificationfunction irdma_uk_cq_emptyfunction irdma_uk_cq_poll_cmplfunction irdma_round_up_wqfunction irdma_get_wqe_shiftfunction irdma_get_sqdepthfunction irdma_get_rqdepthfunction irdma_get_srqdepthfunction irdma_setup_connection_wqesfunction irdma_uk_srq_initfunction irdma_uk_calc_shift_wqfunction irdma_uk_calc_depth_shift_sqfunction irdma_uk_calc_depth_shift_rqfunction irdma_uk_qp_initfunction irdma_uk_cq_initfunction irdma_uk_clean_cqfunction irdma_nopfunction irdma_fragcnt_to_quanta_sqfunction irdma_fragcnt_to_wqesize_rq
Annotated Snippet
while (sge_len) {
u32 bytes_copied;
bytes_copied = min(sge_len, quanta_bytes_remaining);
memcpy(wqe, cur_sge, bytes_copied);
wqe += bytes_copied;
cur_sge += bytes_copied;
quanta_bytes_remaining -= bytes_copied;
sge_len -= bytes_copied;
if (!quanta_bytes_remaining) {
/* Remaining inline bytes reside after hdr */
wqe += 16;
quanta_bytes_remaining = 32;
}
}
}
}
/**
* irdma_inline_data_size_to_quanta_gen_1 - based on inline data, quanta
* @data_size: data size for inline
*
* Gets the quanta based on inline and immediate data.
*/
static inline u16 irdma_inline_data_size_to_quanta_gen_1(u32 data_size)
{
return data_size <= 16 ? IRDMA_QP_WQE_MIN_QUANTA : 2;
}
/**
* irdma_set_mw_bind_wqe - set mw bind in wqe
* @wqe: wqe for setting mw bind
* @op_info: info for setting wqe values
*/
static void irdma_set_mw_bind_wqe(__le64 *wqe,
struct irdma_bind_window *op_info)
{
set_64bit_val(wqe, 0, (uintptr_t)op_info->va);
set_64bit_val(wqe, 8,
FIELD_PREP(IRDMAQPSQ_PARENTMRSTAG, op_info->mr_stag) |
FIELD_PREP(IRDMAQPSQ_MWSTAG, op_info->mw_stag));
set_64bit_val(wqe, 16, op_info->bind_len);
}
/**
* irdma_copy_inline_data - Copy inline data to wqe
* @wqe: pointer to wqe
* @sge_list: table of pointers to inline data
* @num_sges: number of SGE's
* @polarity: polarity of wqe valid bit
*/
static void irdma_copy_inline_data(u8 *wqe, struct ib_sge *sge_list,
u32 num_sges, u8 polarity)
{
u8 inline_valid = polarity << IRDMA_INLINE_VALID_S;
u32 quanta_bytes_remaining = 8;
bool first_quanta = true;
int i;
wqe += 8;
for (i = 0; i < num_sges; i++) {
u8 *cur_sge = (u8 *)(uintptr_t)sge_list[i].addr;
u32 sge_len = sge_list[i].length;
while (sge_len) {
u32 bytes_copied;
bytes_copied = min(sge_len, quanta_bytes_remaining);
memcpy(wqe, cur_sge, bytes_copied);
wqe += bytes_copied;
cur_sge += bytes_copied;
quanta_bytes_remaining -= bytes_copied;
sge_len -= bytes_copied;
if (!quanta_bytes_remaining) {
quanta_bytes_remaining = 31;
/* Remaining inline bytes reside after hdr */
if (first_quanta) {
first_quanta = false;
wqe += 16;
} else {
*wqe = inline_valid;
wqe++;
}
}
}
}
Annotation
- Immediate include surface: `osdep.h`, `defs.h`, `user.h`, `irdma.h`.
- Detected declarations: `function irdma_set_fragment`, `function irdma_set_fragment_gen_1`, `function irdma_nop_1`, `function irdma_clr_wqes`, `function irdma_uk_qp_post_wr`, `function irdma_uk_rdma_write`, `function irdma_uk_atomic_fetch_add`, `function irdma_uk_atomic_compare_swap`, `function irdma_uk_srq_post_receive`, `function irdma_uk_rdma_read`.
- 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.
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.