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: Gavin Shan <gwshan@linux.vnet.ibm.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
ed3e81ff20
commit
ec33d36e5a
|
@ -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 @@
|
||||||
#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)
|
||||||
}
|
}
|
||||||
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()) {
|
||||||
|
|
Loading…
Reference in New Issue