OPAL_PHB_CAPI_MODE_CAPI         = 1,
        OPAL_PHB_CAPI_MODE_SNOOP_OFF    = 2,
        OPAL_PHB_CAPI_MODE_SNOOP_ON     = 3,
+       OPAL_PHB_CAPI_MODE_DMA          = 4,
 };
 
 /* OPAL I2C request */
 
        pe_info(pe, "Switching PHB to CXL\n");
 
        rc = opal_pci_set_phb_cxl_mode(phb->opal_id, mode, pe->pe_number);
-       if (rc)
+       if (rc == OPAL_UNSUPPORTED)
+               dev_err(&dev->dev, "Required cxl mode not supported by firmware - update skiboot\n");
+       else if (rc)
                dev_err(&dev->dev, "opal_pci_set_phb_cxl_mode failed: %i\n", rc);
 
        return rc;
 
        void (*debugfs_stop_trace)(struct cxl *adapter);
        void (*write_timebase_ctrl)(struct cxl *adapter);
        u64 (*timebase_read)(struct cxl *adapter);
+       int capi_mode;
 };
 
 struct cxl_native {
 
        if ((rc = adapter->native->sl_ops->adapter_regs_init(adapter, dev)))
                goto err;
 
-       if ((rc = pnv_phb_to_cxl_mode(dev, OPAL_PHB_CAPI_MODE_CAPI)))
+       if ((rc = pnv_phb_to_cxl_mode(dev, adapter->native->sl_ops->capi_mode)))
                goto err;
 
        /* If recovery happened, the last step is to turn on snooping.
        .debugfs_stop_trace = cxl_stop_trace,
        .write_timebase_ctrl = write_timebase_ctrl_psl,
        .timebase_read = timebase_read_psl,
+       .capi_mode = OPAL_PHB_CAPI_MODE_CAPI,
 };
 
 static const struct cxl_service_layer_ops xsl_ops = {
        .debugfs_add_adapter_sl_regs = cxl_debugfs_add_adapter_xsl_regs,
        .write_timebase_ctrl = write_timebase_ctrl_xsl,
        .timebase_read = timebase_read_xsl,
+       .capi_mode = OPAL_PHB_CAPI_MODE_DMA,
 };
 
 static void set_sl_ops(struct cxl *adapter, struct pci_dev *dev)