From: Thierry Reding <thierry.reding@gmail.com>
To: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Cc: bhelgaas@google.com, lorenzo.pieralisi@arm.com, cyndis@kapsi.fi,
jonathanh@nvidia.com, robh+dt@kernel.org, frowand.list@gmail.com,
rjw@rjwysocki.net, tglx@linutronix.de, vidyas@nvidia.com,
kthota@nvidia.com, linux-tegra@vger.kernel.org,
devicetree@vger.kernel.org, linux-pci@vger.kernel.org,
linux-pm@vger.kernel.org
Subject: Re: [PATCH V6 7/7] PCI: tegra: Add power management support
Date: Thu, 25 Jan 2018 15:48:14 +0100 [thread overview]
Message-ID: <20180125144814.GI27888@ulmo> (raw)
In-Reply-To: <1515650888-9459-8-git-send-email-mmaddireddy@nvidia.com>
[-- Attachment #1: Type: text/plain, Size: 4186 bytes --]
On Thu, Jan 11, 2018 at 11:38:08AM +0530, Manikanta Maddireddy wrote:
> Tegra186 powergate driver is implemented as power domain driver, power
> partition ungate/gate are registered as power_on/power_off callback
> functions. There are no direct functions to power gate/ungate host
> controller in Tegra186. Host controller driver should add "power-domains"
> property in device tree and implement runtime suspend and resume
> callback functons. Power gate and ungate is taken care by power domain
> driver when host controller driver calls pm_runtime_put_sync and
> pm_runtime_get_sync respectively.
>
> Register suspend_noirq & resume_noirq callback functions to allow PCIe to
> come up after resume from RAM. Both runtime and noirq pm ops share same
> callback functions.
>
> Signed-off-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
> ---
> V2:
> * no change in this patch
> V3:
> * no change in this patch
> V4:
> * no change in this patch
> V5:
> * Decoupled from https://patchwork.ozlabs.org/patch/832053/ and
> rebased on linux-next
> V6:
> * no change in this patch
>
> drivers/pci/host/pci-tegra.c | 181 ++++++++++++++++++++++++++-----------------
> 1 file changed, 110 insertions(+), 71 deletions(-)
>
> diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
[...]
> @@ -1536,37 +1526,41 @@ static int tegra_pcie_enable_msi(struct tegra_pcie *pcie)
> int err;
> u32 reg;
>
> - mutex_init(&msi->lock);
> + if (!msi->phys) {
> + mutex_init(&msi->lock);
>
> - msi->chip.dev = dev;
> - msi->chip.setup_irq = tegra_msi_setup_irq;
> - msi->chip.teardown_irq = tegra_msi_teardown_irq;
> + msi->chip.dev = dev;
> + msi->chip.setup_irq = tegra_msi_setup_irq;
> + msi->chip.teardown_irq = tegra_msi_teardown_irq;
>
> - msi->domain = irq_domain_add_linear(dev->of_node, INT_PCI_MSI_NR,
> - &msi_domain_ops, &msi->chip);
> - if (!msi->domain) {
> - dev_err(dev, "failed to create IRQ domain\n");
> - return -ENOMEM;
> - }
> + msi->domain = irq_domain_add_linear(dev->of_node,
> + INT_PCI_MSI_NR,
> + &msi_domain_ops,
> + &msi->chip);
> + if (!msi->domain) {
> + dev_err(dev, "failed to create IRQ domain\n");
> + return -ENOMEM;
> + }
>
> - err = platform_get_irq_byname(pdev, "msi");
> - if (err < 0) {
> - dev_err(dev, "failed to get IRQ: %d\n", err);
> - goto err;
> - }
> + err = platform_get_irq_byname(pdev, "msi");
> + if (err < 0) {
> + dev_err(dev, "failed to get IRQ: %d\n", err);
> + goto err;
> + }
>
> - msi->irq = err;
> + msi->irq = err;
>
> - err = request_irq(msi->irq, tegra_pcie_msi_irq, IRQF_NO_THREAD,
> - tegra_msi_irq_chip.name, pcie);
> - if (err < 0) {
> - dev_err(dev, "failed to request IRQ: %d\n", err);
> - goto err;
> - }
> + err = request_irq(msi->irq, tegra_pcie_msi_irq, IRQF_NO_THREAD,
> + tegra_msi_irq_chip.name, pcie);
> + if (err < 0) {
> + dev_err(dev, "failed to request IRQ: %d\n", err);
> + goto err;
> + }
>
> - /* setup AFI/FPCI range */
> - msi->pages = __get_free_pages(GFP_KERNEL, 0);
> - msi->phys = virt_to_phys((void *)msi->pages);
> + /* setup AFI/FPCI range */
> + msi->pages = __get_free_pages(GFP_KERNEL, 0);
> + msi->phys = virt_to_phys((void *)msi->pages);
> + }
I think it'd be better to split this off into a separate function so
that we can get rid of the confusing if (!msi->phys) conditional. It
looks as though this would work, but it's confusing to have that code
in a resume handler.
It also becomes very asymmetric when you set up the MSIs in the resume
handler, but then don't call tegra_pcie_msi_disable() from the suspend
handler.
I'd suggest just pulling out all of the allocations and such into a
separate function, perhaps tegra_pcie_msi_setup(), and similarily split
off the resource part of tegra_pcie_disable_msi() into a separate
function, perhaps tegra_pcie_msi_teardown().
That way, suspend/resume will do only what they need (write registers)
and everything will look more symmetric again. That in turn makes the
code a lot easier to follow and maintain.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2018-01-25 14:48 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-11 6:08 [PATCH V6 0/7] Add loadable kernel module and power management support Manikanta Maddireddy
2018-01-11 6:08 ` [PATCH V6 2/7] PCI: tegra: Use bus->sysdata to store and get host private data Manikanta Maddireddy
[not found] ` <1515650888-9459-1-git-send-email-mmaddireddy-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2018-01-11 6:08 ` [PATCH V6 1/7] of: Export of_pci_range_to_resource() Manikanta Maddireddy
2018-01-11 6:08 ` [PATCH V6 3/7] PCI: tegra: Remove PCI_REASSIGN_ALL_BUS flag for Tegra PCIe Manikanta Maddireddy
2018-01-11 6:08 ` [PATCH V6 4/7] PCI: tegra: Free resources on probe failure Manikanta Maddireddy
[not found] ` <1515650888-9459-5-git-send-email-mmaddireddy-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2018-01-25 14:25 ` Thierry Reding
2018-01-11 6:08 ` [PATCH V6 5/7] PCI: tegra: Add loadable kernel module support Manikanta Maddireddy
[not found] ` <1515650888-9459-6-git-send-email-mmaddireddy-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2018-01-25 14:27 ` Thierry Reding
2018-01-11 6:08 ` [PATCH V6 6/7] PCI: tegra: Broadcast PME_Turn_Off message before link goes to L2 Manikanta Maddireddy
2018-01-25 14:36 ` Thierry Reding
2018-01-29 4:41 ` Manikanta Maddireddy
2018-01-29 15:18 ` Thierry Reding
2018-01-11 6:08 ` [PATCH V6 7/7] PCI: tegra: Add power management support Manikanta Maddireddy
2018-01-25 14:48 ` Thierry Reding [this message]
2018-01-29 4:46 ` Manikanta Maddireddy
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=20180125144814.GI27888@ulmo \
--to=thierry.reding@gmail.com \
--cc=bhelgaas@google.com \
--cc=cyndis@kapsi.fi \
--cc=devicetree@vger.kernel.org \
--cc=frowand.list@gmail.com \
--cc=jonathanh@nvidia.com \
--cc=kthota@nvidia.com \
--cc=linux-pci@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=mmaddireddy@nvidia.com \
--cc=rjw@rjwysocki.net \
--cc=robh+dt@kernel.org \
--cc=tglx@linutronix.de \
--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).