linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Jon Hunter <jonathanh@nvidia.com>
Cc: "Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"Vidya Sagar" <vidyas@nvidia.com>,
	"Krzysztof Wilczyński" <kw@linux.com>,
	linux-pci@vger.kernel.org, linux-tegra@vger.kernel.org
Subject: Re: [PATCH V4] PCI: tegra: Fix building Tegra194 PCIe driver
Date: Thu, 17 Jun 2021 12:00:42 -0500	[thread overview]
Message-ID: <20210617170042.GA3091529@bjorn-Precision-5520> (raw)
In-Reply-To: <20210610064134.336781-1-jonathanh@nvidia.com>

On Thu, Jun 10, 2021 at 07:41:34AM +0100, Jon Hunter wrote:
> Commit 7f100744749e ("PCI: tegra: Add Tegra194 MCFG quirks for ECAM
> errata") caused a few build regressions for the Tegra194 PCIe driver
> which are:
> 
> 1. The Tegra194 PCIe driver can no longer be built as a module. This
>    was caused by removing the Makefile entry to build the pcie-tegra.c
>    based upon the CONFIG_PCIE_TEGRA194 option. Therefore, restore this
>    so that we can build the driver as a module.
> 2. 7f100744749e ("PCI: tegra: Add Tegra194 MCFG quirks for ECAM
>    errata") added "#ifdef CONFIG_PCIE_TEGRA194" around the native
>    driver. But if we set CONFIG_PCIE_TEGRA194=m to build the driver as a
>    module, autoconf.h contains "#define CONFIG_PCIE_TEGRA194_MODULE 1"
>    (not "#define CONFIG_PCIE_TEGRA194 1"), so the #ifdef excludes the
>    driver. Given that the ACPI quirk code for Tegra194 is completely
>    independent of the native Tegra194 PCIe driver, move this code into
>    its own file so that it can be built independently and we can remove
>    the "#ifdef CONFIG_PCIE_TEGRA194" in the native driver. Note that
>    given the native Tegra194 PCIe driver is only used with device-tree,
>    this will not cause any conflicts.
> 3. The below build warnings to be seen with particular kernel
>    configurations. Fix these by moving these structure definitions to
>    within the necessary guards.
> 
>   drivers/pci/controller/dwc/pcie-tegra194.c:259:18: warning:
>   	‘event_cntr_data_offset’ defined but not used [-Wunused-const-variable=]
>   drivers/pci/controller/dwc/pcie-tegra194.c:250:18: warning:
>   	‘event_cntr_ctrl_offset’ defined but not used [-Wunused-const-variable=]
>   drivers/pci/controller/dwc/pcie-tegra194.c:243:27: warning:
>   	‘pcie_gen_freq’ defined but not used [-Wunused-const-variable=]
> 
> Fixes: 7f100744749e ("PCI: tegra: Add Tegra194 MCFG quirks for ECAM errata")
> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>

Applied with Thierry's reviewed-by and the following subject to
for-linus for v5.13, thanks!

  PCI: tegra194: Fix MCFG quirk build regressions

> ---
> Changes since V3:
> - Moved ACPI quirk code into separate source file
> 
> Changes since V2:
> - Update the commit message per Bjorn's feedback
> - Moved the structure definitions within the necessary guards as opposed
>   to wrapping the existing defintions with the appropriate guards.
> 
> Changes since V1:
> - Added fixes tag
> - Fixed 'defined but not used' compiler warnings
> 
>  drivers/pci/controller/dwc/Makefile           |   3 +-
>  .../pci/controller/dwc/pcie-tegra194-acpi.c   | 108 ++++++++++++++
>  drivers/pci/controller/dwc/pcie-tegra194.c    | 138 +++---------------
>  3 files changed, 128 insertions(+), 121 deletions(-)
>  create mode 100644 drivers/pci/controller/dwc/pcie-tegra194-acpi.c
> 
> diff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile
> index eca805c1a023..9e6ce0dc2f53 100644
> --- a/drivers/pci/controller/dwc/Makefile
> +++ b/drivers/pci/controller/dwc/Makefile
> @@ -18,6 +18,7 @@ obj-$(CONFIG_PCIE_INTEL_GW) += pcie-intel-gw.o
>  obj-$(CONFIG_PCIE_KIRIN) += pcie-kirin.o
>  obj-$(CONFIG_PCIE_HISI_STB) += pcie-histb.o
>  obj-$(CONFIG_PCI_MESON) += pci-meson.o
> +obj-$(CONFIG_PCIE_TEGRA194) += pcie-tegra194.o
>  obj-$(CONFIG_PCIE_UNIPHIER) += pcie-uniphier.o
>  obj-$(CONFIG_PCIE_UNIPHIER_EP) += pcie-uniphier-ep.o
>  
> @@ -38,6 +39,6 @@ ifdef CONFIG_ACPI
>  ifdef CONFIG_PCI_QUIRKS
>  obj-$(CONFIG_ARM64) += pcie-al.o
>  obj-$(CONFIG_ARM64) += pcie-hisi.o
> -obj-$(CONFIG_ARM64) += pcie-tegra194.o
> +obj-$(CONFIG_ARM64) += pcie-tegra194-acpi.o
>  endif
>  endif
> diff --git a/drivers/pci/controller/dwc/pcie-tegra194-acpi.c b/drivers/pci/controller/dwc/pcie-tegra194-acpi.c
> new file mode 100644
> index 000000000000..c2de6ed4d86f
> --- /dev/null
> +++ b/drivers/pci/controller/dwc/pcie-tegra194-acpi.c
> @@ -0,0 +1,108 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * ACPI quirks for Tegra194 PCIe host controller
> + *
> + * Copyright (C) 2021 NVIDIA Corporation.
> + *
> + * Author: Vidya Sagar <vidyas@nvidia.com>
> + */
> +
> +#include <linux/pci.h>
> +#include <linux/pci-acpi.h>
> +#include <linux/pci-ecam.h>
> +
> +#include "pcie-designware.h"
> +
> +struct tegra194_pcie_ecam  {
> +	void __iomem *config_base;
> +	void __iomem *iatu_base;
> +	void __iomem *dbi_base;
> +};
> +
> +static int tegra194_acpi_init(struct pci_config_window *cfg)
> +{
> +	struct device *dev = cfg->parent;
> +	struct tegra194_pcie_ecam *pcie_ecam;
> +
> +	pcie_ecam = devm_kzalloc(dev, sizeof(*pcie_ecam), GFP_KERNEL);
> +	if (!pcie_ecam)
> +		return -ENOMEM;
> +
> +	pcie_ecam->config_base = cfg->win;
> +	pcie_ecam->iatu_base = cfg->win + SZ_256K;
> +	pcie_ecam->dbi_base = cfg->win + SZ_512K;
> +	cfg->priv = pcie_ecam;
> +
> +	return 0;
> +}
> +
> +static void atu_reg_write(struct tegra194_pcie_ecam *pcie_ecam, int index,
> +			  u32 val, u32 reg)
> +{
> +	u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index);
> +
> +	writel(val, pcie_ecam->iatu_base + offset + reg);
> +}
> +
> +static void program_outbound_atu(struct tegra194_pcie_ecam *pcie_ecam,
> +				 int index, int type, u64 cpu_addr,
> +				 u64 pci_addr, u64 size)
> +{
> +	atu_reg_write(pcie_ecam, index, lower_32_bits(cpu_addr),
> +		      PCIE_ATU_LOWER_BASE);
> +	atu_reg_write(pcie_ecam, index, upper_32_bits(cpu_addr),
> +		      PCIE_ATU_UPPER_BASE);
> +	atu_reg_write(pcie_ecam, index, lower_32_bits(pci_addr),
> +		      PCIE_ATU_LOWER_TARGET);
> +	atu_reg_write(pcie_ecam, index, lower_32_bits(cpu_addr + size - 1),
> +		      PCIE_ATU_LIMIT);
> +	atu_reg_write(pcie_ecam, index, upper_32_bits(pci_addr),
> +		      PCIE_ATU_UPPER_TARGET);
> +	atu_reg_write(pcie_ecam, index, type, PCIE_ATU_CR1);
> +	atu_reg_write(pcie_ecam, index, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
> +}
> +
> +static void __iomem *tegra194_map_bus(struct pci_bus *bus,
> +				      unsigned int devfn, int where)
> +{
> +	struct pci_config_window *cfg = bus->sysdata;
> +	struct tegra194_pcie_ecam *pcie_ecam = cfg->priv;
> +	u32 busdev;
> +	int type;
> +
> +	if (bus->number < cfg->busr.start || bus->number > cfg->busr.end)
> +		return NULL;
> +
> +	if (bus->number == cfg->busr.start) {
> +		if (PCI_SLOT(devfn) == 0)
> +			return pcie_ecam->dbi_base + where;
> +		else
> +			return NULL;
> +	}
> +
> +	busdev = PCIE_ATU_BUS(bus->number) | PCIE_ATU_DEV(PCI_SLOT(devfn)) |
> +		 PCIE_ATU_FUNC(PCI_FUNC(devfn));
> +
> +	if (bus->parent->number == cfg->busr.start) {
> +		if (PCI_SLOT(devfn) == 0)
> +			type = PCIE_ATU_TYPE_CFG0;
> +		else
> +			return NULL;
> +	} else {
> +		type = PCIE_ATU_TYPE_CFG1;
> +	}
> +
> +	program_outbound_atu(pcie_ecam, 0, type, cfg->res.start, busdev,
> +			     SZ_256K);
> +
> +	return pcie_ecam->config_base + where;
> +}
> +
> +const struct pci_ecam_ops tegra194_pcie_ops = {
> +	.init		= tegra194_acpi_init,
> +	.pci_ops	= {
> +		.map_bus	= tegra194_map_bus,
> +		.read		= pci_generic_config_read,
> +		.write		= pci_generic_config_write,
> +	}
> +};
> diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c
> index b19775ab134e..fa6b12cfc043 100644
> --- a/drivers/pci/controller/dwc/pcie-tegra194.c
> +++ b/drivers/pci/controller/dwc/pcie-tegra194.c
> @@ -22,8 +22,6 @@
>  #include <linux/of_irq.h>
>  #include <linux/of_pci.h>
>  #include <linux/pci.h>
> -#include <linux/pci-acpi.h>
> -#include <linux/pci-ecam.h>
>  #include <linux/phy/phy.h>
>  #include <linux/pinctrl/consumer.h>
>  #include <linux/platform_device.h>
> @@ -247,24 +245,6 @@ static const unsigned int pcie_gen_freq[] = {
>  	GEN4_CORE_CLK_FREQ
>  };
>  
> -static const u32 event_cntr_ctrl_offset[] = {
> -	0x1d8,
> -	0x1a8,
> -	0x1a8,
> -	0x1a8,
> -	0x1c4,
> -	0x1d8
> -};
> -
> -static const u32 event_cntr_data_offset[] = {
> -	0x1dc,
> -	0x1ac,
> -	0x1ac,
> -	0x1ac,
> -	0x1c8,
> -	0x1dc
> -};
> -
>  struct tegra_pcie_dw {
>  	struct device *dev;
>  	struct resource *appl_res;
> @@ -313,104 +293,6 @@ struct tegra_pcie_dw_of_data {
>  	enum dw_pcie_device_mode mode;
>  };
>  
> -#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
> -struct tegra194_pcie_ecam  {
> -	void __iomem *config_base;
> -	void __iomem *iatu_base;
> -	void __iomem *dbi_base;
> -};
> -
> -static int tegra194_acpi_init(struct pci_config_window *cfg)
> -{
> -	struct device *dev = cfg->parent;
> -	struct tegra194_pcie_ecam *pcie_ecam;
> -
> -	pcie_ecam = devm_kzalloc(dev, sizeof(*pcie_ecam), GFP_KERNEL);
> -	if (!pcie_ecam)
> -		return -ENOMEM;
> -
> -	pcie_ecam->config_base = cfg->win;
> -	pcie_ecam->iatu_base = cfg->win + SZ_256K;
> -	pcie_ecam->dbi_base = cfg->win + SZ_512K;
> -	cfg->priv = pcie_ecam;
> -
> -	return 0;
> -}
> -
> -static void atu_reg_write(struct tegra194_pcie_ecam *pcie_ecam, int index,
> -			  u32 val, u32 reg)
> -{
> -	u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index);
> -
> -	writel(val, pcie_ecam->iatu_base + offset + reg);
> -}
> -
> -static void program_outbound_atu(struct tegra194_pcie_ecam *pcie_ecam,
> -				 int index, int type, u64 cpu_addr,
> -				 u64 pci_addr, u64 size)
> -{
> -	atu_reg_write(pcie_ecam, index, lower_32_bits(cpu_addr),
> -		      PCIE_ATU_LOWER_BASE);
> -	atu_reg_write(pcie_ecam, index, upper_32_bits(cpu_addr),
> -		      PCIE_ATU_UPPER_BASE);
> -	atu_reg_write(pcie_ecam, index, lower_32_bits(pci_addr),
> -		      PCIE_ATU_LOWER_TARGET);
> -	atu_reg_write(pcie_ecam, index, lower_32_bits(cpu_addr + size - 1),
> -		      PCIE_ATU_LIMIT);
> -	atu_reg_write(pcie_ecam, index, upper_32_bits(pci_addr),
> -		      PCIE_ATU_UPPER_TARGET);
> -	atu_reg_write(pcie_ecam, index, type, PCIE_ATU_CR1);
> -	atu_reg_write(pcie_ecam, index, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
> -}
> -
> -static void __iomem *tegra194_map_bus(struct pci_bus *bus,
> -				      unsigned int devfn, int where)
> -{
> -	struct pci_config_window *cfg = bus->sysdata;
> -	struct tegra194_pcie_ecam *pcie_ecam = cfg->priv;
> -	u32 busdev;
> -	int type;
> -
> -	if (bus->number < cfg->busr.start || bus->number > cfg->busr.end)
> -		return NULL;
> -
> -	if (bus->number == cfg->busr.start) {
> -		if (PCI_SLOT(devfn) == 0)
> -			return pcie_ecam->dbi_base + where;
> -		else
> -			return NULL;
> -	}
> -
> -	busdev = PCIE_ATU_BUS(bus->number) | PCIE_ATU_DEV(PCI_SLOT(devfn)) |
> -		 PCIE_ATU_FUNC(PCI_FUNC(devfn));
> -
> -	if (bus->parent->number == cfg->busr.start) {
> -		if (PCI_SLOT(devfn) == 0)
> -			type = PCIE_ATU_TYPE_CFG0;
> -		else
> -			return NULL;
> -	} else {
> -		type = PCIE_ATU_TYPE_CFG1;
> -	}
> -
> -	program_outbound_atu(pcie_ecam, 0, type, cfg->res.start, busdev,
> -			     SZ_256K);
> -
> -	return pcie_ecam->config_base + where;
> -}
> -
> -const struct pci_ecam_ops tegra194_pcie_ops = {
> -	.init		= tegra194_acpi_init,
> -	.pci_ops	= {
> -		.map_bus	= tegra194_map_bus,
> -		.read		= pci_generic_config_read,
> -		.write		= pci_generic_config_write,
> -	}
> -};
> -#endif /* defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS) */
> -
> -#ifdef CONFIG_PCIE_TEGRA194
> -
>  static inline struct tegra_pcie_dw *to_tegra_pcie(struct dw_pcie *pci)
>  {
>  	return container_of(pci, struct tegra_pcie_dw, pci);
> @@ -694,6 +576,24 @@ static struct pci_ops tegra_pci_ops = {
>  };
>  
>  #if defined(CONFIG_PCIEASPM)
> +static const u32 event_cntr_ctrl_offset[] = {
> +	0x1d8,
> +	0x1a8,
> +	0x1a8,
> +	0x1a8,
> +	0x1c4,
> +	0x1d8
> +};
> +
> +static const u32 event_cntr_data_offset[] = {
> +	0x1dc,
> +	0x1ac,
> +	0x1ac,
> +	0x1ac,
> +	0x1c8,
> +	0x1dc
> +};
> +
>  static void disable_aspm_l11(struct tegra_pcie_dw *pcie)
>  {
>  	u32 val;
> @@ -2413,5 +2313,3 @@ MODULE_DEVICE_TABLE(of, tegra_pcie_dw_of_match);
>  MODULE_AUTHOR("Vidya Sagar <vidyas@nvidia.com>");
>  MODULE_DESCRIPTION("NVIDIA PCIe host controller driver");
>  MODULE_LICENSE("GPL v2");
> -
> -#endif /* CONFIG_PCIE_TEGRA194 */
> -- 
> 2.25.1
> 

      parent reply	other threads:[~2021-06-17 17:00 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-10  6:41 [PATCH V4] PCI: tegra: Fix building Tegra194 PCIe driver Jon Hunter
2021-06-10  9:07 ` Thierry Reding
2021-06-14 20:37   ` Jon Hunter
2021-06-16  7:56     ` Jon Hunter
2021-06-17 17:00 ` Bjorn Helgaas [this message]

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=20210617170042.GA3091529@bjorn-Precision-5520 \
    --to=helgaas@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=jonathanh@nvidia.com \
    --cc=kw@linux.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=thierry.reding@gmail.com \
    --cc=vidyas@nvidia.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).