Merge tag 'vfio-v6.4-rc1' of https://github.com/awilliam/linux-vfio
[sfrench/cifs-2.6.git] / drivers / vfio / pci / vfio_pci_config.c
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);