Merge tag 'vfio-v6.4-rc1' of https://github.com/awilliam/linux-vfio
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 2 May 2023 18:56:43 +0000 (11:56 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 2 May 2023 18:56:43 +0000 (11:56 -0700)
Pull VFIO updates from Alex Williamson:

 - Expose and allow R/W access to the PCIe DVSEC capability through
   vfio-pci, as we already do with the legacy vendor capability
   (K V P Satyanarayana)

 - Fix kernel-doc issues with structure definitions (Simon Horman)

 - Clarify ordering of operations relative to the kvm-vfio device for
   driver dependencies against the kvm pointer (Yi Liu)

* tag 'vfio-v6.4-rc1' of https://github.com/awilliam/linux-vfio:
  docs: kvm: vfio: Suggest KVM_DEV_VFIO_GROUP_ADD vs VFIO_GROUP_GET_DEVICE_FD ordering
  vfio: correct kdoc for ops structures
  vfio/pci: Add DVSEC PCI Extended Config Capability to user visible list.

Documentation/virt/kvm/devices/vfio.rst
drivers/vfio/pci/vfio_pci_config.c
include/linux/vfio.h

index 2d20dc56106946c4b79c073789a44eaca91dfebf..08b544212638c1b960f9d9943652aea74822dc1d 100644 (file)
@@ -39,3 +39,8 @@ KVM_DEV_VFIO_GROUP attributes:
        - @groupfd is a file descriptor for a VFIO group;
        - @tablefd is a file descriptor for a TCE table allocated via
          KVM_CREATE_SPAPR_TCE.
+
+The GROUP_ADD operation above should be invoked prior to accessing the
+device file descriptor via VFIO_GROUP_GET_DEVICE_FD in order to support
+drivers which require a kvm pointer to be set in their .open_device()
+callback.
index 523e0144c86fab80bb619164bdfc0d9c38f15a21..948cdd464f4e61cf790dca492a6f24f6a1ec000b 100644 (file)
@@ -96,6 +96,7 @@ static const u16 pci_ext_cap_length[PCI_EXT_CAP_ID_MAX + 1] = {
        [PCI_EXT_CAP_ID_SECPCI] =       0,      /* not yet */
        [PCI_EXT_CAP_ID_PMUX]   =       0,      /* not yet */
        [PCI_EXT_CAP_ID_PASID]  =       0,      /* not yet */
+       [PCI_EXT_CAP_ID_DVSEC]  =       0xFF,
 };
 
 /*
@@ -1101,6 +1102,7 @@ int __init vfio_pci_init_perm_bits(void)
        ret |= init_pci_ext_cap_err_perm(&ecap_perms[PCI_EXT_CAP_ID_ERR]);
        ret |= init_pci_ext_cap_pwr_perm(&ecap_perms[PCI_EXT_CAP_ID_PWR]);
        ecap_perms[PCI_EXT_CAP_ID_VNDR].writefn = vfio_raw_config_write;
+       ecap_perms[PCI_EXT_CAP_ID_DVSEC].writefn = vfio_raw_config_write;
 
        if (ret)
                vfio_pci_uninit_perm_bits();
@@ -1440,6 +1442,11 @@ static int vfio_ext_cap_len(struct vfio_pci_core_device *vdev, u16 ecap, u16 epo
                        return PCI_TPH_BASE_SIZEOF + (sts * 2) + 2;
                }
                return PCI_TPH_BASE_SIZEOF;
+       case PCI_EXT_CAP_ID_DVSEC:
+               ret = pci_read_config_dword(pdev, epos + PCI_DVSEC_HEADER1, &dword);
+               if (ret)
+                       return pcibios_err_to_errno(ret);
+               return PCI_DVSEC_HEADER1_LEN(dword);
        default:
                pci_warn(pdev, "%s: unknown length for PCI ecap %#x@%#x\n",
                         __func__, ecap, epos);
index 3188d8a374bd66f401358b7ed82d6af04a14bcf5..2c137ea94a3e6489a1abd6e4a991d0e56b09b473 100644 (file)
@@ -67,6 +67,7 @@ struct vfio_device {
 /**
  * struct vfio_device_ops - VFIO bus driver device callbacks
  *
+ * @name: Name of the device driver.
  * @init: initialize private fields in device structure
  * @release: Reclaim private fields in device structure
  * @bind_iommufd: Called when binding the device to an iommufd
@@ -139,6 +140,8 @@ int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id);
 #endif
 
 /**
+ * struct vfio_migration_ops - VFIO bus device driver migration callbacks
+ *
  * @migration_set_state: Optional callback to change the migration state for
  *         devices that support migration. It's mandatory for
  *         VFIO_DEVICE_FEATURE_MIGRATION migration support.
@@ -164,6 +167,8 @@ struct vfio_migration_ops {
 };
 
 /**
+ * struct vfio_log_ops - VFIO bus device driver logging callbacks
+ *
  * @log_start: Optional callback to ask the device start DMA logging.
  * @log_stop: Optional callback to ask the device stop DMA logging.
  * @log_read_and_clear: Optional callback to ask the device read