#include <linux/file.h>
 #include <misc/cxl.h>
 #include <linux/fs.h>
+#include <asm/pnv-pci.h>
 
 #include "cxl.h"
 
        int rc;
 
        afu = cxl_pci_to_afu(dev);
+       if (IS_ERR(afu))
+               return ERR_CAST(afu);
 
        ctx = cxl_context_alloc();
        if (IS_ERR(ctx)) {
 ssize_t cxl_read_adapter_vpd(struct pci_dev *dev, void *buf, size_t count)
 {
        struct cxl_afu *afu = cxl_pci_to_afu(dev);
+       if (IS_ERR(afu))
+               return -ENODEV;
 
        return cxl_ops->read_adapter_vpd(afu->adapter, buf, count);
 }
 
                        dev_err(&dev->dev, "AFU %i failed to start: %i\n", slice, rc);
        }
 
+       if (pnv_pci_on_cxl_phb(dev) && adapter->slices >= 1)
+               pnv_cxl_phb_set_peer_afu(dev, adapter->afu[0]);
+
        return 0;
 }
 
 
 
 #include <linux/pci.h>
 #include <misc/cxl.h>
+#include <asm/pnv-pci.h>
 #include "cxl.h"
 
 static int cxl_dma_set_mask(struct pci_dev *pdev, u64 dma_mask)
        pcibios_free_controller(phb);
 }
 
+static bool _cxl_pci_is_vphb_device(struct pci_controller *phb)
+{
+       return (phb->ops == &cxl_pcie_pci_ops);
+}
+
 bool cxl_pci_is_vphb_device(struct pci_dev *dev)
 {
        struct pci_controller *phb;
 
        phb = pci_bus_to_host(dev->bus);
 
-       return (phb->ops == &cxl_pcie_pci_ops);
+       return _cxl_pci_is_vphb_device(phb);
 }
 
 struct cxl_afu *cxl_pci_to_afu(struct pci_dev *dev)
 
        phb = pci_bus_to_host(dev->bus);
 
-       return (struct cxl_afu *)phb->private_data;
+       if (_cxl_pci_is_vphb_device(phb))
+               return (struct cxl_afu *)phb->private_data;
+
+       if (pnv_pci_on_cxl_phb(dev))
+               return pnv_cxl_phb_to_afu(phb);
+
+       return ERR_PTR(-ENODEV);
 }
 EXPORT_SYMBOL_GPL(cxl_pci_to_afu);