linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration
@ 2020-09-17 13:57 Geert Uytterhoeven
  2020-09-17 13:57 ` [PATCH net-next v4 1/5] dt-bindings: net: ethernet-controller: Add internal delay properties Geert Uytterhoeven
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Geert Uytterhoeven @ 2020-09-17 13:57 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski
  Cc: Rob Herring, Sergei Shtylyov, Florian Fainelli, Andrew Lunn,
	Oleksij Rempel, Philippe Schenker, Heiner Kallweit, Dan Murphy,
	Kazuya Mizuguchi, Wolfram Sang, Magnus Damm, netdev, devicetree,
	linux-renesas-soc, linux-kernel, Geert Uytterhoeven

	Hi David, Jakub,

Some Renesas EtherAVB variants support internal clock delay
configuration, which can add larger delays than the delays that are
typically supported by the PHY (using an "rgmii-*id" PHY mode, and/or
"[rt]xc-skew-ps" properties).

Historically, the EtherAVB driver configured these delays based on the
"rgmii-*id" PHY mode.  This caused issues with PHY drivers that
implement PHY internal delays properly[1].  Hence a backwards-compatible
workaround was added by masking the PHY mode[2].

This patch series implements the next step of the plan outlined in [3],
and adds proper support for explicit configuration of the MAC internal
clock delays using new "[rt]x-internal-delay-ps" properties.  If none of
these properties is present, the driver falls back to the old handling.

This can be considered the MAC counterpart of commit 9150069bf5fc0e86
("dt-bindings: net: Add tx and rx internal delays"), which applies to
the PHY.  Note that unlike commit 92252eec913b2dd5 ("net: phy: Add a
helper to return the index for of the internal delay"), no helpers are
provided to parse the DT properties, as so far there is a single user
only, which supports only zero or a single fixed value.  Of course such
helpers can be added later, when the need arises, or when deemed useful
otherwise.

This series consists of 3 parts:
  1. DT binding updates documenting the new properties, for both the
     generic ethernet-controller and the EtherAVB-specific bindings,
  2. Conversion to json-schema of the Renesas EtherAVB DT bindings.
     Technically, the conversion is independent of all of the above.
     I included it in this series, as it shows how all sanity checks on
     "[rt]x-internal-delay-ps" values are implemented as DT binding
     checks,
  3. EtherAVB driver update implementing support for the new properties.

Given Rob has provided his acks for the DT binding updates, all of this
can be merged through net-next.

Changes compared to v3[4]:
  - Add Reviewed-by,
  - Drop the DT updates, as they will be merged through renesas-devel and
    arm-soc, and have a hard dependency on this series.

Changes compared to v2[5]:
  - Update recently added board DTS files,
  - Add Reviewed-by.

Changes compared to v1[6]:
  - Added "[PATCH 1/7] dt-bindings: net: ethernet-controller: Add
    internal delay properties",
  - Replace "renesas,[rt]xc-delay-ps" by "[rt]x-internal-delay-ps",
  - Incorporated EtherAVB DT binding conversion to json-schema,
  - Add Reviewed-by.

Impacted, tested:
  - Salvator-X(S) with R-Car H3 ES1.0 and ES2.0, M3-W, and M3-N.

Not impacted, tested:
  - Ebisu with R-Car E3.

Impacted, not tested:
  - Salvator-X(S) with other SoC variants,
  - ULCB with R-Car H3/M3-W/M3-N variants,
  - V3MSK and Eagle with R-Car V3M,
  - Draak with R-Car V3H,
  - HiHope RZ/G2[MN] with RZ/G2M or RZ/G2N,
  - Beacon EmbeddedWorks RZ/G2M Development Kit.

To ease testing, I have pushed this series and the DT updates to the
topic/ravb-internal-clock-delays-v4 branch of my renesas-drivers
repository at
git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git.

Thanks for applying!

References:
  [1] Commit bcf3440c6dd78bfe ("net: phy: micrel: add phy-mode support
      for the KSZ9031 PHY")
  [2] Commit 9b23203c32ee02cd ("ravb: Mask PHY mode to avoid inserting
      delays twice").
      https://lore.kernel.org/r/20200529122540.31368-1-geert+renesas@glider.be/
  [3] https://lore.kernel.org/r/CAMuHMdU+MR-2tr3-pH55G0GqPG9HwH3XUd=8HZxprFDMGQeWUw@mail.gmail.com/
  [4] https://lore.kernel.org/linux-devicetree/20200819134344.27813-1-geert+renesas@glider.be/
  [5] https://lore.kernel.org/linux-devicetree/20200706143529.18306-1-geert+renesas@glider.be/
  [6] https://lore.kernel.org/linux-devicetree/20200619191554.24942-1-geert+renesas@glider.be/

Geert Uytterhoeven (5):
  dt-bindings: net: ethernet-controller: Add internal delay properties
  dt-bindings: net: renesas,ravb: Document internal clock delay
    properties
  dt-bindings: net: renesas,etheravb: Convert to json-schema
  ravb: Split delay handling in parsing and applying
  ravb: Add support for explicit internal clock delay configuration

 .../bindings/net/ethernet-controller.yaml     |  14 +
 .../bindings/net/renesas,etheravb.yaml        | 261 ++++++++++++++++++
 .../devicetree/bindings/net/renesas,ravb.txt  | 134 ---------
 drivers/net/ethernet/renesas/ravb.h           |   5 +-
 drivers/net/ethernet/renesas/ravb_main.c      |  53 +++-
 5 files changed, 320 insertions(+), 147 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/renesas,etheravb.yaml
 delete mode 100644 Documentation/devicetree/bindings/net/renesas,ravb.txt

-- 
2.17.1

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH net-next v4 1/5] dt-bindings: net: ethernet-controller: Add internal delay properties
  2020-09-17 13:57 [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
@ 2020-09-17 13:57 ` Geert Uytterhoeven
  2020-09-17 13:57 ` [PATCH net-next v4 2/5] dt-bindings: net: renesas,ravb: Document internal clock " Geert Uytterhoeven
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Geert Uytterhoeven @ 2020-09-17 13:57 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski
  Cc: Rob Herring, Sergei Shtylyov, Florian Fainelli, Andrew Lunn,
	Oleksij Rempel, Philippe Schenker, Heiner Kallweit, Dan Murphy,
	Kazuya Mizuguchi, Wolfram Sang, Magnus Damm, netdev, devicetree,
	linux-renesas-soc, linux-kernel, Geert Uytterhoeven

Internal Receive and Transmit Clock Delays are a common setting for
RGMII capable devices.

While these delays are typically applied by the PHY, some MACs support
configuring internal clock delay settings, too.  Hence add standardized
properties to configure this.

This is the MAC counterpart of commit 9150069bf5fc0e86 ("dt-bindings:
net: Add tx and rx internal delays"), which applies to the PHY.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Rob Herring <robh@kernel.org>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
---
v4:
  - Add Reviewed-by,

v3:
  - Add Reviewed-by,

v2:
  - New.
---
 .../bindings/net/ethernet-controller.yaml          | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/ethernet-controller.yaml b/Documentation/devicetree/bindings/net/ethernet-controller.yaml
index 1c4474036d46a9dc..e9bb386066540676 100644
--- a/Documentation/devicetree/bindings/net/ethernet-controller.yaml
+++ b/Documentation/devicetree/bindings/net/ethernet-controller.yaml
@@ -119,6 +119,13 @@ properties:
       and is useful for determining certain configuration settings
       such as flow control thresholds.
 
+  rx-internal-delay-ps:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    description: |
+      RGMII Receive Clock Delay defined in pico seconds.
+      This is used for controllers that have configurable RX internal delays.
+      If this property is present then the MAC applies the RX delay.
+
   sfp:
     $ref: /schemas/types.yaml#definitions/phandle
     description:
@@ -130,6 +137,13 @@ properties:
       The size of the controller\'s transmit fifo in bytes. This
       is used for components that can have configurable fifo sizes.
 
+  tx-internal-delay-ps:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    description: |
+      RGMII Transmit Clock Delay defined in pico seconds.
+      This is used for controllers that have configurable TX internal delays.
+      If this property is present then the MAC applies the TX delay.
+
   managed:
     description:
       Specifies the PHY management type. If auto is set and fixed-link
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net-next v4 2/5] dt-bindings: net: renesas,ravb: Document internal clock delay properties
  2020-09-17 13:57 [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
  2020-09-17 13:57 ` [PATCH net-next v4 1/5] dt-bindings: net: ethernet-controller: Add internal delay properties Geert Uytterhoeven
