powerpc/eeh: I/O chip PE log and bridge setup
The patch adds backends to retrieve error log and configure p2p bridges for the indicated 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
9d5cab0010
commit
bf90dfea23
1 changed files with 55 additions and 2 deletions
|
@ -445,12 +445,65 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ioda_eeh_get_log - Retrieve error log
|
||||||
|
* @pe: EEH PE
|
||||||
|
* @severity: Severity level of the log
|
||||||
|
* @drv_log: buffer to store the log
|
||||||
|
* @len: space of the log buffer
|
||||||
|
*
|
||||||
|
* The function is used to retrieve error log from P7IOC.
|
||||||
|
*/
|
||||||
|
static int ioda_eeh_get_log(struct eeh_pe *pe, int severity,
|
||||||
|
char *drv_log, unsigned long len)
|
||||||
|
{
|
||||||
|
s64 ret;
|
||||||
|
unsigned long flags;
|
||||||
|
struct pci_controller *hose = pe->phb;
|
||||||
|
struct pnv_phb *phb = hose->private_data;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&phb->lock, flags);
|
||||||
|
|
||||||
|
ret = opal_pci_get_phb_diag_data2(phb->opal_id,
|
||||||
|
phb->diag.blob, PNV_PCI_DIAG_BUF_SIZE);
|
||||||
|
if (ret) {
|
||||||
|
spin_unlock_irqrestore(&phb->lock, flags);
|
||||||
|
pr_warning("%s: Failed to get log for PHB#%x-PE#%x\n",
|
||||||
|
__func__, hose->global_number, pe->addr);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FIXME: We probably need log the error in somewhere.
|
||||||
|
* Lets make it up in future.
|
||||||
|
*/
|
||||||
|
/* pr_info("%s", phb->diag.blob); */
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&phb->lock, flags);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ioda_eeh_configure_bridge - Configure the PCI bridges for the indicated PE
|
||||||
|
* @pe: EEH PE
|
||||||
|
*
|
||||||
|
* For particular PE, it might have included PCI bridges. In order
|
||||||
|
* to make the PE work properly, those PCI bridges should be configured
|
||||||
|
* correctly. However, we need do nothing on P7IOC since the reset
|
||||||
|
* function will do everything that should be covered by the function.
|
||||||
|
*/
|
||||||
|
static int ioda_eeh_configure_bridge(struct eeh_pe *pe)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct pnv_eeh_ops ioda_eeh_ops = {
|
struct pnv_eeh_ops ioda_eeh_ops = {
|
||||||
.post_init = ioda_eeh_post_init,
|
.post_init = ioda_eeh_post_init,
|
||||||
.set_option = ioda_eeh_set_option,
|
.set_option = ioda_eeh_set_option,
|
||||||
.get_state = ioda_eeh_get_state,
|
.get_state = ioda_eeh_get_state,
|
||||||
.reset = ioda_eeh_reset,
|
.reset = ioda_eeh_reset,
|
||||||
.get_log = NULL,
|
.get_log = ioda_eeh_get_log,
|
||||||
.configure_bridge = NULL,
|
.configure_bridge = ioda_eeh_configure_bridge,
|
||||||
.next_error = NULL
|
.next_error = NULL
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue