mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-12 20:31:49 +00:00
powerpc/eeh: Trace PCI bus from PE
There're several types of PEs can be supported for now: PHB, Bus and Device dependent PE. For PCI bus dependent PE, tracing the corresponding PCI bus from PE (struct eeh_pe) would make the code more efficient. The patch also enables the retrieval of PCI bus based on the PCI bus dependent PE. Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
0156680854
commit
8cdb283371
@ -59,6 +59,7 @@ struct eeh_pe {
|
|||||||
int config_addr; /* Traditional PCI address */
|
int config_addr; /* Traditional PCI address */
|
||||||
int addr; /* PE configuration address */
|
int addr; /* PE configuration address */
|
||||||
struct pci_controller *phb; /* Associated PHB */
|
struct pci_controller *phb; /* Associated PHB */
|
||||||
|
struct pci_bus *bus; /* Top PCI bus for bus PE */
|
||||||
int check_count; /* Times of ignored error */
|
int check_count; /* Times of ignored error */
|
||||||
int freeze_count; /* Times of froze up */
|
int freeze_count; /* Times of froze up */
|
||||||
int false_positives; /* Times of reported #ff's */
|
int false_positives; /* Times of reported #ff's */
|
||||||
|
@ -364,6 +364,17 @@ int eeh_add_to_parent_pe(struct eeh_dev *edev)
|
|||||||
pe->addr = edev->pe_config_addr;
|
pe->addr = edev->pe_config_addr;
|
||||||
pe->config_addr = edev->config_addr;
|
pe->config_addr = edev->config_addr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* While doing PE reset, we probably hot-reset the
|
||||||
|
* upstream bridge. However, the PCI devices including
|
||||||
|
* the associated EEH devices might be removed when EEH
|
||||||
|
* core is doing recovery. So that won't safe to retrieve
|
||||||
|
* the bridge through downstream EEH device. We have to
|
||||||
|
* trace the parent PCI bus, then the upstream bridge.
|
||||||
|
*/
|
||||||
|
if (eeh_probe_mode_dev())
|
||||||
|
pe->bus = eeh_dev_to_pci_dev(edev)->bus;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Put the new EEH PE into hierarchy tree. If the parent
|
* Put the new EEH PE into hierarchy tree. If the parent
|
||||||
* can't be found, the newly created PE will be attached
|
* can't be found, the newly created PE will be attached
|
||||||
@ -641,12 +652,18 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
|
|||||||
bus = pe->phb->bus;
|
bus = pe->phb->bus;
|
||||||
} else if (pe->type & EEH_PE_BUS ||
|
} else if (pe->type & EEH_PE_BUS ||
|
||||||
pe->type & EEH_PE_DEVICE) {
|
pe->type & EEH_PE_DEVICE) {
|
||||||
|
if (pe->bus) {
|
||||||
|
bus = pe->bus;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
edev = list_first_entry(&pe->edevs, struct eeh_dev, list);
|
edev = list_first_entry(&pe->edevs, struct eeh_dev, list);
|
||||||
pdev = eeh_dev_to_pci_dev(edev);
|
pdev = eeh_dev_to_pci_dev(edev);
|
||||||
if (pdev)
|
if (pdev)
|
||||||
bus = pdev->bus;
|
bus = pdev->bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
eeh_unlock();
|
eeh_unlock();
|
||||||
|
|
||||||
return bus;
|
return bus;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user