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 {
        __be32 version;
        __be32 ioType;
 
 #include <linux/pci.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,
                           unsigned int virq);
 int pnv_cxl_alloc_hwirqs(struct pci_dev *dev, int num);
 
 }
 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 pnv_phb *phb = hose->private_data;
 
        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)
                dev_err(&dev->dev, "opal_pci_set_phb_cxl_mode failed: %i\n", 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?
  * Returns the absolute hardware IRQ number
 
        if ((rc = init_implementation_adapter_regs(adapter, dev)))
                goto err3;
 
-       if ((rc = pnv_phb_to_cxl(dev)))
+       if ((rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_CAPI)))
                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)))
                goto err3;