* [PATCH v2] PCI: Add D3 support for PCI bridges in DT based platforms
@ 2024-02-14 8:48 Manivannan Sadhasivam
2024-02-14 10:28 ` Lukas Wunner
0 siblings, 1 reply; 3+ messages in thread
From: Manivannan Sadhasivam @ 2024-02-14 8:48 UTC (permalink / raw)
To: Bjorn Helgaas, Bjorn Andersson, Konrad Dybcio, Lorenzo Pieralisi,
Krzysztof Wilczyński, Rob Herring
Cc: Lukas Wunner, Mika Westerberg, quic_krichai, linux-pci,
linux-kernel, linux-arm-msm, Manivannan Sadhasivam
Currently, PCI core will enable D3 support for PCI bridges only when the
following conditions are met:
1. Platform is ACPI based
2. Thunderbolt controller is used
3. pcie_port_pm=force passed in cmdline
While options 1 and 2 do not apply to most of the DT based platforms,
option 3 will make the life harder for distro maintainers. Due to this,
runtime PM is also not getting enabled for the bridges.
To fix this, let's make use of the "supports-d3" property [1] in the bridge
DT nodes to enable D3 support for the capable bridges. This will also allow
the capable bridges to support runtime PM, thereby conserving power.
Ideally, D3 support should be enabled by default for the more recent PCI
bridges, but we do not have a sane way to detect them.
[1] https://github.com/devicetree-org/dt-schema/blob/main/dtschema/schemas/pci/pci-pci-bridge.yaml#L31
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
This patch is tested on Qcom SM8450 based development board with an out-of-tree
DT patch.
NOTE: I will submit the DT patches adding this property for applicable bridges
in Qcom SoCs separately.
Changes in v2:
- Switched to DT based approach as suggested by Lukas.
- Link to v1: https://lore.kernel.org/r/20240202-pcie-qcom-bridge-v1-0-46d7789836c0@linaro.org
---
drivers/pci/of.c | 12 ++++++++++++
drivers/pci/pci.c | 3 +++
drivers/pci/pci.h | 6 ++++++
3 files changed, 21 insertions(+)
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 51e3dd0ea5ab..77dc14a3c91d 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -786,3 +786,15 @@ u32 of_pci_get_slot_power_limit(struct device_node *node,
return slot_power_limit_mw;
}
EXPORT_SYMBOL_GPL(of_pci_get_slot_power_limit);
+
+/**
+ * of_pci_bridge_d3 - Check if the bridge is supporting D3 states or not
+ *
+ * @node: device tree node of the bridge
+ *
+ * Return: True if the bridge is supporting D3 states, False otherwise.
+ */
+bool of_pci_bridge_d3(struct device_node *node)
+{
+ return of_property_read_bool(node, "supports-d3");
+}
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index d8f11a078924..3309c45b656c 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1142,6 +1142,9 @@ static inline bool platform_pci_bridge_d3(struct pci_dev *dev)
if (pci_use_mid_pm())
return false;
+ if (dev->dev.of_node)
+ return of_pci_bridge_d3(dev->dev.of_node);
+
return acpi_pci_bridge_d3(dev);
}
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 2336a8d1edab..10387461b1fe 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -635,6 +635,7 @@ int of_pci_get_max_link_speed(struct device_node *node);
u32 of_pci_get_slot_power_limit(struct device_node *node,
u8 *slot_power_limit_value,
u8 *slot_power_limit_scale);
+bool of_pci_bridge_d3(struct device_node *node);
int pci_set_of_node(struct pci_dev *dev);
void pci_release_of_node(struct pci_dev *dev);
void pci_set_bus_of_node(struct pci_bus *bus);
@@ -673,6 +674,11 @@ of_pci_get_slot_power_limit(struct device_node *node,
return 0;
}
+static inline bool of_pci_bridge_d3(struct device_node *node)
+{
+ return false;
+}
+
static inline int pci_set_of_node(struct pci_dev *dev) { return 0; }
static inline void pci_release_of_node(struct pci_dev *dev) { }
static inline void pci_set_bus_of_node(struct pci_bus *bus) { }
---
base-commit: 6613476e225e090cc9aad49be7fa504e290dd33d
change-id: 20240131-pcie-qcom-bridge-b6802a9770a3
Best regards,
--
Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH v2] PCI: Add D3 support for PCI bridges in DT based platforms
2024-02-14 8:48 [PATCH v2] PCI: Add D3 support for PCI bridges in DT based platforms Manivannan Sadhasivam
@ 2024-02-14 10:28 ` Lukas Wunner
2024-02-14 11:34 ` Manivannan Sadhasivam
0 siblings, 1 reply; 3+ messages in thread
From: Lukas Wunner @ 2024-02-14 10:28 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: Bjorn Helgaas, Bjorn Andersson, Konrad Dybcio, Lorenzo Pieralisi,
Krzysztof Wilczy??ski, Rob Herring, Mika Westerberg, quic_krichai,
linux-pci, linux-kernel, linux-arm-msm
On Wed, Feb 14, 2024 at 02:18:31PM +0530, Manivannan Sadhasivam wrote:
> +/**
> + * of_pci_bridge_d3 - Check if the bridge is supporting D3 states or not
> + *
> + * @node: device tree node of the bridge
> + *
> + * Return: True if the bridge is supporting D3 states, False otherwise.
A lot of kernel-doc uses %true and %false.
> +bool of_pci_bridge_d3(struct device_node *node)
> +{
> + return of_property_read_bool(node, "supports-d3");
> +}
What's the difference between of_property_read_bool() and
of_property_present()? When should one use which?
The former has 691 occurrences in the tree, the latter 120.
The latter would seem more "literary" / readable here,
but maybe that's just me.
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -1142,6 +1142,9 @@ static inline bool platform_pci_bridge_d3(struct pci_dev *dev)
> if (pci_use_mid_pm())
> return false;
>
> + if (dev->dev.of_node)
> + return of_pci_bridge_d3(dev->dev.of_node);
> +
> return acpi_pci_bridge_d3(dev);
> }
This will result in an unnecessary test on non-DT platforms (e.g. ACPI)
whether dev->dev.of_node is set.
Please use dev_of_node() instead of "dev->dev.of_node" so that the
code added here can be optimized away by the compiler on non-DT
platforms (due to the IS_ENABLED(CONFIG_OF)).
Thanks,
Lukas
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH v2] PCI: Add D3 support for PCI bridges in DT based platforms
2024-02-14 10:28 ` Lukas Wunner
@ 2024-02-14 11:34 ` Manivannan Sadhasivam
0 siblings, 0 replies; 3+ messages in thread
From: Manivannan Sadhasivam @ 2024-02-14 11:34 UTC (permalink / raw)
To: Lukas Wunner
Cc: Bjorn Helgaas, Bjorn Andersson, Konrad Dybcio, Lorenzo Pieralisi,
Krzysztof Wilczy??ski, Rob Herring, Mika Westerberg, quic_krichai,
linux-pci, linux-kernel, linux-arm-msm
On Wed, Feb 14, 2024 at 11:28:37AM +0100, Lukas Wunner wrote:
> On Wed, Feb 14, 2024 at 02:18:31PM +0530, Manivannan Sadhasivam wrote:
> > +/**
> > + * of_pci_bridge_d3 - Check if the bridge is supporting D3 states or not
> > + *
> > + * @node: device tree node of the bridge
> > + *
> > + * Return: True if the bridge is supporting D3 states, False otherwise.
>
> A lot of kernel-doc uses %true and %false.
>
Ack.
>
> > +bool of_pci_bridge_d3(struct device_node *node)
> > +{
> > + return of_property_read_bool(node, "supports-d3");
> > +}
>
> What's the difference between of_property_read_bool() and
> of_property_present()? When should one use which?
> The former has 691 occurrences in the tree, the latter 120.
> The latter would seem more "literary" / readable here,
> but maybe that's just me.
>
of_property_present() just calls of_property_read_bool() and it is fairly new.
But yeah, the API name itself indicates that it is better suited for the
purpose. Will change it.
>
> > --- a/drivers/pci/pci.c
> > +++ b/drivers/pci/pci.c
> > @@ -1142,6 +1142,9 @@ static inline bool platform_pci_bridge_d3(struct pci_dev *dev)
> > if (pci_use_mid_pm())
> > return false;
> >
> > + if (dev->dev.of_node)
> > + return of_pci_bridge_d3(dev->dev.of_node);
> > +
> > return acpi_pci_bridge_d3(dev);
> > }
>
> This will result in an unnecessary test on non-DT platforms (e.g. ACPI)
> whether dev->dev.of_node is set.
>
> Please use dev_of_node() instead of "dev->dev.of_node" so that the
> code added here can be optimized away by the compiler on non-DT
> platforms (due to the IS_ENABLED(CONFIG_OF)).
>
Sounds good.
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-02-14 11:34 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-14 8:48 [PATCH v2] PCI: Add D3 support for PCI bridges in DT based platforms Manivannan Sadhasivam
2024-02-14 10:28 ` Lukas Wunner
2024-02-14 11:34 ` Manivannan Sadhasivam
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).