All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Sean V Kelley" <sean.v.kelley@intel.com>
To: "Sean V Kelley" <seanvk.dev@oregontracks.org>
Cc: bhelgaas@google.com, Jonathan.Cameron@huawei.com,
	rafael.j.wysocki@intel.com, ashok.raj@intel.com,
	tony.luck@intel.com, sathyanarayanan.kuppuswamy@intel.com,
	qiuxu.zhuo@intel.com, linux-pci@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v7 03/13] PCI/RCEC: Cache RCEC capabilities in pci_init_capabilities()
Date: Wed, 30 Sep 2020 15:15:36 -0700	[thread overview]
Message-ID: <C878940D-0AAC-48D1-99C5-28D7A5E98ACA@intel.com> (raw)
In-Reply-To: <20200930215820.1113353-4-seanvk.dev@oregontracks.org>

On 30 Sep 2020, at 14:58, Sean V Kelley wrote:

> From: Sean V Kelley <sean.v.kelley@intel.com>
>
> Extend support for Root Complex Event Collectors by decoding and
> caching the RCEC Endpoint Association Extended Capabilities when
> enumerating. Use that cached information for later error source
> reporting. See PCI Express Base Specification, version 5.0-1,
> section 7.9.10.
>
> Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
> Co-developed-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
> Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
> Signed-off-by: Sean V Kelley <sean.v.kelley@intel.com>
> ---
>  drivers/pci/pci.h         | 17 +++++++++++
>  drivers/pci/pcie/Makefile |  2 +-
>  drivers/pci/pcie/rcec.c   | 59 
> +++++++++++++++++++++++++++++++++++++++
>  drivers/pci/probe.c       |  2 ++
>  include/linux/pci.h       |  4 +++
>  5 files changed, 83 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/pci/pcie/rcec.c
>
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index fa12f7cbc1a0..88e27a98def5 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -449,6 +449,15 @@ int aer_get_device_error_info(struct pci_dev 
> *dev, struct aer_err_info *info);
>  void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
>  #endif	/* CONFIG_PCIEAER */
>
> +#ifdef CONFIG_PCIEPORTBUS
> +/* Cached RCEC Endpoint Association */
> +struct rcec_ea {
> +	u8		nextbusn;
> +	u8		lastbusn;
> +	u32		bitmap;
> +};
> +#endif
> +
>  #ifdef CONFIG_PCIE_DPC
>  void pci_save_dpc_state(struct pci_dev *dev);
>  void pci_restore_dpc_state(struct pci_dev *dev);
> @@ -461,6 +470,14 @@ static inline void pci_restore_dpc_state(struct 
> pci_dev *dev) {}
>  static inline void pci_dpc_init(struct pci_dev *pdev) {}
>  #endif
>
> +#ifdef CONFIG_PCIEPORTBUS
> +int pci_rcec_init(struct pci_dev *dev);
> +void pci_rcec_exit(struct pci_dev *dev);
> +#else
> +static inline int pci_rcec_init(struct pci_dev *dev) {return 0;}

Will fix the spacing here on the inline. That’s what I get for a last 
minute change of void to int for return…

Sean