@ 2020-09-17 13:57 ` Geert Uytterhoeven
  2020-09-17 13:57 ` [PATCH net-next v4 3/5] dt-bindings: net: renesas,etheravb: Convert to json-schema Geert Uytterhoeven
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Geert Uytterhoeven @ 2020-09-17 13:57 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski
  Cc: Rob Herring, Sergei Shtylyov, Florian Fainelli, Andrew Lunn,
	Oleksij Rempel, Philippe Schenker, Heiner Kallweit, Dan Murphy,
	Kazuya Mizuguchi, Wolfram Sang, Magnus Damm, netdev, devicetree,
	linux-renesas-soc, linux-kernel, Geert Uytterhoeven

Some EtherAVB variants support internal clock delay configuration, which
can add larger delays than the delays that are typically supported by
the PHY (using an "rgmii-*id" PHY mode, and/or "[rt]xc-skew-ps"
properties).

Add properties for configuring the internal MAC delays.
These properties are mandatory, even when specified as zero, to
distinguish between old and new DTBs.

Update the (bogus) example accordingly.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Sergei Shtylyov <sergei.shtylyov@gmail.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
---
v4:
  - Add Reviewed-by,

v3:
  - Add Reviewed-by,

v2:
  - Replace "renesas,[rt]xc-delay-ps" by "[rt]x-internal-delay-ps",
  - Add "(bogus)" to the example update, to avoid people considering it
    a one-to-one conversion.
---
 .../devicetree/bindings/net/renesas,ravb.txt  | 29 ++++++++++---------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/Documentation/devicetree/bindings/net/renesas,ravb.txt b/Documentation/devicetree/bindings/net/renesas,ravb.txt
index 032b76f14f4fdb38..4a62dd11d5c488f4 100644
--- a/Documentation/devicetree/bindings/net/renesas,ravb.txt
+++ b/Documentation/devicetree/bindings/net/renesas,ravb.txt
@@ -64,6 +64,18 @@ Optional properties:
 			 AVB_LINK signal.
 - renesas,ether-link-active-low: boolean, specify when the AVB_LINK signal is
 				 active-low instead of normal active-high.
+- rx-internal-delay-ps: Internal RX clock delay.
+			This property is mandatory and valid only on R-Car Gen3
+			and RZ/G2 SoCs.
+			Valid values are 0 and 1800.
+			A non-zero value is allowed only if phy-mode = "rgmii".
+			Zero is not supported on R-Car D3.
+- tx-internal-delay-ps: Internal TX clock delay.
+			This property is mandatory and valid only on R-Car H3,
+			M3-W, M3-W+, M3-N, V3M, and V3H, and RZ/G2M and RZ/G2N.
+			Valid values are 0 and 2000.
+			A non-zero value is allowed only if phy-mode = "rgmii".
+			Zero is not supported on R-Car V3H.
 
 Example:
 
@@ -105,8 +117,10 @@ Example:
 				  "ch24";
 		clocks = <&cpg CPG_MOD 812>;
 		power-domains = <&cpg>;
-		phy-mode = "rgmii-id";
+		phy-mode = "rgmii";
 		phy-handle = <&phy0>;
+		rx-internal-delay-ps = <0>;
+		tx-internal-delay-ps = <2000>;
 
 		pinctrl-0 = <&ether_pins>;
 		pinctrl-names = "default";
