From: James Puthukattukaran <james.puthukattukaran@oracle.com>
To: Alex Williamson <alex.williamson@redhat.com>,
Sinan Kaya <okaya@codeaurora.org>
Cc: "linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>
Subject: [PATCH 1/2] PCI: Add pci_bus_specific_read_dev_vendor_id() to workaround PCI switch specific issues prior to accessing newly added endpoint
Date: Thu, 19 Apr 2018 13:37:44 -0400 [thread overview]
Message-ID: <028a4335-94f7-48bd-ddea-4ed38159c7e9@oracle.com> (raw)
In-Reply-To: <b6439e86-2284-5b3c-3656-a0c3c2568317@oracle.com>
This patch provides a framework in which it would be possible to implement
bus specific quirks prior to accessing an endpoint device beneath that bus.
The routine, pci_bus_specific_read_dev_vendor_id, can be called prior to
accessing the end point device itself in order to workaround potential
issues
with the parent device (switch). If there is nothing specific to be done for
a particular switch device, it falls through to check for the endpoint
device
i.e pci_bus_generic_read_dev_vendor_id().
Signed-off: James Puthukattukaran <james.puthukattukaran@oracle.com>
---
drivers/pci/pci.h | 2 ++
drivers/pci/probe.c | 19 ++++++++++++++++++-
drivers/pci/quirks.c | 41 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 023f7cf..2d06689 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -225,6 +225,8 @@ enum pci_bar_type {
int pci_configure_extended_tags(struct pci_dev *dev, void *ign);
bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *pl,
int crs_timeout);
+int pci_bus_specific_read_dev_vendor_id(struct pci_bus *bus, int devfn,
+ u32 *pl, int crs_timeout);
int pci_setup_device(struct pci_dev *dev);
int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
struct resource *res, unsigned int reg);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ac91b6f..b4d8cbd 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2097,7 +2097,7 @@ static bool pci_bus_wait_crs(struct pci_bus *bus,
int devfn, u32 *l,
return true;
}
-bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *l,
+bool pci_bus_generic_read_dev_vendor_id(struct pci_bus *bus, int devfn,
u32 *l,
int timeout)
{
if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, l))
@@ -2113,6 +2113,23 @@ bool pci_bus_read_dev_vendor_id(struct pci_bus
*bus, int devfn, u32 *l,
return true;
}
+
+
+bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *l,
+ int timeout)
+{
+ int ret;
+
+ /* An opportunity to implement something specific for this device.
+ * For ex, impelement a quirk prior to even accessing the device
+ */
+ ret = pci_bus_specific_read_dev_vendor_id(bus, devfn, l, timeout);
+ if (ret >= 0)
+ return (ret >= 0);
+
+ return(pci_bus_generic_read_dev_vendor_id(bus, devfn, l, timeout));
+}
+
EXPORT_SYMBOL(pci_bus_read_dev_vendor_id);
/*
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 2990ad1..c637162 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -4741,3 +4741,44 @@ static void quirk_gpu_hda(struct pci_dev *hda)
PCI_CLASS_MULTIMEDIA_HD_AUDIO, 8, quirk_gpu_hda);
DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
PCI_CLASS_MULTIMEDIA_HD_AUDIO, 8, quirk_gpu_hda);
+
+
+static const struct pci_bus_specific_quirk{
+ u16 vendor;
+ u16 device;
+ int (*bus_quirk)(struct pci_bus *bus, int devfn, u32 *l, int timeout);
+} pci_bus_specific_quirks[] = {
+ {0}
+};
+
+/*
+ * This routine provides the ability to implement a bus specific quirk
+ * prior to doing config accesses to the endpoint device itself. For
ex, there
+ * could be HW problems with the switch above the endpoint that causes
issues
+ * when accessing the endpoint device. Such workarounds "specific" to the
+ * parent could be implemented prior or subsequent to accesses to the
+ * endpoint itself
+ *
+ */
+int pci_bus_specific_read_dev_vendor_id(struct pci_bus *bus, int devfn,
u32 *l,
+ int timeout)
+{
+ const struct pci_bus_specific_quirk *i;
+ struct pci_dev *dev;
+
+ if (!bus || !bus->self)
+ return -ENOTTY;
+
+ dev = bus->self;
+
+ /* Implement any quirks in the "bus" (switch, for ex) that causes
+ * issues in accessing the endpoint */
+ for (i = pci_bus_specific_quirks; i->bus_quirk; i++) {
+ if ((i->vendor == dev->vendor ||
+ i->vendor == (u16)PCI_ANY_ID) &&
+ (i->device == dev->device ||
+ i->device == (u16)PCI_ANY_ID))
+ return(i->bus_quirk(bus, devfn, l, timeout));
+ }
+ return -ENOTTY;
+}
--
1.8.3.1
next prev parent reply other threads:[~2018-04-19 17:37 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-19 17:36 [PATCH 0/2] PCI: Support to workaround bus level HW issues James Puthukattukaran
2018-04-19 17:37 ` James Puthukattukaran [this message]
2018-04-19 17:39 ` [PATCH 2/2] PCI: Implement workaround for the ACS bug in the IDT, switch James Puthukattukaran
2018-04-19 18:08 ` [PATCH 0/2] PCI: Support to workaround bus level HW issues Alex Williamson
2018-04-24 14:57 ` James Puthukattukaran
-- strict thread matches above, loose matches on Subject: below --
2018-04-24 14:51 [PATCH 0/2] PCI: SUpport " James Puthukattukaran
2018-04-24 14:53 ` [PATCH 1/2] PCI: Add pci_bus_specific_read_dev_vendor_id() to workaround PCI switch specific issues prior to accessing newly added endpoint James Puthukattukaran
2018-04-24 17:50 ` Alex Williamson
2018-04-26 6:26 ` kbuild test robot
2018-04-26 19:32 ` James Puthukattukaran
2018-04-26 19:42 ` Alex Williamson
2018-04-26 19:45 ` Sinan Kaya
2018-04-26 8:53 ` kbuild test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=028a4335-94f7-48bd-ddea-4ed38159c7e9@oracle.com \
--to=james.puthukattukaran@oracle.com \
--cc=alex.williamson@redhat.com \
--cc=linux-pci@vger.kernel.org \
--cc=okaya@codeaurora.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).