214 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
Microchip Ocelot switch driver family
 | 
						|
=====================================
 | 
						|
 | 
						|
Felix
 | 
						|
-----
 | 
						|
 | 
						|
Currently the switches supported by the felix driver are:
 | 
						|
 | 
						|
- VSC9959 (Felix)
 | 
						|
- VSC9953 (Seville)
 | 
						|
 | 
						|
The VSC9959 switch is found in the NXP LS1028A. It is a PCI device, part of the
 | 
						|
larger ENETC root complex. As a result, the ethernet-switch node is a sub-node
 | 
						|
of the PCIe root complex node and its "reg" property conforms to the parent
 | 
						|
node bindings:
 | 
						|
 | 
						|
* reg: Specifies PCIe Device Number and Function Number of the endpoint device,
 | 
						|
  in this case for the Ethernet L2Switch it is PF5 (of device 0, bus 0).
 | 
						|
 | 
						|
It does not require a "compatible" string.
 | 
						|
 | 
						|
The interrupt line is used to signal availability of PTP TX timestamps and for
 | 
						|
TSN frame preemption.
 | 
						|
 | 
						|
For the external switch ports, depending on board configuration, "phy-mode" and
 | 
						|
"phy-handle" are populated by board specific device tree instances. Ports 4 and
 | 
						|
5 are fixed as internal ports in the NXP LS1028A instantiation.
 | 
						|
 | 
						|
The CPU port property ("ethernet") configures the feature called "NPI port" in
 | 
						|
the Ocelot hardware core. The CPU port in Ocelot is a set of queues, which are
 | 
						|
connected, in the Node Processor Interface (NPI) mode, to an Ethernet port.
 | 
						|
By default, in fsl-ls1028a.dtsi, the NPI port is assigned to the internal
 | 
						|
2.5Gbps port@4, but can be moved to the 1Gbps port@5, depending on the specific
 | 
						|
use case.  Moving the NPI port to an external switch port is hardware possible,
 | 
						|
but there is no platform support for the Linux system on the LS1028A chip to
 | 
						|
operate as an entire slave DSA chip.  NPI functionality (and therefore DSA
 | 
						|
tagging) is supported on a single port at a time.
 | 
						|
 | 
						|
Any port can be disabled (and in fsl-ls1028a.dtsi, they are indeed all disabled
 | 
						|
by default, and should be enabled on a per-board basis). But if any external
 | 
						|
switch port is enabled at all, the ENETC PF2 (enetc_port2) should be enabled as
 | 
						|
well, regardless of whether it is configured as the DSA master or not. This is
 | 
						|
because the Felix PHYLINK implementation accesses the MAC PCS registers, which
 | 
						|
in hardware truly belong to the ENETC port #2 and not to Felix.
 | 
						|
 | 
						|
Supported PHY interface types (appropriate SerDes protocol setting changes are
 | 
						|
needed in the RCW binary):
 | 
						|
 | 
						|
* phy_mode = "internal": on ports 4 and 5
 | 
						|
* phy_mode = "sgmii": on ports 0, 1, 2, 3
 | 
						|
* phy_mode = "qsgmii": on ports 0, 1, 2, 3
 | 
						|
* phy_mode = "usxgmii": on ports 0, 1, 2, 3
 | 
						|
* phy_mode = "2500base-x": on ports 0, 1, 2, 3
 | 
						|
 | 
						|
For the rest of the device tree binding definitions, which are standard DSA and
 | 
						|
PCI, refer to the following documents:
 | 
						|
 | 
						|
Documentation/devicetree/bindings/net/dsa/dsa.txt
 | 
						|
Documentation/devicetree/bindings/pci/pci.txt
 | 
						|
 | 
						|
Example:
 | 
						|
 | 
						|
