linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thierry Reding <thierry.reding@avionic-design.de>
To: Stephen Warren <swarren@wwwdotorg.org>
Cc: Mitch Bradley <wmb@firmworks.com>,
	Russell King <linux@arm.linux.org.uk>,
	linux-pci@vger.kernel.org, devicetree-discuss@lists.ozlabs.org,
	Rob Herring <rob.herring@calxeda.com>,
	Jesse Barnes <jbarnes@virtuousgeek.org>,
	Colin Cross <ccross@android.com>,
	linux-tegra@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH v2 07/10] ARM: tegra: pcie: Add device tree support
Date: Fri, 15 Jun 2012 08:12:36 +0200	[thread overview]
Message-ID: <20120615061236.GA4081@avionic-0098.mockup.avionic-design.de> (raw)
In-Reply-To: <4FDA40A0.4030206@wwwdotorg.org>

[-- Attachment #1: Type: text/plain, Size: 5806 bytes --]

On Thu, Jun 14, 2012 at 01:50:56PM -0600, Stephen Warren wrote:
> On 06/14/2012 01:29 PM, Thierry Reding wrote:
> > On Thu, Jun 14, 2012 at 12:30:50PM -0600, Stephen Warren wrote:
> >> On 06/14/2012 03:19 AM, Thierry Reding wrote:
> ...
> >>> #address-cells = <1>; #size-cells = <1>;
> >>> 
> >>> pci@80000000 {
> >> 
> >> I'm still not convinced that using the address of the port's
> >> registers is the correct way to represent each port. The port
> >> index seems much more useful.
> >> 
> >> The main reason here is that there are a lot of registers that
> >> contain fields for each port - far more than the combination of
> >> this node's reg and ctrl-offset (which I assume is an address
> >> offset for just one example of this issue) properties can
> >> describe. The bit position and bit stride of these fields isn't
> >> necessarily the same in each register. Do we want a property like
> >> ctrl-offset for every single type of field in every single shared
> >> register that describes the location of the relevant data, or
> >> just a single "port ID" bit that can be applied to anything?
> >> 
> >> (Perhaps this isn't so obvious looking at the TRM since it
> >> doesn't document all registers, and I'm also looking at the
> >> Tegra30 documentation too, which might be more exposed to this -
> >> I haven't correlated all the documentation sources to be sure
> >> though)
> > 
> > I agree that maybe adding properties for each bit position or
> > register offset may not work out too well. But I think it still
> > makes sense to use the base address of the port's registers (see
> > below). We could of course add some code to determine the index
> > from the base address at initialization time and reuse the index
> > where appropriate.
> 
> To me, working back from address to ID then using the ID to calculate
> some other addresses seems far more icky than just calculating all the
> addresses based off of one ID. But, I suppose this doesn't make a huge
> practical difference.

This really depends on the device vs. no device decision below. If we can
make it work without needing an extra device for it, then using the index
is certainly better. However, if we instantiate devices from the DT, then
we have the address anyway and adding the index as a property would be
redundant and error prone (what happens if somebody sets the index of the
port at address 0x80000000 to 2?).

> >>> compatible = "nvidia,tegra20-pcie-port"; reg = <0x80000000 
> >>> 0x00001000>; status = "disabled";
> >>> 
> >>> #address-cells = <3>; #size-cells = <2>;
> >>> 
> >>> ranges = <0x81000000 0 0 0x80400000 0 0x00008000   /* I/O */ 
> >>> 0x82000000 0 0 0x90000000 0 0x08000000   /* non-prefetchable
> >>> memory */ 0xc2000000 0 0 0xa0000000 0 0x08000000>; /*
> >>> prefetchable memory */
> >> 
> >> The values here appear identical for both ports. Surely they
> >> should describe just the parts of the overall address space that
> >> have been assigned/delegated to the individual port/bridge?
> > 
> > They're not identical. Port 0 gets the first half and port 1 gets
> > the second half of the ranges specified in the parent.
> 
> Oh right, I missed some 8s and 0s that looked the same!
> 
> >>> While looking into some more code, trying to figure out how to
> >>> hook this all up with the device tree I ran into a problem. I
> >>> need to actually create a 'struct device' for each of the
> >>> ports, so I added the "simple-bus" to the pcie-controller's
> >>> "compatible" property. Furthermore, each PCI root port now
> >>> becomes a platform_device, which are supported by a new
> >>> tegra-pcie-port driver. I'm not sure if "port" is very common
> >>> in PCI speek, so something like tegra-pcie-bridge (compatible =
> >>> "nvidia,tegra20-pcie-bridge") may be more appropriate?
> >> 
> >> What is it that drives the need for each port to be a 'struct
> >> device'? The current driver supports 2 host ports, yet there's
> >> only a single struct device for it. Does the DT code assume a 1:1
> >> mapping between struct device and DT node that represents the
> >> child bus? If so, perhaps it'd be better to rework that code to
> >> accept a DT node as a parameter and call it multiple times,
> >> rather than accept a struct device as a parameter and hence need
> >> multiple devices?
> > 
> > It's not so much the DT code, but rather the PCI core and
> > ultimately the device model that requires it. Each port is
> > basically a PCI host bridge that provides a root PCI bus and the
> > device model is used to represent the hierachy of the busses.
> > Providing just the DT node isn't going to be enough.
> 
> But the existing driver works without /any/ devices, let alone one per
> port.

