drivers/crypto/intel/qat/qat_common/adf_vf_isr.c

Source file repositories/reference/linux-study-clean/drivers/crypto/intel/qat/qat_common/adf_vf_isr.c

File Facts

System
Linux kernel
Corpus path
drivers/crypto/intel/qat/qat_common/adf_vf_isr.c
Extension
.c
Size
8150 bytes
Lines
315
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

struct adf_vf_stop_data {
	struct adf_accel_dev *accel_dev;
	struct work_struct work;
};

void adf_enable_pf2vf_interrupts(struct adf_accel_dev *accel_dev)
{
	void __iomem *pmisc_addr = adf_get_pmisc_base(accel_dev);

	ADF_CSR_WR(pmisc_addr, ADF_VINTMSK_OFFSET, 0x0);
}

void adf_disable_pf2vf_interrupts(struct adf_accel_dev *accel_dev)
{
	void __iomem *pmisc_addr = adf_get_pmisc_base(accel_dev);

	ADF_CSR_WR(pmisc_addr, ADF_VINTMSK_OFFSET, 0x2);
}
EXPORT_SYMBOL_GPL(adf_disable_pf2vf_interrupts);

static int adf_enable_msi(struct adf_accel_dev *accel_dev)
{
	struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
	int stat = pci_alloc_irq_vectors(pci_dev_info->pci_dev, 1, 1,
					 PCI_IRQ_MSI);
	if (unlikely(stat < 0)) {
		dev_err(&GET_DEV(accel_dev),
			"Failed to enable MSI interrupt: %d\n", stat);
		return stat;
	}

	return 0;
}

static void adf_disable_msi(struct adf_accel_dev *accel_dev)
{
	struct pci_dev *pdev = accel_to_pci_dev(accel_dev);

	pci_free_irq_vectors(pdev);
}

static void adf_dev_stop_async(struct work_struct *work)
{
	struct adf_vf_stop_data *stop_data =
		container_of(work, struct adf_vf_stop_data, work);
	struct adf_accel_dev *accel_dev = stop_data->accel_dev;

	adf_dev_restarting_notify(accel_dev);
	adf_dev_down(accel_dev);

	/* Re-enable PF2VF interrupts */
	adf_enable_pf2vf_interrupts(accel_dev);
	adf_vf2pf_notify_restart_complete(accel_dev);
	kfree(stop_data);
}

int adf_pf2vf_handle_pf_restarting(struct adf_accel_dev *accel_dev)
{
	struct adf_vf_stop_data *stop_data;

	clear_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
	stop_data = kzalloc_obj(*stop_data, GFP_ATOMIC);
	if (!stop_data) {
		dev_err(&GET_DEV(accel_dev),
			"Couldn't schedule stop for vf_%d\n",
			accel_dev->accel_id);
		return -ENOMEM;
	}
	stop_data->accel_dev = accel_dev;
	INIT_WORK(&stop_data->work, adf_dev_stop_async);
	queue_work(adf_vf_stop_wq, &stop_data->work);

	return 0;
}

static void adf_pf2vf_bh_handler(void *data)
{
	struct adf_accel_dev *accel_dev = data;
	bool ret;

	ret = adf_recv_and_handle_pf2vf_msg(accel_dev);
	if (ret)
		/* Re-enable PF2VF interrupts */
		adf_enable_pf2vf_interrupts(accel_dev);

	return;

}

static int adf_setup_pf2vf_bh(struct adf_accel_dev *accel_dev)

Annotation

Implementation Notes