drivers/infiniband/hw/ionic/ionic_res.h

Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/ionic/ionic_res.h

File Facts

System
Linux kernel
Corpus path
drivers/infiniband/hw/ionic/ionic_res.h
Extension
.h
Size
4961 bytes
Lines
155
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct ionic_resid_bits {
	struct ida inuse;
	unsigned int inuse_size;
};

/**
 * ionic_resid_init() - Initialize a resid allocator
 * @resid:  Uninitialized resid allocator
 * @size:   Capacity of the allocator
 *
 * Return: Zero on success, or negative error number
 */
static inline void ionic_resid_init(struct ionic_resid_bits *resid,
				    unsigned int size)
{
	resid->inuse_size = size;
	ida_init(&resid->inuse);
}

/**
 * ionic_resid_destroy() - Destroy a resid allocator
 * @resid:  Resid allocator
 */
static inline void ionic_resid_destroy(struct ionic_resid_bits *resid)
{
	ida_destroy(&resid->inuse);
}

/**
 * ionic_resid_get_shared() - Allocate an available shared resource id
 * @resid:   Resid allocator
 * @min:     Smallest valid resource id
 * @size:    One after largest valid resource id
 *
 * Return: Resource id, or negative error number
 */
static inline int ionic_resid_get_shared(struct ionic_resid_bits *resid,
					 unsigned int min,
					 unsigned int size)
{
	return ida_alloc_range(&resid->inuse, min, size - 1, GFP_KERNEL);
}

/**
 * ionic_resid_get() - Allocate an available resource id
 * @resid: Resid allocator
 *
 * Return: Resource id, or negative error number
 */
static inline int ionic_resid_get(struct ionic_resid_bits *resid)
{
	return ionic_resid_get_shared(resid, 0, resid->inuse_size);
}

/**
 * ionic_resid_put() - Free a resource id
 * @resid:  Resid allocator
 * @id:     Resource id
 */
static inline void ionic_resid_put(struct ionic_resid_bits *resid, int id)
{
	ida_free(&resid->inuse, id);
}

/**
 * ionic_bitid_to_qid() - Transform a resource bit index into a queue id
 * @bitid:           Bit index
 * @qgrp_shift:      Log2 number of queues per queue group
 * @half_qid_shift:  Log2 of half the total number of queues
 *
 * Return: Queue id
 *
 * Udma-constrained queues (QPs and CQs) are associated with their udma by
 * queue group. Even queue groups are associated with udma0, and odd queue
 * groups with udma1.
 *
 * For allocating queue ids, we want to arrange the bits into two halves,
 * with the even queue groups of udma0 in the lower half of the bitset,
 * and the odd queue groups of udma1 in the upper half of the bitset.
 * Then, one or two calls of find_next_zero_bit can examine all the bits
 * for queues of an entire udma.
 *
 * For example, assuming eight queue groups with qgrp qids per group:
 *
 * bitid 0*qgrp..1*qgrp-1 : qid 0*qgrp..1*qgrp-1
 * bitid 1*qgrp..2*qgrp-1 : qid 2*qgrp..3*qgrp-1
 * bitid 2*qgrp..3*qgrp-1 : qid 4*qgrp..5*qgrp-1
 * bitid 3*qgrp..4*qgrp-1 : qid 6*qgrp..7*qgrp-1
 * bitid 4*qgrp..5*qgrp-1 : qid 1*qgrp..2*qgrp-1
 * bitid 5*qgrp..6*qgrp-1 : qid 3*qgrp..4*qgrp-1

Annotation

Implementation Notes