linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Gavin Shan <gwshan@linux.vnet.ibm.com>
To: linux-pci@vger.kernel.org
Cc: bhelgaas@google.com, linuxppc-dev@lists.ozlabs.org,
	cascardo@linux.vnet.ibm.com,
	Gavin Shan <gwshan@linux.vnet.ibm.com>
Subject: [PATCH 2/4] PCI: Introduce list for device reset methods
Date: Fri, 13 Feb 2015 15:54:57 +1100	[thread overview]
Message-ID: <1423803299-22356-3-git-send-email-gwshan@linux.vnet.ibm.com> (raw)
In-Reply-To: <1423803299-22356-1-git-send-email-gwshan@linux.vnet.ibm.com>

The patch introduces list to hold the PCI device specific reset
methods. With help of the list, we can register PCI device specific
reset method dynamically as we do in next one patch.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
---
 drivers/pci/pci.h    |  1 +
 drivers/pci/quirks.c | 75 +++++++++++++++++++++++++++++++++++++++-------------
 2 files changed, 57 insertions(+), 19 deletions(-)

diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index e67b22f..82e648a 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -310,6 +310,7 @@ struct pci_dev_reset_method {
 	u16 vendor;
 	u16 device;
 	int (*reset)(struct pci_dev *dev, int probe);
+	struct list_head node;
 };
 
 #ifdef CONFIG_PCI_QUIRKS
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 512bbbb..37f4c5d 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3508,20 +3508,44 @@ static int reset_chelsio_generic_dev(struct pci_dev *dev, int probe)
 #define PCI_DEVICE_ID_INTEL_IVB_M_VGA      0x0156
 #define PCI_DEVICE_ID_INTEL_IVB_M2_VGA     0x0166
 
-static const struct pci_dev_reset_method pci_dev_reset_methods[] = {
-	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF,
-		 reset_intel_82599_sfp_virtfn },
-	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M_VGA,
-		reset_ivb_igd },
-	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA,
-		reset_ivb_igd },
-	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
-		reset_intel_generic_dev },
-	{ PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
-		reset_chelsio_generic_dev },
-	{ 0 }
+static LIST_HEAD(pci_dev_reset_list);
+static DEFINE_MUTEX(pci_dev_reset_mutex);
+static bool pci_dev_reset_populated = false;
+static struct pci_dev_reset_method pci_dev_reset_methods[] = {
+	{ .vendor = PCI_VENDOR_ID_INTEL,
+	  .device = PCI_DEVICE_ID_INTEL_82599_SFP_VF,
+	  .reset  = reset_intel_82599_sfp_virtfn
+	},
+	{ .vendor = PCI_VENDOR_ID_INTEL,
+	  .device = PCI_DEVICE_ID_INTEL_IVB_M_VGA,
+	  .reset  = reset_ivb_igd
+	},
+	{ .vendor = PCI_VENDOR_ID_INTEL,
+	  .device = PCI_DEVICE_ID_INTEL_IVB_M2_VGA,
+	  .reset  =reset_ivb_igd
+	},
+	{ .vendor = PCI_VENDOR_ID_INTEL,
+	  .device = PCI_ANY_ID,
+	  .reset  = reset_intel_generic_dev
+	},
+	{ .vendor = PCI_VENDOR_ID_CHELSIO,
+	  .device = PCI_ANY_ID,
+	  .reset  = reset_chelsio_generic_dev
+	}
 };
 
+static void pci_dev_populate_reset(void)
+{
+	struct pci_dev_reset_method *m;
+	int i;
+
+	for (i = ARRAY_SIZE(pci_dev_reset_methods) - 1; i >= 0; i--) {
+		m = &pci_dev_reset_methods[i];
+		INIT_LIST_HEAD(&m->node);
+		list_add(&m->node, &pci_dev_reset_list);
+	}
+}
+
 /*
  * These device-specific reset methods are here rather than in a driver
  * because when a host assigns a device to a guest VM, the host may need
@@ -3529,16 +3553,29 @@ static const struct pci_dev_reset_method pci_dev_reset_methods[] = {
  */
 int pci_dev_specific_reset(struct pci_dev *dev, int probe)
 {
-	const struct pci_dev_reset_method *i;
+	struct pci_dev_reset_method *m;
+	int ret;
 
-	for (i = pci_dev_reset_methods; i->reset; i++) {
-		if ((i->vendor == dev->vendor ||
-		     i->vendor == (u16)PCI_ANY_ID) &&
-		    (i->device == dev->device ||
-		     i->device == (u16)PCI_ANY_ID))
-			return i->reset(dev, probe);
+	mutex_lock(&pci_dev_reset_mutex);
+
+	if (!pci_dev_reset_populated) {
+		pci_dev_populate_reset();
+		pci_dev_reset_populated = true;
 	}
 
+	list_for_each_entry(m, &pci_dev_reset_list, node) {
+		if ((m->vendor == dev->vendor ||
+		     m->vendor == (u16)PCI_ANY_ID) &&
+		    (m->device == dev->device ||
+		     m->device == (u16)PCI_ANY_ID)) {
+			ret = m->reset(dev, probe);
+			mutex_unlock(&pci_dev_reset_mutex);
+			return ret;
+		}
+	}
+
+	mutex_unlock(&pci_dev_reset_mutex);
+
 	return -ENOTTY;
 }
 
-- 
1.8.3.2

  parent reply	other threads:[~2015-02-13  4:56 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-13  4:54 [PATCH 0/4] Support registering specific reset handler Gavin Shan
2015-02-13  4:54 ` [PATCH 1/4] PCI: Rename struct pci_dev_reset_methods Gavin Shan
2015-02-13  4:54 ` Gavin Shan [this message]
2015-02-13  4:54 ` [PATCH 3/4] PCI: Allow registering reset method Gavin Shan
2015-02-13  4:54 ` [PATCH 4/4] powerpc/powernv: Register PCI dev specific reset handlers Gavin Shan
2015-02-16 13:14 ` [PATCH 0/4] Support registering specific reset handler cascardo
2015-02-16 22:36   ` Gavin Shan
2015-02-19 18:57     ` cascardo
2015-02-20  5:53       ` Gavin Shan
2015-03-06 18:38         ` Bjorn Helgaas
2015-03-10  6:31           ` Gavin Shan

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=1423803299-22356-3-git-send-email-gwshan@linux.vnet.ibm.com \
    --to=gwshan@linux.vnet.ibm.com \
    --cc=bhelgaas@google.com \
    --cc=cascardo@linux.vnet.ibm.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.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).