@@ -115,18 +129,7 @@ Example:
 		#size-cells = <0>;
 
 		phy0: ethernet-phy@0 {
-			rxc-skew-ps = <900>;
-			rxdv-skew-ps = <0>;
-			rxd0-skew-ps = <0>;
-			rxd1-skew-ps = <0>;
-			rxd2-skew-ps = <0>;
-			rxd3-skew-ps = <0>;
-			txc-skew-ps = <900>;
-			txen-skew-ps = <0>;
-			txd0-skew-ps = <0>;
-			txd1-skew-ps = <0>;
-			txd2-skew-ps = <0>;
-			txd3-skew-ps = <0>;
+			rxc-skew-ps = <1500>;
 			reg = <0>;
 			interrupt-parent = <&gpio2>;
 			interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net-next v4 3/5] dt-bindings: net: renesas,etheravb: Convert to json-schema
  2020-09-17 13:57 [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
  2020-09-17 13:57 ` [PATCH net-next v4 1/5] dt-bindings: net: ethernet-controller: Add internal delay properties Geert Uytterhoeven
  2020-09-17 13:57 ` [PATCH net-next v4 2/5] dt-bindings: net: renesas,ravb: Document internal clock " Geert Uytterhoeven
@ 2020-09-17 13:57 ` Geert Uytterhoeven
  2020-09-17 13:57 ` [PATCH net-next v4 4/5] ravb: Split delay handling in parsing and applying Geert Uytterhoeven
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Geert Uytterhoeven @ 2020-09-17 13:57 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski
  Cc: Rob Herring, Sergei Shtylyov, Florian Fainelli, Andrew Lunn,
	Oleksij Rempel, Philippe Schenker, Heiner Kallweit, Dan Murphy,
	Kazuya Mizuguchi, Wolfram Sang, Magnus Damm, netdev, devicetree,
	linux-renesas-soc, linux-kernel, Geert Uytterhoeven

Convert the Renesas Ethernet AVB (EthernetAVB-IF) Device Tree binding
documentation to json-schema.

Add missing properties.
Update the example to match reality.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
---
v4:
  - Add Reviewed-by,

v3:
  - Add Reviewed-by,

v2:
  - Add Reviewed-by,
  - Replace "renesas,[rt]xc-delay-ps" by "[rt]x-internal-delay-ps", for
    which the base definition is imported from ethernet-controller.yaml.
---
 .../bindings/net/renesas,etheravb.yaml        | 261 ++++++++++++++++++
 .../devicetree/bindings/net/renesas,ravb.txt  | 137 ---------
 2 files changed, 261 insertions(+), 137 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/renesas,etheravb.yaml
 delete mode 100644 Documentation/devicetree/bindings/net/renesas,ravb.txt

diff --git a/Documentation/devicetree/bindings/net/renesas,etheravb.yaml b/Documentation/devicetree/bindings/net/renesas,etheravb.yaml
new file mode 100644
index 0000000000000000..e13653051b23d5f7
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/renesas,etheravb.yaml
@@ -0,0 +1,261 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/net/renesas,etheravb.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Renesas Ethernet AVB
+
+maintainers:
+  - Sergei Shtylyov <sergei.shtylyov@gmail.com>
+
+properties:
+  compatible:
+    oneOf:
+      - items:
+          - enum:
+              - renesas,etheravb-r8a7742      # RZ/G1H
+              - renesas,etheravb-r8a7743      # RZ/G1M
+              - renesas,etheravb-r8a7744      # RZ/G1N
+              - renesas,etheravb-r8a7745      # RZ/G1E
+              - renesas,etheravb-r8a77470     # RZ/G1C
+              - renesas,etheravb-r8a7790      # R-Car H2
+              - renesas,etheravb-r8a7791      # R-Car M2-W
+              - renesas,etheravb-r8a7792      # R-Car V2H
+              - renesas,etheravb-r8a7793      # R-Car M2-N
+              - renesas,etheravb-r8a7794      # R-Car E2
+          - const: renesas,etheravb-rcar-gen2 # R-Car Gen2 and RZ/G1
+
+      - items:
+          - enum:
+              - renesas,etheravb-r8a774a1     # RZ/G2M
+              - renesas,etheravb-r8a774b1     # RZ/G2N
+              - renesas,etheravb-r8a774c0     # RZ/G2E
+              - renesas,etheravb-r8a7795      # R-Car H3
+              - renesas,etheravb-r8a7796      # R-Car M3-W
+              - renesas,etheravb-r8a77961     # R-Car M3-W+
+              - renesas,etheravb-r8a77965     # R-Car M3-N
+              - renesas,etheravb-r8a77970     # R-Car V3M
+              - renesas,etheravb-r8a77980     # R-Car V3H
+              - renesas,etheravb-r8a77990     # R-Car E3
+              - renesas,etheravb-r8a77995     # R-Car D3
+          - const: renesas,etheravb-rcar-gen3 # R-Car Gen3 and RZ/G2
+
+  reg: true
+
+  interrupts: true
+
+  interrupt-names: true
+
+  clocks:
+    maxItems: 1
+
+  iommus:
+    maxItems: 1
+
+  power-domains:
+    maxItems: 1
+
+  resets:
+    maxItems: 1
+
+  phy-mode: true
+
+  phy-handle: true
+
+  '#address-cells':
+    description: Number of address cells for the MDIO bus.
+    const: 1
+
+  '#size-cells':
+    description: Number of size cells on the MDIO bus.
+    const: 0
+
+  renesas,no-ether-link:
+    type: boolean
+    description:
+      Specify when a board does not provide a proper AVB_LINK signal.
+
+  renesas,ether-link-active-low:
+    type: boolean
+    description:
+      Specify when the AVB_LINK signal is active-low instead of normal
+      active-high.
+
+  rx-internal-delay-ps:
+    enum: [0, 1800]
+
+  tx-internal-delay-ps:
+    enum: [0, 2000]
+
+patternProperties:
+  "^ethernet-phy@[0-9a-f]$":
+    type: object
+    $ref: ethernet-phy.yaml#
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - clocks
+  - power-domains
+  - resets
+  - phy-mode
+  - phy-handle
+  - '#address-cells'
+  - '#size-cells'
+
+allOf:
+  - $ref: ethernet-controller.yaml#
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - renesas,etheravb-rcar-gen2
+              - renesas,etheravb-r8a7795
+              - renesas,etheravb-r8a7796
+              - renesas,etheravb-r8a77961
+              - renesas,etheravb-r8a77965
+    then:
+      properties:
+        reg:
+          items:
+            - description: MAC register block
+            - description: Stream buffer
+    else:
+      properties:
+        reg:
+          items:
+            - description: MAC register block
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: renesas,etheravb-rcar-gen2
+    then:
+      properties:
+        interrupts:
+          maxItems: 1
+        interrupt-names:
+          items:
+            - const: mux
+        rx-internal-delay-ps: false
+    else:
+      properties:
+        interrupts:
+          minItems: 25
+          maxItems: 25
+        interrupt-names:
+          items:
+            pattern: '^ch[0-9]+$'
+      required:
+        - interrupt-names
+        - rx-internal-delay-ps
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - renesas,etheravb-r8a774a1
+              - renesas,etheravb-r8a774b1
+              - renesas,etheravb-r8a7795
+              - renesas,etheravb-r8a7796
+              - renesas,etheravb-r8a77961
+              - renesas,etheravb-r8a77965
+              - renesas,etheravb-r8a77970
+              - renesas,etheravb-r8a77980
+    then:
+      required:
+        - tx-internal-delay-ps
+    else:
+      properties:
+        tx-internal-delay-ps: false
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: renesas,etheravb-r8a77995
+    then:
+      properties:
+        rx-internal-delay-ps:
+          const: 1800
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: renesas,etheravb-r8a77980
+    then:
+      properties:
+        tx-internal-delay-ps:
+          const: 2000
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/r8a7795-cpg-mssr.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/power/r8a7795-sysc.h>
+    #include <dt-bindings/gpio/gpio.h>
+    aliases {
+            ethernet0 = &avb;
+    };
+
+    avb: ethernet@e6800000 {
+            compatible = "renesas,etheravb-r8a7795",
+                         "renesas,etheravb-rcar-gen3";
+            reg = <0xe6800000 0x800>, <0xe6a00000 0x10000>;
+            interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+            interrupt-names = "ch0", "ch1", "ch2", "ch3", "ch4", "ch5", "ch6",
+                              "ch7", "ch8", "ch9", "ch10", "ch11", "ch12",
+                              "ch13", "ch14", "ch15", "ch16", "ch17", "ch18",
+                              "ch19", "ch20", "ch21", "ch22", "ch23", "ch24";
+            clocks = <&cpg CPG_MOD 812>;
+            iommus = <&ipmmu_ds0 16>;
+            power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+            resets = <&cpg 812>;
+            phy-mode = "rgmii";
+            phy-handle = <&phy0>;
+            rx-internal-delay-ps = <0>;
+            tx-internal-delay-ps = <2000>;
+            #address-cells = <1>;
+            #size-cells = <0>;
+
+            phy0: ethernet-phy@0 {
+                    rxc-skew-ps = <1500>;
+                    reg = <0>;
+                    interrupt-parent = <&gpio2>;
+                    interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
+                    reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
+            };
+    };
diff --git a/Documentation/devicetree/bindings/net/renesas,ravb.txt b/Documentation/devicetree/bindings/net/renesas,ravb.txt
deleted file mode 100644
index 4a62dd11d5c488f4..0000000000000000
--- a/Documentation/devicetree/bindings/net/renesas,ravb.txt
+++ /dev/null
@@ -1,137 +0,0 @@
-* Renesas Electronics Ethernet AVB
-
-This file provides information on what the device node for the Ethernet AVB
-interface contains.
-
-Required properties:
-- compatible: Must contain one or more of the following:
-      - "renesas,etheravb-r8a7742" for the R8A7742 SoC.
-      - "renesas,etheravb-r8a7743" for the R8A7743 SoC.
-      - "renesas,etheravb-r8a7744" for the R8A7744 SoC.
-      - "renesas,etheravb-r8a7745" for the R8A7745 SoC.
-      - "renesas,etheravb-r8a77470" for the R8A77470 SoC.
-      - "renesas,etheravb-r8a7790" for the R8A7790 SoC.
-      - "renesas,etheravb-r8a7791" for the R8A7791 SoC.
-      - "renesas,etheravb-r8a7792" for the R8A7792 SoC.
-      - "renesas,etheravb-r8a7793" for the R8A7793 SoC.
-      - "renesas,etheravb-r8a7794" for the R8A7794 SoC.
-      - "renesas,etheravb-rcar-gen2" as a fallback for the above
-		R-Car Gen2 and RZ/G1 devices.
-
-      - "renesas,etheravb-r8a774a1" for the R8A774A1 SoC.
-      - "renesas,etheravb-r8a774b1" for the R8A774B1 SoC.
-      - "renesas,etheravb-r8a774c0" for the R8A774C0 SoC.
-      - "renesas,etheravb-r8a7795" for the R8A7795 SoC.
-      - "renesas,etheravb-r8a7796" for the R8A77960 SoC.
-      - "renesas,etheravb-r8a77961" for the R8A77961 SoC.
-      - "renesas,etheravb-r8a77965" for the R8A77965 SoC.
-      - "renesas,etheravb-r8a77970" for the R8A77970 SoC.
-      - "renesas,etheravb-r8a77980" for the R8A77980 SoC.
-      - "renesas,etheravb-r8a77990" for the R8A77990 SoC.
-      - "renesas,etheravb-r8a77995" for the R8A77995 SoC.
-      - "renesas,etheravb-rcar-gen3" as a fallback for the above
-		R-Car Gen3 and RZ/G2 devices.
-
-	When compatible with the generic version, nodes must list the
-	SoC-specific version corresponding to the platform first followed by
-	the generic version.
-
-- reg: Offset and length of (1) the register block and (2) the stream buffer.
-       The region for the register block is mandatory.
-       The region for the stream buffer is optional, as it is only present on
-       R-Car Gen2 and RZ/G1 SoCs, and on R-Car H3 (R8A7795), M3-W (R8A77960),
-       M3-W+ (R8A77961), and M3-N (R8A77965).
-- interrupts: A list of interrupt-specifiers, one for each entry in
-	      interrupt-names.
-	      If interrupt-names is not present, an interrupt specifier
-	      for a single muxed interrupt.
-- phy-mode: see ethernet.txt file in the same directory.
-- phy-handle: see ethernet.txt file in the same directory.
-- #address-cells: number of address cells for the MDIO bus, must be equal to 1.
-- #size-cells: number of size cells on the MDIO bus, must be equal to 0.
-- clocks: clock phandle and specifier pair.
-- pinctrl-0: phandle, referring to a default pin configuration node.
-
-Optional properties:
-- interrupt-names: A list of interrupt names.
-		   For the R-Car Gen 3 SoCs this property is mandatory;
-		   it should include one entry per channel, named "ch%u",
-		   where %u is the channel number ranging from 0 to 24.
-		   For other SoCs this property is optional; if present
-		   it should contain "mux" for a single muxed interrupt.
-- pinctrl-names: pin configuration state name ("default").
-- renesas,no-ether-link: boolean, specify when a board does not provide a proper
-			 AVB_LINK signal.
-- renesas,ether-link-active-low: boolean, specify when the AVB_LINK signal is
-				 active-low instead of normal active-high.
-- rx-internal-delay-ps: Internal RX clock delay.
-			This property is mandatory and valid only on R-Car Gen3
-			and RZ/G2 SoCs.
-			Valid values are 0 and 1800.
-			A non-zero value is allowed only if phy-mode = "rgmii".
-			Zero is not supported on R-Car D3.
-- tx-internal-delay-ps: Internal TX clock delay.
-			This property is mandatory and valid only on R-Car H3,
-			M3-W, M3-W+, M3-N, V3M, and V3H, and RZ/G2M and RZ/G2N.
-			Valid values are 0 and 2000.
-			A non-zero value is allowed only if phy-mode = "rgmii".
-			Zero is not supported on R-Car V3H.
-
-Example:
-
-	ethernet@e6800000 {
-		compatible = "renesas,etheravb-r8a7795", "renesas,etheravb-rcar-gen3";
-		reg = <0 0xe6800000 0 0x800>, <0 0xe6a00000 0 0x10000>;
-		interrupt-parent = <&gic>;
-		interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
-		interrupt-names = "ch0", "ch1", "ch2", "ch3",
-				  "ch4", "ch5", "ch6", "ch7",
-				  "ch8", "ch9", "ch10", "ch11",
-				  "ch12", "ch13", "ch14", "ch15",
-				  "ch16", "ch17", "ch18", "ch19",
-				  "ch20", "ch21", "ch22", "ch23",
-				  "ch24";
-		clocks = <&cpg CPG_MOD 812>;
-		power-domains = <&cpg>;
-		phy-mode = "rgmii";
-		phy-handle = <&phy0>;
-		rx-internal-delay-ps = <0>;
-		tx-internal-delay-ps = <2000>;
-
-		pinctrl-0 = <&ether_pins>;
-		pinctrl-names = "default";
-		renesas,no-ether-link;
-		#address-cells = <1>;
-		#size-cells = <0>;
-
-		phy0: ethernet-phy@0 {
-			rxc-skew-ps = <1500>;
-			reg = <0>;
-			interrupt-parent = <&gpio2>;
-			interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
-		};
-	};
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net-next v4 4/5] ravb: Split delay handling in parsing and applying
  2020-09-17 13:57 [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
                   ` (2 preceding siblings ...)
  2020-09-17 13:57 ` [PATCH net-next v4 3/5] dt-bindings: net: renesas,etheravb: Convert to json-schema Geert Uytterhoeven
@ 2020-09-17 13:57 ` Geert Uytterhoeven
  2020-09-17 13:57 ` [PATCH net-next v4 5/5] ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
  2020-09-30 12:21 ` [PATCH net-next v4 0/5] net/ravb: " Geert Uytterhoeven
  5 siblings, 0 replies; 10+ messages in thread
From: Geert Uytterhoeven @ 2020-09-17 13:57 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski
  Cc: Rob Herring, Sergei Shtylyov, Florian Fainelli, Andrew Lunn,
	Oleksij Rempel, Philippe Schenker, Heiner Kallweit, Dan Murphy,
	Kazuya Mizuguchi, Wolfram Sang, Magnus Damm, netdev, devicetree,
	linux-renesas-soc, linux-kernel, Geert Uytterhoeven

Currently, full delay handling is done in both the probe and resume
paths.  Split it in two parts, so the resume path doesn't have to redo
the parsing part over and over again.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
---
v4:
  - Add Reviewed-by,

v3:
  - No changes,

v2:
  - Add Reviewed-by,
  - Use 1 instead of true when assigning to a single-bit bitfield.
---
 drivers/net/ethernet/renesas/ravb.h      |  4 +++-
 drivers/net/ethernet/renesas/ravb_main.c | 21 ++++++++++++++++-----
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/renesas/ravb.h b/drivers/net/ethernet/renesas/ravb.h
index 9f88b5db4f89843a..e5ca12ce93c730a9 100644
--- a/drivers/net/ethernet/renesas/ravb.h
+++ b/drivers/net/ethernet/renesas/ravb.h
@@ -1036,7 +1036,9 @@ struct ravb_private {
 	unsigned no_avb_link:1;
 	unsigned avb_link_active_low:1;
 	unsigned wol_enabled:1;
-	int num_tx_desc;	/* TX descriptors per packet */
+	unsigned rxcidm:1;		/* RX Clock Internal Delay Mode */
+	unsigned txcidm:1;		/* TX Clock Internal Delay Mode */
+	int num_tx_desc;		/* TX descriptors per packet */
 };
 
 static inline u32 ravb_read(struct net_device *ndev, enum ravb_reg reg)
diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 99f7aae102ce12a1..59dadd971345e0d1 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -1989,23 +1989,32 @@ static const struct soc_device_attribute ravb_delay_mode_quirk_match[] = {
 };
 
 /* Set tx and rx clock internal delay modes */
-static void ravb_set_delay_mode(struct net_device *ndev)
+static void ravb_parse_delay_mode(struct net_device *ndev)
 {
 	struct ravb_private *priv = netdev_priv(ndev);
-	int set = 0;
 
 	if (priv->phy_interface == PHY_INTERFACE_MODE_RGMII_ID ||
 	    priv->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
-		set |= APSR_DM_RDM;
+		priv->rxcidm = 1;
 
 	if (priv->phy_interface == PHY_INTERFACE_MODE_RGMII_ID ||
 	    priv->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID) {
 		if (!WARN(soc_device_match(ravb_delay_mode_quirk_match),
 			  "phy-mode %s requires TX clock internal delay mode which is not supported by this hardware revision. Please update device tree",
 			  phy_modes(priv->phy_interface)))
-			set |= APSR_DM_TDM;
+			priv->txcidm = 1;
 	}
+}
 
+static void ravb_set_delay_mode(struct net_device *ndev)
+{
+	struct ravb_private *priv = netdev_priv(ndev);
+	u32 set = 0;
+
+	if (priv->rxcidm)
+		set |= APSR_DM_RDM;
+	if (priv->txcidm)
+		set |= APSR_DM_TDM;
 	ravb_modify(ndev, APSR, APSR_DM, set);
 }
 
@@ -2138,8 +2147,10 @@ static int ravb_probe(struct platform_device *pdev)
 	/* Request GTI loading */
 	ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
 
-	if (priv->chip_id != RCAR_GEN2)
+	if (priv->chip_id != RCAR_GEN2) {
+		ravb_parse_delay_mode(ndev);
 		ravb_set_delay_mode(ndev);
+	}
 
 	/* Allocate descriptor base address table */
 	priv->desc_bat_size = sizeof(struct ravb_desc) * DBAT_ENTRY_NUM;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net-next v4 5/5] ravb: Add support for explicit internal clock delay configuration
  2020-09-17 13:57 [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
                   ` (3 preceding siblings ...)
  2020-09-17 13:57 ` [PATCH net-next v4 4/5] ravb: Split delay handling in parsing and applying Geert Uytterhoeven
@ 2020-09-17 13:57 ` Geert Uytterhoeven
  2020-09-17 18:49   ` Dan Murphy
  2020-09-30 12:21 ` [PATCH net-next v4 0/5] net/ravb: " Geert Uytterhoeven
  5 siblings, 1 reply; 10+ messages in thread
From: Geert Uytterhoeven @ 2020-09-17 13:57 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski
  Cc: Rob Herring, Sergei Shtylyov, Florian Fainelli, Andrew Lunn,
	Oleksij Rempel, Philippe Schenker, Heiner Kallweit, Dan Murphy,
	Kazuya Mizuguchi, Wolfram Sang, Magnus Damm, netdev, devicetree,
	linux-renesas-soc, linux-kernel, Geert Uytterhoeven

Some EtherAVB variants support internal clock delay configuration, which
can add larger delays than the delays that are typically supported by
the PHY (using an "rgmii-*id" PHY mode, and/or "[rt]xc-skew-ps"
properties).

Historically, the EtherAVB driver configured these delays based on the
"rgmii-*id" PHY mode.  This caused issues with PHY drivers that
implement PHY internal delays properly[1].  Hence a backwards-compatible
workaround was added by masking the PHY mode[2].

Add proper support for explicit configuration of the MAC internal clock
delays using the new "[rt]x-internal-delay-ps" properties.
Fall back to the old handling if none of these properties is present.

[1] Commit bcf3440c6dd78bfe ("net: phy: micrel: add phy-mode support for
    the KSZ9031 PHY")
[2] Commit 9b23203c32ee02cd ("ravb: Mask PHY mode to avoid inserting
    delays twice").

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
---
v4:
  - Add Reviewed-by,

v3:
  - No changes,

v2:
  - Add Reviewed-by,
  - Split long line,
  - Replace "renesas,[rt]xc-delay-ps" by "[rt]x-internal-delay-ps",
  - Use 1 instead of true when assigning to a single-bit bitfield.
---
 drivers/net/ethernet/renesas/ravb.h      |  1 +
 drivers/net/ethernet/renesas/ravb_main.c | 36 ++++++++++++++++++------
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/renesas/ravb.h b/drivers/net/ethernet/renesas/ravb.h
index e5ca12ce93c730a9..7453b17a37a2c8d0 100644
--- a/drivers/net/ethernet/renesas/ravb.h
+++ b/drivers/net/ethernet/renesas/ravb.h
@@ -1038,6 +1038,7 @@ struct ravb_private {
 	unsigned wol_enabled:1;
 	unsigned rxcidm:1;		/* RX Clock Internal Delay Mode */
 	unsigned txcidm:1;		/* TX Clock Internal Delay Mode */
+	unsigned rgmii_override:1;	/* Deprecated rgmii-*id behavior */
 	int num_tx_desc;		/* TX descriptors per packet */
 };
 
diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 59dadd971345e0d1..aa120e3f1e4d4da5 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -1034,11 +1034,8 @@ static int ravb_phy_init(struct net_device *ndev)
 		pn = of_node_get(np);
 	}
 
-	iface = priv->phy_interface;
-	if (priv->chip_id != RCAR_GEN2 && phy_interface_mode_is_rgmii(iface)) {
-		/* ravb_set_delay_mode() takes care of internal delay mode */
-		iface = PHY_INTERFACE_MODE_RGMII;
-	}
+	iface = priv->rgmii_override ? PHY_INTERFACE_MODE_RGMII
+				     : priv->phy_interface;
 	phydev = of_phy_connect(ndev, pn, ravb_adjust_link, 0, iface);
 	of_node_put(pn);
 	if (!phydev) {
@@ -1989,20 +1986,41 @@ static const struct soc_device_attribute ravb_delay_mode_quirk_match[] = {
 };
 
 /* Set tx and rx clock internal delay modes */
-static void ravb_parse_delay_mode(struct net_device *ndev)
+static void ravb_parse_delay_mode(struct device_node *np, struct net_device *ndev)
 {
 	struct ravb_private *priv = netdev_priv(ndev);
+	bool explicit_delay = false;
+	u32 delay;
+
+	if (!of_property_read_u32(np, "rx-internal-delay-ps", &delay)) {
+		/* Valid values are 0 and 1800, according to DT bindings */
+		priv->rxcidm = !!delay;
+		explicit_delay = true;
+	}
+	if (!of_property_read_u32(np, "tx-internal-delay-ps", &delay)) {
+		/* Valid values are 0 and 2000, according to DT bindings */
+		priv->txcidm = !!delay;
+		explicit_delay = true;
+	}
 
+	if (explicit_delay)
+		return;
+
+	/* Fall back to legacy rgmii-*id behavior */
 	if (priv->phy_interface == PHY_INTERFACE_MODE_RGMII_ID ||
-	    priv->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
+	    priv->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) {
 		priv->rxcidm = 1;
+		priv->rgmii_override = 1;
+	}
 
 	if (priv->phy_interface == PHY_INTERFACE_MODE_RGMII_ID ||
 	    priv->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID) {
 		if (!WARN(soc_device_match(ravb_delay_mode_quirk_match),
 			  "phy-mode %s requires TX clock internal delay mode which is not supported by this hardware revision. Please update device tree",
-			  phy_modes(priv->phy_interface)))
+			  phy_modes(priv->phy_interface))) {
 			priv->txcidm = 1;
+			priv->rgmii_override = 1;
+		}
 	}
 }
 
@@ -2148,7 +2166,7 @@ static int ravb_probe(struct platform_device *pdev)
 	ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
 
 	if (priv->chip_id != RCAR_GEN2) {
-		ravb_parse_delay_mode(ndev);
+		ravb_parse_delay_mode(np, ndev);
 		ravb_set_delay_mode(ndev);
 	}
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH net-next v4 5/5] ravb: Add support for explicit internal clock delay configuration
  2020-09-17 13:57 ` [PATCH net-next v4 5/5] ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
@ 2020-09-17 18:49   ` Dan Murphy
  2020-09-18  9:04     ` Geert Uytterhoeven
  0 siblings, 1 reply; 10+ messages in thread
From: Dan Murphy @ 2020-09-17 18:49 UTC (permalink / raw)
  To: Geert Uytterhoeven, David S . Miller, Jakub Kicinski
  Cc: Rob Herring, Sergei Shtylyov, Florian Fainelli, Andrew Lunn,
	Oleksij Rempel, Philippe Schenker, Heiner Kallweit,
	Kazuya Mizuguchi, Wolfram Sang, Magnus Damm, netdev, devicetree,
	linux-renesas-soc, linux-kernel

Geert

On 9/17/20 8:57 AM, Geert Uytterhoeven wrote:
> Some EtherAVB variants support internal clock delay configuration, which
> can add larger delays than the delays that are typically supported by
> the PHY (using an "rgmii-*id" PHY mode, and/or "[rt]xc-skew-ps"
> properties).
>
> Historically, the EtherAVB driver configured these delays based on the
> "rgmii-*id" PHY mode.  This caused issues with PHY drivers that
> implement PHY internal delays properly[1].  Hence a backwards-compatible
> workaround was added by masking the PHY mode[2].
>
> Add proper support for explicit configuration of the MAC internal clock
> delays using the new "[rt]x-internal-delay-ps" properties.
> Fall back to the old handling if none of these properties is present.
>
> [1] Commit bcf3440c6dd78bfe ("net: phy: micrel: add phy-mode support for
>      the KSZ9031 PHY")
> [2] Commit 9b23203c32ee02cd ("ravb: Mask PHY mode to avoid inserting
>      delays twice").
>
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Reviewed-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
> v4:
>    - Add Reviewed-by,
>
> v3:
>    - No changes,
>
> v2:
>    - Add Reviewed-by,
>    - Split long line,
>    - Replace "renesas,[rt]xc-delay-ps" by "[rt]x-internal-delay-ps",
>    - Use 1 instead of true when assigning to a single-bit bitfield.
> ---
>   drivers/net/ethernet/renesas/ravb.h      |  1 +
>   drivers/net/ethernet/renesas/ravb_main.c | 36 ++++++++++++++++++------
>   2 files changed, 28 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/renesas/ravb.h b/drivers/net/ethernet/renesas/ravb.h
> index e5ca12ce93c730a9..7453b17a37a2c8d0 100644
> --- a/drivers/net/ethernet/renesas/ravb.h
> +++ b/drivers/net/ethernet/renesas/ravb.h
> @@ -1038,6 +1038,7 @@ struct ravb_private {
>   	unsigned wol_enabled:1;
>   	unsigned rxcidm:1;		/* RX Clock Internal Delay Mode */
>   	unsigned txcidm:1;		/* TX Clock Internal Delay Mode */
> +	unsigned rgmii_override:1;	/* Deprecated rgmii-*id behavior */
>   	int num_tx_desc;		/* TX descriptors per packet */
>   };
>   
> diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
> index 59dadd971345e0d1..aa120e3f1e4d4da5 100644
> --- a/drivers/net/ethernet/renesas/ravb_main.c
> +++ b/drivers/net/ethernet/renesas/ravb_main.c
> @@ -1034,11 +1034,8 @@ static int ravb_phy_init(struct net_device *ndev)
>   		pn = of_node_get(np);
>   	}
>   
> -	iface = priv->phy_interface;
> -	if (priv->chip_id != RCAR_GEN2 && phy_interface_mode_is_rgmii(iface)) {
> -		/* ravb_set_delay_mode() takes care of internal delay mode */
> -		iface = PHY_INTERFACE_MODE_RGMII;
> -	}
> +	iface = priv->rgmii_override ? PHY_INTERFACE_MODE_RGMII
> +				     : priv->phy_interface;
>   	phydev = of_phy_connect(ndev, pn, ravb_adjust_link, 0, iface);
>   	of_node_put(pn);
>   	if (!phydev) {
> @@ -1989,20 +1986,41 @@ static const struct soc_device_attribute ravb_delay_mode_quirk_match[] = {
>   };
>   
>   /* Set tx and rx clock internal delay modes */
> -static void ravb_parse_delay_mode(struct net_device *ndev)
> +static void ravb_parse_delay_mode(struct device_node *np, struct net_device *ndev)
>   {
>   	struct ravb_private *priv = netdev_priv(ndev);
> +	bool explicit_delay = false;
> +	u32 delay;
> +
> +	if (!of_property_read_u32(np, "rx-internal-delay-ps", &delay)) {
> +		/* Valid values are 0 and 1800, according to DT bindings */
> +		priv->rxcidm = !!delay;
> +		explicit_delay = true;
> +	}
> +	if (!of_property_read_u32(np, "tx-internal-delay-ps", &delay)) {
> +		/* Valid values are 0 and 2000, according to DT bindings */
> +		priv->txcidm = !!delay;
> +		explicit_delay = true;
> +	}
There are helper functions for this

s32 phy_get_internal_delay(struct phy_device *phydev, struct device 
*dev, const int *delay_values, int size, bool is_rx)



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH net-next v4 5/5] ravb: Add support for explicit internal clock delay configuration
  2020-09-17 18:49   ` Dan Murphy