> +static inline void pci_rcec_exit(struct pci_dev *dev) {}
> +#endif
> +
>  #ifdef CONFIG_PCI_ATS
>  /* Address Translation Service */
>  void pci_ats_init(struct pci_dev *dev);
> diff --git a/drivers/pci/pcie/Makefile b/drivers/pci/pcie/Makefile
> index 68da9280ff11..d9697892fa3e 100644
> --- a/drivers/pci/pcie/Makefile
> +++ b/drivers/pci/pcie/Makefile
> @@ -2,7 +2,7 @@
>  #
>  # Makefile for PCI Express features and port driver
>
> -pcieportdrv-y			:= portdrv_core.o portdrv_pci.o err.o
> +pcieportdrv-y			:= portdrv_core.o portdrv_pci.o err.o rcec.o
>
>  obj-$(CONFIG_PCIEPORTBUS)	+= pcieportdrv.o
>
> diff --git a/drivers/pci/pcie/rcec.c b/drivers/pci/pcie/rcec.c
> new file mode 100644
> index 000000000000..da02b0af442d
> --- /dev/null
> +++ b/drivers/pci/pcie/rcec.c
> @@ -0,0 +1,59 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Root Complex Event Collector Support
> + *
> + * Authors:
> + *  Sean V Kelley <sean.v.kelley@intel.com>
> + *  Qiuxu Zhuo <qiuxu.zhuo@intel.com>
> + *
> + * Copyright (C) 2020 Intel Corp.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/pci.h>
> +#include <linux/pci_regs.h>
> +
> +#include "../pci.h"
> +
> +int pci_rcec_init(struct pci_dev *dev)
> +{
> +	struct rcec_ea *rcec_ea;
> +	u32 rcec, hdr, busn;
> +	u8 ver;
> +
> +	/* Only for Root Complex Event Collectors */
> +	if (pci_pcie_type(dev) != PCI_EXP_TYPE_RC_EC)
> +		return 0;
> +
> +	rcec = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_RCEC);
> +	if (!rcec)
> +		return 0;
> +
> +	rcec_ea = kzalloc(sizeof(*rcec_ea), GFP_KERNEL);
> +	if (!rcec_ea)
> +		return -ENOMEM;
> +	dev->rcec_ea = rcec_ea;
> +
> +	pci_read_config_dword(dev, rcec + PCI_RCEC_RCIEP_BITMAP, 
> &rcec_ea->bitmap);
> +
> +	/* Check whether RCEC BUSN register is present */
> +	pci_read_config_dword(dev, rcec, &hdr);
> +	ver = PCI_EXT_CAP_VER(hdr);
> +	if (ver < PCI_RCEC_BUSN_REG_VER) {
> +		/* Avoid later ver check by setting nextbusn */
> +		rcec_ea->nextbusn = 0xff;
> +		return 0;
> +	}
> +
> +	pci_read_config_dword(dev, rcec + PCI_RCEC_BUSN, &busn);
> +	rcec_ea->nextbusn = PCI_RCEC_BUSN_NEXT(busn);
> +	rcec_ea->lastbusn = PCI_RCEC_BUSN_LAST(busn);
> +
> +	return 0;
> +}
> +
> +void pci_rcec_exit(struct pci_dev *dev)
> +{
> +	kfree(dev->rcec_ea);
> +	dev->rcec_ea = NULL;
> +}
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 03d37128a24f..25f01f841f2d 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -2201,6 +2201,7 @@ static void pci_configure_device(struct pci_dev 
> *dev)
>  static void pci_release_capabilities(struct pci_dev *dev)
>  {
>  	pci_aer_exit(dev);
> +	pci_rcec_exit(dev);
>  	pci_vpd_release(dev);
>  	pci_iov_release(dev);
>  	pci_free_cap_save_buffers(dev);
> @@ -2400,6 +2401,7 @@ static void pci_init_capabilities(struct pci_dev 
> *dev)
>  	pci_ptm_init(dev);		/* Precision Time Measurement */
>  	pci_aer_init(dev);		/* Advanced Error Reporting */
>  	pci_dpc_init(dev);		/* Downstream Port Containment */
> +	pci_rcec_init(dev);		/* Root Complex Event Collector */
>
>  	pcie_report_downtraining(dev);
>
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 835530605c0d..2290439e8bc0 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -304,6 +304,7 @@ struct pcie_link_state;
>  struct pci_vpd;
>  struct pci_sriov;
>  struct pci_p2pdma;
> +struct rcec_ea;
>
>  /* The pci_dev structure describes PCI devices */
>  struct pci_dev {
> @@ -326,6 +327,9 @@ struct pci_dev {
>  #ifdef CONFIG_PCIEAER
>  	u16		aer_cap;	/* AER capability offset */
>  	struct aer_stats *aer_stats;	/* AER stats for this device */
> +#endif
> +#ifdef CONFIG_PCIEPORTBUS
> +	struct rcec_ea	*rcec_ea;	/* RCEC cached endpoint association */
>  #endif
>  	u8		pcie_cap;	/* PCIe capability offset */
>  	u8		msi_cap;	/* MSI capability offset */
> -- 
> 2.28.0

  reply	other threads:[~2020-09-30 22:15 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-30 21:58 [PATCH v7 00/13] Add RCEC handling to PCI/AER Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 01/13] PCI/RCEC: Add RCEC class code and extended capability Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 02/13] PCI/RCEC: Bind RCEC devices to the Root Port driver Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 03/13] PCI/RCEC: Cache RCEC capabilities in pci_init_capabilities() Sean V Kelley
2020-09-30 22:15   ` Sean V Kelley [this message]
2020-10-01  9:02   ` Jonathan Cameron
2020-09-30 21:58 ` [PATCH v7 04/13] PCI/ERR: Rename reset_link() to reset_subordinate_device() Sean V Kelley
2020-10-01  9:03   ` Jonathan Cameron
2020-09-30 21:58 ` [PATCH v7 05/13] PCI/ERR: Use "bridge" for clarity in pcie_do_recovery() Sean V Kelley
2020-10-01  9:06   ` Jonathan Cameron
2020-10-01 21:04     ` Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 06/13] PCI/ERR: Limit AER resets " Sean V Kelley
2020-10-01 10:00   ` Jonathan Cameron
2020-09-30 21:58 ` [PATCH v7 07/13] PCI/AER: Extend AER error handling to RCECs Sean V Kelley
2020-10-01 23:14   ` Bjorn Helgaas
2020-10-02  4:15     ` Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 08/13] PCI/AER: Apply function level reset to RCiEP on fatal error Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 09/13] PCI/RCEC: Add pcie_link_rcec() to associate RCiEPs Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 10/13] PCI/RCEC: Add RCiEP's linked RCEC to AER/ERR Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 11/13] PCI/AER: Add pcie_walk_rcec() to RCEC AER handling Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 12/13] PCI/PME: Add pcie_walk_rcec() to RCEC PME handling Sean V Kelley
2020-09-30 21:58 ` [PATCH v7 13/13] PCI/AER: Add RCEC AER error injection support Sean V Kelley
2020-10-01 10:16 ` [PATCH v7 00/13] Add RCEC handling to PCI/AER Jonathan Cameron
2020-10-01 21:01   ` Sean V Kelley

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=C878940D-0AAC-48D1-99C5-28D7A5E98ACA@intel.com \
    --to=sean.v.kelley@intel.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=ashok.raj@intel.com \
    --cc=bhelgaas@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=qiuxu.zhuo@intel.com \
    --cc=rafael.j.wysocki@intel.com \
    --cc=sathyanarayanan.kuppuswamy@intel.com \
    --cc=seanvk.dev@oregontracks.org \
    --cc=tony.luck@intel.com \
    /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.