static void __devinit pnv_pci_ioda_setup_DMA(void)
 {
        struct pci_controller *hose, *tmp;
+       struct pnv_phb *phb;
 
        list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
                pnv_ioda_setup_dma(hose->private_data);
+
+               /* Mark the PHB initialization done */
+               phb = hose->private_data;
+               phb->initialized = 1;
        }
 }
 
  */
 static int __devinit pnv_pci_enable_device_hook(struct pci_dev *dev)
 {
-       struct pci_dn *pdn = pnv_ioda_get_pdn(dev);
+       struct pci_controller *hose = pci_bus_to_host(dev->bus);
+       struct pnv_phb *phb = hose->private_data;
+       struct pci_dn *pdn;
 
+       /* The function is probably called while the PEs have
+        * not be created yet. For example, resource reassignment
+        * during PCI probe period. We just skip the check if
+        * PEs isn't ready.
+        */
+       if (!phb->initialized)
+               return 0;
+
+       pdn = pnv_ioda_get_pdn(dev);
        if (!pdn || pdn->pe_number == IODA_INVALID_PE)
                return -EINVAL;
+
        return 0;
 }