Re: [PATCH v16 5/9] PCI/DPC: Cache DPC capabilities in pci_init_capabilities()

From: Bjorn Helgaas
Date: Tue Mar 03 2020 - 19:47:09 EST


On Thu, Feb 27, 2020 at 04:59:47PM -0800, sathyanarayanan.kuppuswamy@xxxxxxxxxxxxxxx wrote:
> From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@xxxxxxxxxxxxxxx>
>
> Since we need to re-use DPC error handling routines in Error Disconnect
> Recover (EDR) driver, move the initalization and caching of DPC
> capabilities to pci_init_capabilities().
>
> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@xxxxxxxxxxxxxxx>
> ---
> drivers/pci/pci.h | 2 ++
> drivers/pci/pcie/dpc.c | 32 ++++++++++++++++++++------------
> 2 files changed, 22 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index c2c35f152cde..e57e78b619f8 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -448,9 +448,11 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
> #ifdef CONFIG_PCIE_DPC
> void pci_save_dpc_state(struct pci_dev *dev);
> void pci_restore_dpc_state(struct pci_dev *dev);
> +void pci_dpc_init(struct pci_dev *pdev);
> #else
> static inline void pci_save_dpc_state(struct pci_dev *dev) {}
> static inline void pci_restore_dpc_state(struct pci_dev *dev) {}
> +static inline void pci_dpc_init(struct pci_dev *pdev) {}
> #endif
>
> #ifdef CONFIG_PCI_ATS
> diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c
> index 114358d62ddf..57e7f94b98cf 100644
> --- a/drivers/pci/pcie/dpc.c
> +++ b/drivers/pci/pcie/dpc.c
> @@ -249,6 +249,26 @@ static irqreturn_t dpc_irq(int irq, void *context)
> return IRQ_HANDLED;
> }
>
> +void pci_dpc_init(struct pci_dev *pdev)
> +{

I think you forgot to call this?

> + u16 cap;
> +
> + pdev->dpc_cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DPC);
> + if (!pdev->dpc_cap)
> + return;
> +
> + pci_read_config_word(pdev, pdev->dpc_cap + PCI_EXP_DPC_CAP, &cap);
> + pdev->dpc_rp_extensions = (cap & PCI_EXP_DPC_CAP_RP_EXT) ? 1 : 0;
> + if (pdev->dpc_rp_extensions) {
> + pdev->dpc_rp_log_size = (cap & PCI_EXP_DPC_RP_PIO_LOG_SIZE) >> 8;
> + if (pdev->dpc_rp_log_size < 4 || pdev->dpc_rp_log_size > 9) {
> + pci_err(pdev, "RP PIO log size %u is invalid\n",
> + pdev->dpc_rp_log_size);
> + pdev->dpc_rp_log_size = 0;
> + }
> + }
> +}
> +
> #define FLAG(x, y) (((x) & (y)) ? '+' : '-')
> static int dpc_probe(struct pcie_device *dev)
> {
> @@ -260,8 +280,6 @@ static int dpc_probe(struct pcie_device *dev)
> if (pcie_aer_get_firmware_first(pdev) && !pcie_ports_dpc_native)
> return -ENOTSUPP;
>
> - pdev->dpc_cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DPC);
> -
> status = devm_request_threaded_irq(device, dev->irq, dpc_irq,
> dpc_handler, IRQF_SHARED,
> "pcie-dpc", pdev);
> @@ -274,16 +292,6 @@ static int dpc_probe(struct pcie_device *dev)
> pci_read_config_word(pdev, pdev->dpc_cap + PCI_EXP_DPC_CAP, &cap);
> pci_read_config_word(pdev, pdev->dpc_cap + PCI_EXP_DPC_CTL, &ctl);
>
> - pdev->dpc_rp_extensions = (cap & PCI_EXP_DPC_CAP_RP_EXT) ? 1 : 0;
> - if (pdev->dpc_rp_extensions) {
> - pdev->dpc_rp_log_size = (cap & PCI_EXP_DPC_RP_PIO_LOG_SIZE) >> 8;
> - if (pdev->dpc_rp_log_size < 4 || pdev->dpc_rp_log_size > 9) {
> - pci_err(pdev, "RP PIO log size %u is invalid\n",
> - pdev->dpc_rp_log_size);
> - pdev->dpc_rp_log_size = 0;
> - }
> - }
> -
> ctl = (ctl & 0xfff4) | PCI_EXP_DPC_CTL_EN_FATAL | PCI_EXP_DPC_CTL_INT_EN;
> pci_write_config_word(pdev, pdev->dpc_cap + PCI_EXP_DPC_CTL, ctl);
>
> --
> 2.21.0
>