powerpc/eeh: Use cached capability for log dump
When calling into eeh_gather_pci_data() on pSeries platform, we possiblly don't have pci_dev instance yet, but eeh_dev is always ready. So we use cached capability from eeh_dev instead of pci_dev for log dump there. In order to keep things unified, we also cache PCI capability positions to eeh_dev for PowerNV as well. Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Bu işleme şunda yer alıyor:

işlemeyi yapan:
Benjamin Herrenschmidt

ebeveyn
2d86c385a1
işleme
2a18dfc6ee
@@ -175,6 +175,36 @@ static int pseries_eeh_find_cap(struct device_node *dn, int cap)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pseries_eeh_find_ecap(struct device_node *dn, int cap)
|
||||
{
|
||||
struct pci_dn *pdn = PCI_DN(dn);
|
||||
struct eeh_dev *edev = of_node_to_eeh_dev(dn);
|
||||
u32 header;
|
||||
int pos = 256;
|
||||
int ttl = (4096 - 256) / 8;
|
||||
|
||||
if (!edev || !edev->pcie_cap)
|
||||
return 0;
|
||||
if (rtas_read_config(pdn, pos, 4, &header) != PCIBIOS_SUCCESSFUL)
|
||||
return 0;
|
||||
else if (!header)
|
||||
return 0;
|
||||
|
||||
while (ttl-- > 0) {
|
||||
if (PCI_EXT_CAP_ID(header) == cap && pos)
|
||||
return pos;
|
||||
|
||||
pos = PCI_EXT_CAP_NEXT(header);
|
||||
if (pos < 256)
|
||||
break;
|
||||
|
||||
if (rtas_read_config(pdn, pos, 4, &header) != PCIBIOS_SUCCESSFUL)
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* pseries_eeh_of_probe - EEH probe on the given device
|
||||
* @dn: OF node
|
||||
@@ -220,7 +250,9 @@ static void *pseries_eeh_of_probe(struct device_node *dn, void *flag)
|
||||
* or PCIe switch downstream port.
|
||||
*/
|
||||
edev->class_code = class_code;
|
||||
edev->pcix_cap = pseries_eeh_find_cap(dn, PCI_CAP_ID_PCIX);
|
||||
edev->pcie_cap = pseries_eeh_find_cap(dn, PCI_CAP_ID_EXP);
|
||||
edev->aer_cap = pseries_eeh_find_ecap(dn, PCI_EXT_CAP_ID_ERR);
|
||||
edev->mode &= 0xFFFFFF00;
|
||||
if ((edev->class_code >> 8) == PCI_CLASS_BRIDGE_PCI) {
|
||||
edev->mode |= EEH_DEV_BRIDGE;
|
||||
|
Yeni konuda referans
Bir kullanıcı engelle