ARMADA 370 - Distributed Switch Architecture (dsa) - device tree
Florian Fainelli
f.fainelli at gmail.com
Tue Oct 14 09:14:47 PDT 2014
On 10/14/2014 04:14 AM, post at twien.net wrote:
> Hello Florian,
> Thanks for the tip. If you wouldn't mind share your Device Tree source I
> would be pleased.
Here is the DTS for the network controller:
ethernet at f04a0000 {
local-mac-address = [ 00 10 18 a2 23 7b ];
systemport,num-txq = <0x20>;
#size-cells = <0x1>;
systemport,num-rxq = <0x1>;
systemport,num-tier2-arb = <0x1>;
device_type = "network";
fixed-link = <0x0 0x1 0x3e8 0x0 0x0>;
phy-mode = "gmii";
compatible = "brcm,systemport-v1.00",
"brcm,systemport";
systemport,num-tier1-arb = <0x4>;
#address-cells = <0x1>;
reg = <0xf04a0000 0x4650>;
interrupts = <0x0 0x16 0x0 0x0 0x17 0x0>;
interrupts-extended = <0x1 0x0 0x16 0x0 0x1 0x0
0x17 0x0 0x9 0x7>;
interrupt-names = "systemport_0",
"systemport_1", "wol_systemport";
clocks = <0x1a 0x1b>;
clock-names = "sw_sysport", "sw_sysportwol";
linux,phandle = <0x1c>;
phandle = <0x1c>;
};
Here is the DTS for the switch, it's a little complex, but the node with
"brcm,bcm7445-switch-v4.0" is the one we match in net/dsa/dsa.c.
switch_top at f0b00000 {
compatible = "brcm,bcm7445-switch-top-v2.0",
"simple-bus";
#size-cells = <0x1>;
#address-cells = <0x1>;
ranges = <0x0 0xf0b00000 0x40804>;
ethernet_switch at 0 {
dsa,ethernet = <0x1c>;
brcm,num-gphy = <0x1>;
compatible = "brcm,bcm7445-switch-v4.0",
"brcm,bcm53012";
brcm,num-rgmii-ports = <0x2>;
#address-cells = <0x2>;
brcm,num-acb-queues = <0x40>;
#size-cells = <0x0>;
dsa,mii-bus = <0x1d>;
reg = <0x0 0x40000 0x40000 0x110 0x40340
0x30 0x40380 0x30 0x40400 0x34 0x40600 0x208>;
reg-names = "core", "reg", "intrl2_0",
"intrl2_1", "fcb", "acb";
interrupts = <0x0 0x18 0x0 0x0 0x19 0x0>;
interrupt-names = "switch_0", "switch_1";
brcm,fcb-pause-override;
brcm,acb-packets-inflight;
clocks = <0x1e 0x1f>;
clock-names = "sw_switch", "sw_switch_mdiv";
switch at 0 {
#size-cells = <0x0>;
reg = <0x0 0x0>;
#address-cells = <0x1>;
port at 0 {
phy-mode = "internal";
phy-handle = <0x8c>;
linux,phandle = <0x8a>;
phandle = <0x8a>;
reg = <0x0>;
label = "gphy";
};
port at 1 {
phy-mode = "rgmii-txid";
phy-handle = <0x8e>;
linux,phandle = <0x8d>;
phandle = <0x8d>;
reg = <0x1>;
label = "rgmii_1";
};
port at 2 {
phy-mode = "rgmii-txid";
fixed-link = <0x2 0x1
0x3e8 0x0 0x0>;
linux,phandle = <0x8f>;
phandle = <0x8f>;
reg = <0x2>;
label = "rgmii_2";
};
port at 7 {
phy-mode = "moca";
fixed-link = <0x7 0x1
0x3e8 0x0 0x0>;
linux,phandle = <0x90>;
phandle = <0x90>;
reg = <0x7>;
label = "moca";
};
port at 8 {
linux,phandle = <0x91>;
phandle = <0x91>;
reg = <0x8>;
label = "cpu";
};
};
};
mdio at 403c0 {
reg = <0x403c0 0x8 0x40300 0x18>;
#size-cells = <0x1>;
compatible = "brcm,bcm7445-mdio-v4.0",
"brcm,unimac-mdio";
reg-names = "mdio", "mdio_indir_rw";
#address-cells = <0x0>;
linux,phandle = <0x1d>;
phandle = <0x1d>;
phy0: ethernet-phy at 0 {
linux,phandle = <0x8e>;
phandle = <0x8e>;
device_type = "ethernet-phy";
max-speed = <0x3e8>;
reg = <0x0>;
compatible = "brcm,bcm53125",
"ethernet-phy-ieee802.3-c22";
};
phy5: ethernet-phy at 5 {
linux,phandle = <0x8c>;
phandle = <0x8c>;
clock-names = "sw_gphy";
clocks = <0x8b>;
device_type = "ethernet-phy";
max-speed = <0x3e8>;
reg = <0x5>;
compatible = "brcm,28nm-gphy",
"ethernet-phy-ieee802.3-c22";
};
};
};
> Best,
> Tormod
>
> On 2014-10-14 04:08, Florian Fainelli wrote:
>> 2014-10-13 3:14 GMT-07:00 <post at twien.net>:
>>> Dear all,
>>> I have a custom board equipped with an ARMADA 370 SoC (88f6W11) and a
>>> Marvell switch chip (88e6352) (I have written a device driver for the
>>> latter).
>>> My question is how to set up a proper device tree specification for the
>>> board. The device tree specification is listed below. This is based on a
>>> similar .dts-file for the kirkwood SoC.
>>> Further down is a excerpt of the start up sequence. I would imagine the
>>> switch would be installed as the "PHY" for eth0 (which seems not to
>>> be the
>>> case). I added some additional printout messages, and from what I can
>>> see a
>>> generic device driver is loaded, and eventually the mvneta_open/-probe
>>> function states that the PHY can not be found. I have read the
>>> "examples" in
>>> the ../boot/dts directory and also read the documentation. There are
>>> some
>>> confusing things, for example the "dsa,mii-bus;" specification where I
>>> eventually put in "dsa,mii-bus = <&mdio_bus>;". From both the
>>> examples and
>>> the documentation it seemed I should specify a device on the
>>> mdio_bus, e.g.
>>> "phy0", but when I did the whole thing crashed.
>>> So specifying "mdio_bus" at least got me running a bit further, and
>>> the dsa
>>> driver was detected and the proper switch device was identified.
>>> What I would like to achieve is to get eth0 to connect to port 5 on the
>>> switch using SGMII.
>>> Any advice on how to proceed would be appreciated.
>>
>> At this point, what I would do is create a fixed-phy Device Tree node
>> for mvneta to hardcode the link indication/speed/duplex, and specify
>> the 'phy-mode' property to be "sgmii", and of course, remove the
>> 'phy-handle' property such that the fixed PHY is used instead.
>>
>> Right now, DSA drivers are not created as regular PHY drivers (which
>> is something on my TODO list), such that they do not provide link
>> indication towards the CPU Ethernet MAC. Except for the front-panel
>> external ports, Ethernet switches does not report standardized link
>> parameters through the standard MII registers for the CPU port, which
>> is why we have to find another way to do that.
>>
>> In case that helps, I could copy/paste a Device Tree source for a
>> Broadcom SoC I use which has both of its DSA switch driver (bcm_sf2)
>> and Ethernet MAC (bcmsysport) drivers mainline.
>>
>> Please note that, in order to boot from the network with DSA-enabled
>> devices, you need such a patch:
>> http://patchwork.ozlabs.org/patch/354293/
>>
>> which I should re-submit eventually
>>
>>
>>>
>>>
>>> +---------+
>>> | | +--------+
>>> | | SGMII | |----- p0
>>> | eth0|-----------|p5 | . .
>>> | | | |----- p4
>>> +---------+ +--------+
>>> ARMADA 370 88e6352
>>>
>>>
>>> Tormod
>>>
>>>
>>>
>>> /*
>>> * Device Tree file for Marvell Armada 370 Ethernet Prototype board
>>> * ()
>>> *
>>> * Copied from arch/arm/boot/dts/armada-370-rd.dts
>>> *
>>> * Copyright (C) 2014 ...
>>> *
>>> * This file is licensed under the terms of the GNU General Public
>>> * License version 2. This program is licensed "as is" without any
>>> * warranty of any kind, whether express or implied.
>>> */
>>>
>>> /dts-v1/;
>>> #include <dt-bindings/input/input.h>
>>> #include <dt-bindings/gpio/gpio.h>
>>> #include "armada-370.dtsi"
>>>
>>> / {
>>> model = "Marvell Armada 370 Ethernet Prototype";
>>> compatible = "marvell,armada370", "marvell,armada-370-xp";
>>>
>>> chosen {
>>> bootargs = "console=ttyS0,115200 earlyprintk";
>>> };
>>>
>>> memory {
>>> device_type = "memory";
>>> reg = <0x00000000 0x40000000>; /* 1 GB */
>>> };
>>>
>>> soc {
>>> ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000
>>> MBUS_ID(0x01, 0xe0) 0 0xfff00000 0x100000>;
>>>
>>>
>>> pcie-controller {
>>> status = "okay";
>>>
>>> /* Internal mini-PCIe connector */
>>> pcie at 1,0 {
>>> /* Port 0, Lane 0 */
>>> status = "okay";
>>> };
>>>
>>> /* Internal mini-PCIe connector */
>>> pcie at 2,0 {
>>> /* Port 1, Lane 0 */
>>> status = "okay";
>>> };
>>> };
>>>
>>> internal-regs {
>>> serial at 12000 {
>>> status = "okay";
>>> };
>>>
>>> mdio_bus: mdio {
>>> phy0: ethernet-phy at ff {
>>> /* compatible =
>>> "ethernet-phy-id5043.0eb0", "ethernet-phy-ieee802.3-c22";
>>> */
>>> reg = <0xff>; /* no PHY
>>> connected
>>> */
>>> speed = <1000>;
>>> duplex = <1>;
>>> };
>>>
>>> /* phy1: ethernet-phy at 1 {
>>> reg = <0x1>;
>>> };
>>> */
>>> };
>>>
>>> ethernet at 70000 {
>>> status = "okay";
>>> phy = <&phy0>;
>>> phy-mode = "sgmii";
>>> };
>>>
>>> /* ethernet at 74000 {
>>> status = "okay";
>>> phy = <&phy1>;
>>> phy-mode = "rgmii-id";
>>> };
>>> */
>>> mvsdio at d4000 {
>>> pinctrl-0 = <&sdio_pins1>;
>>> pinctrl-names = "default";
>>> status = "okay";
>>> /* No CD or WP GPIOs */
>>> broken-cd;
>>> };
>>>
>>> usb at 50000 {
>>> status = "okay";
>>> };
>>>
>>>
>>> /* usb at 51000 {
>>> status = "okay";
>>> };
>>> */
>>> spi0: spi at 10600 {
>>> status = "okay";
>>> };
>>>
>>> i2c at 11000 {
>>> pinctrl-0 = <&i2c0_pins>;
>>> pinctrl-names = "default";
>>> clock-frequency = <100000>;
>>> status = "okay";
>>> };
>>>
>>> nand at d0000 {
>>> status = "okay";
>>> num-cs = <1>;
>>> marvell,nand-keep-config;
>>> marvell,nand-enable-arbiter;
>>> nand-on-flash-bbt;
>>>
>>> partition at 0 {
>>> label = "U-Boot";
>>> reg = <0 0x800000>;
>>> };
>>> partition at 800000 {
>>> label = "Linux";
>>> reg = <0x800000 0x800000>;
>>> };
>>> partition at 1000000 {
>>> label = "Filesystem";
>>> reg = <0x1000000 0x3f000000>;
>>> };
>>> };
>>> };
>>> };
>>>
>>> dsa at 0 {
>>> compatible = "marvell,dsa";
>>> #address-cells = <2>;
>>> #size-cells = <0>;
>>> dsa,ethernet = <ð0>;
>>> dsa,mii-bus = <&mdio_bus>;
>>>
>>> switch at 0 {
>>> #address-cells = <1>;
>>> #size-cells = <0>;
>>>
>>> reg = <0 0>;
>>>
>>> port at 0 {
>>> reg = <0>;
>>> label = "lan1";
>>> };
>>>
>>> port at 1 {
>>> reg = <1>;
>>> label = "lan2";
>>> };
>>>
>>> port at 2 {
>>> reg = <2>;
>>> label = "lan3";
>>> };
>>>
>>> port at 3 {
>>> reg = <3>;
>>> label = "lan4";
>>> };
>>>
>>> port at 5 {
>>> reg = <5>;
>>> label = "cpu";
>>> };
>>>
>>> port at 6 {
>>> reg = <6>;
>>> label = "lan6";
>>> };
>>> };
>>> };
>>>
>>> };
>>>
>>>
>>> nand: device found, Manufacturer ID: 0x2c, Chip ID: 0x38
>>> nand: Micron MT29F8G08ABABAWP
>>> nand: 1024MiB, SLC, page size: 4096, OOB size: 224
>>> pxa3xx-nand f10d0000.nand: ECC strength 16, ECC step size 2048
>>> Bad block table found at page 262016, version 0x01
>>> Bad block table found at page 261888, version 0x01
>>> 3 ofpart partitions found on MTD device pxa3xx_nand-0
>>> Creating 3 MTD partitions on "pxa3xx_nand-0":
>>> 0x000000000000-0x000000800000 : "U-Boot"
>>> 0x000000800000-0x000001000000 : "Linux"
>>> 0x000001000000-0x000040000000 : "Filesystem"
>>> mdiobus register device_node: mdio
>>> libphy: orion_mdio_bus: probed
>>> mdio_bus f1072004.mdio-mi: /soc/internal-regs/mdio/ethernet-phy at ff PHY
>>> address 255 is too large
>>> mvneta_probe: ethernet device: eth%d
>>> mvneta_probe: phy_node: ethernet-phy
>>> mvneta f1070000.ethernet eth0: Using hardware mac address
>>> 00:50:43:02:02:00
>>> ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
>>> ehci-pci: EHCI PCI platform driver
>>> ehci-orion: EHCI orion driver
>>> orion-ehci f1050000.usb: EHCI Host Controller
>>> orion-ehci f1050000.usb: new USB bus registered, assigned bus number 1
>>> orion-ehci f1050000.usb: irq 26, io mem 0xf1050000
>>> orion-ehci f1050000.usb: USB 2.0 started, EHCI 1.00
>>> hub 1-0:1.0: USB hub found
>>> hub 1-0:1.0: 1 port detected
>>> usbcore: registered new interface driver usb-storage
>>> mousedev: PS/2 mouse device common for all mice
>>> rtc-mv f1010300.rtc: internal RTC not ticking
>>> orion_wdt: Initial timeout 229 sec
>>> usbcore: registered new interface driver usbhid
>>> usbhid: USB HID core driver
>>> TCP: cubic registered
>>> Distributed Switch Architecture driver version 0.1
>>> eth0[0]: detected a Marvell 88E6352 switch
>>> libphy: dsa slave smi: probed
>>> ThumbEE CPU extension supported.
>>> drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
>>> mvneta_mdio_probe: mvneta_probe: ethernet-phy
>>> mvneta f1070000.ethernet eth0: could not find the PHY
>>> mvneta f1070000.ethernet eth0: cannot probe MDIO bus
>>> IP-Config: Failed to open eth0
>>> IP-Config: Failed to open lan1
>>> IP-Config: Failed to open lan2
>>> IP-Config: Failed to open lan3
>>> IP-Config: Failed to open lan4
>>> IP-Config: Failed to open lan6
>>> IP-Config: No network devices available
>>>
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> linux-arm-kernel mailing list
>>> linux-arm-kernel at lists.infradead.org
>>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
More information about the linux-arm-kernel
mailing list