Commit 1212aa1c authored by Ryan Grimm's avatar Ryan Grimm Committed by Michael Ellerman

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: default avatarRyan Grimm <grimm@linux.vnet.ibm.com>
Acked-by: default avatarIan Munsie <imunsie@au1.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 95bc11bc
...@@ -595,6 +595,14 @@ enum { ...@@ -595,6 +595,14 @@ enum {
OPAL_PHB3_NUM_PEST_REGS = 256 OPAL_PHB3_NUM_PEST_REGS = 256
}; };
/* CAPI modes for PHB */
enum {
OPAL_PHB_CAPI_MODE_PCIE = 0,
OPAL_PHB_CAPI_MODE_CAPI = 1,
OPAL_PHB_CAPI_MODE_SNOOP_OFF = 2,
OPAL_PHB_CAPI_MODE_SNOOP_ON = 3,
};
struct OpalIoPhbErrorCommon { struct OpalIoPhbErrorCommon {
__be32 version; __be32 version;
__be32 ioType; __be32 ioType;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <misc/cxl.h> #include <misc/cxl.h>
int pnv_phb_to_cxl(struct pci_dev *dev); int pnv_phb_to_cxl_mode(struct pci_dev *dev, uint64_t mode);
int pnv_cxl_ioda_msi_setup(struct pci_dev *dev, unsigned int hwirq, int pnv_cxl_ioda_msi_setup(struct pci_dev *dev, unsigned int hwirq,
unsigned int virq); unsigned int virq);
int pnv_cxl_alloc_hwirqs(struct pci_dev *dev, int num); int pnv_cxl_alloc_hwirqs(struct pci_dev *dev, int num);
......
...@@ -1468,7 +1468,7 @@ struct device_node *pnv_pci_to_phb_node(struct pci_dev *dev) ...@@ -1468,7 +1468,7 @@ struct device_node *pnv_pci_to_phb_node(struct pci_dev *dev)
} }
EXPORT_SYMBOL(pnv_pci_to_phb_node); EXPORT_SYMBOL(pnv_pci_to_phb_node);
int pnv_phb_to_cxl(struct pci_dev *dev) int pnv_phb_to_cxl_mode(struct pci_dev *dev, uint64_t mode)
{ {
struct pci_controller *hose = pci_bus_to_host(dev->bus); struct pci_controller *hose = pci_bus_to_host(dev->bus);
struct pnv_phb *phb = hose->private_data; struct pnv_phb *phb = hose->private_data;
...@@ -1481,13 +1481,13 @@ int pnv_phb_to_cxl(struct pci_dev *dev) ...@@ -1481,13 +1481,13 @@ int pnv_phb_to_cxl(struct pci_dev *dev)
pe_info(pe, "Switching PHB to CXL\n"); pe_info(pe, "Switching PHB to CXL\n");
rc = opal_pci_set_phb_cxl_mode(phb->opal_id, 1, pe->pe_number); rc = opal_pci_set_phb_cxl_mode(phb->opal_id, mode, pe->pe_number);
if (rc) if (rc)
dev_err(&dev->dev, "opal_pci_set_phb_cxl_mode failed: %i\n", rc); dev_err(&dev->dev, "opal_pci_set_phb_cxl_mode failed: %i\n", rc);
return rc; return rc;
} }
EXPORT_SYMBOL(pnv_phb_to_cxl); EXPORT_SYMBOL(pnv_phb_to_cxl_mode);
/* Find PHB for cxl dev and allocate MSI hwirqs? /* Find PHB for cxl dev and allocate MSI hwirqs?
* Returns the absolute hardware IRQ number * Returns the absolute hardware IRQ number
......
...@@ -926,9 +926,15 @@ static struct cxl *cxl_init_adapter(struct pci_dev *dev) ...@@ -926,9 +926,15 @@ static struct cxl *cxl_init_adapter(struct pci_dev *dev)
if ((rc = init_implementation_adapter_regs(adapter, dev))) if ((rc = init_implementation_adapter_regs(adapter, dev)))
goto err3; goto err3;
if ((rc = pnv_phb_to_cxl(dev))) if ((rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_CAPI)))
goto err3; goto err3;
/* If recovery happened, the last step is to turn on snooping.
* In the non-recovery case this has no effect */
if ((rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_SNOOP_ON))) {
goto err3;
}
if ((rc = cxl_register_psl_err_irq(adapter))) if ((rc = cxl_register_psl_err_irq(adapter)))
goto err3; goto err3;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment