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_reset(struct eeh_pe *pe, int option);
|
||||
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.
|
||||
|
|
|
@ -27,4 +27,30 @@
|
|||
#define EEH_PE_STATE_STOPPED_DMA 4 /* Stopped DMA only */
|
||||
#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 */
|
||||
|
|
|
@ -1647,6 +1647,41 @@ int eeh_pe_configure(struct eeh_pe *pe)
|
|||
}
|
||||
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)
|
||||
{
|
||||
if (!eeh_enabled()) {
|
||||
|
|
Loading…
Reference in New Issue