drivers/vfio/pci/pds/vfio_dev.c

Source file repositories/reference/linux-study-clean/drivers/vfio/pci/pds/vfio_dev.c

File Facts

System
Linux kernel
Corpus path
drivers/vfio/pci/pds/vfio_dev.c
Extension
.c
Size
5834 bytes
Lines
216
Domain
Driver Families
Bucket
drivers/vfio
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

if (err) {
			res = ERR_PTR(err);
			break;
		}

		res = pds_vfio_step_device_state_locked(pds_vfio, next_state);
		if (IS_ERR(res))
			break;

		pds_vfio->state = next_state;

		if (WARN_ON(res && new_state != pds_vfio->state)) {
			res = ERR_PTR(-EINVAL);
			break;
		}
	}
	mutex_unlock(&pds_vfio->state_mutex);
	if (pds_vfio->state == VFIO_DEVICE_STATE_ERROR)
		res = ERR_PTR(-EIO);

	return res;
}

static int pds_vfio_get_device_state(struct vfio_device *vdev,
				     enum vfio_device_mig_state *current_state)
{
	struct pds_vfio_pci_device *pds_vfio =
		container_of(vdev, struct pds_vfio_pci_device,
			     vfio_coredev.vdev);

	mutex_lock(&pds_vfio->state_mutex);
	*current_state = pds_vfio->state;
	mutex_unlock(&pds_vfio->state_mutex);
	return 0;
}

static int pds_vfio_get_device_state_size(struct vfio_device *vdev,
					  unsigned long *stop_copy_length)
{
	*stop_copy_length = PDS_LM_DEVICE_STATE_LENGTH;
	return 0;
}

static const struct vfio_migration_ops pds_vfio_lm_ops = {
	.migration_set_state = pds_vfio_set_device_state,
	.migration_get_state = pds_vfio_get_device_state,
	.migration_get_data_size = pds_vfio_get_device_state_size
};

static const struct vfio_log_ops pds_vfio_log_ops = {
	.log_start = pds_vfio_dma_logging_start,
	.log_stop = pds_vfio_dma_logging_stop,
	.log_read_and_clear = pds_vfio_dma_logging_report,
};

static int pds_vfio_init_device(struct vfio_device *vdev)
{
	struct pds_vfio_pci_device *pds_vfio =
		container_of(vdev, struct pds_vfio_pci_device,
			     vfio_coredev.vdev);
	struct pci_dev *pdev = to_pci_dev(vdev->dev);
	int err, vf_id, pci_id;

	vf_id = pci_iov_vf_id(pdev);
	if (vf_id < 0)
		return vf_id;

	err = vfio_pci_core_init_dev(vdev);
	if (err)
		return err;

	pds_vfio->vf_id = vf_id;

	mutex_init(&pds_vfio->state_mutex);

	vdev->migration_flags = VFIO_MIGRATION_STOP_COPY | VFIO_MIGRATION_P2P;
	vdev->mig_ops = &pds_vfio_lm_ops;
	vdev->log_ops = &pds_vfio_log_ops;

	pci_id = PCI_DEVID(pdev->bus->number, pdev->devfn);
	dev_dbg(&pdev->dev,
		"%s: PF %#04x VF %#04x vf_id %d domain %d pds_vfio %p\n",
		__func__, pci_dev_id(pci_physfn(pdev)), pci_id, vf_id,
		pci_domain_nr(pdev->bus), pds_vfio);

	return 0;
}

static void pds_vfio_release_device(struct vfio_device *vdev)
{

Annotation

Implementation Notes