@ 2020-09-18  9:04     ` Geert Uytterhoeven
  0 siblings, 0 replies; 10+ messages in thread
From: Geert Uytterhoeven @ 2020-09-18  9:04 UTC (permalink / raw)
  To: Dan Murphy
  Cc: David S . Miller, Jakub Kicinski, Rob Herring, Sergei Shtylyov,
	Florian Fainelli, Andrew Lunn, Oleksij Rempel, Philippe Schenker,
	Heiner Kallweit, Kazuya Mizuguchi, Wolfram Sang, Magnus Damm,
	netdev,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	Linux-Renesas, Linux Kernel Mailing List

Hi Dan,

On Thu, Sep 17, 2020 at 8:50 PM Dan Murphy <dmurphy@ti.com> wrote:
> On 9/17/20 8:57 AM, Geert Uytterhoeven wrote:
> > Some EtherAVB variants support internal clock delay configuration, which
> > can add larger delays than the delays that are typically supported by
> > the PHY (using an "rgmii-*id" PHY mode, and/or "[rt]xc-skew-ps"
> > properties).
> >
> > Historically, the EtherAVB driver configured these delays based on the
> > "rgmii-*id" PHY mode.  This caused issues with PHY drivers that
> > implement PHY internal delays properly[1].  Hence a backwards-compatible
> > workaround was added by masking the PHY mode[2].
> >
> > Add proper support for explicit configuration of the MAC internal clock
> > delays using the new "[rt]x-internal-delay-ps" properties.
> > Fall back to the old handling if none of these properties is present.
> >
> > [1] Commit bcf3440c6dd78bfe ("net: phy: micrel: add phy-mode support for
> >      the KSZ9031 PHY")
> > [2] Commit 9b23203c32ee02cd ("ravb: Mask PHY mode to avoid inserting
> >      delays twice").
> >
> > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> > Reviewed-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
> > Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>

> > @@ -1989,20 +1986,41 @@ static const struct soc_device_attribute ravb_delay_mode_quirk_match[] = {
> >   };
> >
> >   /* Set tx and rx clock internal delay modes */
> > -static void ravb_parse_delay_mode(struct net_device *ndev)
> > +static void ravb_parse_delay_mode(struct device_node *np, struct net_device *ndev)
> >   {
> >       struct ravb_private *priv = netdev_priv(ndev);
> > +     bool explicit_delay = false;
> > +     u32 delay;
> > +
> > +     if (!of_property_read_u32(np, "rx-internal-delay-ps", &delay)) {
> > +             /* Valid values are 0 and 1800, according to DT bindings */
> > +             priv->rxcidm = !!delay;
> > +             explicit_delay = true;
> > +     }
> > +     if (!of_property_read_u32(np, "tx-internal-delay-ps", &delay)) {
> > +             /* Valid values are 0 and 2000, according to DT bindings */
> > +             priv->txcidm = !!delay;
> > +             explicit_delay = true;
> > +     }
> There are helper functions for this
>
> s32 phy_get_internal_delay(struct phy_device *phydev, struct device
> *dev, const int *delay_values, int size, bool is_rx)

That helper operates on the PHY device, not on the MAC device.
Cfr. what I stated in the cover letter:

    This can be considered the MAC counterpart of commit 9150069bf5fc0e86
    ("dt-bindings: net: Add tx and rx internal delays"), which applies to
    the PHY.  Note that unlike commit 92252eec913b2dd5 ("net: phy: Add a
    helper to return the index for of the internal delay"), no helpers are
    provided to parse the DT properties, as so far there is a single user
    only, which supports only zero or a single fixed value.  Of course such
    helpers can be added later, when the need arises, or when deemed useful
    otherwise.

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration
  2020-09-17 13:57 [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
                   ` (4 preceding siblings ...)
  2020-09-17 13:57 ` [PATCH net-next v4 5/5] ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
@ 2020-09-30 12:21 ` Geert Uytterhoeven
  2020-09-30 21:19   ` David Miller
  5 siblings, 1 reply; 10+ messages in thread
From: Geert Uytterhoeven @ 2020-09-30 12:21 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski
  Cc: Rob Herring, Sergei Shtylyov, Florian Fainelli, Andrew Lunn,
	Oleksij Rempel, Philippe Schenker, Heiner Kallweit, Dan Murphy,
	Kazuya Mizuguchi, Wolfram Sang, Magnus Damm, netdev,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	Linux-Renesas, Linux Kernel Mailing List

Hi David, Jakub,

On Thu, Sep 17, 2020 at 3:57 PM Geert Uytterhoeven
<geert+renesas@glider.be> wrote:
> Some Renesas EtherAVB variants support internal clock delay
> configuration, which can add larger delays than the delays that are
> typically supported by the PHY (using an "rgmii-*id" PHY mode, and/or
> "[rt]xc-skew-ps" properties).
>
> Historically, the EtherAVB driver configured these delays based on the
> "rgmii-*id" PHY mode.  This caused issues with PHY drivers that
> implement PHY internal delays properly[1].  Hence a backwards-compatible
> workaround was added by masking the PHY mode[2].
>
> This patch series implements the next step of the plan outlined in [3],
> and adds proper support for explicit configuration of the MAC internal
> clock delays using new "[rt]x-internal-delay-ps" properties.  If none of
> these properties is present, the driver falls back to the old handling.
>
> This can be considered the MAC counterpart of commit 9150069bf5fc0e86
> ("dt-bindings: net: Add tx and rx internal delays"), which applies to
> the PHY.  Note that unlike commit 92252eec913b2dd5 ("net: phy: Add a
> helper to return the index for of the internal delay"), no helpers are
> provided to parse the DT properties, as so far there is a single user
> only, which supports only zero or a single fixed value.  Of course such
> helpers can be added later, when the need arises, or when deemed useful
> otherwise.
>
> This series consists of 3 parts:
>   1. DT binding updates documenting the new properties, for both the
>      generic ethernet-controller and the EtherAVB-specific bindings,
>   2. Conversion to json-schema of the Renesas EtherAVB DT bindings.
>      Technically, the conversion is independent of all of the above.
>      I included it in this series, as it shows how all sanity checks on
>      "[rt]x-internal-delay-ps" values are implemented as DT binding
>      checks,
>   3. EtherAVB driver update implementing support for the new properties.
>
> Given Rob has provided his acks for the DT binding updates, all of this
> can be merged through net-next.
>
> Changes compared to v3[4]:
>   - Add Reviewed-by,
>   - Drop the DT updates, as they will be merged through renesas-devel and
>     arm-soc, and have a hard dependency on this series.
>
> Changes compared to v2[5]:
>   - Update recently added board DTS files,
>   - Add Reviewed-by.
>
> Changes compared to v1[6]:
>   - Added "[PATCH 1/7] dt-bindings: net: ethernet-controller: Add
>     internal delay properties",
>   - Replace "renesas,[rt]xc-delay-ps" by "[rt]x-internal-delay-ps",
>   - Incorporated EtherAVB DT binding conversion to json-schema,
>   - Add Reviewed-by.
>
> Impacted, tested:
>   - Salvator-X(S) with R-Car H3 ES1.0 and ES2.0, M3-W, and M3-N.
>
> Not impacted, tested:
>   - Ebisu with R-Car E3.
>
> Impacted, not tested:
>   - Salvator-X(S) with other SoC variants,
>   - ULCB with R-Car H3/M3-W/M3-N variants,
>   - V3MSK and Eagle with R-Car V3M,
>   - Draak with R-Car V3H,
>   - HiHope RZ/G2[MN] with RZ/G2M or RZ/G2N,
>   - Beacon EmbeddedWorks RZ/G2M Development Kit.
>
> To ease testing, I have pushed this series and the DT updates to the
> topic/ravb-internal-clock-delays-v4 branch of my renesas-drivers
> repository at
> git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git.
>
> Thanks for applying!

Is there anything still blocking this series?

Thanks!

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration
  2020-09-30 12:21 ` [PATCH net-next v4 0/5] net/ravb: " Geert Uytterhoeven
