All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@redhat.com>
To: Gavin Shan <gwshan@linux.vnet.ibm.com>
Cc: aik@ozlabs.ru, linuxppc-dev@ozlabs.org, agraf@suse.de,
	kvm@vger.kernel.org, david@gibson.dropbear.id.au
Subject: Re: [PATCH 1/2] powerpc/eeh: Introduce eeh_pe_inject_err()
Date: Fri, 13 Mar 2015 14:28:33 -0600	[thread overview]
Message-ID: <1426278513.3643.117.camel@redhat.com> (raw)
In-Reply-To: <1426055651-22925-1-git-send-email-gwshan@linux.vnet.ibm.com>

On Wed, 2015-03-11 at 17:34 +1100, Gavin Shan wrote:
> The patch defines PCI error types and functions in 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>
> ---
>  arch/powerpc/include/asm/eeh.h | 24 ++++++++++++++++
>  arch/powerpc/kernel/eeh.c      | 63 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 87 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h
> index 9de87ce..eb20c62 100644
> --- a/arch/powerpc/include/asm/eeh.h
> +++ b/arch/powerpc/include/asm/eeh.h
> @@ -196,6 +196,28 @@ enum {
>  #define EEH_RESET_COMPLETE	4	/* PHB complete reset		*/
>  #define EEH_LOG_TEMP		1	/* EEH temporary error log	*/
>  #define EEH_LOG_PERM		2	/* EEH permanent error log	*/
> +#define EEH_ERR_TYPE_32		0	/* 32-bits PCI error	*/
> +#define EEH_ERR_TYPE_64		1	/* 64-bits PCI error	*/
> +#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
>  
>  struct eeh_ops {
>  	char *name;
> @@ -296,6 +318,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.
> diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c
> index 60a0f15ce..dbab1a4 100644
> --- a/arch/powerpc/kernel/eeh.c
> +++ b/arch/powerpc/kernel/eeh.c
> @@ -1657,6 +1657,69 @@ 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 */
> +	switch (type) {
> +	case EEH_ERR_TYPE_32:
> +	case EEH_ERR_TYPE_64:
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	/* Check on PCI error function */
> +	switch (func) {
> +	case EEH_ERR_FUNC_LD_MEM_ADDR:
> +	case EEH_ERR_FUNC_LD_MEM_DATA:
> +	case EEH_ERR_FUNC_LD_IO_ADDR:
> +	case EEH_ERR_FUNC_LD_IO_DATA:
> +	case EEH_ERR_FUNC_LD_CFG_ADDR:
> +	case EEH_ERR_FUNC_LD_CFG_DATA:
> +	case EEH_ERR_FUNC_ST_MEM_ADDR:
> +	case EEH_ERR_FUNC_ST_MEM_DATA:
> +	case EEH_ERR_FUNC_ST_IO_ADDR:
> +	case EEH_ERR_FUNC_ST_IO_DATA:
> +	case EEH_ERR_FUNC_ST_CFG_ADDR:
> +	case EEH_ERR_FUNC_ST_CFG_DATA:
> +	case EEH_ERR_FUNC_DMA_RD_ADDR:
> +	case EEH_ERR_FUNC_DMA_RD_DATA:
> +	case EEH_ERR_FUNC_DMA_RD_MASTER:
> +	case EEH_ERR_FUNC_DMA_RD_TARGET:
> +	case EEH_ERR_FUNC_DMA_WR_ADDR:
> +	case EEH_ERR_FUNC_DMA_WR_DATA:
> +	case EEH_ERR_FUNC_DMA_WR_MASTER:
> +	case EEH_ERR_FUNC_DMA_WR_TARGET:
> +		break;
> +	default:
> +		return -EINVAL;
> +	}

Potentially a good use case for an enum for both type and func.  Then
you could close each enum with a "MAX" entry and simply test type/func <
MAX.  Thanks,

Alex

> +
> +	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()) {

WARNING: multiple messages have this Message-ID (diff)
From: Alex Williamson <alex.williamson@redhat.com>
To: Gavin Shan <gwshan@linux.vnet.ibm.com>
Cc: linuxppc-dev@ozlabs.org, kvm@vger.kernel.org, agraf@suse.de,
	aik@ozlabs.ru, david@gibson.dropbear.id.au
Subject: Re: [PATCH 1/2] powerpc/eeh: Introduce eeh_pe_inject_err()
Date: Fri, 13 Mar 2015 14:28:33 -0600	[thread overview]
Message-ID: <1426278513.3643.117.camel@redhat.com> (raw)
In-Reply-To: <1426055651-22925-1-git-send-email-gwshan@linux.vnet.ibm.com>

On Wed, 2015-03-11 at 17:34 +1100, Gavin Shan wrote:
> The patch defines PCI error types and functions in 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>
> ---
>  arch/powerpc/include/asm/eeh.h | 24 ++++++++++++++++
>  arch/powerpc/kernel/eeh.c      | 63 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 87 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h
> index 9de87ce..eb20c62 100644
> --- a/arch/powerpc/include/asm/eeh.h
> +++ b/arch/powerpc/include/asm/eeh.h
> @@ -196,6 +196,28 @@ enum {
>  #define EEH_RESET_COMPLETE	4	/* PHB complete reset		*/
>  #define EEH_LOG_TEMP		1	/* EEH temporary error log	*/
>  #define EEH_LOG_PERM		2	/* EEH permanent error log	*/
> +#define EEH_ERR_TYPE_32		0	/* 32-bits PCI error	*/
> +#define EEH_ERR_TYPE_64		1	/* 64-bits PCI error	*/
> +#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
>  
>  struct eeh_ops {
>  	char *name;
> @@ -296,6 +318,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.
> diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c
> index 60a0f15ce..dbab1a4 100644
> --- a/arch/powerpc/kernel/eeh.c
> +++ b/arch/powerpc/kernel/eeh.c
> @@ -1657,6 +1657,69 @@ 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 */
> +	switch (type) {
> +	case EEH_ERR_TYPE_32:
> +	case EEH_ERR_TYPE_64:
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	/* Check on PCI error function */
> +	switch (func) {
> +	case EEH_ERR_FUNC_LD_MEM_ADDR:
> +	case EEH_ERR_FUNC_LD_MEM_DATA:
> +	case EEH_ERR_FUNC_LD_IO_ADDR:
> +	case EEH_ERR_FUNC_LD_IO_DATA:
> +	case EEH_ERR_FUNC_LD_CFG_ADDR:
> +	case EEH_ERR_FUNC_LD_CFG_DATA:
> +	case EEH_ERR_FUNC_ST_MEM_ADDR:
> +	case EEH_ERR_FUNC_ST_MEM_DATA:
> +	case EEH_ERR_FUNC_ST_IO_ADDR:
> +	case EEH_ERR_FUNC_ST_IO_DATA:
> +	case EEH_ERR_FUNC_ST_CFG_ADDR:
> +	case EEH_ERR_FUNC_ST_CFG_DATA:
> +	case EEH_ERR_FUNC_DMA_RD_ADDR:
> +	case EEH_ERR_FUNC_DMA_RD_DATA:
> +	case EEH_ERR_FUNC_DMA_RD_MASTER:
> +	case EEH_ERR_FUNC_DMA_RD_TARGET:
> +	case EEH_ERR_FUNC_DMA_WR_ADDR:
> +	case EEH_ERR_FUNC_DMA_WR_DATA:
> +	case EEH_ERR_FUNC_DMA_WR_MASTER:
> +	case EEH_ERR_FUNC_DMA_WR_TARGET:
> +		break;
> +	default:
> +		return -EINVAL;
> +	}

Potentially a good use case for an enum for both type and func.  Then
you could close each enum with a "MAX" entry and simply test type/func <
MAX.  Thanks,

Alex

> +
> +	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()) {




  parent reply	other threads:[~2015-03-13 20:28 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-11  6:34 [PATCH 1/2] powerpc/eeh: Introduce eeh_pe_inject_err() Gavin Shan
2015-03-11  6:34 ` Gavin Shan
2015-03-11  6:34 ` [PATCH 2/2] drivers/vfio: Support EEH error injection Gavin Shan
2015-03-11  6:34   ` Gavin Shan
2015-03-12  0:57   ` David Gibson
2015-03-12  0:57     ` David Gibson
2015-03-12  3:16     ` Gavin Shan
2015-03-12  3:16       ` Gavin Shan
2015-03-12  4:21       ` David Gibson
2015-03-12  4:21         ` David Gibson
2015-03-12  5:01         ` Gavin Shan
2015-03-12  5:01           ` Gavin Shan
2015-03-13 20:28         ` Alex Williamson
2015-03-13 20:28           ` Alex Williamson
2015-03-15 22:49           ` Gavin Shan
2015-03-15 22:49             ` Gavin Shan
2015-03-16  1:01           ` David Gibson
2015-03-16  1:01             ` David Gibson
2015-03-13 20:35   ` Alex Williamson
2015-03-13 20:35     ` Alex Williamson
2015-03-15 22:55     ` Gavin Shan
2015-03-15 22:55       ` Gavin Shan
2015-03-13 20:28 ` Alex Williamson [this message]
2015-03-13 20:28   ` [PATCH 1/2] powerpc/eeh: Introduce eeh_pe_inject_err() Alex Williamson
2015-03-15 22:39   ` Gavin Shan
2015-03-15 22:39     ` Gavin Shan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1426278513.3643.117.camel@redhat.com \
    --to=alex.williamson@redhat.com \
    --cc=agraf@suse.de \
    --cc=aik@ozlabs.ru \
    --cc=david@gibson.dropbear.id.au \
    --cc=gwshan@linux.vnet.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linuxppc-dev@ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.