Commit ec33d36e authored by Gavin Shan's avatar Gavin Shan Committed by Michael Ellerman

powerpc/eeh: Introduce eeh_pe_inject_err()

The patch defines PCI error types and functions in uapi/asm/eeh.h
and exports function eeh_pe_inject_err(), which will be called by
VFIO driver to inject the specified PCI error to the indicated
PE for testing purpose.
Signed-off-by: default avatarGavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent ed3e81ff
...@@ -291,6 +291,8 @@ int eeh_pe_set_option(struct eeh_pe *pe, int option); ...@@ -291,6 +291,8 @@ int eeh_pe_set_option(struct eeh_pe *pe, int option);
int eeh_pe_get_state(struct eeh_pe *pe); int eeh_pe_get_state(struct eeh_pe *pe);
int eeh_pe_reset(struct eeh_pe *pe, int option); int eeh_pe_reset(struct eeh_pe *pe, int option);
int eeh_pe_configure(struct eeh_pe *pe); int eeh_pe_configure(struct eeh_pe *pe);
int eeh_pe_inject_err(struct eeh_pe *pe, int type, int func,
unsigned long addr, unsigned long mask);
/** /**
* EEH_POSSIBLE_ERROR() -- test for possible MMIO failure. * EEH_POSSIBLE_ERROR() -- test for possible MMIO failure.
......
...@@ -27,4 +27,30 @@ ...@@ -27,4 +27,30 @@
#define EEH_PE_STATE_STOPPED_DMA 4 /* Stopped DMA only */ #define EEH_PE_STATE_STOPPED_DMA 4 /* Stopped DMA only */
#define EEH_PE_STATE_UNAVAIL 5 /* Unavailable */ #define EEH_PE_STATE_UNAVAIL 5 /* Unavailable */
/* EEH error types and functions */
#define EEH_ERR_TYPE_32 0 /* 32-bits error */
#define EEH_ERR_TYPE_64 1 /* 64-bits error */
#define EEH_ERR_FUNC_MIN 0
#define EEH_ERR_FUNC_LD_MEM_ADDR 0 /* Memory load */
#define EEH_ERR_FUNC_LD_MEM_DATA 1
#define EEH_ERR_FUNC_LD_IO_ADDR 2 /* IO load */
#define EEH_ERR_FUNC_LD_IO_DATA 3
#define EEH_ERR_FUNC_LD_CFG_ADDR 4 /* Config load */
#define EEH_ERR_FUNC_LD_CFG_DATA 5
#define EEH_ERR_FUNC_ST_MEM_ADDR 6 /* Memory store */
#define EEH_ERR_FUNC_ST_MEM_DATA 7
#define EEH_ERR_FUNC_ST_IO_ADDR 8 /* IO store */
#define EEH_ERR_FUNC_ST_IO_DATA 9
#define EEH_ERR_FUNC_ST_CFG_ADDR 10 /* Config store */
#define EEH_ERR_FUNC_ST_CFG_DATA 11
#define EEH_ERR_FUNC_DMA_RD_ADDR 12 /* DMA read */
#define EEH_ERR_FUNC_DMA_RD_DATA 13
#define EEH_ERR_FUNC_DMA_RD_MASTER 14
#define EEH_ERR_FUNC_DMA_RD_TARGET 15
#define EEH_ERR_FUNC_DMA_WR_ADDR 16 /* DMA write */
#define EEH_ERR_FUNC_DMA_WR_DATA 17
#define EEH_ERR_FUNC_DMA_WR_MASTER 18
#define EEH_ERR_FUNC_DMA_WR_TARGET 19
#define EEH_ERR_FUNC_MAX 19
#endif /* _ASM_POWERPC_EEH_H */ #endif /* _ASM_POWERPC_EEH_H */
...@@ -1647,6 +1647,41 @@ int eeh_pe_configure(struct eeh_pe *pe) ...@@ -1647,6 +1647,41 @@ int eeh_pe_configure(struct eeh_pe *pe)
} }
EXPORT_SYMBOL_GPL(eeh_pe_configure); EXPORT_SYMBOL_GPL(eeh_pe_configure);
/**
* eeh_pe_inject_err - Injecting the specified PCI error to the indicated PE
* @pe: the indicated PE
* @type: error type
* @function: error function
* @addr: address
* @mask: address mask
*
* The routine is called to inject the specified PCI error, which
* is determined by @type and @function, to the indicated PE for
* testing purpose.
*/
int eeh_pe_inject_err(struct eeh_pe *pe, int type, int func,
unsigned long addr, unsigned long mask)
{
/* Invalid PE ? */
if (!pe)
return -ENODEV;
/* Unsupported operation ? */
if (!eeh_ops || !eeh_ops->err_inject)
return -ENOENT;
/* Check on PCI error type */
if (type != EEH_ERR_TYPE_32 && type != EEH_ERR_TYPE_64)
return -EINVAL;
/* Check on PCI error function */
if (func < EEH_ERR_FUNC_MIN || func > EEH_ERR_FUNC_MAX)
return -EINVAL;
return eeh_ops->err_inject(pe, type, func, addr, mask);
}
EXPORT_SYMBOL_GPL(eeh_pe_inject_err);
static int proc_eeh_show(struct seq_file *m, void *v) static int proc_eeh_show(struct seq_file *m, void *v)
{ {
if (!eeh_enabled()) { if (!eeh_enabled()) {
......
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