Commit 730ce15d authored by Satish Kharat's avatar Satish Kharat Committed by Jakub Kicinski
Browse files

enic: add type-aware alloc for WQ, RQ, CQ and INTR resources



The existing vnic_wq_alloc(), vnic_rq_alloc(), vnic_cq_alloc() and
vnic_intr_alloc() hardcode data-path resource types (RES_TYPE_WQ,
RES_TYPE_RQ, RES_TYPE_CQ, RES_TYPE_INTR_CTRL). The upcoming admin
channel uses different BAR resource types (RES_TYPE_ADMIN_WQ/RQ/CQ,
RES_TYPE_SRIOV_INTR) for its queues.

Add _with_type() variants that accept an explicit resource type
parameter. Refactor the original functions as thin wrappers that
pass the default data-path type. No functional change.

Signed-off-by: default avatarSatish Kharat <satishkh@cisco.com>
Link: https://patch.msgid.link/20260401-enic-sriov-v2-prep-v4-5-d5834b2ef1b9@cisco.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 0266ecb5
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -20,13 +20,14 @@ void vnic_cq_free(struct vnic_cq *cq)
	cq->ctrl = NULL;
}

int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index,
	unsigned int desc_count, unsigned int desc_size)
int vnic_cq_alloc_with_type(struct vnic_dev *vdev, struct vnic_cq *cq,
			    unsigned int index, unsigned int desc_count,
			    unsigned int desc_size, unsigned int res_type)
{
	cq->index = index;
	cq->vdev = vdev;

	cq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_CQ, index);
	cq->ctrl = vnic_dev_get_res(vdev, res_type, index);
	if (!cq->ctrl) {
		vdev_err(vdev, "Failed to hook CQ[%d] resource\n", index);
		return -EINVAL;
@@ -35,6 +36,13 @@ int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index,
	return vnic_dev_alloc_desc_ring(vdev, &cq->ring, desc_count, desc_size);
}

int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index,
		  unsigned int desc_count, unsigned int desc_size)
{
	return vnic_cq_alloc_with_type(vdev, cq, index, desc_count, desc_size,
				       RES_TYPE_CQ);
}

void vnic_cq_init(struct vnic_cq *cq, unsigned int flow_control_enable,
	unsigned int color_enable, unsigned int cq_head, unsigned int cq_tail,
	unsigned int cq_tail_color, unsigned int interrupt_enable,
+3 −0
Original line number Diff line number Diff line
@@ -73,6 +73,9 @@ static inline void vnic_cq_inc_to_clean(struct vnic_cq *cq)
void vnic_cq_free(struct vnic_cq *cq);
int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index,
	unsigned int desc_count, unsigned int desc_size);
int vnic_cq_alloc_with_type(struct vnic_dev *vdev, struct vnic_cq *cq,
			    unsigned int index, unsigned int desc_count,
			    unsigned int desc_size, unsigned int res_type);
void vnic_cq_init(struct vnic_cq *cq, unsigned int flow_control_enable,
	unsigned int color_enable, unsigned int cq_head, unsigned int cq_tail,
	unsigned int cq_tail_color, unsigned int interrupt_enable,
+9 −3
Original line number Diff line number Diff line
@@ -19,13 +19,13 @@ void vnic_intr_free(struct vnic_intr *intr)
	intr->ctrl = NULL;
}

int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
	unsigned int index)
int vnic_intr_alloc_with_type(struct vnic_dev *vdev, struct vnic_intr *intr,
			      unsigned int index, unsigned int res_type)
{
	intr->index = index;
	intr->vdev = vdev;

	intr->ctrl = vnic_dev_get_res(vdev, RES_TYPE_INTR_CTRL, index);
	intr->ctrl = vnic_dev_get_res(vdev, res_type, index);
	if (!intr->ctrl) {
		vdev_err(vdev, "Failed to hook INTR[%d].ctrl resource\n",
			 index);
@@ -35,6 +35,12 @@ int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
	return 0;
}

int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
		    unsigned int index)
{
	return vnic_intr_alloc_with_type(vdev, intr, index, RES_TYPE_INTR_CTRL);
}

void vnic_intr_init(struct vnic_intr *intr, u32 coalescing_timer,
	unsigned int coalescing_type, unsigned int mask_on_assertion)
{
+2 −0
Original line number Diff line number Diff line
@@ -89,6 +89,8 @@ static inline u32 vnic_intr_legacy_pba(u32 __iomem *legacy_pba)
void vnic_intr_free(struct vnic_intr *intr);
int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
	unsigned int index);
int vnic_intr_alloc_with_type(struct vnic_dev *vdev, struct vnic_intr *intr,
			      unsigned int index, unsigned int res_type);
void vnic_intr_init(struct vnic_intr *intr, u32 coalescing_timer,
	unsigned int coalescing_type, unsigned int mask_on_assertion);
void vnic_intr_coalescing_timer_set(struct vnic_intr *intr,
+11 −3
Original line number Diff line number Diff line
@@ -69,15 +69,16 @@ void vnic_rq_free(struct vnic_rq *rq)
	rq->ctrl = NULL;
}

int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
	unsigned int desc_count, unsigned int desc_size)
int vnic_rq_alloc_with_type(struct vnic_dev *vdev, struct vnic_rq *rq,
			    unsigned int index, unsigned int desc_count,
			    unsigned int desc_size, unsigned int res_type)
{
	int err;

	rq->index = index;
	rq->vdev = vdev;

	rq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_RQ, index);
	rq->ctrl = vnic_dev_get_res(vdev, res_type, index);
	if (!rq->ctrl) {
		vdev_err(vdev, "Failed to hook RQ[%d] resource\n", index);
		return -EINVAL;
@@ -98,6 +99,13 @@ int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
	return 0;
}

int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
		  unsigned int desc_count, unsigned int desc_size)
{
	return vnic_rq_alloc_with_type(vdev, rq, index, desc_count, desc_size,
				       RES_TYPE_RQ);
}

static void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
	unsigned int fetch_index, unsigned int posted_index,
	unsigned int error_interrupt_enable,
Loading