char *name;
        int (*init)(void);
        void* (*of_probe)(struct device_node *dn, void *flag);
-       void* (*dev_probe)(struct pci_dev *dev, void *flag);
+       int (*dev_probe)(struct pci_dev *dev, void *flag);
        int (*set_option)(struct eeh_pe *pe, int option);
        int (*get_pe_addr)(struct eeh_pe *pe);
        int (*get_state)(struct eeh_pe *pe, int *state);
 
 void *eeh_dev_init(struct device_node *dn, void *data);
 void eeh_dev_phb_init_dynamic(struct pci_controller *phb);
+int __init eeh_init(void);
 int __init eeh_ops_register(struct eeh_ops *ops);
 int __exit eeh_ops_unregister(const char *name);
 unsigned long eeh_check_failure(const volatile void __iomem *token,
 
 #else /* !CONFIG_EEH */
 
+static inline int eeh_init(void)
+{
+       return 0;
+}
+
 static inline void *eeh_dev_init(struct device_node *dn, void *data)
 {
        return NULL;
 
  * Even if force-off is set, the EEH hardware is still enabled, so that
  * newer systems can boot.
  */
-static int __init eeh_init(void)
+int __init eeh_init(void)
 {
        struct pci_controller *hose, *tmp;
        struct device_node *phb;
-       int ret;
+       static int cnt = 0;
+       int ret = 0;
+
+       /*
+        * We have to delay the initialization on PowerNV after
+        * the PCI hierarchy tree has been built because the PEs
+        * are figured out based on PCI devices instead of device
+        * tree nodes
+        */
+       if (machine_is(powernv) && cnt++ <= 0)
+               return ret;
 
        /* call platform initialization function */
        if (!eeh_ops) {
                        phb = hose->dn;
                        traverse_pci_devices(phb, eeh_ops->of_probe, NULL);
                }
+       } else if (eeh_probe_mode_dev()) {
+               list_for_each_entry_safe(hose, tmp,
+                       &hose_list, list_node)
+                       pci_walk_bus(hose->bus, eeh_ops->dev_probe, NULL);
+       } else {
+               pr_warning("%s: Invalid probe mode %d\n",
+                          __func__, eeh_probe_mode);
+               return -EINVAL;
        }
 
        if (eeh_subsystem_enabled)