aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Grimm <grimm@linux.vnet.ibm.com>2015-01-19 12:52:50 -0500
committerMichael Ellerman <mpe@ellerman.id.au>2015-01-22 01:31:52 -0500
commit1212aa1c8c9ca34642f7737e1edaa96c9ce3d7dd (patch)
treebd2838b54d66c203e4e55db01299880aeb7e26a5
parent95bc11bcd1428afdb48400ec84dc6d5a83926138 (diff)
cxl: Enable CAPP recovery
Turning snoops on is the last step in CAPP recovery. Sapphire is expected to have reinitialized the PHB and done the previous recovery steps. Add mode argument to opal call to do this. Driver can turn snoops off although it does not currently. Signed-off-by: Ryan Grimm <grimm@linux.vnet.ibm.com> Acked-by: Ian Munsie <imunsie@au1.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/include/asm/opal.h8
-rw-r--r--arch/powerpc/include/asm/pnv-pci.h2
-rw-r--r--arch/powerpc/platforms/powernv/pci-ioda.c6
-rw-r--r--drivers/misc/cxl/pci.c8
4 files changed, 19 insertions, 5 deletions
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
index eb95b675109b..2baf8a5925ca 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -595,6 +595,14 @@ enum {
595 OPAL_PHB3_NUM_PEST_REGS = 256 595 OPAL_PHB3_NUM_PEST_REGS = 256
596}; 596};
597 597
598/* CAPI modes for PHB */
599enum {
600 OPAL_PHB_CAPI_MODE_PCIE = 0,
601 OPAL_PHB_CAPI_MODE_CAPI = 1,
602 OPAL_PHB_CAPI_MODE_SNOOP_OFF = 2,
603 OPAL_PHB_CAPI_MODE_SNOOP_ON = 3,
604};
605
598struct OpalIoPhbErrorCommon { 606struct OpalIoPhbErrorCommon {
599 __be32 version; 607 __be32 version;
600 __be32 ioType; 608 __be32 ioType;
diff --git a/arch/powerpc/include/asm/pnv-pci.h b/arch/powerpc/include/asm/pnv-pci.h
index f09a22fa1bd7..3c00d648336d 100644
--- a/arch/powerpc/include/asm/pnv-pci.h
+++ b/arch/powerpc/include/asm/pnv-pci.h
@@ -13,7 +13,7 @@
13#include <linux/pci.h> 13#include <linux/pci.h>
14#include <misc/cxl.h> 14#include <misc/cxl.h>
15 15
16int pnv_phb_to_cxl(struct pci_dev *dev); 16int pnv_phb_to_cxl_mode(struct pci_dev *dev, uint64_t mode);
17int pnv_cxl_ioda_msi_setup(struct pci_dev *dev, unsigned int hwirq, 17int pnv_cxl_ioda_msi_setup(struct pci_dev *dev, unsigned int hwirq,
18 unsigned int virq); 18 unsigned int virq);
19int pnv_cxl_alloc_hwirqs(struct pci_dev *dev, int num); 19int pnv_cxl_alloc_hwirqs(struct pci_dev *dev, int num);
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index fac88ed8a915..5d52d6f274f8 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -1468,7 +1468,7 @@ struct device_node *pnv_pci_to_phb_node(struct pci_dev *dev)
1468} 1468}
1469EXPORT_SYMBOL(pnv_pci_to_phb_node); 1469EXPORT_SYMBOL(pnv_pci_to_phb_node);
1470 1470
1471int pnv_phb_to_cxl(struct pci_dev *dev) 1471int pnv_phb_to_cxl_mode(struct pci_dev *dev, uint64_t mode)
1472{ 1472{
1473 struct pci_controller *hose = pci_bus_to_host(dev->bus); 1473 struct pci_controller *hose = pci_bus_to_host(dev->bus);
1474 struct pnv_phb *phb = hose->private_data; 1474 struct pnv_phb *phb = hose->private_data;
@@ -1481,13 +1481,13 @@ int pnv_phb_to_cxl(struct pci_dev *dev)
1481 1481
1482 pe_info(pe, "Switching PHB to CXL\n"); 1482 pe_info(pe, "Switching PHB to CXL\n");
1483 1483
1484 rc = opal_pci_set_phb_cxl_mode(phb->opal_id, 1, pe->pe_number); 1484 rc = opal_pci_set_phb_cxl_mode(phb->opal_id, mode, pe->pe_number);
1485 if (rc) 1485 if (rc)
1486 dev_err(&dev->dev, "opal_pci_set_phb_cxl_mode failed: %i\n", rc); 1486 dev_err(&dev->dev, "opal_pci_set_phb_cxl_mode failed: %i\n", rc);
1487 1487
1488 return rc; 1488 return rc;
1489} 1489}
1490EXPORT_SYMBOL(pnv_phb_to_cxl); 1490EXPORT_SYMBOL(pnv_phb_to_cxl_mode);
1491 1491
1492/* Find PHB for cxl dev and allocate MSI hwirqs? 1492/* Find PHB for cxl dev and allocate MSI hwirqs?
1493 * Returns the absolute hardware IRQ number 1493 * Returns the absolute hardware IRQ number
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index 014f4c928e4c..a4a4e0217eed 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -926,9 +926,15 @@ static struct cxl *cxl_init_adapter(struct pci_dev *dev)
926 if ((rc = init_implementation_adapter_regs(adapter, dev))) 926 if ((rc = init_implementation_adapter_regs(adapter, dev)))
927 goto err3; 927 goto err3;
928 928
929 if ((rc = pnv_phb_to_cxl(dev))) 929 if ((rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_CAPI)))
930 goto err3; 930 goto err3;
931 931
932 /* If recovery happened, the last step is to turn on snooping.
933 * In the non-recovery case this has no effect */
934 if ((rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_SNOOP_ON))) {
935 goto err3;
936 }
937
932 if ((rc = cxl_register_psl_err_irq(adapter))) 938 if ((rc = cxl_register_psl_err_irq(adapter)))
933 goto err3; 939 goto err3;
934 940