@ 2020-09-30 21:19   ` David Miller
  0 siblings, 0 replies; 10+ messages in thread
From: David Miller @ 2020-09-30 21:19 UTC (permalink / raw)
  To: geert
  Cc: kuba, robh+dt, sergei.shtylyov, f.fainelli, andrew, linux,
	philippe.schenker, hkallweit1, dmurphy, kazuya.mizuguchi.ks,
	wsa+renesas, magnus.damm, netdev, devicetree, linux-renesas-soc,
	linux-kernel

From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: Wed, 30 Sep 2020 14:21:30 +0200

> Is there anything still blocking this series?

If it's not active in networking patchwork, it needs to be resubmitted
or similar.


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-09-30 21:20 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-17 13:57 [PATCH net-next v4 0/5] net/ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
2020-09-17 13:57 ` [PATCH net-next v4 1/5] dt-bindings: net: ethernet-controller: Add internal delay properties Geert Uytterhoeven
2020-09-17 13:57 ` [PATCH net-next v4 2/5] dt-bindings: net: renesas,ravb: Document internal clock " Geert Uytterhoeven
2020-09-17 13:57 ` [PATCH net-next v4 3/5] dt-bindings: net: renesas,etheravb: Convert to json-schema Geert Uytterhoeven
2020-09-17 13:57 ` [PATCH net-next v4 4/5] ravb: Split delay handling in parsing and applying Geert Uytterhoeven
2020-09-17 13:57 ` [PATCH net-next v4 5/5] ravb: Add support for explicit internal clock delay configuration Geert Uytterhoeven
2020-09-17 18:49   ` Dan Murphy
2020-09-18  9:04     ` Geert Uytterhoeven
2020-09-30 12:21 ` [PATCH net-next v4 0/5] net/ravb: " Geert Uytterhoeven
2020-09-30 21:19   ` David Miller

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).