From 7bcc0412428050b0ab1fd70cbb4aaead5ac3c0e5 Mon Sep 17 00:00:00 2001 From: Manoj Kumar Date: Wed, 29 Jan 2020 17:21:39 +0000 Subject: [PATCH 4/4] n1sdp: update n1sdp pci quirk for SR-IOV support VFs are not probing the vendor ID first, which is otherwise the gate keeper for undiscovered devices. So any accesses using a config space offset greater than 0 must be coming for an already discovered device or from a VF that has just been created. Also if Linux already has a struct pci_dev* for a given BDF, this device is safe to access. Skip the firmware table in these cases and allow accesses to those devices. That enables SR-IOV support on the N1SDP board. Signed-off-by: Andre Przywara --- drivers/pci/controller/pcie-n1sdp.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/pci/controller/pcie-n1sdp.c b/drivers/pci/controller/pcie-n1sdp.c index 620ab221466c..04c0de043817 100644 --- a/drivers/pci/controller/pcie-n1sdp.c +++ b/drivers/pci/controller/pcie-n1sdp.c @@ -61,6 +61,7 @@ static void __iomem *pci_n1sdp_map_bus(struct pci_bus *bus, unsigned int devfn, unsigned int segment = bus->domain_nr; unsigned int bdf_addr; unsigned int table_count, i; + struct pci_dev *dev; if (segment >= MAX_SEGMENTS || busn < cfg->busr.start || busn > cfg->busr.end) @@ -70,6 +71,14 @@ static void __iomem *pci_n1sdp_map_bus(struct pci_bus *bus, unsigned int devfn, if (busn == 0 && devfn == 0) return rc_remapped_addr[segment] + where; + dev = pci_get_domain_bus_and_slot(segment, busn, devfn); + if (dev && dev->is_virtfn) + return pci_ecam_map_bus(bus, devfn, where); + + /* Accesses beyond the vendor ID always go to existing devices. */ + if (where > 0) + return pci_ecam_map_bus(bus, devfn, where); + busn -= cfg->busr.start; bdf_addr = (busn << cfg->ops->bus_shift) + (devfn << devfn_shift); table_count = pcie_discovery_data[segment]->nr_bdfs; -- 2.25.0