diff mbox series

thunderbolt: handle runtime pm for tunnelled pci root port

Message ID 1646658319-59532-1-git-send-email-Sanju.Mehta@amd.com (mailing list archive)
State New, archived
Headers show
Series thunderbolt: handle runtime pm for tunnelled pci root port | expand

Commit Message

Mehta, Sanju March 7, 2022, 1:05 p.m. UTC
From: Sanjay R Mehta <sanju.mehta@amd.com>

Carry out runtime-resume of PCI tunnelled root port to handle
hotplug interrupts synchronously.

Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
---
 drivers/thunderbolt/acpi.c |  3 +++
 drivers/thunderbolt/tb.c   | 11 +++++++++++
 2 files changed, 14 insertions(+)

Comments

Mika Westerberg March 7, 2022, 1:35 p.m. UTC | #1
Hi Sanjay,

On Mon, Mar 07, 2022 at 07:05:19AM -0600, Sanjay R Mehta wrote:
> From: Sanjay R Mehta <sanju.mehta@amd.com>
> 
> Carry out runtime-resume of PCI tunnelled root port to handle
> hotplug interrupts synchronously.

What problem does this solve?

Typically the root ports should be able to wake from D3 when the PCIe
tunnel gets established. Is it not the case here?
Sanjay R Mehta March 7, 2022, 2:30 p.m. UTC | #2
On 3/7/2022 7:05 PM, Mika Westerberg wrote:
> Hi Sanjay,
> 
> On Mon, Mar 07, 2022 at 07:05:19AM -0600, Sanjay R Mehta wrote:
>> From: Sanjay R Mehta <sanju.mehta@amd.com>
>>
>> Carry out runtime-resume of PCI tunnelled root port to handle
>> hotplug interrupts synchronously.
> 
> What problem does this solve?
> 
> Typically the root ports should be able to wake from D3 when the PCIe
> tunnel gets established. Is it not the case here?

Yes Mika, its not waking from D3 in this case on our hardware.

Hence I have kept a check to execute this code only if root port still
in D3 after PCIe tunnel is setup.

Do you think should this patch go as a quirk?
Mika Westerberg March 7, 2022, 2:46 p.m. UTC | #3
Hi,

On Mon, Mar 07, 2022 at 08:00:46PM +0530, Sanjay R Mehta wrote:
> 
> 
> On 3/7/2022 7:05 PM, Mika Westerberg wrote:
> > Hi Sanjay,
> > 
> > On Mon, Mar 07, 2022 at 07:05:19AM -0600, Sanjay R Mehta wrote:
> >> From: Sanjay R Mehta <sanju.mehta@amd.com>
> >>
> >> Carry out runtime-resume of PCI tunnelled root port to handle
> >> hotplug interrupts synchronously.
> > 
> > What problem does this solve?
> > 
> > Typically the root ports should be able to wake from D3 when the PCIe
> > tunnel gets established. Is it not the case here?
> 
> Yes Mika, its not waking from D3 in this case on our hardware.
> 
> Hence I have kept a check to execute this code only if root port still
> in D3 after PCIe tunnel is setup.

OK, I see.

> Do you think should this patch go as a quirk?

I think in that case we should prevent the port from entering D3.  Does
it have the ACPI "HotPlugSupportInD3" property:

  https://docs.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports#identifying-pcie-root-ports-supporting-hot-plug-in-d3

If yes, then simply removing that should work.
diff mbox series

Patch

diff --git a/drivers/thunderbolt/acpi.c b/drivers/thunderbolt/acpi.c
index 79b5abf..10dd61b 100644
--- a/drivers/thunderbolt/acpi.c
+++ b/drivers/thunderbolt/acpi.c
@@ -96,6 +96,9 @@  static acpi_status tb_acpi_add_link(acpi_handle handle, u32 level, void *data,
 				 dev_name(&pdev->dev));
 		}
 
+		pm_runtime_set_autosuspend_delay(&pdev->dev, TB_AUTOSUSPEND_DELAY);
+		pm_runtime_use_autosuspend(&pdev->dev);
+		pm_runtime_mark_last_busy(&pdev->dev);
 		pm_runtime_put(&pdev->dev);
 	}
 
diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c
index cbd0ad8..2a53fa6 100644
--- a/drivers/thunderbolt/tb.c
+++ b/drivers/thunderbolt/tb.c
@@ -1066,6 +1066,7 @@  static int tb_tunnel_pci(struct tb *tb, struct tb_switch *sw)
 	struct tb_cm *tcm = tb_priv(tb);
 	struct tb_switch *parent_sw;
 	struct tb_tunnel *tunnel;
+	struct device_link *link;
 
 	up = tb_switch_find_port(sw, TB_TYPE_PCIE_UP);
 	if (!up)
@@ -1099,6 +1100,16 @@  static int tb_tunnel_pci(struct tb *tb, struct tb_switch *sw)
 	if (tb_switch_pcie_l1_enable(sw))
 		tb_sw_warn(sw, "failed to enable PCIe L1 for Titan Ridge\n");
 
+	list_for_each_entry(link, &tb->nhi->pdev->dev.links.consumers, s_node) {
+		if (pci_pcie_type(to_pci_dev(link->consumer)) == PCI_EXP_TYPE_ROOT_PORT) {
+			if (pm_runtime_status_suspended(link->consumer)) {
+				pm_runtime_get_sync(link->consumer);
+				pm_runtime_mark_last_busy(link->consumer);
+				pm_runtime_put_sync_autosuspend(link->consumer);
+			}
+		}
+	}
+
 	list_add_tail(&tunnel->list, &tcm->tunnel_list);
 	return 0;
 }