ntb: use errata flag set via DID to implement workaround
authorDave Jiang <dave.jiang@intel.com>
Thu, 28 Aug 2014 20:53:18 +0000 (13:53 -0700)
committerJon Mason <jdmason@kudzu.us>
Fri, 17 Oct 2014 11:08:51 +0000 (07:08 -0400)
Instead of using a module parameter, we should detect the errata via
PCI DID and then set an appropriate flag. This will be used for additional
errata later on.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
drivers/ntb/ntb_hw.c
drivers/ntb/ntb_hw.h

index 6f1c92182f353fb0ab604ff40a126a32072c1639..53b739df8cd5d13b514e52d3cc89be0b93ecf441 100644 (file)
@@ -64,10 +64,6 @@ MODULE_VERSION(NTB_VER);
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Intel Corporation");
 
-static bool xeon_errata_workaround = true;
-module_param(xeon_errata_workaround, bool, 0644);
-MODULE_PARM_DESC(xeon_errata_workaround, "Workaround for the Xeon Errata");
-
 enum {
        NTB_CONN_TRANSPARENT = 0,
        NTB_CONN_B2B,
@@ -144,6 +140,30 @@ static int is_ntb_atom(struct ntb_device *ndev)
        return 0;
 }
 
+static void ntb_set_errata_flags(struct ntb_device *ndev)
+{
+       switch (ndev->pdev->device) {
+       /*
+        * this workaround applies to all platform up to IvyBridge
+        * Haswell has splitbar support and use a different workaround
+        */
+       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+               ndev->wa_flags |= WA_SNB_ERR;
+               break;
+       }
+}
+
 /**
  * ntb_register_event_callback() - register event callback
  * @ndev: pointer to ntb_device instance
@@ -717,7 +737,7 @@ static int ntb_xeon_setup(struct ntb_device *ndev)
                 * this use the second memory window to access the interrupt and
                 * scratch pad registers on the remote system.
                 */
-               if (xeon_errata_workaround) {
+               if (ndev->wa_flags & WA_SNB_ERR) {
                        if (!ndev->mw[1].bar_sz)
                                return -EINVAL;
 
@@ -772,7 +792,7 @@ static int ntb_xeon_setup(struct ntb_device *ndev)
                if (ndev->dev_type == NTB_DEV_USD) {
                        writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base +
                               SNB_PBAR2XLAT_OFFSET);
-                       if (xeon_errata_workaround)
+                       if (ndev->wa_flags & WA_SNB_ERR)
                                writeq(SNB_MBAR01_DSD_ADDR, ndev->reg_base +
                                       SNB_PBAR4XLAT_OFFSET);
                        else {
@@ -796,7 +816,7 @@ static int ntb_xeon_setup(struct ntb_device *ndev)
                } else {
                        writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base +
                               SNB_PBAR2XLAT_OFFSET);
-                       if (xeon_errata_workaround)
+                       if (ndev->wa_flags & WA_SNB_ERR)
                                writeq(SNB_MBAR01_USD_ADDR, ndev->reg_base +
                                       SNB_PBAR4XLAT_OFFSET);
                        else {
@@ -819,9 +839,9 @@ static int ntb_xeon_setup(struct ntb_device *ndev)
                }
                break;
        case NTB_CONN_RP:
-               if (xeon_errata_workaround) {
+               if (ndev->wa_flags & WA_SNB_ERR) {
                        dev_err(&ndev->pdev->dev,
-                               "NTB-RP disabled due to hardware errata.  To disregard this warning and potentially lock-up the system, add the parameter 'xeon_errata_workaround=0'.\n");
+                               "NTB-RP disabled due to hardware errata.\n");
                        return -EINVAL;
                }
 
@@ -848,6 +868,12 @@ static int ntb_xeon_setup(struct ntb_device *ndev)
                ndev->limits.max_mw = SNB_MAX_MW;
                break;
        case NTB_CONN_TRANSPARENT:
+               if (ndev->wa_flags & WA_SNB_ERR) {
+                       dev_err(&ndev->pdev->dev,
+                               "NTB-TRANSPARENT disabled due to hardware errata.\n");
+                       return -EINVAL;
+               }
+
                /* Scratch pads need to have exclusive access from the primary
                 * or secondary side.  Halve the num spads so that each side can
                 * have an equal amount.
@@ -1595,6 +1621,9 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                return -ENOMEM;
 
        ndev->pdev = pdev;
+
+       ntb_set_errata_flags(ndev);
+
        ndev->link_status = NTB_LINK_DOWN;
        pci_set_drvdata(pdev, ndev);
        ntb_setup_debugfs(ndev);
index ddbcbfda0f49c0c150fea4d76f21a2a542100236..5380ca16198a45ae09ee13fe5bec060c187bb4ce 100644 (file)
@@ -109,6 +109,8 @@ struct ntb_db_cb {
        struct tasklet_struct irq_work;
 };
 
+#define WA_SNB_ERR     0x00000001
+
 struct ntb_device {
        struct pci_dev *pdev;
        struct msix_entry *msix_entries;
@@ -153,6 +155,8 @@ struct ntb_device {
 
        struct dentry *debugfs_dir;
        struct dentry *debugfs_info;
+
+       unsigned int wa_flags;
 };
 
 /**