* [PATCH 01/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific reg-name
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-25 15:49 ` Rob Herring
2024-04-24 15:16 ` [PATCH 02/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific interrupt-names Niklas Cassel
` (10 subsequent siblings)
11 siblings, 1 reply; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
Considering that some drivers (e.g. pcie-dw-rockchip.c) already use the
reg-name "apb" for the device tree binding in Root Complex mode
(snps,dw-pcie.yaml), it doesn't make sense that those drivers should use a
different reg-name when running in Endpoint mode (snps,dw-pcie-ep.yaml).
Therefore, since "apb" is already defined in snps,dw-pcie.yaml, add it
also for snps,dw-pcie-ep.yaml.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
index bbdb01d22848..00dec01f1f73 100644
--- a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
+++ b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
@@ -100,7 +100,7 @@ properties:
for new bindings.
oneOf:
- description: See native 'elbi/app' CSR region for details.
- enum: [ link, appl ]
+ enum: [ apb, link, appl ]
- description: See native 'atu' CSR region for details.
enum: [ atu_dma ]
allOf:
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 01/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific reg-name
2024-04-24 15:16 ` [PATCH 01/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific reg-name Niklas Cassel
@ 2024-04-25 15:49 ` Rob Herring
2024-04-25 15:54 ` Rob Herring
0 siblings, 1 reply; 21+ messages in thread
From: Rob Herring @ 2024-04-25 15:49 UTC (permalink / raw)
To: Niklas Cassel
Cc: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue, linux-pci, devicetree, linux-rockchip
On Wed, Apr 24, 2024 at 05:16:19PM +0200, Niklas Cassel wrote:
> Considering that some drivers (e.g. pcie-dw-rockchip.c) already use the
> reg-name "apb" for the device tree binding in Root Complex mode
> (snps,dw-pcie.yaml), it doesn't make sense that those drivers should use a
> different reg-name when running in Endpoint mode (snps,dw-pcie-ep.yaml).
>
> Therefore, since "apb" is already defined in snps,dw-pcie.yaml, add it
> also for snps,dw-pcie-ep.yaml.
>
> Signed-off-by: Niklas Cassel <cassel@kernel.org>
> ---
> Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
> index bbdb01d22848..00dec01f1f73 100644
> --- a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
> +++ b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
> @@ -100,7 +100,7 @@ properties:
> for new bindings.
> oneOf:
> - description: See native 'elbi/app' CSR region for details.
> - enum: [ link, appl ]
> + enum: [ apb, link, appl ]
This section is for existing bindings. IOW, don't use or add to them
for new users. New users should "See native 'elbi/app' CSR region".
Rob
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 01/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific reg-name
2024-04-25 15:49 ` Rob Herring
@ 2024-04-25 15:54 ` Rob Herring
0 siblings, 0 replies; 21+ messages in thread
From: Rob Herring @ 2024-04-25 15:54 UTC (permalink / raw)
To: Niklas Cassel
Cc: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue, linux-pci, devicetree, linux-rockchip
On Thu, Apr 25, 2024 at 10:49:28AM -0500, Rob Herring wrote:
> On Wed, Apr 24, 2024 at 05:16:19PM +0200, Niklas Cassel wrote:
> > Considering that some drivers (e.g. pcie-dw-rockchip.c) already use the
> > reg-name "apb" for the device tree binding in Root Complex mode
> > (snps,dw-pcie.yaml), it doesn't make sense that those drivers should use a
> > different reg-name when running in Endpoint mode (snps,dw-pcie-ep.yaml).
> >
> > Therefore, since "apb" is already defined in snps,dw-pcie.yaml, add it
> > also for snps,dw-pcie-ep.yaml.
> >
> > Signed-off-by: Niklas Cassel <cassel@kernel.org>
> > ---
> > Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
> > index bbdb01d22848..00dec01f1f73 100644
> > --- a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
> > +++ b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
> > @@ -100,7 +100,7 @@ properties:
> > for new bindings.
> > oneOf:
> > - description: See native 'elbi/app' CSR region for details.
> > - enum: [ link, appl ]
> > + enum: [ apb, link, appl ]
>
> This section is for existing bindings. IOW, don't use or add to them
> for new users. New users should "See native 'elbi/app' CSR region".
Err, I guess this is an existing user for the most part.
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 02/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific interrupt-names
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
2024-04-24 15:16 ` [PATCH 01/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific reg-name Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-25 15:55 ` Rob Herring
2024-04-24 15:16 ` [PATCH 03/12] dt-bindings: PCI: snps,dw-pcie-ep: Add tx_int{a,b,c,d} legacy irqs Niklas Cassel
` (9 subsequent siblings)
11 siblings, 1 reply; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
Considering that some drivers (e.g. pcie-dw-rockchip.c) already use the
interrupt-names "sys", "pmc", "msg", "err" for the device tree binding in
Root Complex mode (snps,dw-pcie.yaml), it doesn't make sense that those
drivers should use different interrupt-names when running in Endpoint mode
(snps,dw-pcie-ep.yaml).
Therefore, since "sys", "pmc", "msg", "err" are already defined in
snps,dw-pcie.yaml, add them also for snps,dw-pcie-ep.yaml.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
index 00dec01f1f73..f5f12cbc2cb3 100644
--- a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
+++ b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
@@ -156,7 +156,7 @@ properties:
for new bindings.
oneOf:
- description: See native "app" IRQ for details
- enum: [ intr ]
+ enum: [ intr, sys, pmc, msg, err ]
max-functions:
maximum: 32
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 02/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific interrupt-names
2024-04-24 15:16 ` [PATCH 02/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific interrupt-names Niklas Cassel
@ 2024-04-25 15:55 ` Rob Herring
0 siblings, 0 replies; 21+ messages in thread
From: Rob Herring @ 2024-04-25 15:55 UTC (permalink / raw)
To: Niklas Cassel
Cc: Shawn Lin, Krzysztof Wilczyński, devicetree, Jingoo Han,
Conor Dooley, Arnd Bergmann, Lorenzo Pieralisi, linux-rockchip,
Bjorn Helgaas, Damien Le Moal, Jon Lin, Kishon Vijay Abraham I,
linux-pci, Krzysztof Kozlowski, Manivannan Sadhasivam,
Heiko Stuebner, Simon Xue
On Wed, 24 Apr 2024 17:16:20 +0200, Niklas Cassel wrote:
> Considering that some drivers (e.g. pcie-dw-rockchip.c) already use the
> interrupt-names "sys", "pmc", "msg", "err" for the device tree binding in
> Root Complex mode (snps,dw-pcie.yaml), it doesn't make sense that those
> drivers should use different interrupt-names when running in Endpoint mode
> (snps,dw-pcie-ep.yaml).
>
> Therefore, since "sys", "pmc", "msg", "err" are already defined in
> snps,dw-pcie.yaml, add them also for snps,dw-pcie-ep.yaml.
>
> Signed-off-by: Niklas Cassel <cassel@kernel.org>
> ---
> Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 03/12] dt-bindings: PCI: snps,dw-pcie-ep: Add tx_int{a,b,c,d} legacy irqs
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
2024-04-24 15:16 ` [PATCH 01/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific reg-name Niklas Cassel
2024-04-24 15:16 ` [PATCH 02/12] dt-bindings: PCI: snps,dw-pcie-ep: Add vendor specific interrupt-names Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-25 16:20 ` Rob Herring
2024-04-24 15:16 ` [PATCH 04/12] dt-bindings: rockchip: Add DesignWare based PCIe Endpoint controller Niklas Cassel
` (8 subsequent siblings)
11 siblings, 1 reply; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
The DWC core has four interrupt signals: tx_inta, tx_intb, tx_intc, tx_intd
that are triggered when the PCIe controller (when running in Endpoint mode)
has sent an Assert_INTA Message to the upstream device.
Some DWC controllers have these interrupt in a combined interrupt signal.
Add the description of these interrupts to the device tree binding.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
index f5f12cbc2cb3..f474b9e3fc7e 100644
--- a/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
+++ b/Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
@@ -151,6 +151,15 @@ properties:
Application-specific IRQ raised depending on the vendor-specific
events basis.
const: app
+ - description:
+ Interrupts triggered when the controller itself (in Endpoint mode)
+ has sent an Assert_INT{A,B,C,D}/Desassert_INT{A,B,C,D} message to
+ the upstream device.
+ pattern: "^tx_int(a|b|c|d)$"
+ - description:
+ Combined interrupt signal raised when the controller has sent an
+ Assert_INT{A,B,C,D} message. See "^tx_int(a|b|c|d)$" for details.
+ const: legacy
- description:
Vendor-specific IRQ names. Consider using the generic names above
for new bindings.
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 03/12] dt-bindings: PCI: snps,dw-pcie-ep: Add tx_int{a,b,c,d} legacy irqs
2024-04-24 15:16 ` [PATCH 03/12] dt-bindings: PCI: snps,dw-pcie-ep: Add tx_int{a,b,c,d} legacy irqs Niklas Cassel
@ 2024-04-25 16:20 ` Rob Herring
0 siblings, 0 replies; 21+ messages in thread
From: Rob Herring @ 2024-04-25 16:20 UTC (permalink / raw)
To: Niklas Cassel
Cc: linux-pci, Simon Xue, linux-rockchip, Manivannan Sadhasivam,
Jingoo Han, Damien Le Moal, Bjorn Helgaas, Lorenzo Pieralisi,
Shawn Lin, Conor Dooley, devicetree, Krzysztof Kozlowski,
Krzysztof Wilczyński, Kishon Vijay Abraham I,
Heiko Stuebner, Arnd Bergmann, Jon Lin
On Wed, 24 Apr 2024 17:16:21 +0200, Niklas Cassel wrote:
> The DWC core has four interrupt signals: tx_inta, tx_intb, tx_intc, tx_intd
> that are triggered when the PCIe controller (when running in Endpoint mode)
> has sent an Assert_INTA Message to the upstream device.
>
> Some DWC controllers have these interrupt in a combined interrupt signal.
>
> Add the description of these interrupts to the device tree binding.
>
> Signed-off-by: Niklas Cassel <cassel@kernel.org>
> ---
> Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 04/12] dt-bindings: rockchip: Add DesignWare based PCIe Endpoint controller
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (2 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 03/12] dt-bindings: PCI: snps,dw-pcie-ep: Add tx_int{a,b,c,d} legacy irqs Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-25 16:08 ` Rob Herring
2024-04-24 15:16 ` [PATCH 05/12] PCI: dw-rockchip: Fix weird indentation Niklas Cassel
` (7 subsequent siblings)
11 siblings, 1 reply; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
Document DT bindings for PCIe Endpoint controller found in Rockchip SoCs.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
.../bindings/pci/rockchip-dw-pcie-ep.yaml | 192 +++++++++++++++++++++
1 file changed, 192 insertions(+)
diff --git a/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml
new file mode 100644
index 000000000000..57a6c542058f
--- /dev/null
+++ b/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml
@@ -0,0 +1,192 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/pci/rockchip-dw-pcie-ep.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: DesignWare based PCIe Endpoint controller on Rockchip SoCs
+
+maintainers:
+ - Niklas Cassel <cassel@kernel.org>
+
+description: |+
+ RK3588 SoC PCIe Endpoint controller is based on the Synopsys DesignWare
+ PCIe IP and thus inherits all the common properties defined in
+ snps,dw-pcie-ep.yaml.
+
+allOf:
+ - $ref: /schemas/pci/snps,dw-pcie-ep.yaml#
+
+properties:
+ compatible:
+ items:
+ - const: rockchip,rk3588-pcie-ep
+
+ reg:
+ items:
+ - description: Data Bus Interface (DBI) registers
+ - description: Data Bus Interface (DBI) shadow registers
+ - description: Rockchip designed configuration registers
+ - description: Memory region used to map remote RC address space
+ - description: Address Translation Unit (ATU) registers
+
+ reg-names:
+ items:
+ - const: dbi
+ - const: dbi2
+ - const: apb
+ - const: addr_space
+ - const: atu
+
+ clocks:
+ minItems: 6
+ items:
+ - description: AHB clock for PCIe master
+ - description: AHB clock for PCIe slave
+ - description: AHB clock for PCIe dbi
+ - description: APB clock for PCIe
+ - description: Auxiliary clock for PCIe
+ - description: PIPE clock
+ - description: Reference clock for PCIe
+
+ clock-names:
+ minItems: 6
+ items:
+ - const: aclk_mst
+ - const: aclk_slv
+ - const: aclk_dbi
+ - const: pclk
+ - const: aux
+ - const: pipe
+ - const: ref
+
+ interrupts:
+ items:
+ - description:
+ Combined system interrupt, which is used to signal the following
+ interrupts - phy_link_up, dll_link_up, link_req_rst_not, hp_pme,
+ hp, hp_msi, link_auto_bw, link_auto_bw_msi, bw_mgt, bw_mgt_msi,
+ edma_wr, edma_rd, dpa_sub_upd, rbar_update, link_eq_req, ep_elbi_app
+ - description:
+ Combined PM interrupt, which is used to signal the following
+ interrupts - linkst_in_l1sub, linkst_in_l1, linkst_in_l2,
+ linkst_in_l0s, linkst_out_l1sub, linkst_out_l1, linkst_out_l2,
+ linkst_out_l0s, pm_dstate_update
+ - description:
+ Combined message interrupt, which is used to signal the following
+ interrupts - ven_msg, unlock_msg, ltr_msg, cfg_pme, cfg_pme_msi,
+ pm_pme, pm_to_ack, pm_turnoff, obff_idle, obff_obff, obff_cpu_active
+ - description:
+ Combined legacy interrupt, which is used to signal the following
+ interrupts - tx_inta, tx_intb, tx_intc, tx_intd
+ - description:
+ Combined error interrupt, which is used to signal the following
+ interrupts - aer_rc_err, aer_rc_err_msi, rx_cpl_timeout,
+ tx_cpl_timeout, cor_err_sent, nf_err_sent, f_err_sent, cor_err_rx,
+ nf_err_rx, f_err_rx, radm_qoverflow
+ - description:
+ eDMA write channel 0 interrupt
+ - description:
+ eDMA write channel 1 interrupt
+ - description:
+ eDMA read channel 0 interrupt
+ - description:
+ eDMA read channel 1 interrupt
+
+ interrupt-names:
+ items:
+ - const: sys
+ - const: pmc
+ - const: msg
+ - const: legacy
+ - const: err
+ - const: dma0
+ - const: dma1
+ - const: dma2
+ - const: dma3
+
+ num-lanes: true
+
+ phys:
+ maxItems: 1
+
+ phy-names:
+ const: pcie-phy
+
+ power-domains:
+ maxItems: 1
+
+ resets:
+ maxItems: 2
+
+ reset-names:
+ items:
+ - const: pwr
+ - const: pipe
+
+ vpcie3v3-supply: true
+
+required:
+ - compatible
+ - reg
+ - reg-names
+ - clocks
+ - clock-names
+ - interrupts
+ - interrupt-names
+ - num-lanes
+ - phys
+ - phy-names
+ - power-domains
+ - resets
+ - reset-names
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/rockchip,rk3588-cru.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/power/rk3588-power.h>
+ #include <dt-bindings/reset/rockchip,rk3588-cru.h>
+
+ bus {
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ pcie3x4_ep: pcie-ep@fe150000 {
+ compatible = "rockchip,rk3588-pcie-ep";
+ clocks = <&cru ACLK_PCIE_4L_MSTR>, <&cru ACLK_PCIE_4L_SLV>,
+ <&cru ACLK_PCIE_4L_DBI>, <&cru PCLK_PCIE_4L>,
+ <&cru CLK_PCIE_AUX0>, <&cru CLK_PCIE4L_PIPE>;
+ clock-names = "aclk_mst", "aclk_slv",
+ "aclk_dbi", "pclk",
+ "aux", "pipe";
+ interrupts = <GIC_SPI 263 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 262 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 261 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 260 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 259 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 271 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 272 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 270 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "sys", "pmc", "msg", "legacy", "err",
+ "dma0", "dma1", "dma2", "dma3";
+ max-link-speed = <3>;
+ num-lanes = <4>;
+ phys = <&pcie30phy>;
+ phy-names = "pcie-phy";
+ power-domains = <&power RK3588_PD_PCIE>;
+ reg = <0xa 0x40000000 0x0 0x00100000>,
+ <0xa 0x40100000 0x0 0x00100000>,
+ <0x0 0xfe150000 0x0 0x00010000>,
+ <0x9 0x00000000 0x0 0x40000000>,
+ <0xa 0x40300000 0x0 0x00100000>;
+ reg-names = "dbi", "dbi2", "apb", "addr_space", "atu";
+ resets = <&cru SRST_PCIE0_POWER_UP>, <&cru SRST_P_PCIE0>;
+ reset-names = "pwr", "pipe";
+ };
+ };
+...
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 04/12] dt-bindings: rockchip: Add DesignWare based PCIe Endpoint controller
2024-04-24 15:16 ` [PATCH 04/12] dt-bindings: rockchip: Add DesignWare based PCIe Endpoint controller Niklas Cassel
@ 2024-04-25 16:08 ` Rob Herring
2024-04-30 11:34 ` Niklas Cassel
0 siblings, 1 reply; 21+ messages in thread
From: Rob Herring @ 2024-04-25 16:08 UTC (permalink / raw)
To: Niklas Cassel
Cc: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue, linux-pci, devicetree, linux-rockchip
On Wed, Apr 24, 2024 at 05:16:22PM +0200, Niklas Cassel wrote:
> Document DT bindings for PCIe Endpoint controller found in Rockchip SoCs.
>
> Signed-off-by: Niklas Cassel <cassel@kernel.org>
> ---
> .../bindings/pci/rockchip-dw-pcie-ep.yaml | 192 +++++++++++++++++++++
> 1 file changed, 192 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml
> new file mode 100644
> index 000000000000..57a6c542058f
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml
> @@ -0,0 +1,192 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/pci/rockchip-dw-pcie-ep.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: DesignWare based PCIe Endpoint controller on Rockchip SoCs
> +
> +maintainers:
> + - Niklas Cassel <cassel@kernel.org>
> +
> +description: |+
> + RK3588 SoC PCIe Endpoint controller is based on the Synopsys DesignWare
> + PCIe IP and thus inherits all the common properties defined in
> + snps,dw-pcie-ep.yaml.
> +
> +allOf:
> + - $ref: /schemas/pci/snps,dw-pcie-ep.yaml#
> +
> +properties:
> + compatible:
> + items:
> + - const: rockchip,rk3588-pcie-ep
3568 doesn't support endpoint mode? It would be good to keep the
bindings aligned.
> +
> + reg:
> + items:
> + - description: Data Bus Interface (DBI) registers
> + - description: Data Bus Interface (DBI) shadow registers
> + - description: Rockchip designed configuration registers
> + - description: Memory region used to map remote RC address space
> + - description: Address Translation Unit (ATU) registers
> +
> + reg-names:
> + items:
> + - const: dbi
> + - const: dbi2
> + - const: apb
> + - const: addr_space
> + - const: atu
> +
> + clocks:
> + minItems: 6
> + items:
> + - description: AHB clock for PCIe master
> + - description: AHB clock for PCIe slave
> + - description: AHB clock for PCIe dbi
> + - description: APB clock for PCIe
> + - description: Auxiliary clock for PCIe
> + - description: PIPE clock
> + - description: Reference clock for PCIe
> +
> + clock-names:
> + minItems: 6
> + items:
> + - const: aclk_mst
> + - const: aclk_slv
> + - const: aclk_dbi
> + - const: pclk
> + - const: aux
> + - const: pipe
> + - const: ref
> +
> + interrupts:
> + items:
> + - description:
> + Combined system interrupt, which is used to signal the following
> + interrupts - phy_link_up, dll_link_up, link_req_rst_not, hp_pme,
> + hp, hp_msi, link_auto_bw, link_auto_bw_msi, bw_mgt, bw_mgt_msi,
> + edma_wr, edma_rd, dpa_sub_upd, rbar_update, link_eq_req, ep_elbi_app
> + - description:
> + Combined PM interrupt, which is used to signal the following
> + interrupts - linkst_in_l1sub, linkst_in_l1, linkst_in_l2,
> + linkst_in_l0s, linkst_out_l1sub, linkst_out_l1, linkst_out_l2,
> + linkst_out_l0s, pm_dstate_update
> + - description:
> + Combined message interrupt, which is used to signal the following
> + interrupts - ven_msg, unlock_msg, ltr_msg, cfg_pme, cfg_pme_msi,
> + pm_pme, pm_to_ack, pm_turnoff, obff_idle, obff_obff, obff_cpu_active
> + - description:
> + Combined legacy interrupt, which is used to signal the following
> + interrupts - tx_inta, tx_intb, tx_intc, tx_intd
> + - description:
> + Combined error interrupt, which is used to signal the following
> + interrupts - aer_rc_err, aer_rc_err_msi, rx_cpl_timeout,
> + tx_cpl_timeout, cor_err_sent, nf_err_sent, f_err_sent, cor_err_rx,
> + nf_err_rx, f_err_rx, radm_qoverflow
> + - description:
> + eDMA write channel 0 interrupt
> + - description:
> + eDMA write channel 1 interrupt
> + - description:
> + eDMA read channel 0 interrupt
> + - description:
> + eDMA read channel 1 interrupt
> +
> + interrupt-names:
> + items:
> + - const: sys
> + - const: pmc
> + - const: msg
> + - const: legacy
> + - const: err
> + - const: dma0
> + - const: dma1
> + - const: dma2
> + - const: dma3
> +
> + num-lanes: true
> +
> + phys:
> + maxItems: 1
> +
> + phy-names:
> + const: pcie-phy
> +
> + power-domains:
> + maxItems: 1
> +
> + resets:
> + maxItems: 2
> +
> + reset-names:
> + items:
> + - const: pwr
> + - const: pipe
Most of this is all duplicated from rockchip-dw-pcie.yaml. Pull out the
common bits to a separate schema file and reference it from the RC and
endpoint schemas.
You'll need to add to interrupts/interrupt-names in the common schema
and then restrict the number of items here and in the RC schema.
> +
> + vpcie3v3-supply: true
This doesn't make sense for endpoint mode. At least in the sense this
is supposed to be a standard slot voltage driven from the host side.
> +
> +required:
> + - compatible
> + - reg
> + - reg-names
> + - clocks
> + - clock-names
> + - interrupts
> + - interrupt-names
> + - num-lanes
> + - phys
> + - phy-names
> + - power-domains
> + - resets
> + - reset-names
A bunch or all? of these can be in the common schema too.
> +
> +unevaluatedProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/clock/rockchip,rk3588-cru.h>
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> + #include <dt-bindings/interrupt-controller/irq.h>
> + #include <dt-bindings/power/rk3588-power.h>
> + #include <dt-bindings/reset/rockchip,rk3588-cru.h>
> +
> + bus {
> + #address-cells = <2>;
> + #size-cells = <2>;
> +
> + pcie3x4_ep: pcie-ep@fe150000 {
> + compatible = "rockchip,rk3588-pcie-ep";
> + clocks = <&cru ACLK_PCIE_4L_MSTR>, <&cru ACLK_PCIE_4L_SLV>,
> + <&cru ACLK_PCIE_4L_DBI>, <&cru PCLK_PCIE_4L>,
> + <&cru CLK_PCIE_AUX0>, <&cru CLK_PCIE4L_PIPE>;
> + clock-names = "aclk_mst", "aclk_slv",
> + "aclk_dbi", "pclk",
> + "aux", "pipe";
> + interrupts = <GIC_SPI 263 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 262 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 261 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 260 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 259 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 271 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 272 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 270 IRQ_TYPE_LEVEL_HIGH 0>;
> + interrupt-names = "sys", "pmc", "msg", "legacy", "err",
> + "dma0", "dma1", "dma2", "dma3";
> + max-link-speed = <3>;
> + num-lanes = <4>;
> + phys = <&pcie30phy>;
> + phy-names = "pcie-phy";
> + power-domains = <&power RK3588_PD_PCIE>;
> + reg = <0xa 0x40000000 0x0 0x00100000>,
> + <0xa 0x40100000 0x0 0x00100000>,
> + <0x0 0xfe150000 0x0 0x00010000>,
> + <0x9 0x00000000 0x0 0x40000000>,
> + <0xa 0x40300000 0x0 0x00100000>;
> + reg-names = "dbi", "dbi2", "apb", "addr_space", "atu";
> + resets = <&cru SRST_PCIE0_POWER_UP>, <&cru SRST_P_PCIE0>;
> + reset-names = "pwr", "pipe";
> + };
> + };
> +...
>
> --
> 2.44.0
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 04/12] dt-bindings: rockchip: Add DesignWare based PCIe Endpoint controller
2024-04-25 16:08 ` Rob Herring
@ 2024-04-30 11:34 ` Niklas Cassel
0 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-30 11:34 UTC (permalink / raw)
To: Rob Herring
Cc: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue, linux-pci, devicetree, linux-rockchip
On Thu, Apr 25, 2024 at 11:08:09AM -0500, Rob Herring wrote:
> On Wed, Apr 24, 2024 at 05:16:22PM +0200, Niklas Cassel wrote:
> > Document DT bindings for PCIe Endpoint controller found in Rockchip SoCs.
> >
> > Signed-off-by: Niklas Cassel <cassel@kernel.org>
> > ---
> > .../bindings/pci/rockchip-dw-pcie-ep.yaml | 192 +++++++++++++++++++++
> > 1 file changed, 192 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml b/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml
> > new file mode 100644
> > index 000000000000..57a6c542058f
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml
> > @@ -0,0 +1,192 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/pci/rockchip-dw-pcie-ep.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: DesignWare based PCIe Endpoint controller on Rockchip SoCs
> > +
> > +maintainers:
> > + - Niklas Cassel <cassel@kernel.org>
> > +
> > +description: |+
> > + RK3588 SoC PCIe Endpoint controller is based on the Synopsys DesignWare
> > + PCIe IP and thus inherits all the common properties defined in
> > + snps,dw-pcie-ep.yaml.
> > +
> > +allOf:
> > + - $ref: /schemas/pci/snps,dw-pcie-ep.yaml#
> > +
> > +properties:
> > + compatible:
> > + items:
> > + - const: rockchip,rk3588-pcie-ep
>
> 3568 doesn't support endpoint mode? It would be good to keep the
> bindings aligned.
It does.
However, it does not have the dedicated IRQ lines for the eDMA interrupts.
I will add rk3568 to the DT binding and to the driver.
If someone wants eDMA functional for rk3568, there is further code needed,
but EP mode without eDMA should work on rk3568 as is.
> > + phys:
> > + maxItems: 1
> > +
> > + phy-names:
> > + const: pcie-phy
> > +
> > + power-domains:
> > + maxItems: 1
> > +
> > + resets:
> > + maxItems: 2
> > +
> > + reset-names:
> > + items:
> > + - const: pwr
> > + - const: pipe
>
> Most of this is all duplicated from rockchip-dw-pcie.yaml. Pull out the
> common bits to a separate schema file and reference it from the RC and
> endpoint schemas.
Ok, will fix in V2.
> You'll need to add to interrupts/interrupt-names in the common schema
> and then restrict the number of items here and in the RC schema.
Remember that eDMA can be used also in RC mode.
Even if the RC binding doesn't allow it right now, these interrupts could
be optional also for RC mode, in case someone actually wants to use them
in the future.
> > +
> > + vpcie3v3-supply: true
>
> This doesn't make sense for endpoint mode. At least in the sense this
> is supposed to be a standard slot voltage driven from the host side.
I tried not supplying the regulator for the EP side on my rock5b
(rk3588 based) platform.
The driver (in EP mode) probes correctly, but does not work without this,
regardless of how I try. Boot EP first, boot RC first.
Looking at the rock5b schematic:
https://dl.radxa.com/rock5/5b/docs/hw/radxa_rock_5b_v1423_sch.pdf
Page 7, specifically VCC3V3_PCIE30.
It does seem to only support sourcing VIN from a regulator on the local
board (VCC5V0_SYS).
(Looking at a vendor using this SoC in a board that supports EP mode
(Mixtile Blade 3), they do supply the regulator also for the EP-mode
DT node.)
I will drop the "vpcie3v3-supply" from the EP binding and keep it
only in the RC binding. (As perhaps some other rk3588 based board can
actually source the 3.3v from the PCIe slot in EP mode.)
I will keep it in the rock5b (a rk3588 based board) DT overlay,
as it is obviously needed for rock5b.
> > +
> > +required:
> > + - compatible
> > + - reg
> > + - reg-names
> > + - clocks
> > + - clock-names
> > + - interrupts
> > + - interrupt-names
> > + - num-lanes
> > + - phys
> > + - phy-names
> > + - power-domains
> > + - resets
> > + - reset-names
>
> A bunch or all? of these can be in the common schema too.
Ok, will fix in V2.
Kind regards,
Niklas
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 05/12] PCI: dw-rockchip: Fix weird indentation
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (3 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 04/12] dt-bindings: rockchip: Add DesignWare based PCIe Endpoint controller Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-24 15:16 ` [PATCH 06/12] PCI: dw-rockchip: Add rockchip_pcie_ltssm() helper Niklas Cassel
` (6 subsequent siblings)
11 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
Fix the indentation of rockchip_pcie_{readl,writel}_apb() parameters to
match the opening parenthesis.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
drivers/pci/controller/dwc/pcie-dw-rockchip.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index d6842141d384..1993c430b90c 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -60,14 +60,13 @@ struct rockchip_pcie {
struct irq_domain *irq_domain;
};
-static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip,
- u32 reg)
+static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip, u32 reg)
{
return readl_relaxed(rockchip->apb_base + reg);
}
-static void rockchip_pcie_writel_apb(struct rockchip_pcie *rockchip,
- u32 val, u32 reg)
+static void rockchip_pcie_writel_apb(struct rockchip_pcie *rockchip, u32 val,
+ u32 reg)
{
writel_relaxed(val, rockchip->apb_base + reg);
}
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 06/12] PCI: dw-rockchip: Add rockchip_pcie_ltssm() helper
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (4 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 05/12] PCI: dw-rockchip: Fix weird indentation Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-24 15:16 ` [PATCH 07/12] PCI: dw-rockchip: Refactor the driver to prepare for EP mode Niklas Cassel
` (5 subsequent siblings)
11 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
Add a rockchip_pcie_ltssm() helper function that reads the LTSSM status.
This helper will be used in additional places in follow-up patches.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
drivers/pci/controller/dwc/pcie-dw-rockchip.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index 1993c430b90c..4023fd86176f 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -143,6 +143,11 @@ static int rockchip_pcie_init_irq_domain(struct rockchip_pcie *rockchip)
return 0;
}
+static inline u32 rockchip_pcie_ltssm(struct rockchip_pcie *rockchip)
+{
+ return rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_LTSSM_STATUS);
+}
+
static void rockchip_pcie_enable_ltssm(struct rockchip_pcie *rockchip)
{
rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_ENABLE_LTSSM,
@@ -152,7 +157,7 @@ static void rockchip_pcie_enable_ltssm(struct rockchip_pcie *rockchip)
static int rockchip_pcie_link_up(struct dw_pcie *pci)
{
struct rockchip_pcie *rockchip = to_rockchip_pcie(pci);
- u32 val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_LTSSM_STATUS);
+ u32 val = rockchip_pcie_ltssm(rockchip);
if ((val & PCIE_LINKUP) == PCIE_LINKUP &&
(val & PCIE_LTSSM_STATUS_MASK) == PCIE_L0S_ENTRY)
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 07/12] PCI: dw-rockchip: Refactor the driver to prepare for EP mode
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (5 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 06/12] PCI: dw-rockchip: Add rockchip_pcie_ltssm() helper Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-24 15:16 ` [PATCH 08/12] PCI: dw-rockchip: Add explicit rockchip,rk3588-pcie compatible Niklas Cassel
` (4 subsequent siblings)
11 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
This refactors the driver to prepare for EP mode.
Add of-match data to the existing compatible, and explicitly define it as
DW_PCIE_RC_TYPE. This way, we will be able to add EP mode in a follow-up
patch in a much less intrusive way, which makes the follup-up patches
much easier to review.
No functional change intended.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
drivers/pci/controller/dwc/pcie-dw-rockchip.c | 72 +++++++++++++++++++++------
1 file changed, 57 insertions(+), 15 deletions(-)
diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index 4023fd86176f..bc1347e84f72 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -58,6 +58,11 @@ struct rockchip_pcie {
struct gpio_desc *rst_gpio;
struct regulator *vpcie3v3;
struct irq_domain *irq_domain;
+ enum dw_pcie_device_mode mode;
+};
+
+struct rockchip_pcie_of_data {
+ enum dw_pcie_device_mode mode;
};
static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip, u32 reg)
@@ -195,7 +200,6 @@ static int rockchip_pcie_host_init(struct dw_pcie_rp *pp)
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct rockchip_pcie *rockchip = to_rockchip_pcie(pci);
struct device *dev = rockchip->pci.dev;
- u32 val = HIWORD_UPDATE_BIT(PCIE_LTSSM_ENABLE_ENHANCE);
int irq, ret;
irq = of_irq_get_byname(dev->of_node, "legacy");
@@ -209,12 +213,6 @@ static int rockchip_pcie_host_init(struct dw_pcie_rp *pp)
irq_set_chained_handler_and_data(irq, rockchip_pcie_intx_handler,
rockchip);
- /* LTSSM enable control mode */
- rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL);
-
- rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_RC_MODE,
- PCIE_CLIENT_GENERAL_CONTROL);
-
return 0;
}
@@ -288,13 +286,41 @@ static const struct dw_pcie_ops dw_pcie_ops = {
.start_link = rockchip_pcie_start_link,
};
+static int rockchip_pcie_configure_rc(struct rockchip_pcie *rockchip)
+{
+ struct dw_pcie_rp *pp;
+ u32 val;
+
+ if (!IS_ENABLED(CONFIG_PCIE_ROCKCHIP_DW_HOST))
+ return -ENODEV;
+
+ /* LTSSM enable control mode */
+ val = HIWORD_UPDATE_BIT(PCIE_LTSSM_ENABLE_ENHANCE);
+ rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL);
+
+ rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_RC_MODE,
+ PCIE_CLIENT_GENERAL_CONTROL);
+
+ pp = &rockchip->pci.pp;
+ pp->ops = &rockchip_pcie_host_ops;
+
+ return dw_pcie_host_init(pp);
+}
+
static int rockchip_pcie_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct rockchip_pcie *rockchip;
- struct dw_pcie_rp *pp;
+ const struct rockchip_pcie_of_data *data;
+ enum dw_pcie_device_mode mode;
int ret;
+ data = of_device_get_match_data(dev);
+ if (!data)
+ return -EINVAL;
+
+ mode = (enum dw_pcie_device_mode)data->mode;
+
rockchip = devm_kzalloc(dev, sizeof(*rockchip), GFP_KERNEL);
if (!rockchip)
return -ENOMEM;
@@ -303,9 +329,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
rockchip->pci.dev = dev;
rockchip->pci.ops = &dw_pcie_ops;
-
- pp = &rockchip->pci.pp;
- pp->ops = &rockchip_pcie_host_ops;
+ rockchip->mode = mode;
ret = rockchip_pcie_resource_get(pdev, rockchip);
if (ret)
@@ -342,10 +366,21 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
if (ret)
goto deinit_phy;
- ret = dw_pcie_host_init(pp);
- if (!ret)
- return 0;
+ switch (rockchip->mode) {
+ case DW_PCIE_RC_TYPE:
+ ret = rockchip_pcie_configure_rc(rockchip);
+ if (ret)
+ goto deinit_clk;
+ break;
+ default:
+ dev_err(dev, "INVALID device type %d\n", rockchip->mode);
+ ret = -EINVAL;
+ goto deinit_clk;
+ }
+ return 0;
+
+deinit_clk:
clk_bulk_disable_unprepare(rockchip->clk_cnt, rockchip->clks);
deinit_phy:
rockchip_pcie_phy_deinit(rockchip);
@@ -356,8 +391,15 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
return ret;
}
+static const struct rockchip_pcie_of_data rk3568_pcie_rc_of_data = {
+ .mode = DW_PCIE_RC_TYPE,
+};
+
static const struct of_device_id rockchip_pcie_of_match[] = {
- { .compatible = "rockchip,rk3568-pcie", },
+ {
+ .compatible = "rockchip,rk3568-pcie",
+ .data = &rk3568_pcie_rc_of_data,
+ },
{},
};
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 08/12] PCI: dw-rockchip: Add explicit rockchip,rk3588-pcie compatible
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (6 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 07/12] PCI: dw-rockchip: Refactor the driver to prepare for EP mode Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-24 15:16 ` [PATCH 09/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (3 subsequent siblings)
11 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
The rockchip-dw-pcie.yaml device tree binding already defines
rockchip,rk3588-pcie as a supported compatible string.
Add an explicit rockchip,rk3588-pcie entry to make it easier to find the
driver that implements this compatible string.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
drivers/pci/controller/dwc/pcie-dw-rockchip.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index bc1347e84f72..332ada5cb9c6 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -400,6 +400,10 @@ static const struct of_device_id rockchip_pcie_of_match[] = {
.compatible = "rockchip,rk3568-pcie",
.data = &rk3568_pcie_rc_of_data,
},
+ {
+ .compatible = "rockchip,rk3588-pcie",
+ .data = &rk3568_pcie_rc_of_data,
+ },
{},
};
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 09/12] PCI: dw-rockchip: Add endpoint mode support
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (7 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 08/12] PCI: dw-rockchip: Add explicit rockchip,rk3588-pcie compatible Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-24 15:16 ` [PATCH 10/12] misc: pci_endpoint_test: Add support for rockchip rk3588 Niklas Cassel
` (2 subsequent siblings)
11 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
The PCIe controller in rk3568 and rk3588 can operate in endpoint mode.
This endpoint mode support heavily leverages the existing code in
pcie-designware-ep.c.
Add support for endpoint mode to the existing pcie-dw-rockchip glue
driver.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
drivers/pci/controller/dwc/Kconfig | 17 ++-
drivers/pci/controller/dwc/pcie-dw-rockchip.c | 173 ++++++++++++++++++++++++++
2 files changed, 187 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig
index 8afacc90c63b..9fae0d977271 100644
--- a/drivers/pci/controller/dwc/Kconfig
+++ b/drivers/pci/controller/dwc/Kconfig
@@ -311,16 +311,27 @@ config PCIE_RCAR_GEN4_EP
SoCs. To compile this driver as a module, choose M here: the module
will be called pcie-rcar-gen4.ko. This uses the DesignWare core.
+config PCIE_ROCKCHIP_DW
+ bool
+
config PCIE_ROCKCHIP_DW_HOST
- bool "Rockchip DesignWare PCIe controller"
- select PCIE_DW
+ bool "Rockchip DesignWare PCIe controller (host mode)"
select PCIE_DW_HOST
depends on PCI_MSI
depends on ARCH_ROCKCHIP || COMPILE_TEST
depends on OF
help
Enables support for the DesignWare PCIe controller in the
- Rockchip SoC except RK3399.
+ Rockchip SoC (except RK3399) to work in host mode.
+
+config PCIE_ROCKCHIP_DW_EP
+ bool "Rockchip DesignWare PCIe controller (endpoint mode)"
+ select PCIE_DW_EP
+ depends on ARCH_ROCKCHIP || COMPILE_TEST
+ depends on OF
+ help
+ Enables support for the DesignWare PCIe controller in the
+ Rockchip SoC (except RK3399) to work in endpoint mode.
config PCI_EXYNOS
tristate "Samsung Exynos PCIe controller"
diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index 332ada5cb9c6..0de0462f7536 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -34,10 +34,16 @@
#define to_rockchip_pcie(x) dev_get_drvdata((x)->dev)
#define PCIE_CLIENT_RC_MODE HIWORD_UPDATE_BIT(0x40)
+#define PCIE_CLIENT_EP_MODE HIWORD_UPDATE(0xf0, 0x0)
#define PCIE_CLIENT_ENABLE_LTSSM HIWORD_UPDATE_BIT(0xc)
+#define PCIE_CLIENT_DISABLE_LTSSM HIWORD_UPDATE(0x0c, 0x8)
+#define PCIE_CLIENT_INTR_STATUS_MISC 0x10
+#define PCIE_CLIENT_INTR_MASK_MISC 0x24
#define PCIE_SMLH_LINKUP BIT(16)
#define PCIE_RDLH_LINKUP BIT(17)
#define PCIE_LINKUP (PCIE_SMLH_LINKUP | PCIE_RDLH_LINKUP)
+#define PCIE_RDLH_LINK_UP_CHGED BIT(1)
+#define PCIE_LINK_REQ_RST_NOT_INT BIT(2)
#define PCIE_L0S_ENTRY 0x11
#define PCIE_CLIENT_GENERAL_CONTROL 0x0
#define PCIE_CLIENT_INTR_STATUS_LEGACY 0x8
@@ -159,6 +165,12 @@ static void rockchip_pcie_enable_ltssm(struct rockchip_pcie *rockchip)
PCIE_CLIENT_GENERAL_CONTROL);
}
+static void rockchip_pcie_disable_ltssm(struct rockchip_pcie *rockchip)
+{
+ rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_DISABLE_LTSSM,
+ PCIE_CLIENT_GENERAL_CONTROL);
+}
+
static int rockchip_pcie_link_up(struct dw_pcie *pci)
{
struct rockchip_pcie *rockchip = to_rockchip_pcie(pci);
@@ -195,6 +207,13 @@ static int rockchip_pcie_start_link(struct dw_pcie *pci)
return 0;
}
+static void rockchip_pcie_stop_link(struct dw_pcie *pci)
+{
+ struct rockchip_pcie *rockchip = to_rockchip_pcie(pci);
+
+ rockchip_pcie_disable_ltssm(rockchip);
+}
+
static int rockchip_pcie_host_init(struct dw_pcie_rp *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
@@ -220,6 +239,59 @@ static const struct dw_pcie_host_ops rockchip_pcie_host_ops = {
.init = rockchip_pcie_host_init,
};
+static void rockchip_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 rockchip_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);
+ case PCI_IRQ_MSIX:
+ return dw_pcie_ep_raise_msix_irq(ep, func_no, interrupt_num);
+ default:
+ dev_err(pci->dev, "UNKNOWN IRQ type\n");
+ }
+
+ return 0;
+}
+
+static const struct pci_epc_features rockchip_pcie_epc_features = {
+ .linkup_notifier = true,
+ .msi_capable = true,
+ .msix_capable = true,
+ .align = SZ_64K,
+ .bar[BAR_0] = { .type = BAR_FIXED, .fixed_size = SZ_1M, },
+ .bar[BAR_1] = { .type = BAR_FIXED, .fixed_size = SZ_1M, },
+ .bar[BAR_2] = { .type = BAR_FIXED, .fixed_size = SZ_1M, },
+ .bar[BAR_3] = { .type = BAR_FIXED, .fixed_size = SZ_1M, },
+ .bar[BAR_4] = { .type = BAR_RESERVED, },
+ .bar[BAR_5] = { .type = BAR_FIXED, .fixed_size = SZ_1M, },
+};
+
+static const struct pci_epc_features *
+rockchip_pcie_get_features(struct dw_pcie_ep *ep)
+{
+ return &rockchip_pcie_epc_features;
+}
+
+static const struct dw_pcie_ep_ops rockchip_pcie_ep_ops = {
+ .init = rockchip_pcie_ep_init,
+ .raise_irq = rockchip_pcie_raise_irq,
+ .get_features = rockchip_pcie_get_features,
+};
+
static int rockchip_pcie_clk_init(struct rockchip_pcie *rockchip)
{
struct device *dev = rockchip->pci.dev;
@@ -284,8 +356,39 @@ static void rockchip_pcie_phy_deinit(struct rockchip_pcie *rockchip)
static const struct dw_pcie_ops dw_pcie_ops = {
.link_up = rockchip_pcie_link_up,
.start_link = rockchip_pcie_start_link,
+ .stop_link = rockchip_pcie_stop_link,
};
+static irqreturn_t rockchip_pcie_ep_sys_irq_thread(int irq, void *arg)
+{
+ struct rockchip_pcie *rockchip = arg;
+ struct dw_pcie *pci = &rockchip->pci;
+ struct device *dev = pci->dev;
+ u32 reg, val;
+
+ reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
+
+ dev_dbg(dev, "PCIE_CLIENT_INTR_STATUS_MISC: %#x\n", reg);
+ dev_dbg(dev, "LTSSM_STATUS: %#x\n", rockchip_pcie_ltssm(rockchip));
+
+ if (reg & PCIE_LINK_REQ_RST_NOT_INT) {
+ dev_dbg(dev, "hot reset or link-down reset\n");
+ dw_pcie_ep_linkdown(&pci->ep);
+ }
+
+ if (reg & PCIE_RDLH_LINK_UP_CHGED) {
+ val = rockchip_pcie_ltssm(rockchip);
+ if ((val & PCIE_LINKUP) == PCIE_LINKUP) {
+ dev_dbg(dev, "link up\n");
+ dw_pcie_ep_linkup(&pci->ep);
+ }
+ }
+
+ rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC);
+
+ return IRQ_HANDLED;
+}
+
static int rockchip_pcie_configure_rc(struct rockchip_pcie *rockchip)
{
struct dw_pcie_rp *pp;
@@ -307,6 +410,63 @@ static int rockchip_pcie_configure_rc(struct rockchip_pcie *rockchip)
return dw_pcie_host_init(pp);
}
+static int rockchip_pcie_configure_ep(struct platform_device *pdev,
+ struct rockchip_pcie *rockchip)
+{
+ struct device *dev = &pdev->dev;
+ int irq, ret;
+ u32 val;
+
+ if (!IS_ENABLED(CONFIG_PCIE_ROCKCHIP_DW_EP))
+ return -ENODEV;
+
+ irq = platform_get_irq_byname(pdev, "sys");
+ if (irq < 0) {
+ dev_err(dev, "missing sys IRQ resource\n");
+ return irq;
+ }
+
+ ret = devm_request_threaded_irq(dev, irq, NULL,
+ rockchip_pcie_ep_sys_irq_thread,
+ IRQF_ONESHOT, "pcie-sys", rockchip);
+ if (ret) {
+ dev_err(dev, "failed to request PCIe sys IRQ\n");
+ return ret;
+ }
+
+ /* LTSSM enable control mode */
+ val = HIWORD_UPDATE_BIT(PCIE_LTSSM_ENABLE_ENHANCE);
+ rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL);
+
+ rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_EP_MODE,
+ PCIE_CLIENT_GENERAL_CONTROL);
+
+ rockchip->pci.ep.ops = &rockchip_pcie_ep_ops;
+ rockchip->pci.ep.page_size = SZ_64K;
+
+ dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
+
+ ret = dw_pcie_ep_init(&rockchip->pci.ep);
+ if (ret) {
+ dev_err(dev, "failed to initialize endpoint\n");
+ return ret;
+ }
+
+ ret = dw_pcie_ep_init_registers(&rockchip->pci.ep);
+ if (ret) {
+ dev_err(dev, "failed to initialize DWC endpoint registers\n");
+ dw_pcie_ep_deinit(&rockchip->pci.ep);
+ return ret;
+ }
+
+ dw_pcie_ep_init_notify(&rockchip->pci.ep);
+
+ /* unmask DLL up/down indicator and hot reset/link-down reset */
+ rockchip_pcie_writel_apb(rockchip, 0x60000, PCIE_CLIENT_INTR_MASK_MISC);
+
+ return ret;
+}
+
static int rockchip_pcie_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -372,6 +532,11 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
if (ret)
goto deinit_clk;
break;
+ case DW_PCIE_EP_TYPE:
+ ret = rockchip_pcie_configure_ep(pdev, rockchip);
+ if (ret)
+ goto deinit_clk;
+ break;
default:
dev_err(dev, "INVALID device type %d\n", rockchip->mode);
ret = -EINVAL;
@@ -395,6 +560,10 @@ static const struct rockchip_pcie_of_data rk3568_pcie_rc_of_data = {
.mode = DW_PCIE_RC_TYPE,
};
+static const struct rockchip_pcie_of_data rk3588_pcie_ep_of_data = {
+ .mode = DW_PCIE_EP_TYPE,
+};
+
static const struct of_device_id rockchip_pcie_of_match[] = {
{
.compatible = "rockchip,rk3568-pcie",
@@ -404,6 +573,10 @@ static const struct of_device_id rockchip_pcie_of_match[] = {
.compatible = "rockchip,rk3588-pcie",
.data = &rk3568_pcie_rc_of_data,
},
+ {
+ .compatible = "rockchip,rk3588-pcie-ep",
+ .data = &rk3588_pcie_ep_of_data,
+ },
{},
};
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 10/12] misc: pci_endpoint_test: Add support for rockchip rk3588
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (8 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 09/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-25 19:16 ` Frank Li
2024-04-24 15:16 ` [PATCH 11/12] arm64: dts: rockchip: Add PCIe endpoint mode support Niklas Cassel
2024-04-24 15:16 ` [PATCH 12/12] arm64: dts: rockchip: Add rock5b overlays for PCIe endpoint mode Niklas Cassel
11 siblings, 1 reply; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
Rockchip rk3588 requires 64k alignment.
While there is an existing device_id:vendor_id in the driver with 64k
alignment, that device_id:vendor_id is am654, which uses BAR2 instead of
BAR0 as the test_reg_bar, and also has special is_am654_pci_dev() checks
in the driver to disallow BAR0. In order to allow testing all BARs, add a
new rk3588 entry in the driver.
We intentionally do not add the vendor id to pci_ids.h, since the policy
for that file is that the vendor id has to be used by multiple drivers.
Hopefully, this new entry will be short-lived, as there is a series on the
mailing list which intends to move the address alignment restrictions from
this driver to the endpoint side.
Add a new entry for rk3588 in order to allow us to test all BARs.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
drivers/misc/pci_endpoint_test.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c
index c38a6083f0a7..a7f593b4e3b3 100644
--- a/drivers/misc/pci_endpoint_test.c
+++ b/drivers/misc/pci_endpoint_test.c
@@ -84,6 +84,9 @@
#define PCI_DEVICE_ID_RENESAS_R8A774E1 0x0025
#define PCI_DEVICE_ID_RENESAS_R8A779F0 0x0031
+#define PCI_VENDOR_ID_ROCKCHIP 0x1d87
+#define PCI_DEVICE_ID_ROCKCHIP_RK3588 0x3588
+
static DEFINE_IDA(pci_endpoint_test_ida);
#define to_endpoint_test(priv) container_of((priv), struct pci_endpoint_test, \
@@ -980,6 +983,11 @@ static const struct pci_endpoint_test_data j721e_data = {
.irq_type = IRQ_TYPE_MSI,
};
+static const struct pci_endpoint_test_data rk3588_data = {
+ .alignment = SZ_64K,
+ .irq_type = IRQ_TYPE_MSI,
+};
+
static const struct pci_device_id pci_endpoint_test_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA74x),
.driver_data = (kernel_ulong_t)&default_data,
@@ -1017,6 +1025,9 @@ static const struct pci_device_id pci_endpoint_test_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721S2),
.driver_data = (kernel_ulong_t)&j721e_data,
},
+ { PCI_DEVICE(PCI_VENDOR_ID_ROCKCHIP, PCI_DEVICE_ID_ROCKCHIP_RK3588),
+ .driver_data = (kernel_ulong_t)&rk3588_data,
+ },
{ }
};
MODULE_DEVICE_TABLE(pci, pci_endpoint_test_tbl);
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 10/12] misc: pci_endpoint_test: Add support for rockchip rk3588
2024-04-24 15:16 ` [PATCH 10/12] misc: pci_endpoint_test: Add support for rockchip rk3588 Niklas Cassel
@ 2024-04-25 19:16 ` Frank Li
2024-04-30 11:42 ` Niklas Cassel
0 siblings, 1 reply; 21+ messages in thread
From: Frank Li @ 2024-04-25 19:16 UTC (permalink / raw)
To: Niklas Cassel
Cc: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue, linux-pci, devicetree, linux-rockchip
On Wed, Apr 24, 2024 at 05:16:28PM +0200, Niklas Cassel wrote:
> Rockchip rk3588 requires 64k alignment.
> While there is an existing device_id:vendor_id in the driver with 64k
> alignment, that device_id:vendor_id is am654, which uses BAR2 instead of
> BAR0 as the test_reg_bar, and also has special is_am654_pci_dev() checks
> in the driver to disallow BAR0. In order to allow testing all BARs, add a
> new rk3588 entry in the driver.
>
> We intentionally do not add the vendor id to pci_ids.h, since the policy
> for that file is that the vendor id has to be used by multiple drivers.
>
> Hopefully, this new entry will be short-lived, as there is a series on the
> mailing list which intends to move the address alignment restrictions from
> this driver to the endpoint side.
>
> Add a new entry for rk3588 in order to allow us to test all BARs.
>
> Signed-off-by: Niklas Cassel <cassel@kernel.org>
> ---
> drivers/misc/pci_endpoint_test.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c
> index c38a6083f0a7..a7f593b4e3b3 100644
> --- a/drivers/misc/pci_endpoint_test.c
> +++ b/drivers/misc/pci_endpoint_test.c
> @@ -84,6 +84,9 @@
> #define PCI_DEVICE_ID_RENESAS_R8A774E1 0x0025
> #define PCI_DEVICE_ID_RENESAS_R8A779F0 0x0031
>
> +#define PCI_VENDOR_ID_ROCKCHIP 0x1d87
> +#define PCI_DEVICE_ID_ROCKCHIP_RK3588 0x3588
> +
Did you make sure 0x3588 will not used by other production with vendor id
0x1d87?
Frank
> static DEFINE_IDA(pci_endpoint_test_ida);
>
> #define to_endpoint_test(priv) container_of((priv), struct pci_endpoint_test, \
> @@ -980,6 +983,11 @@ static const struct pci_endpoint_test_data j721e_data = {
> .irq_type = IRQ_TYPE_MSI,
> };
>
> +static const struct pci_endpoint_test_data rk3588_data = {
> + .alignment = SZ_64K,
> + .irq_type = IRQ_TYPE_MSI,
> +};
> +
> static const struct pci_device_id pci_endpoint_test_tbl[] = {
> { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA74x),
> .driver_data = (kernel_ulong_t)&default_data,
> @@ -1017,6 +1025,9 @@ static const struct pci_device_id pci_endpoint_test_tbl[] = {
> { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721S2),
> .driver_data = (kernel_ulong_t)&j721e_data,
> },
> + { PCI_DEVICE(PCI_VENDOR_ID_ROCKCHIP, PCI_DEVICE_ID_ROCKCHIP_RK3588),
> + .driver_data = (kernel_ulong_t)&rk3588_data,
> + },
> { }
> };
> MODULE_DEVICE_TABLE(pci, pci_endpoint_test_tbl);
>
> --
> 2.44.0
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 10/12] misc: pci_endpoint_test: Add support for rockchip rk3588
2024-04-25 19:16 ` Frank Li
@ 2024-04-30 11:42 ` Niklas Cassel
0 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-30 11:42 UTC (permalink / raw)
To: Frank Li
Cc: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue, linux-pci, devicetree, linux-rockchip
On Thu, Apr 25, 2024 at 03:16:53PM -0400, Frank Li wrote:
> On Wed, Apr 24, 2024 at 05:16:28PM +0200, Niklas Cassel wrote:
> > Rockchip rk3588 requires 64k alignment.
> > While there is an existing device_id:vendor_id in the driver with 64k
> > alignment, that device_id:vendor_id is am654, which uses BAR2 instead of
> > BAR0 as the test_reg_bar, and also has special is_am654_pci_dev() checks
> > in the driver to disallow BAR0. In order to allow testing all BARs, add a
> > new rk3588 entry in the driver.
> >
> > We intentionally do not add the vendor id to pci_ids.h, since the policy
> > for that file is that the vendor id has to be used by multiple drivers.
> >
> > Hopefully, this new entry will be short-lived, as there is a series on the
> > mailing list which intends to move the address alignment restrictions from
> > this driver to the endpoint side.
> >
> > Add a new entry for rk3588 in order to allow us to test all BARs.
> >
> > Signed-off-by: Niklas Cassel <cassel@kernel.org>
> > ---
> > drivers/misc/pci_endpoint_test.c | 11 +++++++++++
> > 1 file changed, 11 insertions(+)
> >
> > diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c
> > index c38a6083f0a7..a7f593b4e3b3 100644
> > --- a/drivers/misc/pci_endpoint_test.c
> > +++ b/drivers/misc/pci_endpoint_test.c
> > @@ -84,6 +84,9 @@
> > #define PCI_DEVICE_ID_RENESAS_R8A774E1 0x0025
> > #define PCI_DEVICE_ID_RENESAS_R8A779F0 0x0031
> >
> > +#define PCI_VENDOR_ID_ROCKCHIP 0x1d87
> > +#define PCI_DEVICE_ID_ROCKCHIP_RK3588 0x3588
> > +
>
> Did you make sure 0x3588 will not used by other production with vendor id
> 0x1d87?
Hello Frank,
I do not fully understand your question.
Vendor ID 0x1d87 is rockchip:
https://admin.pci-ids.ucw.cz/read/PC/1d87
https://admin.pci-ids.ucw.cz/read/PC/1d87/3588
is RK3588.
This is the PCI device ID and the vendor ID that the device will have on
reset. So since rockchip has put these values as the reset values, and
they appear in the PCI IDE repository, I assume that they should be fine
to use.
I could not find any other Linux device driver using this PCI device and
vendor ID, if that was what you meant.
Kind regards,
Niklas
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 11/12] arm64: dts: rockchip: Add PCIe endpoint mode support
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (9 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 10/12] misc: pci_endpoint_test: Add support for rockchip rk3588 Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
2024-04-24 15:16 ` [PATCH 12/12] arm64: dts: rockchip: Add rock5b overlays for PCIe endpoint mode Niklas Cassel
11 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
Add a device tree node representing PCIe endpoint mode.
The controller can either be configured to run in Root Complex or Endpoint
node.
If a user wants to run the controller in endpoint mode, the user has to
disable the pcie3x4 node and enable the pcie3x4_ep node.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
arch/arm64/boot/dts/rockchip/rk3588.dtsi | 35 ++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/arch/arm64/boot/dts/rockchip/rk3588.dtsi b/arch/arm64/boot/dts/rockchip/rk3588.dtsi
index 5519c1430cb7..09a06e8c43b7 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588.dtsi
@@ -136,6 +136,41 @@ pcie3x4_intc: legacy-interrupt-controller {
};
};
+ pcie3x4_ep: pcie-ep@fe150000 {
+ compatible = "rockchip,rk3588-pcie-ep";
+ clocks = <&cru ACLK_PCIE_4L_MSTR>, <&cru ACLK_PCIE_4L_SLV>,
+ <&cru ACLK_PCIE_4L_DBI>, <&cru PCLK_PCIE_4L>,
+ <&cru CLK_PCIE_AUX0>, <&cru CLK_PCIE4L_PIPE>;
+ clock-names = "aclk_mst", "aclk_slv",
+ "aclk_dbi", "pclk",
+ "aux", "pipe";
+ interrupts = <GIC_SPI 263 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 262 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 261 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 260 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 259 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 271 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 272 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 270 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "sys", "pmc", "msg", "legacy", "err",
+ "dma0", "dma1", "dma2", "dma3";
+ max-link-speed = <3>;
+ num-lanes = <4>;
+ phys = <&pcie30phy>;
+ phy-names = "pcie-phy";
+ power-domains = <&power RK3588_PD_PCIE>;
+ reg = <0xa 0x40000000 0x0 0x00100000>,
+ <0xa 0x40100000 0x0 0x00100000>,
+ <0x0 0xfe150000 0x0 0x00010000>,
+ <0x9 0x00000000 0x0 0x40000000>,
+ <0xa 0x40300000 0x0 0x00100000>;
+ reg-names = "dbi", "dbi2", "apb", "addr_space", "atu";
+ resets = <&cru SRST_PCIE0_POWER_UP>, <&cru SRST_P_PCIE0>;
+ reset-names = "pwr", "pipe";
+ status = "disabled";
+ };
+
pcie3x2: pcie@fe160000 {
compatible = "rockchip,rk3588-pcie", "rockchip,rk3568-pcie";
#address-cells = <3>;
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 12/12] arm64: dts: rockchip: Add rock5b overlays for PCIe endpoint mode
2024-04-24 15:16 [PATCH 00/12] PCI: dw-rockchip: Add endpoint mode support Niklas Cassel
` (10 preceding siblings ...)
2024-04-24 15:16 ` [PATCH 11/12] arm64: dts: rockchip: Add PCIe endpoint mode support Niklas Cassel
@ 2024-04-24 15:16 ` Niklas Cassel
11 siblings, 0 replies; 21+ messages in thread
From: Niklas Cassel @ 2024-04-24 15:16 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Bjorn Helgaas,
Lorenzo Pieralisi, Krzysztof Wilczyński, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Niklas Cassel,
Kishon Vijay Abraham I, Arnd Bergmann, Damien Le Moal, Jon Lin,
Shawn Lin, Simon Xue
Cc: linux-pci, devicetree, linux-rockchip
Add rock5b overlays for PCIe endpoint mode support.
If using the rock5b as an endpoint against a normal PC, only the
rk3588-rock-5b-pcie-ep.dtbo needs to be applied.
If using two rock5b:s, with one board as EP and the other board as RC,
rk3588-rock-5b-pcie-ep.dtbo and rk3588-rock-5b-pcie-srns.dtbo has to
be applied to the respective boards.
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
arch/arm64/boot/dts/rockchip/Makefile | 5 +++++
.../boot/dts/rockchip/rk3588-rock-5b-pcie-ep.dtso | 25 ++++++++++++++++++++++
.../dts/rockchip/rk3588-rock-5b-pcie-srns.dtso | 16 ++++++++++++++
3 files changed, 46 insertions(+)
diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
index f906a868b71a..d827432d5111 100644
--- a/arch/arm64/boot/dts/rockchip/Makefile
+++ b/arch/arm64/boot/dts/rockchip/Makefile
@@ -117,6 +117,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-nanopc-t6.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-orangepi-5-plus.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-quartzpro64.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-rock-5b.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-rock-5b-pcie-ep.dtbo
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-rock-5b-pcie-srns.dtbo
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-tiger-haikou.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-toybrick-x0.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-turing-rk1.dtb
@@ -127,3 +129,6 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588s-nanopi-r6s.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588s-nanopi-r6c.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588s-rock-5a.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588s-orangepi-5.dtb
+
+# Enable support for device-tree overlays
+DTC_FLAGS_rk3588-rock-5b += -@
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-rock-5b-pcie-ep.dtso b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b-pcie-ep.dtso
new file mode 100644
index 000000000000..672d748fcc67
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b-pcie-ep.dtso
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * DT-overlay to run the PCIe3_4L Dual Mode controller in Endpoint mode
+ * in the SRNS (Separate Reference Clock No Spread) configuration.
+ *
+ * NOTE: If using a setup with two ROCK 5B:s, with one board running in
+ * RC mode and the other board running in EP mode, see also the device
+ * tree overlay: rk3588-rock-5b-pcie-srns.dtso.
+ */
+
+/dts-v1/;
+/plugin/;
+
+&pcie30phy {
+ rockchip,rx-common-refclk-mode = <0 0 0 0>;
+};
+
+&pcie3x4 {
+ status = "disabled";
+};
+
+&pcie3x4_ep {
+ vpcie3v3-supply = <&vcc3v3_pcie30>;
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-rock-5b-pcie-srns.dtso b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b-pcie-srns.dtso
new file mode 100644
index 000000000000..1a0f1af65c43
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b-pcie-srns.dtso
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * DT-overlay to run the PCIe3_4L Dual Mode controller in Root Complex
+ * mode in the SRNS (Separate Reference Clock No Spread) configuration.
+ *
+ * This device tree overlay is only needed (on the RC side) when running
+ * a setup with two ROCK 5B:s, with one board running in RC mode and the
+ * other board running in EP mode.
+ */
+
+/dts-v1/;
+/plugin/;
+
+&pcie30phy {
+ rockchip,rx-common-refclk-mode = <0 0 0 0>;
+};
--
2.44.0
^ permalink raw reply related [flat|nested] 21+ messages in thread