Lines Matching refs:pe
61 struct eeh_pe *pe; in eeh_pe_alloc() local
71 pe = kzalloc(alloc_size, GFP_KERNEL); in eeh_pe_alloc()
72 if (!pe) return NULL; in eeh_pe_alloc()
75 pe->type = type; in eeh_pe_alloc()
76 pe->phb = phb; in eeh_pe_alloc()
77 INIT_LIST_HEAD(&pe->child_list); in eeh_pe_alloc()
78 INIT_LIST_HEAD(&pe->child); in eeh_pe_alloc()
79 INIT_LIST_HEAD(&pe->edevs); in eeh_pe_alloc()
81 pe->data = (void *)pe + ALIGN(sizeof(struct eeh_pe), in eeh_pe_alloc()
83 return pe; in eeh_pe_alloc()
95 struct eeh_pe *pe; in eeh_phb_pe_create() local
98 pe = eeh_pe_alloc(phb, EEH_PE_PHB); in eeh_phb_pe_create()
99 if (!pe) { in eeh_phb_pe_create()
105 list_add_tail(&pe->child, &eeh_phb_pe); in eeh_phb_pe_create()
122 struct eeh_pe *pe; in eeh_phb_pe_get() local
124 list_for_each_entry(pe, &eeh_phb_pe, child) { in eeh_phb_pe_get()
130 if ((pe->type & EEH_PE_PHB) && pe->phb == phb) in eeh_phb_pe_get()
131 return pe; in eeh_phb_pe_get()
145 static struct eeh_pe *eeh_pe_next(struct eeh_pe *pe, in eeh_pe_next() argument
148 struct list_head *next = pe->child_list.next; in eeh_pe_next()
150 if (next == &pe->child_list) { in eeh_pe_next()
152 if (pe == root) in eeh_pe_next()
154 next = pe->child.next; in eeh_pe_next()
155 if (next != &pe->parent->child_list) in eeh_pe_next()
157 pe = pe->parent; in eeh_pe_next()
178 struct eeh_pe *pe; in eeh_pe_traverse() local
181 for (pe = root; pe; pe = eeh_pe_next(pe, root)) { in eeh_pe_traverse()
182 ret = fn(pe, flag); in eeh_pe_traverse()
201 struct eeh_pe *pe; in eeh_pe_dev_traverse() local
212 for (pe = root; pe; pe = eeh_pe_next(pe, root)) { in eeh_pe_dev_traverse()
213 eeh_pe_for_each_dev(pe, edev, tmp) { in eeh_pe_dev_traverse()
235 struct eeh_pe *pe = (struct eeh_pe *)data; in __eeh_pe_get() local
239 if (pe->type & EEH_PE_PHB) in __eeh_pe_get()
247 if (edev->pe_config_addr == pe->addr) in __eeh_pe_get()
248 return pe; in __eeh_pe_get()
251 (edev->pe_config_addr == pe->addr)) in __eeh_pe_get()
252 return pe; in __eeh_pe_get()
257 (edev->config_addr == pe->config_addr)) in __eeh_pe_get()
258 return pe; in __eeh_pe_get()
277 struct eeh_pe *pe; in eeh_pe_get() local
279 pe = eeh_pe_traverse(root, __eeh_pe_get, edev); in eeh_pe_get()
281 return pe; in eeh_pe_get()
309 if (parent->pe) in eeh_pe_get_parent()
310 return parent->pe; in eeh_pe_get_parent()
329 struct eeh_pe *pe, *parent; in eeh_add_to_parent_pe() local
344 pe = eeh_pe_get(edev); in eeh_add_to_parent_pe()
345 if (pe && !(pe->type & EEH_PE_INVALID)) { in eeh_add_to_parent_pe()
347 pe->type = EEH_PE_BUS; in eeh_add_to_parent_pe()
348 edev->pe = pe; in eeh_add_to_parent_pe()
351 list_add_tail(&edev->list, &pe->edevs); in eeh_add_to_parent_pe()
357 pe->addr); in eeh_add_to_parent_pe()
359 } else if (pe && (pe->type & EEH_PE_INVALID)) { in eeh_add_to_parent_pe()
360 list_add_tail(&edev->list, &pe->edevs); in eeh_add_to_parent_pe()
361 edev->pe = pe; in eeh_add_to_parent_pe()
366 parent = pe; in eeh_add_to_parent_pe()
380 pe->addr, pe->parent->addr); in eeh_add_to_parent_pe()
385 pe = eeh_pe_alloc(edev->phb, EEH_PE_DEVICE); in eeh_add_to_parent_pe()
386 if (!pe) { in eeh_add_to_parent_pe()
390 pe->addr = edev->pe_config_addr; in eeh_add_to_parent_pe()
391 pe->config_addr = edev->config_addr; in eeh_add_to_parent_pe()
405 edev->pe = NULL; in eeh_add_to_parent_pe()
406 kfree(pe); in eeh_add_to_parent_pe()
410 pe->parent = parent; in eeh_add_to_parent_pe()
416 list_add_tail(&pe->child, &parent->child_list); in eeh_add_to_parent_pe()
417 list_add_tail(&edev->list, &pe->edevs); in eeh_add_to_parent_pe()
418 edev->pe = pe; in eeh_add_to_parent_pe()
425 pe->addr, pe->parent->addr); in eeh_add_to_parent_pe()
441 struct eeh_pe *pe, *parent, *child; in eeh_rmv_from_parent_pe() local
444 if (!edev->pe) { in eeh_rmv_from_parent_pe()
454 pe = eeh_dev_to_pe(edev); in eeh_rmv_from_parent_pe()
455 edev->pe = NULL; in eeh_rmv_from_parent_pe()
465 parent = pe->parent; in eeh_rmv_from_parent_pe()
466 if (pe->type & EEH_PE_PHB) in eeh_rmv_from_parent_pe()
469 if (!(pe->state & EEH_PE_KEEP)) { in eeh_rmv_from_parent_pe()
470 if (list_empty(&pe->edevs) && in eeh_rmv_from_parent_pe()
471 list_empty(&pe->child_list)) { in eeh_rmv_from_parent_pe()
472 list_del(&pe->child); in eeh_rmv_from_parent_pe()
473 kfree(pe); in eeh_rmv_from_parent_pe()
478 if (list_empty(&pe->edevs)) { in eeh_rmv_from_parent_pe()
480 list_for_each_entry(child, &pe->child_list, child) { in eeh_rmv_from_parent_pe()
488 pe->type |= EEH_PE_INVALID; in eeh_rmv_from_parent_pe()
494 pe = parent; in eeh_rmv_from_parent_pe()
509 void eeh_pe_update_time_stamp(struct eeh_pe *pe) in eeh_pe_update_time_stamp() argument
513 if (!pe) return; in eeh_pe_update_time_stamp()
515 if (pe->freeze_count <= 0) { in eeh_pe_update_time_stamp()
516 pe->freeze_count = 0; in eeh_pe_update_time_stamp()
517 do_gettimeofday(&pe->tstamp); in eeh_pe_update_time_stamp()
520 if (tstamp.tv_sec - pe->tstamp.tv_sec > 3600) { in eeh_pe_update_time_stamp()
521 pe->tstamp = tstamp; in eeh_pe_update_time_stamp()
522 pe->freeze_count = 0; in eeh_pe_update_time_stamp()
538 struct eeh_pe *pe = (struct eeh_pe *)data; in __eeh_pe_state_mark() local
544 if (pe->state & EEH_PE_REMOVED) in __eeh_pe_state_mark()
547 pe->state |= state; in __eeh_pe_state_mark()
553 eeh_pe_for_each_dev(pe, edev, tmp) { in __eeh_pe_state_mark()
560 if (pe->state & EEH_PE_CFG_RESTRICTED) in __eeh_pe_state_mark()
561 pe->state |= EEH_PE_CFG_BLOCKED; in __eeh_pe_state_mark()
574 void eeh_pe_state_mark(struct eeh_pe *pe, int state) in eeh_pe_state_mark() argument
576 eeh_pe_traverse(pe, __eeh_pe_state_mark, &state); in eeh_pe_state_mark()
595 void eeh_pe_dev_mode_mark(struct eeh_pe *pe, int mode) in eeh_pe_dev_mode_mark() argument
597 eeh_pe_dev_traverse(pe, __eeh_pe_dev_mode_mark, &mode); in eeh_pe_dev_mode_mark()
611 struct eeh_pe *pe = (struct eeh_pe *)data; in __eeh_pe_state_clear() local
617 if (pe->state & EEH_PE_REMOVED) in __eeh_pe_state_clear()
620 pe->state &= ~state; in __eeh_pe_state_clear()
630 pe->check_count = 0; in __eeh_pe_state_clear()
631 eeh_pe_for_each_dev(pe, edev, tmp) { in __eeh_pe_state_clear()
640 if (pe->state & EEH_PE_CFG_RESTRICTED) in __eeh_pe_state_clear()
641 pe->state &= ~EEH_PE_CFG_BLOCKED; in __eeh_pe_state_clear()
655 void eeh_pe_state_clear(struct eeh_pe *pe, int state) in eeh_pe_state_clear() argument
657 eeh_pe_traverse(pe, __eeh_pe_state_clear, &state); in eeh_pe_state_clear()
671 void eeh_pe_state_mark_with_cfg(struct eeh_pe *pe, int state) in eeh_pe_state_mark_with_cfg() argument
673 eeh_pe_traverse(pe, __eeh_pe_state_mark, &state); in eeh_pe_state_mark_with_cfg()
679 eeh_pe_traverse(pe, __eeh_pe_state_clear, &state); in eeh_pe_state_mark_with_cfg()
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
927 if (pe->type & EEH_PE_PHB) { in eeh_pe_bus_get()
928 bus = pe->phb->bus; in eeh_pe_bus_get()
929 } else if (pe->type & EEH_PE_BUS || in eeh_pe_bus_get()
930 pe->type & EEH_PE_DEVICE) { in eeh_pe_bus_get()
931 if (pe->state & EEH_PE_PRI_BUS) { in eeh_pe_bus_get()
932 bus = pe->bus; in eeh_pe_bus_get()
936 edev = list_first_entry(&pe->edevs, struct eeh_dev, list); in eeh_pe_bus_get()