Revert "powerpc/powernv: Fundamental reset on PLX ports"

This reverts commit b2b5efcf.

This code was way too board specific, there are quirks as to how
the PERST line is wired on different boards, we'll have to revisit
this using/creating appropriate firmware interfaces.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent f6869e7f
...@@ -109,7 +109,6 @@ struct eeh_pe { ...@@ -109,7 +109,6 @@ struct eeh_pe {
#define EEH_DEV_NO_HANDLER (1 << 8) /* No error handler */ #define EEH_DEV_NO_HANDLER (1 << 8) /* No error handler */
#define EEH_DEV_SYSFS (1 << 9) /* Sysfs created */ #define EEH_DEV_SYSFS (1 << 9) /* Sysfs created */
#define EEH_DEV_REMOVED (1 << 10) /* Removed permanently */ #define EEH_DEV_REMOVED (1 << 10) /* Removed permanently */
#define EEH_DEV_FRESET (1 << 11) /* Fundamental reset */
struct eeh_dev { struct eeh_dev {
int mode; /* EEH mode */ int mode; /* EEH mode */
......
...@@ -477,127 +477,49 @@ static int ioda_eeh_root_reset(struct pci_controller *hose, int option) ...@@ -477,127 +477,49 @@ static int ioda_eeh_root_reset(struct pci_controller *hose, int option)
return 0; return 0;
} }
static bool ioda_eeh_is_plx_dnport(struct pci_dev *dev, int *reg,
int *mask, int *len)
{
unsigned short *pid;
unsigned short ids[] = {
0x10b5, 0x8748, 0x0080, 0x0400, /* PLX#8748 */
0x0000, 0x0000, 0x0000, 0x0000, /* End flag */
};
if (!pci_is_pcie(dev))
return false;
if (pci_pcie_type(dev) != PCI_EXP_TYPE_DOWNSTREAM)
return false;
pid = &ids[0];
while (!reg) {
if (pid[0] == 0x0)
break;
if (dev->vendor == pid[0] &&
dev->device == pid[1]) {
*reg = pid[2];
*mask = pid[3];
*len = 2;
return true;
}
}
*reg = PCI_BRIDGE_CONTROL;
*mask = PCI_BRIDGE_CTL_BUS_RESET;
*len = 2;
return false;
}
static int ioda_eeh_bridge_reset(struct pci_dev *dev, int option) static int ioda_eeh_bridge_reset(struct pci_dev *dev, int option)
{ {
struct device_node *dn = pci_device_to_OF_node(dev); struct device_node *dn = pci_device_to_OF_node(dev);
struct eeh_dev *edev = of_node_to_eeh_dev(dn); struct eeh_dev *edev = of_node_to_eeh_dev(dn);
int aer = edev ? edev->aer_cap : 0; int aer = edev ? edev->aer_cap : 0;
int reg, mask, val, len; u32 ctrl;
bool is_plx_dnport;
pr_debug("%s: Reset PCI bus %04x:%02x with option %d\n", pr_debug("%s: Reset PCI bus %04x:%02x with option %d\n",
__func__, pci_domain_nr(dev->bus), __func__, pci_domain_nr(dev->bus),
dev->bus->number, option); dev->bus->number, option);
is_plx_dnport = ioda_eeh_is_plx_dnport(dev, &reg, &mask, &len);
if (option == EEH_RESET_FUNDAMENTAL)
if (!is_plx_dnport || !edev)
option = EEH_RESET_HOT;
if (option == EEH_RESET_HOT) {
reg = PCI_BRIDGE_CONTROL;
mask = PCI_BRIDGE_CTL_BUS_RESET;
len = 2;
}
if (option == EEH_RESET_DEACTIVATE) {
if (!is_plx_dnport || !edev ||
!(edev->mode & EEH_DEV_FRESET)) {
reg = PCI_BRIDGE_CONTROL;
mask = PCI_BRIDGE_CTL_BUS_RESET;
len = 2;
}
}
switch (option) { switch (option) {
case EEH_RESET_FUNDAMENTAL: case EEH_RESET_FUNDAMENTAL:
edev->mode |= EEH_DEV_FRESET;
/* Fall through */
case EEH_RESET_HOT: case EEH_RESET_HOT:
/* Don't report linkDown event */
if (aer) { if (aer) {
/* Mask receiver error */
eeh_ops->read_config(dn, aer + PCI_ERR_COR_MASK,
4, &val);
val |= PCI_ERR_COR_RCVR;
eeh_ops->write_config(dn, aer + PCI_ERR_COR_MASK,
4, val);
/* Mask linkDown */
eeh_ops->read_config(dn, aer + PCI_ERR_UNCOR_MASK, eeh_ops->read_config(dn, aer + PCI_ERR_UNCOR_MASK,
4, &val); 4, &ctrl);
val |= PCI_ERR_UNC_SURPDN; ctrl |= PCI_ERR_UNC_SURPDN;
eeh_ops->write_config(dn, aer + PCI_ERR_UNCOR_MASK, eeh_ops->write_config(dn, aer + PCI_ERR_UNCOR_MASK,
4, val); 4, ctrl);
} }
eeh_ops->read_config(dn, reg, len, &val); eeh_ops->read_config(dn, PCI_BRIDGE_CONTROL, 2, &ctrl);
val |= mask; ctrl |= PCI_BRIDGE_CTL_BUS_RESET;
eeh_ops->write_config(dn, reg, len, val); eeh_ops->write_config(dn, PCI_BRIDGE_CONTROL, 2, ctrl);
msleep(EEH_PE_RST_HOLD_TIME); msleep(EEH_PE_RST_HOLD_TIME);
break; break;
case EEH_RESET_DEACTIVATE: case EEH_RESET_DEACTIVATE:
eeh_ops->read_config(dn, reg, len, &val); eeh_ops->read_config(dn, PCI_BRIDGE_CONTROL, 2, &ctrl);
val &= ~mask; ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET;
eeh_ops->write_config(dn, reg, len, val); eeh_ops->write_config(dn, PCI_BRIDGE_CONTROL, 2, ctrl);
msleep(EEH_PE_RST_SETTLE_TIME); msleep(EEH_PE_RST_SETTLE_TIME);
if (edev) /* Continue reporting linkDown event */
edev->mode &= ~EEH_DEV_FRESET;
if (aer) { if (aer) {
/* Clear receive error and enable it */
eeh_ops->write_config(dn, aer + PCI_ERR_COR_STATUS,
4, PCI_ERR_COR_RCVR);
eeh_ops->read_config(dn, aer + PCI_ERR_COR_MASK,
4, &val);
val &= ~PCI_ERR_COR_RCVR;
eeh_ops->write_config(dn, aer + PCI_ERR_COR_MASK,
4, val);
/* Clear linkDown and enable it */
eeh_ops->write_config(dn, aer + PCI_ERR_UNCOR_STATUS,
4, PCI_ERR_UNC_SURPDN);
eeh_ops->read_config(dn, aer + PCI_ERR_UNCOR_MASK, eeh_ops->read_config(dn, aer + PCI_ERR_UNCOR_MASK,
4, &val); 4, &ctrl);
val &= ~PCI_ERR_UNC_SURPDN; ctrl &= ~PCI_ERR_UNC_SURPDN;
eeh_ops->write_config(dn, aer + PCI_ERR_UNCOR_MASK, eeh_ops->write_config(dn, aer + PCI_ERR_UNCOR_MASK,
4, val); 4, ctrl);
} }
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment