Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

Distributed Switch Architecture Device Tree Bindings
----------------------------------------------------

Switches are true Linux devices and can be probed by any means. Once
probed, they register to the DSA framework, passing a node
pointer. This node is expected to fulfil the following binding, and
may contain additional properties as required by the device it is
embedded within.

Required properties:

- ports		: A container for child nodes representing switch ports.

Optional properties:

- dsa,member	: A two element list indicates which DSA cluster, and position
		  within the cluster a switch takes. <0 0> is cluster 0,
		  switch 0. <0 1> is cluster 0, switch 1. <1 0> is cluster 1,
		  switch 0. A switch not part of any cluster (single device
		  hanging off a CPU port) must not specify this property

The ports container has the following properties

Required properties:

- #address-cells	: Must be 1
- #size-cells		: Must be 0

Each port children node must have the following mandatory properties:
- reg			: Describes the port address in the switch

An uplink/downlink port between switches in the cluster has the following
mandatory property:

- link			: Should be a list of phandles to other switch's DSA
			  port. This port is used as the outgoing port
			  towards the phandle ports. The full routing
			  information must be given, not just the one hop
			  routes to neighbouring switches.

A CPU port has the following mandatory property:

- ethernet		: Should be a phandle to a valid Ethernet device node.
                          This host device is what the switch port is
			  connected to.

A user port has the following optional property:

- label			: Describes the label associated with this port, which
                          will become the netdev name.

Port child nodes may also contain the following optional standardised
properties, described in binding documents:

- phy-handle		: Phandle to a PHY on an MDIO bus. See
			  Documentation/devicetree/bindings/net/ethernet.txt
			  for details.

- phy-mode		: See
			  Documentation/devicetree/bindings/net/ethernet.txt
			  for details.

- fixed-link		: Fixed-link subnode describing a link to a non-MDIO
			  managed entity. See
			  Documentation/devicetree/bindings/net/fixed-link.txt
			  for details.

The MAC address will be determined using the optional properties
defined in ethernet.txt.

Example

The following example shows three switches on three MDIO busses,
linked into one DSA cluster.

&mdio1 {
	#address-cells = <1>;
	#size-cells = <0>;

	switch0: switch0@0 {
		compatible = "marvell,mv88e6085";
		reg = <0>;

		dsa,member = <0 0>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				reg = <0>;
				label = "lan0";
			};

			port@1 {
				reg = <1>;
				label = "lan1";
				local-mac-address = [00 00 00 00 00 00];
			};

			port@2 {
				reg = <2>;
				label = "lan2";
			};

			switch0port5: port@5 {
				reg = <5>;
				phy-mode = "rgmii-txid";
				link = <&switch1port6
					&switch2port9>;
				fixed-link {
					speed = <1000>;
					full-duplex;
				};
			};

			port@6 {
				reg = <6>;
				ethernet = <&fec1>;
				fixed-link {
					speed = <100>;
					full-duplex;
				};
			};
		};
	};
};

&mdio2 {
	#address-cells = <1>;
	#size-cells = <0>;

	switch1: switch1@0 {
		compatible = "marvell,mv88e6085";
		reg = <0>;

		dsa,member = <0 1>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				reg = <0>;
				label = "lan3";
				phy-handle = <&switch1phy0>;
			};

			port@1 {
				reg = <1>;
				label = "lan4";
				phy-handle = <&switch1phy1>;
			};

			port@2 {
				reg = <2>;
				label = "lan5";
				phy-handle = <&switch1phy2>;
			};

			switch1port5: port@5 {
				reg = <5>;
				link = <&switch2port9>;
				phy-mode = "rgmii-txid";
				fixed-link {
					speed = <1000>;
					full-duplex;
				};
			};

			switch1port6: port@6 {
				reg = <6>;
				phy-mode = "rgmii-txid";
				link = <&switch0port5>;
				fixed-link {
					speed = <1000>;
					full-duplex;
				};
			};
		};
		mdio-bus {
			#address-cells = <1>;
			#size-cells = <0>;
			switch1phy0: switch1phy0@0 {
				reg = <0>;
			};
			switch1phy1: switch1phy0@1 {
				reg = <1>;
			};
			switch1phy2: switch1phy0@2 {
				reg = <2>;
			};
		};
	 };
};

&mdio4 {
	#address-cells = <1>;
	#size-cells = <0>;

	switch2: switch2@0 {
		compatible = "marvell,mv88e6085";
		reg = <0>;

		dsa,member = <0 2>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				reg = <0>;
				label = "lan6";
			};

			port@1 {
				reg = <1>;
				label = "lan7";
			};

			port@2 {
				reg = <2>;
				label = "lan8";
			};

			port@3 {
				reg = <3>;
				label = "optical3";
				fixed-link {
					speed = <1000>;
					full-duplex;
					link-gpios = <&gpio6 2
					      GPIO_ACTIVE_HIGH>;
				};
			};

			port@4 {
				reg = <4>;
				label = "optical4";
				fixed-link {
					speed = <1000>;
					full-duplex;
					link-gpios = <&gpio6 3
					      GPIO_ACTIVE_HIGH>;
				};
			};

			switch2port9: port@9 {
				reg = <9>;
				phy-mode = "rgmii-txid";
				link = <&switch1port5
					&switch0port5>;
				fixed-link {
					speed = <1000>;
					full-duplex;
				};
			};
		};
	};
};