drivers/crypto/marvell/octeontx2/otx2_cptlf.c

Source file repositories/reference/linux-study-clean/drivers/crypto/marvell/octeontx2/otx2_cptlf.c

File Facts

System
Linux kernel
Corpus path
drivers/crypto/marvell/octeontx2/otx2_cptlf.c
Extension
.c
Size
13081 bytes
Lines
499
Domain
Driver Families
Bucket
drivers/crypto
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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

if (unlikely(!lf->wqe)) {
			dev_err(&lf->lfs->pdev->dev, "No work for LF %d\n",
				lf->slot);
			return IRQ_NONE;
		}

		/* Schedule processing of completed requests */
		tasklet_hi_schedule(&lf->wqe->work);
	}
	return IRQ_HANDLED;
}

void otx2_cptlf_unregister_misc_interrupts(struct otx2_cptlfs_info *lfs)
{
	int i, irq_offs, vector;

	irq_offs = OTX2_CPT_LF_INT_VEC_E_MISC;
	for (i = 0; i < lfs->lfs_num; i++) {
		if (!lfs->lf[i].is_irq_reg[irq_offs])
			continue;

		vector = pci_irq_vector(lfs->pdev,
					lfs->lf[i].msix_offset + irq_offs);
		free_irq(vector, &lfs->lf[i]);
		lfs->lf[i].is_irq_reg[irq_offs] = false;
	}

	cptlf_set_misc_intrs(lfs, false);
}
EXPORT_SYMBOL_NS_GPL(otx2_cptlf_unregister_misc_interrupts, "CRYPTO_DEV_OCTEONTX2_CPT");

void otx2_cptlf_unregister_done_interrupts(struct otx2_cptlfs_info *lfs)
{
	int i, irq_offs, vector;

	irq_offs = OTX2_CPT_LF_INT_VEC_E_DONE;
	for (i = 0; i < lfs->lfs_num; i++) {
		if (!lfs->lf[i].is_irq_reg[irq_offs])
			continue;

		vector = pci_irq_vector(lfs->pdev,
					lfs->lf[i].msix_offset + irq_offs);
		free_irq(vector, &lfs->lf[i]);
		lfs->lf[i].is_irq_reg[irq_offs] = false;
	}

	cptlf_set_done_intrs(lfs, false);
}
EXPORT_SYMBOL_NS_GPL(otx2_cptlf_unregister_done_interrupts, "CRYPTO_DEV_OCTEONTX2_CPT");

static int cptlf_do_register_interrrupts(struct otx2_cptlfs_info *lfs,
					 int lf_num, int irq_offset,
					 irq_handler_t handler)
{
	int ret, vector;

	vector = pci_irq_vector(lfs->pdev, lfs->lf[lf_num].msix_offset +
				irq_offset);
	ret = request_irq(vector, handler, 0,
			  lfs->lf[lf_num].irq_name[irq_offset],
			  &lfs->lf[lf_num]);
	if (ret)
		return ret;

	lfs->lf[lf_num].is_irq_reg[irq_offset] = true;

	return ret;
}

int otx2_cptlf_register_misc_interrupts(struct otx2_cptlfs_info *lfs)
{
	bool is_cpt1 = (lfs->blkaddr == BLKADDR_CPT1);
	int irq_offs, ret, i;

	irq_offs = OTX2_CPT_LF_INT_VEC_E_MISC;
	for (i = 0; i < lfs->lfs_num; i++) {
		snprintf(lfs->lf[i].irq_name[irq_offs], 32, "CPT%dLF Misc%d",
			 is_cpt1, i);
		ret = cptlf_do_register_interrrupts(lfs, i, irq_offs,
						    cptlf_misc_intr_handler);
		if (ret)
			goto free_irq;
	}
	cptlf_set_misc_intrs(lfs, true);
	return 0;

free_irq:
	otx2_cptlf_unregister_misc_interrupts(lfs);
	return ret;
}

Annotation

Implementation Notes