PCI: tegra: Use generic accessors where possible

Message ID 20170923061841.6123-1-treding@nvidia.com
State New
Headers show
Series
  • PCI: tegra: Use generic accessors where possible
Related show

Commit Message

Thierry Reding Sept. 23, 2017, 6:18 a.m.
The Tegra PCI host controller can generate configuration space accesses
with byte, word and dword granularity for devices. Only root ports can't
have their configuration space accessed in this way.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/pci/host/pci-tegra.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

Comments

vidya sagar Sept. 27, 2017, 8:56 a.m. | #1
On Sat, Sep 23, 2017 at 11:48 AM, Thierry Reding
<thierry.reding@gmail.com> wrote:
> The Tegra PCI host controller can generate configuration space accesses
> with byte, word and dword granularity for devices. Only root ports can't
> have their configuration space accessed in this way.
>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
>  drivers/pci/host/pci-tegra.c | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
> index 9c40da54f88a..e8e1ddbaabc9 100644
> --- a/drivers/pci/host/pci-tegra.c
> +++ b/drivers/pci/host/pci-tegra.c
> @@ -491,12 +491,32 @@ static void __iomem *tegra_pcie_map_bus(struct pci_bus *bus,
>         return addr;
>  }
>
> +static int tegra_pcie_config_read(struct pci_bus *bus, unsigned int devfn,
> +                                 int where, int size, u32 *value)
> +{
> +       if (bus->number == 0)
> +               return pci_generic_config_read32(bus, devfn, where, size,
> +                                                value);
> +
> +       return pci_generic_config_read(bus, devfn, where, size, value);

Since T20, T30 and T124 had issues with 8-bit and 16-bit end point
config accesses, generic accessors should be used only for T210

> +}
> +
> +static int tegra_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
> +                                  int where, int size, u32 value)
> +{
> +       if (bus->number == 0)
> +               return pci_generic_config_write32(bus, devfn, where, size,
> +                                                 value);
> +
> +       return pci_generic_config_write(bus, devfn, where, size, value);

same as above.

> +}
> +
>  static struct pci_ops tegra_pcie_ops = {
>         .add_bus = tegra_pcie_add_bus,
>         .remove_bus = tegra_pcie_remove_bus,
>         .map_bus = tegra_pcie_map_bus,
> -       .read = pci_generic_config_read32,
> -       .write = pci_generic_config_write32,
> +       .read = tegra_pcie_config_read,
> +       .write = tegra_pcie_config_write,
>  };
>
>  static unsigned long tegra_pcie_port_get_pex_ctrl(struct tegra_pcie_port *port)
> --
> 2.14.1
>
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Thierry Reding Sept. 27, 2017, 9:33 a.m. | #2
On Wed, Sep 27, 2017 at 02:26:04PM +0530, vidya sagar wrote:
> On Sat, Sep 23, 2017 at 11:48 AM, Thierry Reding
> <thierry.reding@gmail.com> wrote:
> > The Tegra PCI host controller can generate configuration space accesses
> > with byte, word and dword granularity for devices. Only root ports can't
> > have their configuration space accessed in this way.
> >
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> >  drivers/pci/host/pci-tegra.c | 24 ++++++++++++++++++++++--
> >  1 file changed, 22 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
> > index 9c40da54f88a..e8e1ddbaabc9 100644
> > --- a/drivers/pci/host/pci-tegra.c
> > +++ b/drivers/pci/host/pci-tegra.c
> > @@ -491,12 +491,32 @@ static void __iomem *tegra_pcie_map_bus(struct pci_bus *bus,
> >         return addr;
> >  }
> >
> > +static int tegra_pcie_config_read(struct pci_bus *bus, unsigned int devfn,
> > +                                 int where, int size, u32 *value)
> > +{
> > +       if (bus->number == 0)
> > +               return pci_generic_config_read32(bus, devfn, where, size,
> > +                                                value);
> > +
> > +       return pci_generic_config_read(bus, devfn, where, size, value);
> 
> Since T20, T30 and T124 had issues with 8-bit and 16-bit end point
> config accesses, generic accessors should be used only for T210

I thought that 8-bit and 16-bit configuration space accesses were only
ever problematic for the root ports. I've certainly not seen 8-bit and
16-bit accesses fail on any of the devices I tested on. That is, this
patch was tested on TrimSlice (Tegra20), Beaver (Tegra30), Jetson TK1
(Tegra124) and Jetson TX1 (Tegra210) without any issues.

Thierry
Bjorn Helgaas Oct. 11, 2017, 8:11 p.m. | #3
[+cc vidya]

On Fri, Sep 22, 2017 at 11:18:41PM -0700, Thierry Reding wrote:
> The Tegra PCI host controller can generate configuration space accesses
> with byte, word and dword granularity for devices. Only root ports can't
> have their configuration space accessed in this way.
> 
> Signed-off-by: Thierry Reding <treding@nvidia.com>

Applied to pci/host-tegra for v4.15, thanks!

> ---
>  drivers/pci/host/pci-tegra.c | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
> index 9c40da54f88a..e8e1ddbaabc9 100644
> --- a/drivers/pci/host/pci-tegra.c
> +++ b/drivers/pci/host/pci-tegra.c
> @@ -491,12 +491,32 @@ static void __iomem *tegra_pcie_map_bus(struct pci_bus *bus,
>  	return addr;
>  }
>  
> +static int tegra_pcie_config_read(struct pci_bus *bus, unsigned int devfn,
> +				  int where, int size, u32 *value)
> +{
> +	if (bus->number == 0)
> +		return pci_generic_config_read32(bus, devfn, where, size,
> +						 value);
> +
> +	return pci_generic_config_read(bus, devfn, where, size, value);
> +}
> +
> +static int tegra_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
> +				   int where, int size, u32 value)
> +{
> +	if (bus->number == 0)
> +		return pci_generic_config_write32(bus, devfn, where, size,
> +						  value);
> +
> +	return pci_generic_config_write(bus, devfn, where, size, value);
> +}
> +
>  static struct pci_ops tegra_pcie_ops = {
>  	.add_bus = tegra_pcie_add_bus,
>  	.remove_bus = tegra_pcie_remove_bus,
>  	.map_bus = tegra_pcie_map_bus,
> -	.read = pci_generic_config_read32,
> -	.write = pci_generic_config_write32,
> +	.read = tegra_pcie_config_read,
> +	.write = tegra_pcie_config_write,
>  };
>  
>  static unsigned long tegra_pcie_port_get_pex_ctrl(struct tegra_pcie_port *port)
> -- 
> 2.14.1
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
index 9c40da54f88a..e8e1ddbaabc9 100644
--- a/drivers/pci/host/pci-tegra.c
+++ b/drivers/pci/host/pci-tegra.c
@@ -491,12 +491,32 @@  static void __iomem *tegra_pcie_map_bus(struct pci_bus *bus,
 	return addr;
 }
 
+static int tegra_pcie_config_read(struct pci_bus *bus, unsigned int devfn,
+				  int where, int size, u32 *value)
+{
+	if (bus->number == 0)
+		return pci_generic_config_read32(bus, devfn, where, size,
+						 value);
+
+	return pci_generic_config_read(bus, devfn, where, size, value);
+}
+
+static int tegra_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
+				   int where, int size, u32 value)
+{
+	if (bus->number == 0)
+		return pci_generic_config_write32(bus, devfn, where, size,
+						  value);
+
+	return pci_generic_config_write(bus, devfn, where, size, value);
+}
+
 static struct pci_ops tegra_pcie_ops = {
 	.add_bus = tegra_pcie_add_bus,
 	.remove_bus = tegra_pcie_remove_bus,
 	.map_bus = tegra_pcie_map_bus,
-	.read = pci_generic_config_read32,
-	.write = pci_generic_config_write32,
+	.read = tegra_pcie_config_read,
+	.write = tegra_pcie_config_write,
 };
 
 static unsigned long tegra_pcie_port_get_pex_ctrl(struct tegra_pcie_port *port)