* [PATCH v13 00/11] Add STM32MP25 PCIe drivers
@ 2025-08-20 7:54 Christian Bruel
2025-08-20 7:54 ` [PATCH v13 01/11] Documentation: pinctrl: Describe PM helper functions for standard states Christian Bruel
` (11 more replies)
0 siblings, 12 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Changes in v13:
- Rebase on pci/next
- Replace access to dev->pins->init_state by new
pinctrl_pm_select_init_state().
- Document pinctrl PM state API.
- Group GPIO PERST# de-assertion with PVPERL delay. (Bjorn)
Changes in v12:
Fix warning reported by kernel test robot <lkp@intel.com>
Changes in v11:
Address comments from Manivanna:
- RC driver: Do not call pm_runtime_get_noresume in probe
More uses of dev_err_probe
- EP driver: Use level triggered PERST# irq
Changes in v10:
- Update pcie_ep bindings with dbi2 and atu regs,
thus remove Reviewed-by and Acked-by.
Changes in v9:
- Describe atu and dbi2 shadowed registers in pcie_ep node
Address RC and EP drivers comments from Manivanna:
- Use dev_error_probe() for pm_runtime_enable() calls
- Reword Kconfig help message
- Move pm_runtime_get_noresume() before devm_pm_runtime_enable()
Changes in v8:
- Whitespace in comment
Changes in v7:
- Use device_init_wakeup to enable wakeup
- Fix comments (Bjorn)
Changes in v6:
- Call device_wakeup_enable() to fix WAKE# wakeup.
Address comments from Manivanna:
- Fix/Add Comments
- Fix DT indents
- Remove dw_pcie_ep_linkup() in EP start link
- Add PCIE_T_PVPERL_MS delay in RC PERST# deassert
Changes in v5:
Address driver comments from Manivanna:
- Use dw_pcie_{suspend/resume}_noirq instead of private ones.
- Move dw_pcie_host_init() to probe
- Add stm32_remove_pcie_port cleanup function
- Use of_node_put in stm32_pcie_parse_port
- Remove wakeup-source property
- Use generic dev_pm_set_dedicated_wake_irq to support wake# irq
Changes in v4:
Address bindings comments Rob Herring
- Remove phy property form common yaml
- Remove phy-name property
- Move wake_gpio and reset_gpio to the host root port
Changes in v3:
Address comments from Manivanna, Rob and Bjorn:
- Move host wakeup helper to dwc core (Mani)
- Drop num-lanes=<1> from bindings (Rob)
- Fix PCI address of I/O region (Mani)
- Moved PHY to a RC rootport subsection (Bjorn, Mani)
- Replaced dma-limit quirk by dma-ranges property (Bjorn)
- Moved out perst assert/deassert from start/stop link (Mani)
- Drop link_up test optim (Mani)
- DT and comments rephrasing (Bjorn)
- Add dts entries now that the combophy entries has landed
- Drop delaying Configuration Requests
Changes in v2:
- Fix st,stm32-pcie-common.yaml dt_binding_check
Changes in v1:
Address comments from Rob Herring and Bjorn Helgaas:
- Drop st,limit-mrrs and st,max-payload-size from this patchset
- Remove single reset and clocks binding names and misc yaml cleanups
- Split RC/EP common bindings to a separate schema file
- Use correct PCIE_T_PERST_CLK_US and PCIE_T_RRS_READY_MS defines
- Use .remove instead of .remove_new
- Fix bar reset sequence in EP driver
- Use cleanup blocks for error handling
- Cosmetic fixes
Christian Bruel (11):
Documentation: pinctrl: Describe PM helper functions for standard
states.
pinctrl: Add pinctrl_pm_select_init_state helper function
dt-bindings: PCI: Add STM32MP25 PCIe Root Complex bindings
PCI: stm32: Add PCIe host support for STM32MP25
dt-bindings: PCI: Add STM32MP25 PCIe Endpoint bindings
PCI: stm32: Add PCIe Endpoint support for STM32MP25
MAINTAINERS: add entry for ST STM32MP25 PCIe drivers
arm64: dts: st: add PCIe pinctrl entries in stm32mp25-pinctrl.dtsi
arm64: dts: st: Add PCIe Root Complex mode on stm32mp251
arm64: dts: st: Add PCIe Endpoint mode on stm32mp251
arm64: dts: st: Enable PCIe on the stm32mp257f-ev1 board
.../bindings/pci/st,stm32-pcie-common.yaml | 33 ++
.../bindings/pci/st,stm32-pcie-ep.yaml | 73 ++++
.../bindings/pci/st,stm32-pcie-host.yaml | 112 +++++
Documentation/driver-api/pin-control.rst | 57 ++-
MAINTAINERS | 7 +
arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi | 20 +
arch/arm64/boot/dts/st/stm32mp251.dtsi | 59 +++
arch/arm64/boot/dts/st/stm32mp257f-ev1.dts | 21 +
drivers/pci/controller/dwc/Kconfig | 24 ++
drivers/pci/controller/dwc/Makefile | 2 +
drivers/pci/controller/dwc/pcie-stm32-ep.c | 384 ++++++++++++++++++
drivers/pci/controller/dwc/pcie-stm32.c | 360 ++++++++++++++++
drivers/pci/controller/dwc/pcie-stm32.h | 16 +
drivers/pinctrl/core.c | 13 +
include/linux/pinctrl/consumer.h | 10 +
15 files changed, 1189 insertions(+), 2 deletions(-)
create mode 100644 Documentation/devicetree/bindings/pci/st,stm32-pcie-common.yaml
create mode 100644 Documentation/devicetree/bindings/pci/st,stm32-pcie-ep.yaml
create mode 100644 Documentation/devicetree/bindings/pci/st,stm32-pcie-host.yaml
create mode 100644 drivers/pci/controller/dwc/pcie-stm32-ep.c
create mode 100644 drivers/pci/controller/dwc/pcie-stm32.c
create mode 100644 drivers/pci/controller/dwc/pcie-stm32.h
--
2.34.1
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v13 01/11] Documentation: pinctrl: Describe PM helper functions for standard states.
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-20 7:54 ` [PATCH v13 02/11] pinctrl: Add pinctrl_pm_select_init_state helper function Christian Bruel
` (10 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Clarify documentation for predefined standard state names 'default',
'init', 'sleep', 'idle' and their associated PM API.
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
Documentation/driver-api/pin-control.rst | 57 +++++++++++++++++++++++-
1 file changed, 55 insertions(+), 2 deletions(-)
diff --git a/Documentation/driver-api/pin-control.rst b/Documentation/driver-api/pin-control.rst
index 27ea1236307e..204cc3e162e2 100644
--- a/Documentation/driver-api/pin-control.rst
+++ b/Documentation/driver-api/pin-control.rst
@@ -1162,8 +1162,55 @@ pinmux core.
Pin control requests from drivers
=================================
-When a device driver is about to probe the device core will automatically
-attempt to issue ``pinctrl_get_select_default()`` on these devices.
+When a device driver is about to probe, the device core attaches the
+standard states if they are defined in the device tree by calling
+``pinctrl_bind_pins()`` on these devices.
+Possible standard state names are: "default", "init", "sleep" and "idle".
+
+- if ``default`` is defined in the device tree, it is selected before
+ device probe.
+
+- if ``init`` and ``default`` are defined in the device tree, the "init"
+ state is selected before the driver probe and the "default" state is
+ selected after the driver probe.
+
+- the ``sleep`` and ``idle`` states are for power management and can only
+ be selected with the PM API bellow.
+
+PM interfaces
+=================
+PM runtime suspend/resume might need to execute the same init sequence as
+during probe. Since the predefined states are already attached to the
+device, the driver can activate these states explicitly with the
+following helper functions:
+
+- ``pinctrl_pm_select_default_state()``
+- ``pinctrl_pm_select_init_state()``
+- ``pinctrl_pm_select_sleep_state()``
+- ``pinctrl_pm_select_idle_state()``
+
+For example, if resuming the device depend on certain pinmux states
+
+.. code-block:: c
+
+ foo_suspend()
+ {
+ /* suspend device */
+ ...
+
+ pinctrl_pm_select_sleep_state(dev);
+ }
+
+ foo_resume()
+ {
+ pinctrl_pm_select_init_state(dev);
+
+ /* resuming device */
+ ...
+
+ pinctrl_pm_select_default_state(dev);
+ }
+
This way driver writers do not need to add any of the boilerplate code
of the type found below. However when doing fine-grained state selection
and not using the "default" state, you may have to do some device driver
@@ -1185,6 +1232,12 @@ operation and going to sleep, moving from the ``PINCTRL_STATE_DEFAULT`` to
``PINCTRL_STATE_SLEEP`` at runtime, re-biasing or even re-muxing pins to save
current in sleep mode.
+Another case is when the pinctrl needs to switch to a certain mode during
+probe and then revert to the default state at the end of probe. For example
+a PINMUX may need to be configured as a GPIO during probe. In this case, use
+``PINCTRL_STATE_INIT`` to switch state before probe, then move to
+``PINCTRL_STATE_DEFAULT`` at the end of probe for normal operation.
+
A driver may request a certain control state to be activated, usually just the
default state like this:
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 02/11] pinctrl: Add pinctrl_pm_select_init_state helper function
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
2025-08-20 7:54 ` [PATCH v13 01/11] Documentation: pinctrl: Describe PM helper functions for standard states Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-20 7:54 ` [PATCH v13 03/11] dt-bindings: PCI: Add STM32MP25 PCIe Root Complex bindings Christian Bruel
` (9 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
If a platform requires an initial pinctrl state during probing, this
helper function provides the client with access to the same initial
state.
eg:
xxx_suspend_noirq
...
pinctrl_pm_select_sleep_state
xxx resume_noirq
pinctrl_pm_select_init_state
...
pinctrl_pm_select_default_state
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
drivers/pinctrl/core.c | 13 +++++++++++++
include/linux/pinctrl/consumer.h | 10 ++++++++++
2 files changed, 23 insertions(+)
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index 73b78d6eac67..c5dbf4e9db84 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -1655,6 +1655,19 @@ int pinctrl_pm_select_default_state(struct device *dev)
}
EXPORT_SYMBOL_GPL(pinctrl_pm_select_default_state);
+/**
+ * pinctrl_pm_select_init_state() - select init pinctrl state for PM
+ * @dev: device to select init state for
+ */
+int pinctrl_pm_select_init_state(struct device *dev)
+{
+ if (!dev->pins)
+ return 0;
+
+ return pinctrl_select_bound_state(dev, dev->pins->init_state);
+}
+EXPORT_SYMBOL_GPL(pinctrl_pm_select_init_state);
+
/**
* pinctrl_pm_select_sleep_state() - select sleep pinctrl state for PM
* @dev: device to select sleep state for
diff --git a/include/linux/pinctrl/consumer.h b/include/linux/pinctrl/consumer.h
index 73de70362b98..63ce16191eb9 100644
--- a/include/linux/pinctrl/consumer.h
+++ b/include/linux/pinctrl/consumer.h
@@ -48,6 +48,7 @@ int pinctrl_select_default_state(struct device *dev);
#ifdef CONFIG_PM
int pinctrl_pm_select_default_state(struct device *dev);
+int pinctrl_pm_select_init_state(struct device *dev);
int pinctrl_pm_select_sleep_state(struct device *dev);
int pinctrl_pm_select_idle_state(struct device *dev);
#else
@@ -55,6 +56,10 @@ static inline int pinctrl_pm_select_default_state(struct device *dev)
{
return 0;
}
+static inline int pinctrl_pm_select_init_state(struct device *dev)
+{
+ return 0;
+}
static inline int pinctrl_pm_select_sleep_state(struct device *dev)
{
return 0;
@@ -143,6 +148,11 @@ static inline int pinctrl_pm_select_default_state(struct device *dev)
return 0;
}
+static inline int pinctrl_pm_select_init_state(struct device *dev)
+{
+ return 0;
+}
+
static inline int pinctrl_pm_select_sleep_state(struct device *dev)
{
return 0;
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 03/11] dt-bindings: PCI: Add STM32MP25 PCIe Root Complex bindings
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
2025-08-20 7:54 ` [PATCH v13 01/11] Documentation: pinctrl: Describe PM helper functions for standard states Christian Bruel
2025-08-20 7:54 ` [PATCH v13 02/11] pinctrl: Add pinctrl_pm_select_init_state helper function Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-20 7:54 ` [PATCH v13 04/11] PCI: stm32: Add PCIe host support for STM32MP25 Christian Bruel
` (8 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc,
Manivannan Sadhasivam
Document the bindings for STM32MP25 PCIe Controller configured in
root complex mode with one root port.
Supports 4 INTx and MSI interrupts from the ARM GICv2m controller.
STM32 PCIe may be in a power domain which is the case for the STM32MP25
based boards.
Supports WAKE# from wake-gpios
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Acked-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
.../bindings/pci/st,stm32-pcie-common.yaml | 33 ++++++
.../bindings/pci/st,stm32-pcie-host.yaml | 112 ++++++++++++++++++
2 files changed, 145 insertions(+)
create mode 100644 Documentation/devicetree/bindings/pci/st,stm32-pcie-common.yaml
create mode 100644 Documentation/devicetree/bindings/pci/st,stm32-pcie-host.yaml
diff --git a/Documentation/devicetree/bindings/pci/st,stm32-pcie-common.yaml b/Documentation/devicetree/bindings/pci/st,stm32-pcie-common.yaml
new file mode 100644
index 000000000000..5adbff259204
--- /dev/null
+++ b/Documentation/devicetree/bindings/pci/st,stm32-pcie-common.yaml
@@ -0,0 +1,33 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/pci/st,stm32-pcie-common.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: STM32MP25 PCIe RC/EP controller
+
+maintainers:
+ - Christian Bruel <christian.bruel@foss.st.com>
+
+description:
+ STM32MP25 PCIe RC/EP common properties
+
+properties:
+ clocks:
+ maxItems: 1
+ description: PCIe system clock
+
+ resets:
+ maxItems: 1
+
+ power-domains:
+ maxItems: 1
+
+ access-controllers:
+ maxItems: 1
+
+required:
+ - clocks
+ - resets
+
+additionalProperties: true
diff --git a/Documentation/devicetree/bindings/pci/st,stm32-pcie-host.yaml b/Documentation/devicetree/bindings/pci/st,stm32-pcie-host.yaml
new file mode 100644
index 000000000000..443bfe2cdc98
--- /dev/null
+++ b/Documentation/devicetree/bindings/pci/st,stm32-pcie-host.yaml
@@ -0,0 +1,112 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/pci/st,stm32-pcie-host.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: STMicroelectronics STM32MP25 PCIe Root Complex
+
+maintainers:
+ - Christian Bruel <christian.bruel@foss.st.com>
+
+description:
+ PCIe root complex controller based on the Synopsys DesignWare PCIe core.
+
+allOf:
+ - $ref: /schemas/pci/snps,dw-pcie.yaml#
+ - $ref: /schemas/pci/st,stm32-pcie-common.yaml#
+
+properties:
+ compatible:
+ const: st,stm32mp25-pcie-rc
+
+ reg:
+ items:
+ - description: Data Bus Interface (DBI) registers.
+ - description: PCIe configuration registers.
+
+ reg-names:
+ items:
+ - const: dbi
+ - const: config
+
+ msi-parent:
+ maxItems: 1
+
+patternProperties:
+ '^pcie@[0-2],0$':
+ type: object
+ $ref: /schemas/pci/pci-pci-bridge.yaml#
+
+ properties:
+ reg:
+ maxItems: 1
+
+ phys:
+ maxItems: 1
+
+ reset-gpios:
+ description: GPIO controlled connection to PERST# signal
+ maxItems: 1
+
+ wake-gpios:
+ description: GPIO used as WAKE# input signal
+ maxItems: 1
+
+ required:
+ - phys
+ - ranges
+
+ unevaluatedProperties: false
+
+required:
+ - interrupt-map
+ - interrupt-map-mask
+ - ranges
+ - dma-ranges
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/st,stm32mp25-rcc.h>
+ #include <dt-bindings/gpio/gpio.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/phy/phy.h>
+ #include <dt-bindings/reset/st,stm32mp25-rcc.h>
+
+ pcie@48400000 {
+ compatible = "st,stm32mp25-pcie-rc";
+ device_type = "pci";
+ reg = <0x48400000 0x400000>,
+ <0x10000000 0x10000>;
+ reg-names = "dbi", "config";
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0 0 0 7>;
+ interrupt-map = <0 0 0 1 &intc 0 0 GIC_SPI 264 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 2 &intc 0 0 GIC_SPI 265 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 3 &intc 0 0 GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 4 &intc 0 0 GIC_SPI 267 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <3>;
+ #size-cells = <2>;
+ ranges = <0x01000000 0x0 0x00000000 0x10010000 0x0 0x10000>,
+ <0x02000000 0x0 0x10020000 0x10020000 0x0 0x7fe0000>,
+ <0x42000000 0x0 0x18000000 0x18000000 0x0 0x8000000>;
+ dma-ranges = <0x42000000 0x0 0x80000000 0x80000000 0x0 0x80000000>;
+ clocks = <&rcc CK_BUS_PCIE>;
+ resets = <&rcc PCIE_R>;
+ msi-parent = <&v2m0>;
+ access-controllers = <&rifsc 68>;
+ power-domains = <&CLUSTER_PD>;
+
+ pcie@0,0 {
+ device_type = "pci";
+ reg = <0x0 0x0 0x0 0x0 0x0>;
+ phys = <&combophy PHY_TYPE_PCIE>;
+ wake-gpios = <&gpioh 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
+ reset-gpios = <&gpioj 8 GPIO_ACTIVE_LOW>;
+ #address-cells = <3>;
+ #size-cells = <2>;
+ ranges;
+ };
+ };
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 04/11] PCI: stm32: Add PCIe host support for STM32MP25
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (2 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 03/11] dt-bindings: PCI: Add STM32MP25 PCIe Root Complex bindings Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-25 9:15 ` Philipp Zabel
2025-08-20 7:54 ` [PATCH v13 05/11] dt-bindings: PCI: Add STM32MP25 PCIe Endpoint bindings Christian Bruel
` (7 subsequent siblings)
11 siblings, 1 reply; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Add driver for the STM32MP25 SoC PCIe Gen1 2.5 GT/s and Gen2 5GT/s
controller based on the DesignWare PCIe core.
Supports MSI via GICv2m, Single Virtual Channel, Single Function
Supports WAKE# GPIO.
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
drivers/pci/controller/dwc/Kconfig | 12 +
drivers/pci/controller/dwc/Makefile | 1 +
drivers/pci/controller/dwc/pcie-stm32.c | 360 ++++++++++++++++++++++++
drivers/pci/controller/dwc/pcie-stm32.h | 15 +
4 files changed, 388 insertions(+)
create mode 100644 drivers/pci/controller/dwc/pcie-stm32.c
create mode 100644 drivers/pci/controller/dwc/pcie-stm32.h
diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig
index deafc512b079..a8174817fd5b 100644
--- a/drivers/pci/controller/dwc/Kconfig
+++ b/drivers/pci/controller/dwc/Kconfig
@@ -423,6 +423,18 @@ config PCIE_SPEAR13XX
help
Say Y here if you want PCIe support on SPEAr13XX SoCs.
+config PCIE_STM32_HOST
+ tristate "STMicroelectronics STM32MP25 PCIe Controller (host mode)"
+ depends on ARCH_STM32 || COMPILE_TEST
+ depends on PCI_MSI
+ select PCIE_DW_HOST
+ help
+ Enables Root Complex (RC) support for the DesignWare core based PCIe
+ controller found in STM32MP25 SoC.
+
+ This driver can also be built as a module. If so, the module
+ will be called pcie-stm32.
+
config PCI_DRA7XX
tristate
diff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile
index 6919d27798d1..1307a87b1cf0 100644
--- a/drivers/pci/controller/dwc/Makefile
+++ b/drivers/pci/controller/dwc/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_PCIE_UNIPHIER) += pcie-uniphier.o
obj-$(CONFIG_PCIE_UNIPHIER_EP) += pcie-uniphier-ep.o
obj-$(CONFIG_PCIE_VISCONTI_HOST) += pcie-visconti.o
obj-$(CONFIG_PCIE_RCAR_GEN4) += pcie-rcar-gen4.o
+obj-$(CONFIG_PCIE_STM32_HOST) += pcie-stm32.o
# The following drivers are for devices that use the generic ACPI
# pci_root.c driver but don't support standard ECAM config access.
diff --git a/drivers/pci/controller/dwc/pcie-stm32.c b/drivers/pci/controller/dwc/pcie-stm32.c
new file mode 100644
index 000000000000..964fa6f674c8
--- /dev/null
+++ b/drivers/pci/controller/dwc/pcie-stm32.c
@@ -0,0 +1,360 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * STMicroelectronics STM32MP25 PCIe root complex driver.
+ *
+ * Copyright (C) 2025 STMicroelectronics
+ * Author: Christian Bruel <christian.bruel@foss.st.com>
+ */
+
+#include <linux/clk.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of_platform.h>
+#include <linux/phy/phy.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/pm_wakeirq.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+#include "pcie-designware.h"
+#include "pcie-stm32.h"
+#include "../../pci.h"
+
+struct stm32_pcie {
+ struct dw_pcie pci;
+ struct regmap *regmap;
+ struct reset_control *rst;
+ struct phy *phy;
+ struct clk *clk;
+ struct gpio_desc *perst_gpio;
+ struct gpio_desc *wake_gpio;
+};
+
+static void stm32_pcie_deassert_perst(struct stm32_pcie *stm32_pcie)
+{
+ if (stm32_pcie->perst_gpio) {
+ msleep(PCIE_T_PVPERL_MS);
+ gpiod_set_value(stm32_pcie->perst_gpio, 0);
+ }
+
+ msleep(PCIE_RESET_CONFIG_WAIT_MS);
+}
+
+static void stm32_pcie_assert_perst(struct stm32_pcie *stm32_pcie)
+{
+ gpiod_set_value(stm32_pcie->perst_gpio, 1);
+}
+
+static int stm32_pcie_start_link(struct dw_pcie *pci)
+{
+ struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
+
+ return regmap_update_bits(stm32_pcie->regmap, SYSCFG_PCIECR,
+ STM32MP25_PCIECR_LTSSM_EN,
+ STM32MP25_PCIECR_LTSSM_EN);
+}
+
+static void stm32_pcie_stop_link(struct dw_pcie *pci)
+{
+ struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
+
+ regmap_update_bits(stm32_pcie->regmap, SYSCFG_PCIECR,
+ STM32MP25_PCIECR_LTSSM_EN, 0);
+}
+
+static int stm32_pcie_suspend_noirq(struct device *dev)
+{
+ struct stm32_pcie *stm32_pcie = dev_get_drvdata(dev);
+ int ret;
+
+ ret = dw_pcie_suspend_noirq(&stm32_pcie->pci);
+ if (ret)
+ return ret;
+
+ stm32_pcie_assert_perst(stm32_pcie);
+
+ clk_disable_unprepare(stm32_pcie->clk);
+
+ if (!device_wakeup_path(dev))
+ phy_exit(stm32_pcie->phy);
+
+ return pinctrl_pm_select_sleep_state(dev);
+}
+
+static int stm32_pcie_resume_noirq(struct device *dev)
+{
+ struct stm32_pcie *stm32_pcie = dev_get_drvdata(dev);
+ int ret;
+
+ /*
+ * The core clock is gated with CLKREQ# from the COMBOPHY REFCLK,
+ * thus if no device is present, must deassert it with a GPIO from
+ * pinctrl pinmux before accessing the DBI registers.
+ */
+ ret = pinctrl_pm_select_init_state(dev);
+ if (ret) {
+ dev_err(dev, "Failed to activate pinctrl pm state: %d\n", ret);
+ return ret;
+ }
+
+ if (!device_wakeup_path(dev)) {
+ ret = phy_init(stm32_pcie->phy);
+ if (ret) {
+ pinctrl_pm_select_default_state(dev);
+ return ret;
+ }
+ }
+
+ ret = clk_prepare_enable(stm32_pcie->clk);
+ if (ret)
+ goto err_phy_exit;
+
+ stm32_pcie_deassert_perst(stm32_pcie);
+
+ ret = dw_pcie_resume_noirq(&stm32_pcie->pci);
+ if (ret)
+ goto err_disable_clk;
+
+ pinctrl_pm_select_default_state(dev);
+
+ return 0;
+
+err_disable_clk:
+ stm32_pcie_assert_perst(stm32_pcie);
+ clk_disable_unprepare(stm32_pcie->clk);
+
+err_phy_exit:
+ phy_exit(stm32_pcie->phy);
+ pinctrl_pm_select_default_state(dev);
+
+ return ret;
+}
+
+static const struct dev_pm_ops stm32_pcie_pm_ops = {
+ NOIRQ_SYSTEM_SLEEP_PM_OPS(stm32_pcie_suspend_noirq,
+ stm32_pcie_resume_noirq)
+};
+
+static const struct dw_pcie_host_ops stm32_pcie_host_ops = {
+};
+
+static const struct dw_pcie_ops dw_pcie_ops = {
+ .start_link = stm32_pcie_start_link,
+ .stop_link = stm32_pcie_stop_link
+};
+
+static int stm32_add_pcie_port(struct stm32_pcie *stm32_pcie)
+{
+ struct device *dev = stm32_pcie->pci.dev;
+ unsigned int wake_irq;
+ int ret;
+
+ ret = phy_set_mode(stm32_pcie->phy, PHY_MODE_PCIE);
+ if (ret)
+ return ret;
+
+ ret = phy_init(stm32_pcie->phy);
+ if (ret)
+ return ret;
+
+ ret = regmap_update_bits(stm32_pcie->regmap, SYSCFG_PCIECR,
+ STM32MP25_PCIECR_TYPE_MASK,
+ STM32MP25_PCIECR_RC);
+ if (ret)
+ goto err_phy_exit;
+
+ stm32_pcie_deassert_perst(stm32_pcie);
+
+ if (stm32_pcie->wake_gpio) {
+ wake_irq = gpiod_to_irq(stm32_pcie->wake_gpio);
+ ret = dev_pm_set_dedicated_wake_irq(dev, wake_irq);
+ if (ret) {
+ dev_err(dev, "Failed to enable wakeup irq %d\n", ret);
+ goto err_assert_perst;
+ }
+ irq_set_irq_type(wake_irq, IRQ_TYPE_EDGE_FALLING);
+ }
+
+ return 0;
+
+err_assert_perst:
+ stm32_pcie_assert_perst(stm32_pcie);
+
+err_phy_exit:
+ phy_exit(stm32_pcie->phy);
+
+ return ret;
+}
+
+static void stm32_remove_pcie_port(struct stm32_pcie *stm32_pcie)
+{
+ dev_pm_clear_wake_irq(stm32_pcie->pci.dev);
+
+ stm32_pcie_assert_perst(stm32_pcie);
+
+ phy_exit(stm32_pcie->phy);
+}
+
+static int stm32_pcie_parse_port(struct stm32_pcie *stm32_pcie)
+{
+ struct device *dev = stm32_pcie->pci.dev;
+ struct device_node *root_port;
+
+ root_port = of_get_next_available_child(dev->of_node, NULL);
+
+ stm32_pcie->phy = devm_of_phy_get(dev, root_port, NULL);
+ if (IS_ERR(stm32_pcie->phy)) {
+ of_node_put(root_port);
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->phy),
+ "Failed to get pcie-phy\n");
+ }
+
+ stm32_pcie->perst_gpio = devm_fwnode_gpiod_get(dev, of_fwnode_handle(root_port),
+ "reset", GPIOD_OUT_HIGH, NULL);
+ if (IS_ERR(stm32_pcie->perst_gpio)) {
+ if (PTR_ERR(stm32_pcie->perst_gpio) != -ENOENT) {
+ of_node_put(root_port);
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->perst_gpio),
+ "Failed to get reset GPIO\n");
+ }
+ stm32_pcie->perst_gpio = NULL;
+ }
+
+ stm32_pcie->wake_gpio = devm_fwnode_gpiod_get(dev, of_fwnode_handle(root_port),
+ "wake", GPIOD_IN, NULL);
+
+ if (IS_ERR(stm32_pcie->wake_gpio)) {
+ if (PTR_ERR(stm32_pcie->wake_gpio) != -ENOENT) {
+ of_node_put(root_port);
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->wake_gpio),
+ "Failed to get wake GPIO\n");
+ }
+ stm32_pcie->wake_gpio = NULL;
+ }
+
+ of_node_put(root_port);
+
+ return 0;
+}
+
+static int stm32_pcie_probe(struct platform_device *pdev)
+{
+ struct stm32_pcie *stm32_pcie;
+ struct device *dev = &pdev->dev;
+ int ret;
+
+ stm32_pcie = devm_kzalloc(dev, sizeof(*stm32_pcie), GFP_KERNEL);
+ if (!stm32_pcie)
+ return -ENOMEM;
+
+ stm32_pcie->pci.dev = dev;
+ stm32_pcie->pci.ops = &dw_pcie_ops;
+ stm32_pcie->pci.pp.ops = &stm32_pcie_host_ops;
+
+ stm32_pcie->regmap = syscon_regmap_lookup_by_compatible("st,stm32mp25-syscfg");
+ if (IS_ERR(stm32_pcie->regmap))
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->regmap),
+ "No syscfg specified\n");
+
+ stm32_pcie->clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(stm32_pcie->clk))
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->clk),
+ "Failed to get PCIe clock source\n");
+
+ stm32_pcie->rst = devm_reset_control_get_exclusive(dev, NULL);
+ if (IS_ERR(stm32_pcie->rst))
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->rst),
+ "Failed to get PCIe reset\n");
+
+ ret = stm32_pcie_parse_port(stm32_pcie);
+ if (ret)
+ return ret;
+
+ platform_set_drvdata(pdev, stm32_pcie);
+
+ ret = stm32_add_pcie_port(stm32_pcie);
+ if (ret)
+ return ret;
+
+ reset_control_assert(stm32_pcie->rst);
+ reset_control_deassert(stm32_pcie->rst);
+
+ ret = clk_prepare_enable(stm32_pcie->clk);
+ if (ret) {
+ dev_err(dev, "Core clock enable failed %d\n", ret);
+ goto err_remove_port;
+ }
+
+ ret = pm_runtime_set_active(dev);
+ if (ret < 0) {
+ clk_disable_unprepare(stm32_pcie->clk);
+ stm32_remove_pcie_port(stm32_pcie);
+ return dev_err_probe(dev, ret, "Failed to activate runtime PM\n");
+ }
+
+ pm_runtime_no_callbacks(dev);
+
+ ret = devm_pm_runtime_enable(dev);
+ if (ret < 0) {
+ clk_disable_unprepare(stm32_pcie->clk);
+ stm32_remove_pcie_port(stm32_pcie);
+ return dev_err_probe(dev, ret, "Failed to enable runtime PM\n");
+ }
+
+ ret = dw_pcie_host_init(&stm32_pcie->pci.pp);
+ if (ret)
+ goto err_disable_clk;
+
+ if (stm32_pcie->wake_gpio)
+ device_init_wakeup(dev, true);
+
+ return 0;
+
+err_disable_clk:
+ clk_disable_unprepare(stm32_pcie->clk);
+
+err_remove_port:
+ stm32_remove_pcie_port(stm32_pcie);
+
+ return ret;
+}
+
+static void stm32_pcie_remove(struct platform_device *pdev)
+{
+ struct stm32_pcie *stm32_pcie = platform_get_drvdata(pdev);
+ struct dw_pcie_rp *pp = &stm32_pcie->pci.pp;
+
+ if (stm32_pcie->wake_gpio)
+ device_init_wakeup(&pdev->dev, false);
+
+ dw_pcie_host_deinit(pp);
+
+ clk_disable_unprepare(stm32_pcie->clk);
+
+ stm32_remove_pcie_port(stm32_pcie);
+
+ pm_runtime_put_noidle(&pdev->dev);
+}
+
+static const struct of_device_id stm32_pcie_of_match[] = {
+ { .compatible = "st,stm32mp25-pcie-rc" },
+ {},
+};
+
+static struct platform_driver stm32_pcie_driver = {
+ .probe = stm32_pcie_probe,
+ .remove = stm32_pcie_remove,
+ .driver = {
+ .name = "stm32-pcie",
+ .of_match_table = stm32_pcie_of_match,
+ .pm = &stm32_pcie_pm_ops,
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
+ },
+};
+
+module_platform_driver(stm32_pcie_driver);
+
+MODULE_AUTHOR("Christian Bruel <christian.bruel@foss.st.com>");
+MODULE_DESCRIPTION("STM32MP25 PCIe Controller driver");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(of, stm32_pcie_of_match);
diff --git a/drivers/pci/controller/dwc/pcie-stm32.h b/drivers/pci/controller/dwc/pcie-stm32.h
new file mode 100644
index 000000000000..387112c4e42c
--- /dev/null
+++ b/drivers/pci/controller/dwc/pcie-stm32.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * ST PCIe driver definitions for STM32-MP25 SoC
+ *
+ * Copyright (C) 2025 STMicroelectronics - All Rights Reserved
+ * Author: Christian Bruel <christian.bruel@foss.st.com>
+ */
+
+#define to_stm32_pcie(x) dev_get_drvdata((x)->dev)
+
+#define STM32MP25_PCIECR_TYPE_MASK GENMASK(11, 8)
+#define STM32MP25_PCIECR_LTSSM_EN BIT(2)
+#define STM32MP25_PCIECR_RC BIT(10)
+
+#define SYSCFG_PCIECR 0x6000
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 05/11] dt-bindings: PCI: Add STM32MP25 PCIe Endpoint bindings
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (3 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 04/11] PCI: stm32: Add PCIe host support for STM32MP25 Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-20 7:54 ` [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25 Christian Bruel
` (6 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
STM32MP25 PCIe Controller is based on the DesignWare core configured as
end point mode from the SYSCFG register.
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
---
.../bindings/pci/st,stm32-pcie-ep.yaml | 73 +++++++++++++++++++
1 file changed, 73 insertions(+)
create mode 100644 Documentation/devicetree/bindings/pci/st,stm32-pcie-ep.yaml
diff --git a/Documentation/devicetree/bindings/pci/st,stm32-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/st,stm32-pcie-ep.yaml
new file mode 100644
index 000000000000..b076ada4f332
--- /dev/null
+++ b/Documentation/devicetree/bindings/pci/st,stm32-pcie-ep.yaml
@@ -0,0 +1,73 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/pci/st,stm32-pcie-ep.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: STMicroelectronics STM32MP25 PCIe Endpoint
+
+maintainers:
+ - Christian Bruel <christian.bruel@foss.st.com>
+
+description:
+ PCIe endpoint controller based on the Synopsys DesignWare PCIe core.
+
+allOf:
+ - $ref: /schemas/pci/snps,dw-pcie-ep.yaml#
+ - $ref: /schemas/pci/st,stm32-pcie-common.yaml#
+
+properties:
+ compatible:
+ const: st,stm32mp25-pcie-ep
+
+ reg:
+ items:
+ - description: Data Bus Interface (DBI) registers.
+ - description: Data Bus Interface (DBI) shadow registers.
+ - description: Internal Address Translation Unit (iATU) registers.
+ - description: PCIe configuration registers.
+
+ reg-names:
+ items:
+ - const: dbi
+ - const: dbi2
+ - const: atu
+ - const: addr_space
+
+ reset-gpios:
+ description: GPIO controlled connection to PERST# signal
+ maxItems: 1
+
+ phys:
+ maxItems: 1
+
+required:
+ - phys
+ - reset-gpios
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/st,stm32mp25-rcc.h>
+ #include <dt-bindings/gpio/gpio.h>
+ #include <dt-bindings/phy/phy.h>
+ #include <dt-bindings/reset/st,stm32mp25-rcc.h>
+
+ pcie-ep@48400000 {
+ compatible = "st,stm32mp25-pcie-ep";
+ reg = <0x48400000 0x400000>,
+ <0x48500000 0x100000>,
+ <0x48700000 0x80000>,
+ <0x10000000 0x10000000>;
+ reg-names = "dbi", "dbi2", "atu", "addr_space";
+ clocks = <&rcc CK_BUS_PCIE>;
+ phys = <&combophy PHY_TYPE_PCIE>;
+ resets = <&rcc PCIE_R>;
+ pinctrl-names = "default", "init";
+ pinctrl-0 = <&pcie_pins_a>;
+ pinctrl-1 = <&pcie_init_pins_a>;
+ reset-gpios = <&gpioj 8 GPIO_ACTIVE_LOW>;
+ access-controllers = <&rifsc 68>;
+ power-domains = <&CLUSTER_PD>;
+ };
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (4 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 05/11] dt-bindings: PCI: Add STM32MP25 PCIe Endpoint bindings Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-27 18:58 ` Bjorn Helgaas
2025-08-28 17:22 ` Bjorn Helgaas
2025-08-20 7:54 ` [PATCH v13 07/11] MAINTAINERS: add entry for ST STM32MP25 PCIe drivers Christian Bruel
` (5 subsequent siblings)
11 siblings, 2 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Add driver to configure the STM32MP25 SoC PCIe Gen1 2.5GT/s or Gen2 5GT/s
controller based on the DesignWare PCIe core in endpoint mode.
Uses the common reference clock provided by the host.
The PCIe core_clk receives the pipe0_clk from the ComboPHY as input,
and the ComboPHY PLL must be locked for pipe0_clk to be ready.
Consequently, PCIe core registers cannot be accessed until the ComboPHY is
fully initialised and REFCLK is enabled and ready.
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
drivers/pci/controller/dwc/Kconfig | 12 +
drivers/pci/controller/dwc/Makefile | 1 +
drivers/pci/controller/dwc/pcie-stm32-ep.c | 384 +++++++++++++++++++++
drivers/pci/controller/dwc/pcie-stm32.h | 1 +
4 files changed, 398 insertions(+)
create mode 100644 drivers/pci/controller/dwc/pcie-stm32-ep.c
diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig
index a8174817fd5b..34abc859c107 100644
--- a/drivers/pci/controller/dwc/Kconfig
+++ b/drivers/pci/controller/dwc/Kconfig
@@ -435,6 +435,18 @@ config PCIE_STM32_HOST
This driver can also be built as a module. If so, the module
will be called pcie-stm32.
+config PCIE_STM32_EP
+ tristate "STMicroelectronics STM32MP25 PCIe Controller (endpoint mode)"
+ depends on ARCH_STM32 || COMPILE_TEST
+ depends on PCI_ENDPOINT
+ select PCIE_DW_EP
+ help
+ Enables Endpoint (EP) support for the DesignWare core based PCIe
+ controller found in STM32MP25 SoC.
+
+ This driver can also be built as a module. If so, the module
+ will be called pcie-stm32-ep.
+
config PCI_DRA7XX
tristate
diff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile
index 1307a87b1cf0..7ae28f3b0fb3 100644
--- a/drivers/pci/controller/dwc/Makefile
+++ b/drivers/pci/controller/dwc/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_PCIE_UNIPHIER_EP) += pcie-uniphier-ep.o
obj-$(CONFIG_PCIE_VISCONTI_HOST) += pcie-visconti.o
obj-$(CONFIG_PCIE_RCAR_GEN4) += pcie-rcar-gen4.o
obj-$(CONFIG_PCIE_STM32_HOST) += pcie-stm32.o
+obj-$(CONFIG_PCIE_STM32_EP) += pcie-stm32-ep.o
# The following drivers are for devices that use the generic ACPI
# pci_root.c driver but don't support standard ECAM config access.
diff --git a/drivers/pci/controller/dwc/pcie-stm32-ep.c b/drivers/pci/controller/dwc/pcie-stm32-ep.c
new file mode 100644
index 000000000000..1f46bcf0c79f
--- /dev/null
+++ b/drivers/pci/controller/dwc/pcie-stm32-ep.c
@@ -0,0 +1,384 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * STMicroelectronics STM32MP25 PCIe endpoint driver.
+ *
+ * Copyright (C) 2025 STMicroelectronics
+ * Author: Christian Bruel <christian.bruel@foss.st.com>
+ */
+
+#include <linux/clk.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+#include "pcie-designware.h"
+#include "pcie-stm32.h"
+
+enum stm32_pcie_ep_link_status {
+ STM32_PCIE_EP_LINK_DISABLED,
+ STM32_PCIE_EP_LINK_ENABLED,
+};
+
+struct stm32_pcie {
+ struct dw_pcie pci;
+ struct regmap *regmap;
+ struct reset_control *rst;
+ struct phy *phy;
+ struct clk *clk;
+ struct gpio_desc *perst_gpio;
+ enum stm32_pcie_ep_link_status link_status;
+ unsigned int perst_irq;
+};
+
+static void stm32_pcie_ep_init(struct dw_pcie_ep *ep)
+{
+ struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
+ enum pci_barno bar;
+
+ for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
+ dw_pcie_ep_reset_bar(pci, bar);
+}
+
+static int stm32_pcie_enable_link(struct dw_pcie *pci)
+{
+ struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
+
+ regmap_update_bits(stm32_pcie->regmap, SYSCFG_PCIECR,
+ STM32MP25_PCIECR_LTSSM_EN,
+ STM32MP25_PCIECR_LTSSM_EN);
+
+ return dw_pcie_wait_for_link(pci);
+}
+
+static void stm32_pcie_disable_link(struct dw_pcie *pci)
+{
+ struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
+
+ regmap_update_bits(stm32_pcie->regmap, SYSCFG_PCIECR, STM32MP25_PCIECR_LTSSM_EN, 0);
+}
+
+static int stm32_pcie_start_link(struct dw_pcie *pci)
+{
+ struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
+ int ret;
+
+ if (stm32_pcie->link_status == STM32_PCIE_EP_LINK_ENABLED) {
+ dev_dbg(pci->dev, "Link is already enabled\n");
+ return 0;
+ }
+
+ dev_dbg(pci->dev, "Enable link\n");
+
+ ret = stm32_pcie_enable_link(pci);
+ if (ret) {
+ dev_err(pci->dev, "PCIe cannot establish link: %d\n", ret);
+ return ret;
+ }
+
+ enable_irq(stm32_pcie->perst_irq);
+
+ stm32_pcie->link_status = STM32_PCIE_EP_LINK_ENABLED;
+
+ return 0;
+}
+
+static void stm32_pcie_stop_link(struct dw_pcie *pci)
+{
+ struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
+
+ if (stm32_pcie->link_status == STM32_PCIE_EP_LINK_DISABLED) {
+ dev_dbg(pci->dev, "Link is already disabled\n");
+ return;
+ }
+
+ dev_dbg(pci->dev, "Disable link\n");
+
+ disable_irq(stm32_pcie->perst_irq);
+
+ stm32_pcie_disable_link(pci);
+
+ stm32_pcie->link_status = STM32_PCIE_EP_LINK_DISABLED;
+}
+
+static int stm32_pcie_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
+ unsigned int type, u16 interrupt_num)
+{
+ struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
+
+ switch (type) {
+ case PCI_IRQ_INTX:
+ return dw_pcie_ep_raise_intx_irq(ep, func_no);
+ case PCI_IRQ_MSI:
+ return dw_pcie_ep_raise_msi_irq(ep, func_no, interrupt_num);
+ default:
+ dev_err(pci->dev, "UNKNOWN IRQ type\n");
+ return -EINVAL;
+ }
+}
+
+static const struct pci_epc_features stm32_pcie_epc_features = {
+ .msi_capable = true,
+ .align = SZ_64K,
+};
+
+static const struct pci_epc_features*
+stm32_pcie_get_features(struct dw_pcie_ep *ep)
+{
+ return &stm32_pcie_epc_features;
+}
+
+static const struct dw_pcie_ep_ops stm32_pcie_ep_ops = {
+ .init = stm32_pcie_ep_init,
+ .raise_irq = stm32_pcie_raise_irq,
+ .get_features = stm32_pcie_get_features,
+};
+
+static const struct dw_pcie_ops dw_pcie_ops = {
+ .start_link = stm32_pcie_start_link,
+ .stop_link = stm32_pcie_stop_link,
+};
+
+static int stm32_pcie_enable_resources(struct stm32_pcie *stm32_pcie)
+{
+ int ret;
+
+ ret = phy_init(stm32_pcie->phy);
+ if (ret)
+ return ret;
+
+ ret = clk_prepare_enable(stm32_pcie->clk);
+ if (ret)
+ phy_exit(stm32_pcie->phy);
+
+ return ret;
+}
+
+static void stm32_pcie_disable_resources(struct stm32_pcie *stm32_pcie)
+{
+ clk_disable_unprepare(stm32_pcie->clk);
+
+ phy_exit(stm32_pcie->phy);
+}
+
+static void stm32_pcie_perst_assert(struct dw_pcie *pci)
+{
+ struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
+ struct dw_pcie_ep *ep = &stm32_pcie->pci.ep;
+ struct device *dev = pci->dev;
+
+ dev_dbg(dev, "PERST asserted by host\n");
+
+ pci_epc_deinit_notify(ep->epc);
+
+ stm32_pcie_disable_resources(stm32_pcie);
+
+ pm_runtime_put_sync(dev);
+}
+
+static void stm32_pcie_perst_deassert(struct dw_pcie *pci)
+{
+ struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
+ struct device *dev = pci->dev;
+ struct dw_pcie_ep *ep = &pci->ep;
+ int ret;
+
+ dev_dbg(dev, "PERST de-asserted by host\n");
+
+ ret = pm_runtime_resume_and_get(dev);
+ if (ret < 0) {
+ dev_err(dev, "Failed to resume runtime PM: %d\n", ret);
+ return;
+ }
+
+ ret = stm32_pcie_enable_resources(stm32_pcie);
+ if (ret) {
+ dev_err(dev, "Failed to enable resources: %d\n", ret);
+ goto err_pm_put_sync;
+ }
+
+ /*
+ * Need to reprogram the configuration space registers here because the
+ * DBI registers were incorrectly reset by the PHY RCC during phy_init().
+ */
+ ret = dw_pcie_ep_init_registers(ep);
+ if (ret) {
+ dev_err(dev, "Failed to complete initialization: %d\n", ret);
+ goto err_disable_resources;
+ }
+
+ pci_epc_init_notify(ep->epc);
+
+ return;
+
+err_disable_resources:
+ stm32_pcie_disable_resources(stm32_pcie);
+
+err_pm_put_sync:
+ pm_runtime_put_sync(dev);
+}
+
+static irqreturn_t stm32_pcie_ep_perst_irq_thread(int irq, void *data)
+{
+ struct stm32_pcie *stm32_pcie = data;
+ struct dw_pcie *pci = &stm32_pcie->pci;
+ u32 perst;
+
+ perst = gpiod_get_value(stm32_pcie->perst_gpio);
+ if (perst)
+ stm32_pcie_perst_assert(pci);
+ else
+ stm32_pcie_perst_deassert(pci);
+
+ irq_set_irq_type(gpiod_to_irq(stm32_pcie->perst_gpio),
+ (perst ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW));
+
+ return IRQ_HANDLED;
+}
+
+static int stm32_add_pcie_ep(struct stm32_pcie *stm32_pcie,
+ struct platform_device *pdev)
+{
+ struct dw_pcie_ep *ep = &stm32_pcie->pci.ep;
+ struct device *dev = &pdev->dev;
+ int ret;
+
+ ret = regmap_update_bits(stm32_pcie->regmap, SYSCFG_PCIECR,
+ STM32MP25_PCIECR_TYPE_MASK,
+ STM32MP25_PCIECR_EP);
+ if (ret)
+ return ret;
+
+ reset_control_assert(stm32_pcie->rst);
+ reset_control_deassert(stm32_pcie->rst);
+
+ ep->ops = &stm32_pcie_ep_ops;
+
+ ret = dw_pcie_ep_init(ep);
+ if (ret) {
+ dev_err(dev, "Failed to initialize ep: %d\n", ret);
+ return ret;
+ }
+
+ ret = stm32_pcie_enable_resources(stm32_pcie);
+ if (ret) {
+ dev_err(dev, "Failed to enable resources: %d\n", ret);
+ dw_pcie_ep_deinit(ep);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int stm32_pcie_probe(struct platform_device *pdev)
+{
+ struct stm32_pcie *stm32_pcie;
+ struct device *dev = &pdev->dev;
+ int ret;
+
+ stm32_pcie = devm_kzalloc(dev, sizeof(*stm32_pcie), GFP_KERNEL);
+ if (!stm32_pcie)
+ return -ENOMEM;
+
+ stm32_pcie->pci.dev = dev;
+ stm32_pcie->pci.ops = &dw_pcie_ops;
+
+ stm32_pcie->regmap = syscon_regmap_lookup_by_compatible("st,stm32mp25-syscfg");
+ if (IS_ERR(stm32_pcie->regmap))
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->regmap),
+ "No syscfg specified\n");
+
+ stm32_pcie->phy = devm_phy_get(dev, NULL);
+ if (IS_ERR(stm32_pcie->phy))
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->phy),
+ "failed to get pcie-phy\n");
+
+ stm32_pcie->clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(stm32_pcie->clk))
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->clk),
+ "Failed to get PCIe clock source\n");
+
+ stm32_pcie->rst = devm_reset_control_get_exclusive(dev, NULL);
+ if (IS_ERR(stm32_pcie->rst))
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->rst),
+ "Failed to get PCIe reset\n");
+
+ stm32_pcie->perst_gpio = devm_gpiod_get(dev, "reset", GPIOD_IN);
+ if (IS_ERR(stm32_pcie->perst_gpio))
+ return dev_err_probe(dev, PTR_ERR(stm32_pcie->perst_gpio),
+ "Failed to get reset GPIO\n");
+
+ ret = phy_set_mode(stm32_pcie->phy, PHY_MODE_PCIE);
+ if (ret)
+ return ret;
+
+ platform_set_drvdata(pdev, stm32_pcie);
+
+ pm_runtime_get_noresume(dev);
+
+ ret = devm_pm_runtime_enable(dev);
+ if (ret < 0) {
+ pm_runtime_put_noidle(&pdev->dev);
+ return dev_err_probe(dev, ret, "Failed to enable runtime PM\n");
+ }
+
+ stm32_pcie->perst_irq = gpiod_to_irq(stm32_pcie->perst_gpio);
+
+ /* Will be enabled in start_link when device is initialized. */
+ irq_set_status_flags(stm32_pcie->perst_irq, IRQ_NOAUTOEN);
+
+ ret = devm_request_threaded_irq(dev, stm32_pcie->perst_irq, NULL,
+ stm32_pcie_ep_perst_irq_thread,
+ IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+ "perst_irq", stm32_pcie);
+ if (ret) {
+ pm_runtime_put_noidle(&pdev->dev);
+ return dev_err_probe(dev, ret, "Failed to request PERST IRQ\n");
+ }
+
+ ret = stm32_add_pcie_ep(stm32_pcie, pdev);
+ if (ret)
+ pm_runtime_put_noidle(&pdev->dev);
+
+ return ret;
+}
+
+static void stm32_pcie_remove(struct platform_device *pdev)
+{
+ struct stm32_pcie *stm32_pcie = platform_get_drvdata(pdev);
+ struct dw_pcie *pci = &stm32_pcie->pci;
+ struct dw_pcie_ep *ep = &pci->ep;
+
+ dw_pcie_stop_link(pci);
+
+ pci_epc_deinit_notify(ep->epc);
+ dw_pcie_ep_deinit(ep);
+
+ stm32_pcie_disable_resources(stm32_pcie);
+
+ pm_runtime_put_sync(&pdev->dev);
+}
+
+static const struct of_device_id stm32_pcie_ep_of_match[] = {
+ { .compatible = "st,stm32mp25-pcie-ep" },
+ {},
+};
+
+static struct platform_driver stm32_pcie_ep_driver = {
+ .probe = stm32_pcie_probe,
+ .remove = stm32_pcie_remove,
+ .driver = {
+ .name = "stm32-ep-pcie",
+ .of_match_table = stm32_pcie_ep_of_match,
+ },
+};
+
+module_platform_driver(stm32_pcie_ep_driver);
+
+MODULE_AUTHOR("Christian Bruel <christian.bruel@foss.st.com>");
+MODULE_DESCRIPTION("STM32MP25 PCIe Endpoint Controller driver");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(of, stm32_pcie_ep_of_match);
diff --git a/drivers/pci/controller/dwc/pcie-stm32.h b/drivers/pci/controller/dwc/pcie-stm32.h
index 387112c4e42c..09d39f04e469 100644
--- a/drivers/pci/controller/dwc/pcie-stm32.h
+++ b/drivers/pci/controller/dwc/pcie-stm32.h
@@ -9,6 +9,7 @@
#define to_stm32_pcie(x) dev_get_drvdata((x)->dev)
#define STM32MP25_PCIECR_TYPE_MASK GENMASK(11, 8)
+#define STM32MP25_PCIECR_EP 0
#define STM32MP25_PCIECR_LTSSM_EN BIT(2)
#define STM32MP25_PCIECR_RC BIT(10)
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 07/11] MAINTAINERS: add entry for ST STM32MP25 PCIe drivers
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (5 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25 Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-20 7:54 ` [PATCH v13 08/11] arm64: dts: st: add PCIe pinctrl entries in stm32mp25-pinctrl.dtsi Christian Bruel
` (4 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Add myself as maintainer of STM32MP25 PCIe host and PCIe endpoint drivers
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
MAINTAINERS | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index fe168477caa4..8318f105e0cd 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -19377,6 +19377,13 @@ L: linux-samsung-soc@vger.kernel.org
S: Maintained
F: drivers/pci/controller/dwc/pci-exynos.c
+PCI DRIVER FOR STM32MP25
+M: Christian Bruel <christian.bruel@foss.st.com>
+L: linux-pci@vger.kernel.org
+S: Maintained
+F: Documentation/devicetree/bindings/pci/st,stm32-pcie-*.yaml
+F: drivers/pci/controller/dwc/*stm32*
+
PCI DRIVER FOR SYNOPSYS DESIGNWARE
M: Jingoo Han <jingoohan1@gmail.com>
M: Manivannan Sadhasivam <mani@kernel.org>
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 08/11] arm64: dts: st: add PCIe pinctrl entries in stm32mp25-pinctrl.dtsi
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (6 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 07/11] MAINTAINERS: add entry for ST STM32MP25 PCIe drivers Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-20 7:54 ` [PATCH v13 09/11] arm64: dts: st: Add PCIe Root Complex mode on stm32mp251 Christian Bruel
` (3 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Add PCIe pinctrl entries in stm32mp25-pinctrl.dtsi
init: forces GPIO to low while probing so CLKREQ is low for
phy_init
default: restore the AFMUX after controller probe
Add Analog pins of PCIe to perform power cycle
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi b/arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi
index 5ac9e72478dd..04e1606df126 100644
--- a/arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi
+++ b/arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi
@@ -133,6 +133,26 @@ pins {
};
};
+ pcie_pins_a: pcie-0 {
+ pins {
+ pinmux = <STM32_PINMUX('J', 0, AF4)>;
+ bias-disable;
+ };
+ };
+
+ pcie_init_pins_a: pcie-init-0 {
+ pins {
+ pinmux = <STM32_PINMUX('J', 0, GPIO)>;
+ output-low;
+ };
+ };
+
+ pcie_sleep_pins_a: pcie-sleep-0 {
+ pins {
+ pinmux = <STM32_PINMUX('J', 0, ANALOG)>;
+ };
+ };
+
pwm3_pins_a: pwm3-0 {
pins {
pinmux = <STM32_PINMUX('B', 15, AF7)>; /* TIM3_CH2 */
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 09/11] arm64: dts: st: Add PCIe Root Complex mode on stm32mp251
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (7 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 08/11] arm64: dts: st: add PCIe pinctrl entries in stm32mp25-pinctrl.dtsi Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-20 7:54 ` [PATCH v13 10/11] arm64: dts: st: Add PCIe Endpoint " Christian Bruel
` (2 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Add pcie_rc node to support STM32 MP25 PCIe driver based on the
DesignWare PCIe core configured as Root Complex mode
Supports Gen1/Gen2, single lane, MSI interrupts using the ARM GICv2m
Acked-by: Manivannan Sadhasivam <mani@kernel.org>
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
arch/arm64/boot/dts/st/stm32mp251.dtsi | 44 ++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/arch/arm64/boot/dts/st/stm32mp251.dtsi b/arch/arm64/boot/dts/st/stm32mp251.dtsi
index 303abf915b8e..a3ed617a43d3 100644
--- a/arch/arm64/boot/dts/st/stm32mp251.dtsi
+++ b/arch/arm64/boot/dts/st/stm32mp251.dtsi
@@ -122,6 +122,15 @@ intc: interrupt-controller@4ac00000 {
<0x0 0x4ac20000 0x0 0x20000>,
<0x0 0x4ac40000 0x0 0x20000>,
<0x0 0x4ac60000 0x0 0x20000>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ v2m0: v2m@48090000 {
+ compatible = "arm,gic-v2m-frame";
+ reg = <0x0 0x48090000 0x0 0x1000>;
+ msi-controller;
+ };
};
psci {
@@ -1654,6 +1663,41 @@ stmmac_axi_config_1: stmmac-axi-config {
snps,wr_osr_lmt = <0x7>;
};
};
+
+ pcie_rc: pcie@48400000 {
+ compatible = "st,stm32mp25-pcie-rc";
+ device_type = "pci";
+ reg = <0x48400000 0x400000>,
+ <0x10000000 0x10000>;
+ reg-names = "dbi", "config";
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0 0 0 7>;
+ interrupt-map = <0 0 0 1 &intc 0 0 GIC_SPI 264 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 2 &intc 0 0 GIC_SPI 265 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 3 &intc 0 0 GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>,
+ <0 0 0 4 &intc 0 0 GIC_SPI 267 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <3>;
+ #size-cells = <2>;
+ ranges = <0x01000000 0x0 0x00000000 0x10010000 0x0 0x10000>,
+ <0x02000000 0x0 0x10020000 0x10020000 0x0 0x7fe0000>,
+ <0x42000000 0x0 0x18000000 0x18000000 0x0 0x8000000>;
+ dma-ranges = <0x42000000 0x0 0x80000000 0x80000000 0x0 0x80000000>;
+ clocks = <&rcc CK_BUS_PCIE>;
+ resets = <&rcc PCIE_R>;
+ msi-parent = <&v2m0>;
+ access-controllers = <&rifsc 68>;
+ power-domains = <&CLUSTER_PD>;
+ status = "disabled";
+
+ pcie@0,0 {
+ device_type = "pci";
+ reg = <0x0 0x0 0x0 0x0 0x0>;
+ phys = <&combophy PHY_TYPE_PCIE>;
+ #address-cells = <3>;
+ #size-cells = <2>;
+ ranges;
+ };
+ };
};
bsec: efuse@44000000 {
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 10/11] arm64: dts: st: Add PCIe Endpoint mode on stm32mp251
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (8 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 09/11] arm64: dts: st: Add PCIe Root Complex mode on stm32mp251 Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-20 7:54 ` [PATCH v13 11/11] arm64: dts: st: Enable PCIe on the stm32mp257f-ev1 board Christian Bruel
2025-08-27 13:30 ` (subset) [PATCH v13 00/11] Add STM32MP25 PCIe drivers Manivannan Sadhasivam
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Add pcie_ep node to support STM32 MP25 PCIe driver based on the
DesignWare PCIe core configured as Endpoint mode
Acked-by: Manivannan Sadhasivam <mani@kernel.org>
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
arch/arm64/boot/dts/st/stm32mp251.dtsi | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/arch/arm64/boot/dts/st/stm32mp251.dtsi b/arch/arm64/boot/dts/st/stm32mp251.dtsi
index a3ed617a43d3..764b6a1623db 100644
--- a/arch/arm64/boot/dts/st/stm32mp251.dtsi
+++ b/arch/arm64/boot/dts/st/stm32mp251.dtsi
@@ -1664,6 +1664,21 @@ stmmac_axi_config_1: stmmac-axi-config {
};
};
+ pcie_ep: pcie-ep@48400000 {
+ compatible = "st,stm32mp25-pcie-ep";
+ reg = <0x48400000 0x100000>,
+ <0x48500000 0x100000>,
+ <0x48700000 0x80000>,
+ <0x10000000 0x10000000>;
+ reg-names = "dbi", "dbi2", "atu", "addr_space";
+ clocks = <&rcc CK_BUS_PCIE>;
+ resets = <&rcc PCIE_R>;
+ phys = <&combophy PHY_TYPE_PCIE>;
+ access-controllers = <&rifsc 68>;
+ power-domains = <&CLUSTER_PD>;
+ status = "disabled";
+ };
+
pcie_rc: pcie@48400000 {
compatible = "st,stm32mp25-pcie-rc";
device_type = "pci";
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v13 11/11] arm64: dts: st: Enable PCIe on the stm32mp257f-ev1 board
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (9 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 10/11] arm64: dts: st: Add PCIe Endpoint " Christian Bruel
@ 2025-08-20 7:54 ` Christian Bruel
2025-08-27 13:30 ` (subset) [PATCH v13 00/11] Add STM32MP25 PCIe drivers Manivannan Sadhasivam
11 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-20 7:54 UTC (permalink / raw)
To: christian.bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, p.zabel, shradha.t, mayank.rana, namcao,
qiang.yu, thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
Add PCIe RC and EP support on stm32mp257f-ev1 board.
Default to RC mode.
Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
---
arch/arm64/boot/dts/st/stm32mp257f-ev1.dts | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/arch/arm64/boot/dts/st/stm32mp257f-ev1.dts b/arch/arm64/boot/dts/st/stm32mp257f-ev1.dts
index 836b1958ce65..b20bff82da80 100644
--- a/arch/arm64/boot/dts/st/stm32mp257f-ev1.dts
+++ b/arch/arm64/boot/dts/st/stm32mp257f-ev1.dts
@@ -265,6 +265,27 @@ scmi_vdd_sdcard: regulator@23 {
};
};
+&pcie_ep {
+ pinctrl-names = "default", "init";
+ pinctrl-0 = <&pcie_pins_a>;
+ pinctrl-1 = <&pcie_init_pins_a>;
+ reset-gpios = <&gpioj 8 GPIO_ACTIVE_LOW>;
+ status = "disabled";
+};
+
+&pcie_rc {
+ pinctrl-names = "default", "init", "sleep";
+ pinctrl-0 = <&pcie_pins_a>;
+ pinctrl-1 = <&pcie_init_pins_a>;
+ pinctrl-2 = <&pcie_sleep_pins_a>;
+ status = "okay";
+
+ pcie@0,0 {
+ reset-gpios = <&gpioj 8 GPIO_ACTIVE_LOW>;
+ wake-gpios = <&gpioh 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
+ };
+};
+
&sdmmc1 {
pinctrl-names = "default", "opendrain", "sleep";
pinctrl-0 = <&sdmmc1_b4_pins_a>;
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v13 04/11] PCI: stm32: Add PCIe host support for STM32MP25
2025-08-20 7:54 ` [PATCH v13 04/11] PCI: stm32: Add PCIe host support for STM32MP25 Christian Bruel
@ 2025-08-25 9:15 ` Philipp Zabel
2025-08-25 14:47 ` Christian Bruel
0 siblings, 1 reply; 23+ messages in thread
From: Philipp Zabel @ 2025-08-25 9:15 UTC (permalink / raw)
To: Christian Bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, shradha.t, mayank.rana, namcao, qiang.yu,
thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
On Mi, 2025-08-20 at 09:54 +0200, Christian Bruel wrote:
> Add driver for the STM32MP25 SoC PCIe Gen1 2.5 GT/s and Gen2 5GT/s
> controller based on the DesignWare PCIe core.
>
> Supports MSI via GICv2m, Single Virtual Channel, Single Function
>
> Supports WAKE# GPIO.
>
> Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
> ---
> drivers/pci/controller/dwc/Kconfig | 12 +
> drivers/pci/controller/dwc/Makefile | 1 +
> drivers/pci/controller/dwc/pcie-stm32.c | 360 ++++++++++++++++++++++++
> drivers/pci/controller/dwc/pcie-stm32.h | 15 +
> 4 files changed, 388 insertions(+)
> create mode 100644 drivers/pci/controller/dwc/pcie-stm32.c
> create mode 100644 drivers/pci/controller/dwc/pcie-stm32.h
>
> diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig
> index deafc512b079..a8174817fd5b 100644
> --- a/drivers/pci/controller/dwc/Kconfig
> +++ b/drivers/pci/controller/dwc/Kconfig
> @@ -423,6 +423,18 @@ config PCIE_SPEAR13XX
> help
> Say Y here if you want PCIe support on SPEAr13XX SoCs.
>
> +config PCIE_STM32_HOST
> + tristate "STMicroelectronics STM32MP25 PCIe Controller (host mode)"
> + depends on ARCH_STM32 || COMPILE_TEST
> + depends on PCI_MSI
> + select PCIE_DW_HOST
> + help
> + Enables Root Complex (RC) support for the DesignWare core based PCIe
> + controller found in STM32MP25 SoC.
> +
> + This driver can also be built as a module. If so, the module
> + will be called pcie-stm32.
> +
> config PCI_DRA7XX
> tristate
>
> diff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile
> index 6919d27798d1..1307a87b1cf0 100644
> --- a/drivers/pci/controller/dwc/Makefile
> +++ b/drivers/pci/controller/dwc/Makefile
> @@ -31,6 +31,7 @@ obj-$(CONFIG_PCIE_UNIPHIER) += pcie-uniphier.o
> obj-$(CONFIG_PCIE_UNIPHIER_EP) += pcie-uniphier-ep.o
> obj-$(CONFIG_PCIE_VISCONTI_HOST) += pcie-visconti.o
> obj-$(CONFIG_PCIE_RCAR_GEN4) += pcie-rcar-gen4.o
> +obj-$(CONFIG_PCIE_STM32_HOST) += pcie-stm32.o
>
> # The following drivers are for devices that use the generic ACPI
> # pci_root.c driver but don't support standard ECAM config access.
> diff --git a/drivers/pci/controller/dwc/pcie-stm32.c b/drivers/pci/controller/dwc/pcie-stm32.c
> new file mode 100644
> index 000000000000..964fa6f674c8
> --- /dev/null
> +++ b/drivers/pci/controller/dwc/pcie-stm32.c
> @@ -0,0 +1,360 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * STMicroelectronics STM32MP25 PCIe root complex driver.
> + *
> + * Copyright (C) 2025 STMicroelectronics
> + * Author: Christian Bruel <christian.bruel@foss.st.com>
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/mfd/syscon.h>
> +#include <linux/of_platform.h>
> +#include <linux/phy/phy.h>
> +#include <linux/pinctrl/consumer.h>
> +#include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/pm_wakeirq.h>
> +#include <linux/regmap.h>
> +#include <linux/reset.h>
> +#include "pcie-designware.h"
> +#include "pcie-stm32.h"
> +#include "../../pci.h"
> +
> +struct stm32_pcie {
> + struct dw_pcie pci;
> + struct regmap *regmap;
> + struct reset_control *rst;
This could be a local variable in stm32_pcie_probe().
regards
Philipp
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 04/11] PCI: stm32: Add PCIe host support for STM32MP25
2025-08-25 9:15 ` Philipp Zabel
@ 2025-08-25 14:47 ` Christian Bruel
2025-08-25 15:56 ` Philipp Zabel
0 siblings, 1 reply; 23+ messages in thread
From: Christian Bruel @ 2025-08-25 14:47 UTC (permalink / raw)
To: Philipp Zabel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, shradha.t, mayank.rana, namcao, qiang.yu,
thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
On 8/25/25 11:15, Philipp Zabel wrote:
> On Mi, 2025-08-20 at 09:54 +0200, Christian Bruel wrote:
>> Add driver for the STM32MP25 SoC PCIe Gen1 2.5 GT/s and Gen2 5GT/s
>> controller based on the DesignWare PCIe core.
>>
>> Supports MSI via GICv2m, Single Virtual Channel, Single Function
>>
>> Supports WAKE# GPIO.
>>
>> Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
>> ---
>> drivers/pci/controller/dwc/Kconfig | 12 +
>> drivers/pci/controller/dwc/Makefile | 1 +
>> drivers/pci/controller/dwc/pcie-stm32.c | 360 ++++++++++++++++++++++++
>> drivers/pci/controller/dwc/pcie-stm32.h | 15 +
>> 4 files changed, 388 insertions(+)
>> create mode 100644 drivers/pci/controller/dwc/pcie-stm32.c
>> create mode 100644 drivers/pci/controller/dwc/pcie-stm32.h
>>
>> diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig
>> index deafc512b079..a8174817fd5b 100644
>> --- a/drivers/pci/controller/dwc/Kconfig
>> +++ b/drivers/pci/controller/dwc/Kconfig
>> @@ -423,6 +423,18 @@ config PCIE_SPEAR13XX
>> help
>> Say Y here if you want PCIe support on SPEAr13XX SoCs.
>>
>> +config PCIE_STM32_HOST
>> + tristate "STMicroelectronics STM32MP25 PCIe Controller (host mode)"
>> + depends on ARCH_STM32 || COMPILE_TEST
>> + depends on PCI_MSI
>> + select PCIE_DW_HOST
>> + help
>> + Enables Root Complex (RC) support for the DesignWare core based PCIe
>> + controller found in STM32MP25 SoC.
>> +
>> + This driver can also be built as a module. If so, the module
>> + will be called pcie-stm32.
>> +
>> config PCI_DRA7XX
>> tristate
>>
>> diff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile
>> index 6919d27798d1..1307a87b1cf0 100644
>> --- a/drivers/pci/controller/dwc/Makefile
>> +++ b/drivers/pci/controller/dwc/Makefile
>> @@ -31,6 +31,7 @@ obj-$(CONFIG_PCIE_UNIPHIER) += pcie-uniphier.o
>> obj-$(CONFIG_PCIE_UNIPHIER_EP) += pcie-uniphier-ep.o
>> obj-$(CONFIG_PCIE_VISCONTI_HOST) += pcie-visconti.o
>> obj-$(CONFIG_PCIE_RCAR_GEN4) += pcie-rcar-gen4.o
>> +obj-$(CONFIG_PCIE_STM32_HOST) += pcie-stm32.o
>>
>> # The following drivers are for devices that use the generic ACPI
>> # pci_root.c driver but don't support standard ECAM config access.
>> diff --git a/drivers/pci/controller/dwc/pcie-stm32.c b/drivers/pci/controller/dwc/pcie-stm32.c
>> new file mode 100644
>> index 000000000000..964fa6f674c8
>> --- /dev/null
>> +++ b/drivers/pci/controller/dwc/pcie-stm32.c
>> @@ -0,0 +1,360 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * STMicroelectronics STM32MP25 PCIe root complex driver.
>> + *
>> + * Copyright (C) 2025 STMicroelectronics
>> + * Author: Christian Bruel <christian.bruel@foss.st.com>
>> + */
>> +
>> +#include <linux/clk.h>
>> +#include <linux/mfd/syscon.h>
>> +#include <linux/of_platform.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/pinctrl/consumer.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/pm_runtime.h>
>> +#include <linux/pm_wakeirq.h>
>> +#include <linux/regmap.h>
>> +#include <linux/reset.h>
>> +#include "pcie-designware.h"
>> +#include "pcie-stm32.h"
>> +#include "../../pci.h"
>> +
>> +struct stm32_pcie {
>> + struct dw_pcie pci;
>> + struct regmap *regmap;
>> + struct reset_control *rst;
>
> This could be a local variable in stm32_pcie_probe().
Thank you for pointing that out.
Since we use the same common resources in stm32_pcie for both the host
and endpoint drivers, aligning the same fields in the struct stm32_pcie
seems more consistent.
Additionally, we could improve the code by moving regmap, clk, and rst
out of probe into a new function, stm32_pcie_resource_get().
Which approach do you think is best? Moving rst to stm32_pcie_probe()
offers slight optimization, while using a new stm32_pcie_resource_get()
provides better modularity.
Shall I re-spin a v14 with either of these options?
thank you,
Christian
>
> regards
> Philipp
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 04/11] PCI: stm32: Add PCIe host support for STM32MP25
2025-08-25 14:47 ` Christian Bruel
@ 2025-08-25 15:56 ` Philipp Zabel
0 siblings, 0 replies; 23+ messages in thread
From: Philipp Zabel @ 2025-08-25 15:56 UTC (permalink / raw)
To: Christian Bruel, lpieralisi, kwilczynski, mani, robh, bhelgaas,
krzk+dt, conor+dt, mcoquelin.stm32, alexandre.torgue,
linus.walleij, corbet, shradha.t, mayank.rana, namcao, qiang.yu,
thippeswamy.havalige, inochiama, quic_schintav
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
On Mo, 2025-08-25 at 16:47 +0200, Christian Bruel wrote:
>
> On 8/25/25 11:15, Philipp Zabel wrote:
> > On Mi, 2025-08-20 at 09:54 +0200, Christian Bruel wrote:
> > > Add driver for the STM32MP25 SoC PCIe Gen1 2.5 GT/s and Gen2 5GT/s
> > > controller based on the DesignWare PCIe core.
> > >
> > > Supports MSI via GICv2m, Single Virtual Channel, Single Function
> > >
> > > Supports WAKE# GPIO.
> > >
> > > Signed-off-by: Christian Bruel <christian.bruel@foss.st.com>
> > > ---
> > > drivers/pci/controller/dwc/Kconfig | 12 +
> > > drivers/pci/controller/dwc/Makefile | 1 +
> > > drivers/pci/controller/dwc/pcie-stm32.c | 360 ++++++++++++++++++++++++
> > > drivers/pci/controller/dwc/pcie-stm32.h | 15 +
> > > 4 files changed, 388 insertions(+)
> > > create mode 100644 drivers/pci/controller/dwc/pcie-stm32.c
> > > create mode 100644 drivers/pci/controller/dwc/pcie-stm32.h
> > >
> > > diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig
> > > index deafc512b079..a8174817fd5b 100644
> > > --- a/drivers/pci/controller/dwc/Kconfig
> > > +++ b/drivers/pci/controller/dwc/Kconfig
> > > @@ -423,6 +423,18 @@ config PCIE_SPEAR13XX
> > > help
> > > Say Y here if you want PCIe support on SPEAr13XX SoCs.
> > >
> > > +config PCIE_STM32_HOST
> > > + tristate "STMicroelectronics STM32MP25 PCIe Controller (host mode)"
> > > + depends on ARCH_STM32 || COMPILE_TEST
> > > + depends on PCI_MSI
> > > + select PCIE_DW_HOST
> > > + help
> > > + Enables Root Complex (RC) support for the DesignWare core based PCIe
> > > + controller found in STM32MP25 SoC.
> > > +
> > > + This driver can also be built as a module. If so, the module
> > > + will be called pcie-stm32.
> > > +
> > > config PCI_DRA7XX
> > > tristate
> > >
> > > diff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile
> > > index 6919d27798d1..1307a87b1cf0 100644
> > > --- a/drivers/pci/controller/dwc/Makefile
> > > +++ b/drivers/pci/controller/dwc/Makefile
> > > @@ -31,6 +31,7 @@ obj-$(CONFIG_PCIE_UNIPHIER) += pcie-uniphier.o
> > > obj-$(CONFIG_PCIE_UNIPHIER_EP) += pcie-uniphier-ep.o
> > > obj-$(CONFIG_PCIE_VISCONTI_HOST) += pcie-visconti.o
> > > obj-$(CONFIG_PCIE_RCAR_GEN4) += pcie-rcar-gen4.o
> > > +obj-$(CONFIG_PCIE_STM32_HOST) += pcie-stm32.o
> > >
> > > # The following drivers are for devices that use the generic ACPI
> > > # pci_root.c driver but don't support standard ECAM config access.
> > > diff --git a/drivers/pci/controller/dwc/pcie-stm32.c b/drivers/pci/controller/dwc/pcie-stm32.c
> > > new file mode 100644
> > > index 000000000000..964fa6f674c8
> > > --- /dev/null
> > > +++ b/drivers/pci/controller/dwc/pcie-stm32.c
> > > @@ -0,0 +1,360 @@
> > > +// SPDX-License-Identifier: GPL-2.0-only
> > > +/*
> > > + * STMicroelectronics STM32MP25 PCIe root complex driver.
> > > + *
> > > + * Copyright (C) 2025 STMicroelectronics
> > > + * Author: Christian Bruel <christian.bruel@foss.st.com>
> > > + */
> > > +
> > > +#include <linux/clk.h>
> > > +#include <linux/mfd/syscon.h>
> > > +#include <linux/of_platform.h>
> > > +#include <linux/phy/phy.h>
> > > +#include <linux/pinctrl/consumer.h>
> > > +#include <linux/platform_device.h>
> > > +#include <linux/pm_runtime.h>
> > > +#include <linux/pm_wakeirq.h>
> > > +#include <linux/regmap.h>
> > > +#include <linux/reset.h>
> > > +#include "pcie-designware.h"
> > > +#include "pcie-stm32.h"
> > > +#include "../../pci.h"
> > > +
> > > +struct stm32_pcie {
> > > + struct dw_pcie pci;
> > > + struct regmap *regmap;
> > > + struct reset_control *rst;
> >
> > This could be a local variable in stm32_pcie_probe().
>
> Thank you for pointing that out.
>
> Since we use the same common resources in stm32_pcie for both the host
> and endpoint drivers, aligning the same fields in the struct stm32_pcie
> seems more consistent.
I hadn't seen the host driver at that point.
Aligning struct stm32_pcie with another struct in another .c file as an
unwritten rule doesn't make sense to me. If parts of the structs should
be kept aligned between host and endpoint drivers, it would be better
to define a common base struct in a shared header.
> Additionally, we could improve the code by moving regmap, clk, and rst
> out of probe into a new function, stm32_pcie_resource_get().
>
> Which approach do you think is best? Moving rst to stm32_pcie_probe()
> offers slight optimization,
This option would be my preference, but it's not a strong one.
Storing a single pointer unnecessarily isn't a big deal.
My mind just went "where is it used? - oh, nowhere", so I thought I'd
point that out.
> while using a new stm32_pcie_resource_get()
> provides better modularity.
I think this isn't enough code to warrant sharing
stm32_pcie_resource_get() between host and endpoint drivers in the
absence of other shared code.
Whether splitting this out in each driver improves readability of the
probe functions is a matter of taste. I think it's fine as-is. I
wouldn't argue against the change either.
> Shall I re-spin a v14 with either of these options?
Don't respin just for this.
regards
Philipp
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: (subset) [PATCH v13 00/11] Add STM32MP25 PCIe drivers
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
` (10 preceding siblings ...)
2025-08-20 7:54 ` [PATCH v13 11/11] arm64: dts: st: Enable PCIe on the stm32mp257f-ev1 board Christian Bruel
@ 2025-08-27 13:30 ` Manivannan Sadhasivam
11 siblings, 0 replies; 23+ messages in thread
From: Manivannan Sadhasivam @ 2025-08-27 13:30 UTC (permalink / raw)
To: lpieralisi, kwilczynski, robh, bhelgaas, krzk+dt, conor+dt,
mcoquelin.stm32, alexandre.torgue, linus.walleij, corbet, p.zabel,
shradha.t, mayank.rana, namcao, qiang.yu, thippeswamy.havalige,
inochiama, quic_schintav, Christian Bruel
Cc: johan+linaro, linux-pci, devicetree, linux-stm32,
linux-arm-kernel, linux-kernel, linux-gpio, linux-doc
On Wed, 20 Aug 2025 09:54:00 +0200, Christian Bruel wrote:
> Changes in v13:
> - Rebase on pci/next
> - Replace access to dev->pins->init_state by new
> pinctrl_pm_select_init_state().
> - Document pinctrl PM state API.
> - Group GPIO PERST# de-assertion with PVPERL delay. (Bjorn)
>
> [...]
Applied, thanks!
[01/11] Documentation: pinctrl: Describe PM helper functions for standard states.
commit: 272dad3f84004079328e8f36b2292e7297460ffd
[02/11] pinctrl: Add pinctrl_pm_select_init_state helper function
commit: 08383cd479f8212fafee2f557b58cfd48818bee0
[03/11] dt-bindings: PCI: Add STM32MP25 PCIe Root Complex bindings
commit: 5ffa3d2f43a487f60e9f6f692aa8e22251446755
[04/11] PCI: stm32: Add PCIe host support for STM32MP25
commit: bb90c3dd42adba65fc2f26ecb16c1d27d74fa68b
[05/11] dt-bindings: PCI: Add STM32MP25 PCIe Endpoint bindings
commit: 89f6842156333cca9abb8e641e28100b708bed00
[06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
commit: 679ebde120900c246925a374ea1ad39392d6e84b
[07/11] MAINTAINERS: add entry for ST STM32MP25 PCIe drivers
commit: 3cf6b1bf4d250c15ebe537d55b5e09a902c41971
Best regards,
--
Manivannan Sadhasivam <mani@kernel.org>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
2025-08-20 7:54 ` [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25 Christian Bruel
@ 2025-08-27 18:58 ` Bjorn Helgaas
2025-08-28 12:12 ` Christian Bruel
2025-08-28 17:22 ` Bjorn Helgaas
1 sibling, 1 reply; 23+ messages in thread
From: Bjorn Helgaas @ 2025-08-27 18:58 UTC (permalink / raw)
To: Christian Bruel
Cc: lpieralisi, kwilczynski, mani, robh, bhelgaas, krzk+dt, conor+dt,
mcoquelin.stm32, alexandre.torgue, linus.walleij, corbet, p.zabel,
shradha.t, mayank.rana, namcao, qiang.yu, thippeswamy.havalige,
inochiama, quic_schintav, johan+linaro, linux-pci, devicetree,
linux-stm32, linux-arm-kernel, linux-kernel, linux-gpio,
linux-doc
On Wed, Aug 20, 2025 at 09:54:06AM +0200, Christian Bruel wrote:
> Add driver to configure the STM32MP25 SoC PCIe Gen1 2.5GT/s or Gen2 5GT/s
> controller based on the DesignWare PCIe core in endpoint mode.
> +static void stm32_pcie_perst_deassert(struct dw_pcie *pci)
> +{
> + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
> + struct device *dev = pci->dev;
> + struct dw_pcie_ep *ep = &pci->ep;
> + int ret;
> +
> + dev_dbg(dev, "PERST de-asserted by host\n");
> +
> + ret = pm_runtime_resume_and_get(dev);
> + if (ret < 0) {
> + dev_err(dev, "Failed to resume runtime PM: %d\n", ret);
> + return;
> + }
> +
> + ret = stm32_pcie_enable_resources(stm32_pcie);
> + if (ret) {
> + dev_err(dev, "Failed to enable resources: %d\n", ret);
> + goto err_pm_put_sync;
> + }
> +
> + /*
> + * Need to reprogram the configuration space registers here because the
> + * DBI registers were incorrectly reset by the PHY RCC during phy_init().
Is this incorrect reset of DBI registers a software issue or some kind
of hardware erratum that might be fixed someday? Or maybe it's just a
characteristic of the hardware and thus not really "incorrect"?
I do see that qcom_pcie_perst_deassert() in pcie-qcom-ep.c also calls
dw_pcie_ep_init_registers() in the qcom_pcie_ep_perst_irq_thread()
path.
So does pex_ep_event_pex_rst_deassert() (pcie-tegra194.c) in the
tegra_pcie_ep_pex_rst_irq() path.
But as far as I can tell, none of the other dwc drivers need this, so
maybe it's something to do with the glue around the DWC core?
> + */
> + ret = dw_pcie_ep_init_registers(ep);
> + if (ret) {
> + dev_err(dev, "Failed to complete initialization: %d\n", ret);
> + goto err_disable_resources;
> + }
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
2025-08-27 18:58 ` Bjorn Helgaas
@ 2025-08-28 12:12 ` Christian Bruel
2025-08-28 17:16 ` Bjorn Helgaas
0 siblings, 1 reply; 23+ messages in thread
From: Christian Bruel @ 2025-08-28 12:12 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: lpieralisi, kwilczynski, mani, robh, bhelgaas, krzk+dt, conor+dt,
mcoquelin.stm32, alexandre.torgue, linus.walleij, corbet, p.zabel,
shradha.t, mayank.rana, namcao, qiang.yu, thippeswamy.havalige,
inochiama, quic_schintav, johan+linaro, linux-pci, devicetree,
linux-stm32, linux-arm-kernel, linux-kernel, linux-gpio,
linux-doc
On 8/27/25 20:58, Bjorn Helgaas wrote:
> On Wed, Aug 20, 2025 at 09:54:06AM +0200, Christian Bruel wrote:
>> Add driver to configure the STM32MP25 SoC PCIe Gen1 2.5GT/s or Gen2 5GT/s
>> controller based on the DesignWare PCIe core in endpoint mode.
>
>> +static void stm32_pcie_perst_deassert(struct dw_pcie *pci)
>> +{
>> + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
>> + struct device *dev = pci->dev;
>> + struct dw_pcie_ep *ep = &pci->ep;
>> + int ret;
>> +
>> + dev_dbg(dev, "PERST de-asserted by host\n");
>> +
>> + ret = pm_runtime_resume_and_get(dev);
>> + if (ret < 0) {
>> + dev_err(dev, "Failed to resume runtime PM: %d\n", ret);
>> + return;
>> + }
>> +
>> + ret = stm32_pcie_enable_resources(stm32_pcie);
>> + if (ret) {
>> + dev_err(dev, "Failed to enable resources: %d\n", ret);
>> + goto err_pm_put_sync;
>> + }
>> +
>> + /*
>> + * Need to reprogram the configuration space registers here because the
>> + * DBI registers were incorrectly reset by the PHY RCC during phy_init().
>
> Is this incorrect reset of DBI registers a software issue or some kind
> of hardware erratum that might be fixed someday? Or maybe it's just a
> characteristic of the hardware and thus not really "incorrect"?
>
> I do see that qcom_pcie_perst_deassert() in pcie-qcom-ep.c also calls
> dw_pcie_ep_init_registers() in the qcom_pcie_ep_perst_irq_thread()
> path.
>
> So does pex_ep_event_pex_rst_deassert() (pcie-tegra194.c) in the
> tegra_pcie_ep_pex_rst_irq() path.
>
> But as far as I can tell, none of the other dwc drivers need this, so
> maybe it's something to do with the glue around the DWC core?
The RCC PHY reset is connected to the Synopsys cold reset logic, which
explains why the registers need to be restored. This point has been
addressed in the reference manual.
I am not sure if the tegra194 and qcom drivers restore the registers for
the same reason. But refactoring this into the DWC core would require a
runtime condition to test for persistent registers or support for warm
reset.
Best Regards
Christian
>
>> + */
>> + ret = dw_pcie_ep_init_registers(ep);
>> + if (ret) {
>> + dev_err(dev, "Failed to complete initialization: %d\n", ret);
>> + goto err_disable_resources;
>> + }
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
2025-08-28 12:12 ` Christian Bruel
@ 2025-08-28 17:16 ` Bjorn Helgaas
2025-08-28 18:46 ` Christian Bruel
0 siblings, 1 reply; 23+ messages in thread
From: Bjorn Helgaas @ 2025-08-28 17:16 UTC (permalink / raw)
To: Christian Bruel
Cc: lpieralisi, kwilczynski, mani, robh, bhelgaas, krzk+dt, conor+dt,
mcoquelin.stm32, alexandre.torgue, linus.walleij, corbet, p.zabel,
shradha.t, mayank.rana, namcao, qiang.yu, thippeswamy.havalige,
inochiama, quic_schintav, johan+linaro, linux-pci, devicetree,
linux-stm32, linux-arm-kernel, linux-kernel, linux-gpio,
linux-doc
On Thu, Aug 28, 2025 at 02:12:57PM +0200, Christian Bruel wrote:
> On 8/27/25 20:58, Bjorn Helgaas wrote:
> > On Wed, Aug 20, 2025 at 09:54:06AM +0200, Christian Bruel wrote:
> > > Add driver to configure the STM32MP25 SoC PCIe Gen1 2.5GT/s or Gen2 5GT/s
> > > controller based on the DesignWare PCIe core in endpoint mode.
> >
> > > +static void stm32_pcie_perst_deassert(struct dw_pcie *pci)
> > > +{
> > > + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
> > > + struct device *dev = pci->dev;
> > > + struct dw_pcie_ep *ep = &pci->ep;
> > > + int ret;
> > > +
> > > + dev_dbg(dev, "PERST de-asserted by host\n");
> > > +
> > > + ret = pm_runtime_resume_and_get(dev);
> > > + if (ret < 0) {
> > > + dev_err(dev, "Failed to resume runtime PM: %d\n", ret);
> > > + return;
> > > + }
> > > +
> > > + ret = stm32_pcie_enable_resources(stm32_pcie);
> > > + if (ret) {
> > > + dev_err(dev, "Failed to enable resources: %d\n", ret);
> > > + goto err_pm_put_sync;
> > > + }
> > > +
> > > + /*
> > > + * Need to reprogram the configuration space registers here because the
> > > + * DBI registers were incorrectly reset by the PHY RCC during phy_init().
> >
> > Is this incorrect reset of DBI registers a software issue or some kind
> > of hardware erratum that might be fixed someday? Or maybe it's just a
> > characteristic of the hardware and thus not really "incorrect"?
> >
> > I do see that qcom_pcie_perst_deassert() in pcie-qcom-ep.c also calls
> > dw_pcie_ep_init_registers() in the qcom_pcie_ep_perst_irq_thread()
> > path.
> >
> > So does pex_ep_event_pex_rst_deassert() (pcie-tegra194.c) in the
> > tegra_pcie_ep_pex_rst_irq() path.
> >
> > But as far as I can tell, none of the other dwc drivers need this, so
> > maybe it's something to do with the glue around the DWC core?
>
> The RCC PHY reset is connected to the Synopsys cold reset logic, which
> explains why the registers need to be restored. This point has been
> addressed in the reference manual.
OK. I dropped "incorrectly" from the comment because I think future
readers will wonder about whether or how this could be fixed, and it
sounds like it's just a feature of the hardware that we need to deal
with.
> > > + */
> > > + ret = dw_pcie_ep_init_registers(ep);
> > > + if (ret) {
> > > + dev_err(dev, "Failed to complete initialization: %d\n", ret);
> > > + goto err_disable_resources;
> > > + }
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
2025-08-20 7:54 ` [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25 Christian Bruel
2025-08-27 18:58 ` Bjorn Helgaas
@ 2025-08-28 17:22 ` Bjorn Helgaas
2025-08-28 19:06 ` Christian Bruel
1 sibling, 1 reply; 23+ messages in thread
From: Bjorn Helgaas @ 2025-08-28 17:22 UTC (permalink / raw)
To: Christian Bruel
Cc: lpieralisi, kwilczynski, mani, robh, bhelgaas, krzk+dt, conor+dt,
mcoquelin.stm32, alexandre.torgue, linus.walleij, corbet, p.zabel,
shradha.t, mayank.rana, namcao, qiang.yu, thippeswamy.havalige,
inochiama, quic_schintav, johan+linaro, linux-pci, devicetree,
linux-stm32, linux-arm-kernel, linux-kernel, linux-gpio,
linux-doc
On Wed, Aug 20, 2025 at 09:54:06AM +0200, Christian Bruel wrote:
> Add driver to configure the STM32MP25 SoC PCIe Gen1 2.5GT/s or Gen2 5GT/s
> controller based on the DesignWare PCIe core in endpoint mode.
> ...
> +static int stm32_pcie_start_link(struct dw_pcie *pci)
> +{
> + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
> + int ret;
> +
> + if (stm32_pcie->link_status == STM32_PCIE_EP_LINK_ENABLED) {
> + dev_dbg(pci->dev, "Link is already enabled\n");
> + return 0;
> + }
While looking at the "incorrectly reset" comment, I noticed
stm32_pcie->link_status and wondered why it exists. It looks like
it's only used in stm32_pcie_start_link() and stm32_pcie_stop_link(),
and I don't see similar tracking in other drivers.
It feels a little racy because the link might go down for reasons
other than calling stm32_pcie_stop_link().
> + dev_dbg(pci->dev, "Enable link\n");
> +
> + ret = stm32_pcie_enable_link(pci);
> + if (ret) {
> + dev_err(pci->dev, "PCIe cannot establish link: %d\n", ret);
> + return ret;
> + }
> +
> + enable_irq(stm32_pcie->perst_irq);
> +
> + stm32_pcie->link_status = STM32_PCIE_EP_LINK_ENABLED;
> +
> + return 0;
> +}
> +
> +static void stm32_pcie_stop_link(struct dw_pcie *pci)
> +{
> + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
> +
> + if (stm32_pcie->link_status == STM32_PCIE_EP_LINK_DISABLED) {
> + dev_dbg(pci->dev, "Link is already disabled\n");
> + return;
> + }
> +
> + dev_dbg(pci->dev, "Disable link\n");
> +
> + disable_irq(stm32_pcie->perst_irq);
> +
> + stm32_pcie_disable_link(pci);
> +
> + stm32_pcie->link_status = STM32_PCIE_EP_LINK_DISABLED;
> +}
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
2025-08-28 17:16 ` Bjorn Helgaas
@ 2025-08-28 18:46 ` Christian Bruel
0 siblings, 0 replies; 23+ messages in thread
From: Christian Bruel @ 2025-08-28 18:46 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: lpieralisi, kwilczynski, mani, robh, bhelgaas, krzk+dt, conor+dt,
mcoquelin.stm32, alexandre.torgue, linus.walleij, corbet, p.zabel,
shradha.t, mayank.rana, namcao, qiang.yu, thippeswamy.havalige,
inochiama, quic_schintav, johan+linaro, linux-pci, devicetree,
linux-stm32, linux-arm-kernel, linux-kernel, linux-gpio,
linux-doc
On 8/28/25 19:16, Bjorn Helgaas wrote:
> On Thu, Aug 28, 2025 at 02:12:57PM +0200, Christian Bruel wrote:
>> On 8/27/25 20:58, Bjorn Helgaas wrote:
>>> On Wed, Aug 20, 2025 at 09:54:06AM +0200, Christian Bruel wrote:
>>>> Add driver to configure the STM32MP25 SoC PCIe Gen1 2.5GT/s or Gen2 5GT/s
>>>> controller based on the DesignWare PCIe core in endpoint mode.
>>>
>>>> +static void stm32_pcie_perst_deassert(struct dw_pcie *pci)
>>>> +{
>>>> + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
>>>> + struct device *dev = pci->dev;
>>>> + struct dw_pcie_ep *ep = &pci->ep;
>>>> + int ret;
>>>> +
>>>> + dev_dbg(dev, "PERST de-asserted by host\n");
>>>> +
>>>> + ret = pm_runtime_resume_and_get(dev);
>>>> + if (ret < 0) {
>>>> + dev_err(dev, "Failed to resume runtime PM: %d\n", ret);
>>>> + return;
>>>> + }
>>>> +
>>>> + ret = stm32_pcie_enable_resources(stm32_pcie);
>>>> + if (ret) {
>>>> + dev_err(dev, "Failed to enable resources: %d\n", ret);
>>>> + goto err_pm_put_sync;
>>>> + }
>>>> +
>>>> + /*
>>>> + * Need to reprogram the configuration space registers here because the
>>>> + * DBI registers were incorrectly reset by the PHY RCC during phy_init().
>>>
>>> Is this incorrect reset of DBI registers a software issue or some kind
>>> of hardware erratum that might be fixed someday? Or maybe it's just a
>>> characteristic of the hardware and thus not really "incorrect"?
>>>
>>> I do see that qcom_pcie_perst_deassert() in pcie-qcom-ep.c also calls
>>> dw_pcie_ep_init_registers() in the qcom_pcie_ep_perst_irq_thread()
>>> path.
>>>
>>> So does pex_ep_event_pex_rst_deassert() (pcie-tegra194.c) in the
>>> tegra_pcie_ep_pex_rst_irq() path.
>>>
>>> But as far as I can tell, none of the other dwc drivers need this, so
>>> maybe it's something to do with the glue around the DWC core?
>>
>> The RCC PHY reset is connected to the Synopsys cold reset logic, which
>> explains why the registers need to be restored. This point has been
>> addressed in the reference manual.
>
> OK. I dropped "incorrectly" from the comment because I think future
> readers will wonder about whether or how this could be fixed, and it
> sounds like it's just a feature of the hardware that we need to deal
> with.
OK, thank you. "unexpectedly" would have been appropriate, but just drop
it is even better.
>
>>>> + */
>>>> + ret = dw_pcie_ep_init_registers(ep);
>>>> + if (ret) {
>>>> + dev_err(dev, "Failed to complete initialization: %d\n", ret);
>>>> + goto err_disable_resources;
>>>> + }
>>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
2025-08-28 17:22 ` Bjorn Helgaas
@ 2025-08-28 19:06 ` Christian Bruel
2025-08-28 19:20 ` Bjorn Helgaas
0 siblings, 1 reply; 23+ messages in thread
From: Christian Bruel @ 2025-08-28 19:06 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: lpieralisi, kwilczynski, mani, robh, bhelgaas, krzk+dt, conor+dt,
mcoquelin.stm32, alexandre.torgue, linus.walleij, corbet, p.zabel,
shradha.t, mayank.rana, namcao, qiang.yu, thippeswamy.havalige,
inochiama, quic_schintav, johan+linaro, linux-pci, devicetree,
linux-stm32, linux-arm-kernel, linux-kernel, linux-gpio,
linux-doc
On 8/28/25 19:22, Bjorn Helgaas wrote:
> On Wed, Aug 20, 2025 at 09:54:06AM +0200, Christian Bruel wrote:
>> Add driver to configure the STM32MP25 SoC PCIe Gen1 2.5GT/s or Gen2 5GT/s
>> controller based on the DesignWare PCIe core in endpoint mode.
>> ...
>
>> +static int stm32_pcie_start_link(struct dw_pcie *pci)
>> +{
>> + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
>> + int ret;
>> +
>> + if (stm32_pcie->link_status == STM32_PCIE_EP_LINK_ENABLED) {
>> + dev_dbg(pci->dev, "Link is already enabled\n");
>> + return 0;
>> + }
>
> While looking at the "incorrectly reset" comment, I noticed
> stm32_pcie->link_status and wondered why it exists. It looks like
> it's only used in stm32_pcie_start_link() and stm32_pcie_stop_link(),
> and I don't see similar tracking in other drivers.
>
> It feels a little racy because the link might go down for reasons
> other than calling stm32_pcie_stop_link().
I think that as an excess of paranoid that was meant to protect against
a driver unbind when the link hasn’t started yet. In that case,
stm32_pcie_remove() would disable a link that’s already disabled.
But that shouldn’t be a problem to disable twice the ltssm enable bit,
as well as the perst irq. I’ll look into removing it. Is it okay if I do
this with a fixup patch?
thank you
Christian
>
>> + dev_dbg(pci->dev, "Enable link\n");
>> +
>> + ret = stm32_pcie_enable_link(pci);
>> + if (ret) {
>> + dev_err(pci->dev, "PCIe cannot establish link: %d\n", ret);
>> + return ret;
>> + }
>> +
>> + enable_irq(stm32_pcie->perst_irq);
>> +
>> + stm32_pcie->link_status = STM32_PCIE_EP_LINK_ENABLED;
>> +
>> + return 0;
>> +}
>> +
>> +static void stm32_pcie_stop_link(struct dw_pcie *pci)
>> +{
>> + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
>> +
>> + if (stm32_pcie->link_status == STM32_PCIE_EP_LINK_DISABLED) {
>> + dev_dbg(pci->dev, "Link is already disabled\n");
>> + return;
>> + }
>> +
>> + dev_dbg(pci->dev, "Disable link\n");
>> +
>> + disable_irq(stm32_pcie->perst_irq);
>> +
>> + stm32_pcie_disable_link(pci);
>> +
>> + stm32_pcie->link_status = STM32_PCIE_EP_LINK_DISABLED;
>> +}
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25
2025-08-28 19:06 ` Christian Bruel
@ 2025-08-28 19:20 ` Bjorn Helgaas
0 siblings, 0 replies; 23+ messages in thread
From: Bjorn Helgaas @ 2025-08-28 19:20 UTC (permalink / raw)
To: Christian Bruel
Cc: lpieralisi, kwilczynski, mani, robh, bhelgaas, krzk+dt, conor+dt,
mcoquelin.stm32, alexandre.torgue, linus.walleij, corbet, p.zabel,
shradha.t, mayank.rana, namcao, qiang.yu, thippeswamy.havalige,
inochiama, quic_schintav, johan+linaro, linux-pci, devicetree,
linux-stm32, linux-arm-kernel, linux-kernel, linux-gpio,
linux-doc
On Thu, Aug 28, 2025 at 09:06:33PM +0200, Christian Bruel wrote:
> On 8/28/25 19:22, Bjorn Helgaas wrote:
> > On Wed, Aug 20, 2025 at 09:54:06AM +0200, Christian Bruel wrote:
> > > Add driver to configure the STM32MP25 SoC PCIe Gen1 2.5GT/s or Gen2 5GT/s
> > > controller based on the DesignWare PCIe core in endpoint mode.
> > > ...
> >
> > > +static int stm32_pcie_start_link(struct dw_pcie *pci)
> > > +{
> > > + struct stm32_pcie *stm32_pcie = to_stm32_pcie(pci);
> > > + int ret;
> > > +
> > > + if (stm32_pcie->link_status == STM32_PCIE_EP_LINK_ENABLED) {
> > > + dev_dbg(pci->dev, "Link is already enabled\n");
> > > + return 0;
> > > + }
> >
> > While looking at the "incorrectly reset" comment, I noticed
> > stm32_pcie->link_status and wondered why it exists. It looks like
> > it's only used in stm32_pcie_start_link() and stm32_pcie_stop_link(),
> > and I don't see similar tracking in other drivers.
> >
> > It feels a little racy because the link might go down for reasons
> > other than calling stm32_pcie_stop_link().
>
> I think that as an excess of paranoid that was meant to protect against a
> driver unbind when the link hasn’t started yet. In that case,
> stm32_pcie_remove() would disable a link that’s already disabled.
>
> But that shouldn’t be a problem to disable twice the ltssm enable bit, as
> well as the perst irq. I’ll look into removing it. Is it okay if I do this
> with a fixup patch?
Sure. We'll put it in pci/next as-is, and if/when you post a patch to
remove link_status, we'll squash it in.
Bjorn
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2025-08-28 19:20 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-20 7:54 [PATCH v13 00/11] Add STM32MP25 PCIe drivers Christian Bruel
2025-08-20 7:54 ` [PATCH v13 01/11] Documentation: pinctrl: Describe PM helper functions for standard states Christian Bruel
2025-08-20 7:54 ` [PATCH v13 02/11] pinctrl: Add pinctrl_pm_select_init_state helper function Christian Bruel
2025-08-20 7:54 ` [PATCH v13 03/11] dt-bindings: PCI: Add STM32MP25 PCIe Root Complex bindings Christian Bruel
2025-08-20 7:54 ` [PATCH v13 04/11] PCI: stm32: Add PCIe host support for STM32MP25 Christian Bruel
2025-08-25 9:15 ` Philipp Zabel
2025-08-25 14:47 ` Christian Bruel
2025-08-25 15:56 ` Philipp Zabel
2025-08-20 7:54 ` [PATCH v13 05/11] dt-bindings: PCI: Add STM32MP25 PCIe Endpoint bindings Christian Bruel
2025-08-20 7:54 ` [PATCH v13 06/11] PCI: stm32: Add PCIe Endpoint support for STM32MP25 Christian Bruel
2025-08-27 18:58 ` Bjorn Helgaas
2025-08-28 12:12 ` Christian Bruel
2025-08-28 17:16 ` Bjorn Helgaas
2025-08-28 18:46 ` Christian Bruel
2025-08-28 17:22 ` Bjorn Helgaas
2025-08-28 19:06 ` Christian Bruel
2025-08-28 19:20 ` Bjorn Helgaas
2025-08-20 7:54 ` [PATCH v13 07/11] MAINTAINERS: add entry for ST STM32MP25 PCIe drivers Christian Bruel
2025-08-20 7:54 ` [PATCH v13 08/11] arm64: dts: st: add PCIe pinctrl entries in stm32mp25-pinctrl.dtsi Christian Bruel
2025-08-20 7:54 ` [PATCH v13 09/11] arm64: dts: st: Add PCIe Root Complex mode on stm32mp251 Christian Bruel
2025-08-20 7:54 ` [PATCH v13 10/11] arm64: dts: st: Add PCIe Endpoint " Christian Bruel
2025-08-20 7:54 ` [PATCH v13 11/11] arm64: dts: st: Enable PCIe on the stm32mp257f-ev1 board Christian Bruel
2025-08-27 13:30 ` (subset) [PATCH v13 00/11] Add STM32MP25 PCIe drivers 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).