That doesn't necessarily mean it is correct. The representation of the
device tree (as in the Linux kernel device tree) isn't quite accurate
because you're missing the link of the host bridge to the parent PCIe
controller. It also means that the representation of the kernel device
tree doesn't match the DT representation.

Additionally, if you look at how PCI busses and devices are matched to
their respective DT nodes, the code in drivers/pci/of.c provides a
default implementation of pcibios_get_phb_of_node(), which matches the
struct pci_bus up with the device_node of the parent device.

If we keep the current implementation that passes NULL as parent to the
pci_scan_root_bus() function, then we'll have to provide a custom
implementation of pcibios_get_phb_of_node() which has to go through
similar hoops as the x86 version (see arch/x86/kernel/devicetree.c).
That of course will not contribute to improving the current state of
fragmentation in the PCI subsystem.

Thierry

[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]

  reply	other threads:[~2012-06-15  6:13 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-11 15:05 [PATCH v2 00/10] ARM: tegra: Add PCIe device tree support Thierry Reding
2012-06-11 15:05 ` [PATCH v2 01/10] PCI: Keep pci_fixup_irqs() around after init Thierry Reding
2012-06-11 15:05 ` [PATCH v2 02/10] ARM: pci: Keep pci_common_init() " Thierry Reding
2012-06-11 15:05 ` [PATCH v2 03/10] ARM: pci: Allow passing per-controller private data Thierry Reding
2012-06-11 15:05 ` [PATCH v2 04/10] ARM: tegra: Move tegra_pcie_xclk_clamp() to PMC Thierry Reding
2012-06-11 15:05 ` [PATCH v2 05/10] ARM: tegra: Rewrite PCIe support as a driver Thierry Reding
2012-06-11 21:09   ` Stephen Warren
2012-06-12  6:41     ` Thierry Reding
2012-06-12  7:24       ` Thierry Reding
2012-06-12 16:00         ` Stephen Warren
2012-06-13  8:12           ` Thierry Reding
2012-06-11 21:22   ` Stephen Warren
2012-06-12  4:59     ` Thierry Reding
2012-06-11 15:05 ` [PATCH v2 06/10] ARM: tegra: pcie: Add MSI support Thierry Reding
2012-06-11 21:19   ` Stephen Warren
2012-06-12  5:07     ` Thierry Reding
2012-06-12  5:33       ` Stephen Warren
2012-06-12  5:41         ` Thierry Reding
2012-06-12  6:10       ` Thierry Reding
2012-06-12 15:40         ` Stephen Warren
2012-06-12 17:23           ` Thierry Reding
2012-06-11 15:05 ` [PATCH v2 07/10] ARM: tegra: pcie: Add device tree support Thierry Reding
2012-06-11 21:33   ` Stephen Warren
2012-06-12  6:21     ` Thierry Reding
2012-06-12 15:44       ` Stephen Warren
2012-06-12 17:20         ` Thierry Reding
     [not found]           ` <4FD7943E.60302@firmworks.com>
2012-06-12 19:46             ` Stephen Warren
2012-06-12 19:52               ` Mitch Bradley
2012-06-13  5:54                 ` Thierry Reding
2012-06-13  7:04                   ` Mitch Bradley
2012-06-12 20:15           ` Stephen Warren
2012-06-12 21:11             ` Mitch Bradley
2012-06-13  6:45               ` Thierry Reding
2012-06-13  7:28                 ` Mitch Bradley
2012-06-13  7:52                   ` Thierry Reding
2012-06-13  8:05                     ` Mitch Bradley
2012-06-13  8:19                       ` Thierry Reding
2012-06-13  8:36                         ` Mitch Bradley
2012-06-13  8:42                           ` Thierry Reding
2012-06-14  9:19                           ` Thierry Reding
2012-06-14 18:30                             ` Stephen Warren
2012-06-14 19:29                               ` Thierry Reding
2012-06-14 19:50                                 ` Stephen Warren
2012-06-15  6:12                                   ` Thierry Reding [this message]
2012-06-19 13:30                                     ` Thierry Reding
2012-06-19 16:40                                       ` Stephen Warren
2012-06-19 21:31                                       ` Mitch Bradley
2012-06-20 16:32                                         ` Stephen Warren
2012-06-20 17:41                                           ` Mitch Bradley
2012-06-20 17:47                                             ` Stephen Warren
2012-06-20 19:57                                         ` Arnd Bergmann
2012-06-20 20:19                                           ` Mitch Bradley
2012-06-21  6:47                                         ` Thierry Reding
2012-06-22 10:18                                           ` Bjorn Helgaas
2012-06-22 11:00                                             ` Thierry Reding
2012-06-22 11:46                                               ` Bjorn Helgaas
2012-06-22 12:43                                                 ` Thierry Reding
2012-06-22 13:03                                                   ` Arnd Bergmann
2012-06-22 16:49                                                     ` Bjorn Helgaas
2012-06-22 16:53                                                       ` Arnd Bergmann
2012-06-22 17:13                                                         ` Bjorn Helgaas
2012-06-22 21:08                                                           ` Arnd Bergmann
2012-06-22 17:14                                                         ` Arnd Bergmann
2012-06-22 17:00                                               ` Stephen Warren
2012-06-22 17:28                                                 ` Stephen Warren
2012-06-23 21:35                                                   ` Bjorn Helgaas
2012-06-25  6:34                                                   ` Thierry Reding
2012-06-26 17:22                                                     ` Stephen Warren
2012-06-27  6:19                                                       ` Thierry Reding
2012-06-22 16:20                                           ` Stephen Warren
2012-06-22 17:09                                           ` Mitch Bradley
2012-06-22 11:04                                         ` Thierry Reding
2012-06-22 13:22                                           ` Thierry Reding
2012-06-22 13:48                                             ` Arnd Bergmann
2012-06-22 14:02                                               ` Thierry Reding
2012-06-22 16:40                                                 ` Arnd Bergmann
2012-06-13 20:21                     ` Arnd Bergmann
2012-06-14  8:37                       ` Thierry Reding
2012-06-14 10:25                         ` Arnd Bergmann
2012-06-14 10:31                           ` Thierry Reding
2012-06-14 11:06                             ` Arnd Bergmann
2012-06-14 11:58                               ` Thierry Reding
2012-06-13  6:34             ` Thierry Reding
2012-06-13 16:20               ` Stephen Warren
2012-06-13 17:03               ` Stephen Warren
2012-06-11 15:05 ` [PATCH v2 08/10] ARM: tegra: harmony: Initialize regulators from DT Thierry Reding
2012-06-11 21:36   ` Stephen Warren
2012-06-12  6:13     ` Thierry Reding
2012-06-21 20:17   ` Stephen Warren
2012-06-22  6:06     ` Thierry Reding
2012-06-11 15:05 ` [PATCH v2 09/10] ARM: tegra: harmony: Initialize PCIe " Thierry Reding
2012-06-11 21:41   ` Stephen Warren
2012-06-12  5:48     ` Thierry Reding
2012-06-12 15:38       ` Stephen Warren
2012-06-11 15:05 ` [PATCH v2 10/10] ARM: tegra: trimslice: " Thierry Reding

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=20120615061236.GA4081@avionic-0098.mockup.avionic-design.de \
    --to=thierry.reding@avionic-design.de \
    --cc=arnd@arndb.de \
    --cc=ccross@android.com \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=jbarnes@virtuousgeek.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=rob.herring@calxeda.com \
    --cc=swarren@wwwdotorg.org \
    --cc=wmb@firmworks.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).