Lines Matching refs:pe
48 struct eeh_pe *pe; in eeh_pe_alloc() local
58 pe = kzalloc(alloc_size, GFP_KERNEL); in eeh_pe_alloc()
59 if (!pe) return NULL; in eeh_pe_alloc()
62 pe->type = type; in eeh_pe_alloc()
63 pe->phb = phb; in eeh_pe_alloc()
64 INIT_LIST_HEAD(&pe->child_list); in eeh_pe_alloc()
65 INIT_LIST_HEAD(&pe->edevs); in eeh_pe_alloc()
67 pe->data = (void *)pe + ALIGN(sizeof(struct eeh_pe), in eeh_pe_alloc()
69 return pe; in eeh_pe_alloc()
81 struct eeh_pe *pe; in eeh_phb_pe_create() local
84 pe = eeh_pe_alloc(phb, EEH_PE_PHB); in eeh_phb_pe_create()
85 if (!pe) { in eeh_phb_pe_create()
91 list_add_tail(&pe->child, &eeh_phb_pe); in eeh_phb_pe_create()
106 int eeh_wait_state(struct eeh_pe *pe, int max_wait) in eeh_wait_state() argument
123 ret = eeh_ops->get_state(pe, &mwait); in eeh_wait_state()
159 struct eeh_pe *pe; in eeh_phb_pe_get() local
161 list_for_each_entry(pe, &eeh_phb_pe, child) { in eeh_phb_pe_get()
167 if ((pe->type & EEH_PE_PHB) && pe->phb == phb) in eeh_phb_pe_get()
168 return pe; in eeh_phb_pe_get()
182 struct eeh_pe *eeh_pe_next(struct eeh_pe *pe, struct eeh_pe *root) in eeh_pe_next() argument
184 struct list_head *next = pe->child_list.next; in eeh_pe_next()
186 if (next == &pe->child_list) { in eeh_pe_next()
188 if (pe == root) in eeh_pe_next()
190 next = pe->child.next; in eeh_pe_next()
191 if (next != &pe->parent->child_list) in eeh_pe_next()
193 pe = pe->parent; in eeh_pe_next()
214 struct eeh_pe *pe; in eeh_pe_traverse() local
217 eeh_for_each_pe(root, pe) { in eeh_pe_traverse()
218 ret = fn(pe, flag); in eeh_pe_traverse()
237 struct eeh_pe *pe; in eeh_pe_dev_traverse() local
247 eeh_for_each_pe(root, pe) in eeh_pe_dev_traverse()
248 eeh_pe_for_each_dev(pe, edev, tmp) in eeh_pe_dev_traverse()
267 static void *__eeh_pe_get(struct eeh_pe *pe, void *flag) in __eeh_pe_get() argument
272 if (pe->type & EEH_PE_PHB) in __eeh_pe_get()
280 if (tmp->pe_no == pe->addr) in __eeh_pe_get()
281 return pe; in __eeh_pe_get()
284 (tmp->pe_no == pe->addr)) in __eeh_pe_get()
285 return pe; in __eeh_pe_get()
290 (tmp->config_addr == pe->config_addr)) in __eeh_pe_get()
291 return pe; in __eeh_pe_get()
314 struct eeh_pe *pe; in eeh_pe_get() local
316 pe = eeh_pe_traverse(root, __eeh_pe_get, &tmp); in eeh_pe_get()
318 return pe; in eeh_pe_get()
349 if (parent->pe) in eeh_pe_get_parent()
350 return parent->pe; in eeh_pe_get_parent()
369 struct eeh_pe *pe, *parent; in eeh_add_to_parent_pe() local
385 pe = eeh_pe_get(pdn->phb, edev->pe_config_addr, config_addr); in eeh_add_to_parent_pe()
386 if (pe) { in eeh_add_to_parent_pe()
387 if (pe->type & EEH_PE_INVALID) { in eeh_add_to_parent_pe()
388 list_add_tail(&edev->entry, &pe->edevs); in eeh_add_to_parent_pe()
389 edev->pe = pe; in eeh_add_to_parent_pe()
394 parent = pe; in eeh_add_to_parent_pe()
404 pe->parent->addr); in eeh_add_to_parent_pe()
407 pe->type = EEH_PE_BUS; in eeh_add_to_parent_pe()
408 edev->pe = pe; in eeh_add_to_parent_pe()
411 list_add_tail(&edev->entry, &pe->edevs); in eeh_add_to_parent_pe()
419 pe = eeh_pe_alloc(pdn->phb, EEH_PE_VF); in eeh_add_to_parent_pe()
421 pe = eeh_pe_alloc(pdn->phb, EEH_PE_DEVICE); in eeh_add_to_parent_pe()
422 if (!pe) { in eeh_add_to_parent_pe()
426 pe->addr = edev->pe_config_addr; in eeh_add_to_parent_pe()
427 pe->config_addr = config_addr; in eeh_add_to_parent_pe()
441 edev->pe = NULL; in eeh_add_to_parent_pe()
442 kfree(pe); in eeh_add_to_parent_pe()
446 pe->parent = parent; in eeh_add_to_parent_pe()
452 list_add_tail(&pe->child, &parent->child_list); in eeh_add_to_parent_pe()
453 list_add_tail(&edev->entry, &pe->edevs); in eeh_add_to_parent_pe()
454 edev->pe = pe; in eeh_add_to_parent_pe()
456 pe->parent->addr); in eeh_add_to_parent_pe()
472 struct eeh_pe *pe, *parent, *child; in eeh_rmv_from_parent_pe() local
476 pe = eeh_dev_to_pe(edev); in eeh_rmv_from_parent_pe()
477 if (!pe) { in eeh_rmv_from_parent_pe()
483 edev->pe = NULL; in eeh_rmv_from_parent_pe()
493 parent = pe->parent; in eeh_rmv_from_parent_pe()
496 if (pe->type & EEH_PE_PHB) in eeh_rmv_from_parent_pe()
504 keep = !!(pe->state & EEH_PE_KEEP); in eeh_rmv_from_parent_pe()
505 recover = !!(pe->state & EEH_PE_RECOVERING); in eeh_rmv_from_parent_pe()
509 if (list_empty(&pe->edevs) && in eeh_rmv_from_parent_pe()
510 list_empty(&pe->child_list)) { in eeh_rmv_from_parent_pe()
511 list_del(&pe->child); in eeh_rmv_from_parent_pe()
512 kfree(pe); in eeh_rmv_from_parent_pe()
526 if (list_empty(&pe->edevs)) { in eeh_rmv_from_parent_pe()
528 list_for_each_entry(child, &pe->child_list, child) { in eeh_rmv_from_parent_pe()
536 pe->type |= EEH_PE_INVALID; in eeh_rmv_from_parent_pe()
542 pe = parent; in eeh_rmv_from_parent_pe()
557 void eeh_pe_update_time_stamp(struct eeh_pe *pe) in eeh_pe_update_time_stamp() argument
561 if (!pe) return; in eeh_pe_update_time_stamp()
563 if (pe->freeze_count <= 0) { in eeh_pe_update_time_stamp()
564 pe->freeze_count = 0; in eeh_pe_update_time_stamp()
565 pe->tstamp = ktime_get_seconds(); in eeh_pe_update_time_stamp()
568 if (tstamp - pe->tstamp > 3600) { in eeh_pe_update_time_stamp()
569 pe->tstamp = tstamp; in eeh_pe_update_time_stamp()
570 pe->freeze_count = 0; in eeh_pe_update_time_stamp()
585 struct eeh_pe *pe; in eeh_pe_state_mark() local
587 eeh_for_each_pe(root, pe) in eeh_pe_state_mark()
588 if (!(pe->state & EEH_PE_REMOVED)) in eeh_pe_state_mark()
589 pe->state |= state; in eeh_pe_state_mark()
603 struct eeh_pe *pe; in eeh_pe_mark_isolated() local
608 eeh_for_each_pe(root, pe) { in eeh_pe_mark_isolated()
609 list_for_each_entry(edev, &pe->edevs, entry) { in eeh_pe_mark_isolated()
615 if (pe->state & EEH_PE_CFG_RESTRICTED) in eeh_pe_mark_isolated()
616 pe->state |= EEH_PE_CFG_BLOCKED; in eeh_pe_mark_isolated()
634 void eeh_pe_dev_mode_mark(struct eeh_pe *pe, int mode) in eeh_pe_dev_mode_mark() argument
636 eeh_pe_dev_traverse(pe, __eeh_pe_dev_mode_mark, &mode); in eeh_pe_dev_mode_mark()
651 struct eeh_pe *pe; in eeh_pe_state_clear() local
655 eeh_for_each_pe(root, pe) { in eeh_pe_state_clear()
657 if (pe->state & EEH_PE_REMOVED) in eeh_pe_state_clear()
660 if (!include_passed && eeh_pe_passed(pe)) in eeh_pe_state_clear()
663 pe->state &= ~state; in eeh_pe_state_clear()
673 pe->check_count = 0; in eeh_pe_state_clear()
674 eeh_pe_for_each_dev(pe, edev, tmp) { in eeh_pe_state_clear()
683 if (pe->state & EEH_PE_CFG_RESTRICTED) in eeh_pe_state_clear()
684 pe->state &= ~EEH_PE_CFG_BLOCKED; in eeh_pe_state_clear()
865 void eeh_pe_restore_bars(struct eeh_pe *pe) in eeh_pe_restore_bars() argument
871 eeh_pe_dev_traverse(pe, eeh_restore_one_device_bars, NULL); in eeh_pe_restore_bars()
883 const char *eeh_pe_loc_get(struct eeh_pe *pe) in eeh_pe_loc_get() argument
885 struct pci_bus *bus = eeh_pe_bus_get(pe); in eeh_pe_loc_get()
921 struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe) in eeh_pe_bus_get() argument
926 if (pe->type & EEH_PE_PHB) in eeh_pe_bus_get()
927 return pe->phb->bus; in eeh_pe_bus_get()
930 if (pe->state & EEH_PE_PRI_BUS) in eeh_pe_bus_get()
931 return pe->bus; in eeh_pe_bus_get()
934 edev = list_first_entry_or_null(&pe->edevs, struct eeh_dev, entry); in eeh_pe_bus_get()