&soc {
 | 
						|
	pcie@1f0000000 { /* Integrated Endpoint Root Complex */
 | 
						|
		ethernet-switch@0,5 {
 | 
						|
			reg = <0x000500 0 0 0 0>;
 | 
						|
			/* IEP INT_B */
 | 
						|
			interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
 | 
						|
 | 
						|
			ports {
 | 
						|
				#address-cells = <1>;
 | 
						|
				#size-cells = <0>;
 | 
						|
 | 
						|
				/* External ports */
 | 
						|
				port@0 {
 | 
						|
					reg = <0>;
 | 
						|
					label = "swp0";
 | 
						|
				};
 | 
						|
 | 
						|
				port@1 {
 | 
						|
					reg = <1>;
 | 
						|
					label = "swp1";
 | 
						|
				};
 | 
						|
 | 
						|
				port@2 {
 | 
						|
					reg = <2>;
 | 
						|
					label = "swp2";
 | 
						|
				};
 | 
						|
 | 
						|
				port@3 {
 | 
						|
					reg = <3>;
 | 
						|
					label = "swp3";
 | 
						|
				};
 | 
						|
 | 
						|
				/* Tagging CPU port */
 | 
						|
				port@4 {
 | 
						|
					reg = <4>;
 | 
						|
					ethernet = <&enetc_port2>;
 | 
						|
					phy-mode = "internal";
 | 
						|
 | 
						|
					fixed-link {
 | 
						|
						speed = <2500>;
 | 
						|
						full-duplex;
 | 
						|
					};
 | 
						|
				};
 | 
						|
 | 
						|
				/* Non-tagging CPU port */
 | 
						|
				port@5 {
 | 
						|
					reg = <5>;
 | 
						|
					phy-mode = "internal";
 | 
						|
					status = "disabled";
 | 
						|
 | 
						|
					fixed-link {
 | 
						|
						speed = <1000>;
 | 
						|
						full-duplex;
 | 
						|
					};
 | 
						|
				};
 | 
						|
			};
 | 
						|
		};
 | 
						|
	};
 | 
						|
};
 | 
						|
 | 
						|
The VSC9953 switch is found inside NXP T1040. It is a platform device with the
 | 
						|
following required properties:
 | 
						|
 | 
						|
- compatible:
 | 
						|
	Must be "mscc,vsc9953-switch".
 | 
						|
 | 
						|
Supported PHY interface types (appropriate SerDes protocol setting changes are
 | 
						|
needed in the RCW binary):
 | 
						|
 | 
						|
* phy_mode = "internal": on ports 8 and 9
 | 
						|
* phy_mode = "sgmii": on ports 0, 1, 2, 3, 4, 5, 6, 7
 | 
						|
* phy_mode = "qsgmii": on ports 0, 1, 2, 3, 4, 5, 6, 7
 | 
						|
 | 
						|
Example:
 | 
						|
 | 
						|
&soc {
 | 
						|
	ethernet-switch@800000 {
 | 
						|
		#address-cells = <0x1>;
 | 
						|
		#size-cells = <0x0>;
 | 
						|
		compatible = "mscc,vsc9953-switch";
 | 
						|
		little-endian;
 | 
						|
		reg = <0x800000 0x290000>;
 | 
						|
 | 
						|
		ports {
 | 
						|
			#address-cells = <0x1>;
 | 
						|
			#size-cells = <0x0>;
 | 
						|
 | 
						|
			port@0 {
 | 
						|
				reg = <0x0>;
 | 
						|
				label = "swp0";
 | 
						|
			};
 | 
						|
 | 
						|
			port@1 {
 | 
						|
				reg = <0x1>;
 | 
						|
				label = "swp1";
 | 
						|
			};
 | 
						|
 | 
						|
			port@2 {
 | 
						|
				reg = <0x2>;
 | 
						|
				label = "swp2";
 | 
						|
			};
 | 
						|
 | 
						|
			port@3 {
 | 
						|
				reg = <0x3>;
 | 
						|
				label = "swp3";
 | 
						|
			};
 | 
						|
 | 
						|
			port@4 {
 | 
						|
				reg = <0x4>;
 | 
						|
				label = "swp4";
 | 
						|
			};
 | 
						|
 | 
						|
			port@5 {
 | 
						|
				reg = <0x5>;
 | 
						|
				label = "swp5";
 | 
						|
			};
 | 
						|
 | 
						|
			port@6 {
 | 
						|
				reg = <0x6>;
 | 
						|
				label = "swp6";
 | 
						|
			};
 | 
						|
 | 
						|
			port@7 {
 | 
						|
				reg = <0x7>;
 | 
						|
				label = "swp7";
 | 
						|
			};
 | 
						|
 | 
						|
			port@8 {
 | 
						|
				reg = <0x8>;
 | 
						|
				phy-mode = "internal";
 | 
						|
				ethernet = <&enet0>;
 | 
						|
 | 
						|
				fixed-link {
 | 
						|
					speed = <2500>;
 | 
						|
					full-duplex;
 | 
						|
				};
 | 
						|
			};
 | 
						|
 | 
						|
			port@9 {
 | 
						|
				reg = <0x9>;
 | 
						|
				phy-mode = "internal";
 | 
						|
				status = "disabled";
 | 
						|
 | 
						|
				fixed-link {
 | 
						|
					speed = <2500>;
 | 
						|
					full-duplex;
 | 
						|
				};
 | 
						|
			};
 | 
						|
		};
 | 
						|
	};
 | 
						|
};
 |