Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff45f9dd authored by Ben Shelton's avatar Ben Shelton Committed by Bjorn Helgaas
Browse files

PCI: Enable SR-IOV ARI Capable Hierarchy before reading TotalVFs



For some SR-IOV devices, the number of available virtual functions, i.e.,
TotalVFs, increases after setting the ARI Capable Hierarchy bit in the
SR-IOV Control register.  This violates the SR-IOV spec, r1.1, sec 3.3.6,
which says TotalVFs is HwInit, but we don't need TotalVFs before setting
the ARI Capable bit anyway.

Set the ARI Capable Hierarchy bit (if ARI is enabled in the upstream
bridge) before reading TotalVFs.

[bhelgaas: changelog]
Signed-off-by: default avatarBen Shelton <benjamin.h.shelton@intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 70675e0b
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -399,10 +399,6 @@ static int sriov_init(struct pci_dev *dev, int pos)
		ssleep(1);
	}

	pci_read_config_word(dev, pos + PCI_SRIOV_TOTAL_VF, &total);
	if (!total)
		return 0;

	ctrl = 0;
	list_for_each_entry(pdev, &dev->bus->devices, bus_list)
		if (pdev->is_physfn)
@@ -420,6 +416,10 @@ static int sriov_init(struct pci_dev *dev, int pos)
	if (!offset || (total > 1 && !stride))
		return -EIO;

	pci_read_config_word(dev, pos + PCI_SRIOV_TOTAL_VF, &total);
	if (!total)
		return 0;

	pci_read_config_dword(dev, pos + PCI_SRIOV_SUP_PGSIZE, &pgsz);
	i = PAGE_SHIFT > 12 ? PAGE_SHIFT - 12 : 0;
	pgsz &= ~((1 << i) - 1);