From: Vidya Sagar <vidyas@nvidia.com>
To: Liviu Dudau <liviu.dudau@arm.com>
Cc: Bjorn Helgaas <helgaas@kernel.org>, <robh+dt@kernel.org>,
<mark.rutland@arm.com>, <thierry.reding@gmail.com>,
<jonathanh@nvidia.com>, <kishon@ti.com>,
<catalin.marinas@arm.com>, <will.deacon@arm.com>,
<lorenzo.pieralisi@arm.com>, <jingoohan1@gmail.com>,
<gustavo.pimentel@synopsys.com>, <mperttunen@nvidia.com>,
<tiwai@suse.de>, <spujar@nvidia.com>, <skomatineni@nvidia.com>,
<krzk@kernel.org>, <heiko@sntech.de>,
<horms+renesas@verge.net.au>, <olof@lixom.net>,
<maxime.ripard@bootlin.com>, <andy.gross@linaro.org>,
<bjorn.andersson@linaro.org>, <jagan@amarulasolutions.com>,
<enric.balletbo@collabora.com>, <ezequiel@collabora.com>,
<stefan.wahren@i2se.com>, <marc.w.gonzalez@free.fr>,
<l.stach@pengutronix.de>, <tpiepho@impinj.com>,
<hayashi.kunihiko@socionext.com>, <yue.wang@amlogic.com>,
<shawn.lin@rock-chips.com>, <xiaowei.bao@nxp.com>,
<devicetree@vger.kernel.org>, <mmaddireddy@nvidia.com>,
<kthota@nvidia.com>, <linux-pci@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-tegra@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH 09/10] PCI: tegra: Add Tegra194 PCIe support
Date: Wed, 10 Apr 2019 15:23:39 +0530 [thread overview]
Message-ID: <31385c64-86b9-ebe3-99e3-6d156b66fb6a@nvidia.com> (raw)
In-Reply-To: <20190410081448.GC15144@e110455-lin.cambridge.arm.com>
On 4/10/2019 1:44 PM, Liviu Dudau wrote:
> On Wed, Apr 10, 2019 at 11:40:40AM +0530, Vidya Sagar wrote:
>> On 4/9/2019 6:56 PM, Bjorn Helgaas wrote:
>>> On Tue, Apr 09, 2019 at 05:00:53PM +0530, Vidya Sagar wrote:
>>>> On 4/6/2019 12:28 AM, Bjorn Helgaas wrote:
>>>>> On Fri, Apr 05, 2019 at 01:23:51AM +0530, Vidya Sagar wrote:
>>>>>> On 4/3/2019 11:06 PM, Bjorn Helgaas wrote:
>>>>>>> On Wed, Apr 03, 2019 at 03:13:09PM +0530, Vidya Sagar wrote:
>>>>>>>> On 4/3/2019 12:01 AM, Bjorn Helgaas wrote:
>>>>>>>>> On Tue, Apr 02, 2019 at 12:47:48PM +0530, Vidya Sagar wrote:
>>>>>>>>>> On 3/30/2019 2:22 AM, Bjorn Helgaas wrote:
>>>>>>>>>>> On Tue, Mar 26, 2019 at 08:43:26PM +0530, Vidya Sagar wrote:
>>>>>>>>>>>> Add support for Synopsys DesignWare core IP based PCIe host controller
>>>>>>>>>>>> present in Tegra194 SoC.
>>>>>>>>>
>>>>>>>>> - Why does this chip require pcie_pme_disable_msi()? The only other
>>>>>>>>> use is a DMI quirk for "MSI Wind U-100", added by c39fae1416d5
>>>>>>>>> ("PCI PM: Make it possible to force using INTx for PCIe PME
>>>>>>>>> signaling").
>>>>>>>>
>>>>>>>> Because Tegra194 doesn't support raising PME interrupts through MSI line.
>>>
>>>>> There's something wrong here. Either the question of how PME is
>>>>> signaled is generic and the spec provides a way for the OS to discover
>>>>> that method, or it's part of the device-specific architecture that
>>>>> each host bridge driver has to know about its device. If the former,
>>>>> we need to make the PCI core smart enough to figure it out. If the
>>>>> latter, we need a better interface than this ad hoc
>>>>> pcie_pme_disable_msi() thing. But if it is truly the latter, your
>>>>> current code is sufficient and we can refine it over time.
>>>>
>>>> In case of Tegra194, it is the latter case.
>>>
>>> This isn't a Tegra194 question; it's a question of whether this
>>> behavior is covered by the PCIe spec.
>> AFAIU the spec and what I heard from Nvidia hardware folks is that spec doesn't
>> explicitly talk about this and it was a design choice made by Nvidia hardware
>> folks to route these interrupts through legacy line instead of MSI line.
>>
>>>
>>>>> What I suspect should happen eventually is the DWC driver should call
>>>>> devm_pci_alloc_host_bridge() directly, as all the non-DWC drivers do.
>>>>> That would require a little reorganization of the DWC data structures,
>>>>> but it would be good to be more consistent.
>>>>>
>>>>> For now, I think stashing the pointer in pcie_port or dw_pcie would be
>>>>> OK. I'm not 100% clear on the difference, but it looks like either
>>>>> should be common across all the DWC drivers, which is what we want.
>>>>
>>>> Since dw_pcie is common for both root port and end point mode structures,
>>>> I think it makes sense to keep the pointer in pcie_port as this structure
>>>> is specific to root port mode of operation.
>>>> I'll make a note to reorganize code to have devm_pci_alloc_host_bridge()
>>>> used in the beginning itself to be inline with non-DWC implementations.
>>>> But, I'll take it up later (after I'm done with upstreaming current series)
>>>
>>> Fair enough.
>>>
>>>>>> .remove() internally calls pm_runtime_put_sync() API which calls
>>>>>> .runtime_suspend(). I made a new patch to add a host_deinit() call
>>>>>> which make all these calls. Since host_init() is called from inside
>>>>>> .runtime_resume() of this driver, to be in sync, I'm now calling
>>>>>> host_deinit() from inside .runtime_suspend() API.
>>>>>
>>>>> I think this is wrong. pci_stop_root_bus() will detach all the
>>>>> drivers from all the devices. We don't want to do that if we're
>>>>> merely runtime suspending the host bridge, do we?
>>>>
>>>> In the current driver, the scenarios in which .runtime_suspend() is called
>>>> are
>>>> a) during .remove() call and
>>>
>>> It makes sense that you should call pci_stop_root_bus() during
>>> .remove(), i.e., when the host controller driver is being removed,
>>> because the PCI bus will no longer be accessible. I think you should
>>> call it *directly* from tegra_pcie_dw_remove() because that will match
>>> what other drivers do.
>>>
>>>> b) when there is no endpoint found and controller would be shutdown
>>>> In both cases, it is required to stop the root bus and remove all devices,
>>>> so, instead of having same call present in respective paths, I kept them
>>>> in .runtime_suspend() itself to avoid code duplication.
>>>
>>> I don't understand this part. We should be able to runtime suspend
>>> the host controller without detaching drivers for child devices.
>>>
>>> If you shutdown the controller completely and detach the *host
>>> controller driver*, sure, it makes sense to detach drivers from child
>>> devices. But that would be handled by the host controller .remove()
>>> method, not by the runtime suspend method.
>> I think it is time I give some background about why I chose to implement
>> .runtime_suspend() and .runtime_resume() APIs in the first place. We wanted to
>> powerdown PCIe controller if there is no link up (i.e. slot is open and no endpoint
>> devices are connected). We want to achieve this without returning a failure in
>> .probe() call. Given PCIe IP power partitioning is handled by generic power domain
>> framework, power partition gets unpowergated before .probe() gets called and gets
>> powergated either when a failure is returned in .probe() or when pm_runtime_put_sync()
>> is called. So, I chose to call pm_runtime_put_sync() in no-link-up scenario and chose
>> to implement .runtime_suspend() to handle all the cleanup work before PCIe partition
>> getting powergated. In fact, to match this, I'm doing all the PCIe IP bring up
>> activity in .runtime_resume() implementation which gets invoked by pm_runtime_get_sync()
>> which in turn is called in .probe() path. In fact the very dw_pcie_host_init() itself
>> is called from .runtime_resume() implementation. So, it is because of these reasons that
>> I called pci_stop_root_bus() and pci_remove_root_bus() as part of .runtime_suspend()
>> implementation as pm_runtime_put_sync() is called from both .remove() and also during
>> no-link-up scenario. Please do let me know if there is a better way to do this.
>
> I think you're missing the case where .runtime_suspend() is called when
> there are no *active* devices on the bus, i.e. everyone is dormant. It
> doesn't mean that you need to remove them from the bus and re-probe them
> back on .runtime_resume(). Most of the drivers for PCI devices don't
> expect to be removed during idle, as they will configure the hardware to
> be in a "quick wake" state (see PCIe Dx power states).
>
> You should probe and configure the bus during .probe() and remove and
> detach all drivers during .remove(). For .runtime_suspend() all you need
> to do is put the host controller in low power mode if it has one, or
> stop all clocks that are not required for responding to devices waking
> up from PCIe Dx state. For .runtime_resume() you then restore the
> clocks, without re-scanning the bus.
Since this is a host controller driver and the device as such is sitting on platform
bus instead of PCIe bus, is it still the case that .runtime_suspend() and
.runtime_resume() of this driver get called when devices on PCIe bus are idle?
Having asked that, I start to feel what I'm doing as part of .runtime_suspend() and
.runtime_resume() doesn't really justify these API names. Since I know where I'm
calling pm_runtime_get/put_sync() APIs (which eventually call .runtime_resume/suspend())
I should probably move the content of these APIs before calling pm_runtime_get/put_sync().
Do you agree with that?
>
> Best regards,
> Liviu
>
>
>>
>>>
>>> Bjorn
>>>
>>
>
next prev parent reply other threads:[~2019-04-10 9:53 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-26 15:13 [PATCH 00/10] " Vidya Sagar
2019-03-26 15:13 ` [PATCH 01/10] PCI: save pci_bus pointer in pcie_port structure Vidya Sagar
2019-03-26 15:13 ` [PATCH 02/10] PCI: perform dbi regs write lock towards the end Vidya Sagar
2019-03-26 15:13 ` [PATCH 03/10] PCI: dwc: Move config space capability search API Vidya Sagar
2019-03-28 12:33 ` Thierry Reding
2019-04-01 11:46 ` Vidya Sagar
2019-03-26 15:13 ` [PATCH 04/10] PCI: Add #defines for PCIe spec r4.0 features Vidya Sagar
2019-03-26 15:13 ` [PATCH 05/10] dt-bindings: PCI: tegra: Add device tree support for T194 Vidya Sagar
2019-03-27 10:10 ` Jon Hunter
2019-03-27 10:53 ` Vidya Sagar
2019-03-28 13:15 ` Thierry Reding
2019-04-01 10:01 ` Vidya Sagar
2019-04-01 15:07 ` Thierry Reding
2019-04-02 11:41 ` Vidya Sagar
2019-04-02 14:35 ` Thierry Reding
2019-04-03 6:22 ` Vidya Sagar
2019-04-02 19:21 ` Bjorn Helgaas
2019-03-31 6:42 ` Rob Herring
2019-04-01 11:18 ` Vidya Sagar
2019-04-01 14:31 ` Thierry Reding
2019-04-02 9:16 ` Vidya Sagar
2019-04-02 14:20 ` Thierry Reding
2019-04-03 5:29 ` Vidya Sagar
2019-03-26 15:13 ` [PATCH 06/10] arm64: tegra: Add P2U and PCIe controller nodes to Tegra194 DT Vidya Sagar
2019-03-28 16:59 ` Thierry Reding
2019-04-01 12:37 ` Vidya Sagar
2019-03-26 15:13 ` [PATCH 07/10] arm64: tegra: Enable PCIe slots in P2972-0000 board Vidya Sagar
2019-03-26 15:13 ` [PATCH 08/10] phy: tegra: Add PCIe PIPE2UPHY support Vidya Sagar
2019-04-03 8:05 ` Kishon Vijay Abraham I
2019-04-03 10:45 ` Vidya Sagar
2019-03-26 15:13 ` [PATCH 09/10] PCI: tegra: Add Tegra194 PCIe support Vidya Sagar
2019-03-27 10:07 ` Jon Hunter
2019-03-29 20:52 ` Bjorn Helgaas
2019-04-02 7:17 ` Vidya Sagar
2019-04-02 14:14 ` Thierry Reding
2019-04-03 9:15 ` Vidya Sagar
2019-04-02 18:31 ` Bjorn Helgaas
2019-04-03 9:43 ` Vidya Sagar
2019-04-03 17:36 ` Bjorn Helgaas
2019-04-04 19:53 ` Vidya Sagar
2019-04-05 18:58 ` Bjorn Helgaas
2019-04-09 11:30 ` Vidya Sagar
2019-04-09 13:26 ` Bjorn Helgaas
2019-04-10 6:10 ` Vidya Sagar
2019-04-10 8:14 ` Liviu Dudau
2019-04-10 9:53 ` Vidya Sagar [this message]
2019-04-10 11:35 ` Liviu Dudau
2019-03-26 15:13 ` [PATCH 10/10] arm64: Add Tegra194 PCIe driver to defconfig Vidya Sagar
2019-03-27 10:08 ` Jon Hunter
2019-03-27 10:12 ` Vidya Sagar
2019-03-27 12:26 ` Jon Hunter
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=31385c64-86b9-ebe3-99e3-6d156b66fb6a@nvidia.com \
--to=vidyas@nvidia.com \
--cc=andy.gross@linaro.org \
--cc=bjorn.andersson@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=devicetree@vger.kernel.org \
--cc=enric.balletbo@collabora.com \
--cc=ezequiel@collabora.com \
--cc=gustavo.pimentel@synopsys.com \
--cc=hayashi.kunihiko@socionext.com \
--cc=heiko@sntech.de \
--cc=helgaas@kernel.org \
--cc=horms+renesas@verge.net.au \
--cc=jagan@amarulasolutions.com \
--cc=jingoohan1@gmail.com \
--cc=jonathanh@nvidia.com \
--cc=kishon@ti.com \
--cc=krzk@kernel.org \
--cc=kthota@nvidia.com \
--cc=l.stach@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=liviu.dudau@arm.com \
--cc=lorenzo.pieralisi@arm.com \
--cc=marc.w.gonzalez@free.fr \
--cc=mark.rutland@arm.com \
--cc=maxime.ripard@bootlin.com \
--cc=mmaddireddy@nvidia.com \
--cc=mperttunen@nvidia.com \
--cc=olof@lixom.net \
--cc=robh+dt@kernel.org \
--cc=shawn.lin@rock-chips.com \
--cc=skomatineni@nvidia.com \
--cc=spujar@nvidia.com \
--cc=stefan.wahren@i2se.com \
--cc=thierry.reding@gmail.com \
--cc=tiwai@suse.de \
--cc=tpiepho@impinj.com \
--cc=will.deacon@arm.com \
--cc=xiaowei.bao@nxp.com \
--cc=yue.wang@amlogic.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
all inboxes | Powered by JetHome®