Message ID | 20180109221053.927-1-linus.walleij@linaro.org |
---|---|
State | New |
Headers | show |
Series | [net-next,1/2,v10] net: ethernet: Add DT bindings for the Gemini ethernet | expand |
From: Linus Walleij <linus.walleij@linaro.org> Date: Tue, 9 Jan 2018 23:10:52 +0100 > This adds the device tree bindings for the Gemini ethernet > controller. It is pretty straight-forward, using standard > bindings and modelling the two child ports as child devices > under the parent ethernet controller device. > > Cc: devicetree@vger.kernel.org > Cc: Tobias Waldvogel <tobias.waldvogel@gmail.com> > Cc: Michał Mirosław <mirq-linux@rere.qmqm.pl> > Reviewed-by: Rob Herring <robh@kernel.org> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Applied.
From: Linus Walleij <linus.walleij@linaro.org> Date: Tue, 9 Jan 2018 23:10:53 +0100 > The Gemini ethernet has been around for years as an out-of-tree > patch used with the NAS boxen and routers built on StorLink > SL3512 and SL3516, later Storm Semiconductor, later Cortina > Systems. These ASICs are still being deployed and brand new > off-the-shelf systems using it can easily be acquired. > > The full name of the IP block is "Net Engine and Gigabit > Ethernet MAC" commonly just called "GMAC". > > The hardware block contains a common TCP Offload Enginer (TOE) > that can be used by both MACs. The current driver does not use > it. > > Cc: Tobias Waldvogel <tobias.waldvogel@gmail.com> > Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Applied.
Actually I had to revert these two patches, this stuff doesn't even build. [davem@dhcp-10-15-49-227 net-next]$ make -s -j16 In file included from ./include/linux/printk.h:329:0, from ./include/linux/kernel.h:14, from ./include/linux/list.h:9, from ./include/linux/module.h:9, from drivers/net/ethernet/cortina/gemini.c:16: drivers/net/ethernet/cortina/gemini.c: In function ‘geth_freeq_alloc_map_page’: drivers/net/ethernet/cortina/gemini.c:821:21: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 5 has type ‘dma_addr_t {aka long long unsigned int}’ [-Wformat=] dev_dbg(geth->dev, "page %d, DMA addr: %08x, page %p\n", ^ ./include/linux/dynamic_debug.h:135:39: note: in definition of macro ‘dynamic_dev_dbg’ __dynamic_dev_dbg(&descriptor, dev, fmt, \ ^~~ drivers/net/ethernet/cortina/gemini.c:821:2: note: in expansion of macro ‘dev_dbg’ dev_dbg(geth->dev, "page %d, DMA addr: %08x, page %p\n", ^~~~~~~ drivers/net/ethernet/cortina/gemini.c: In function ‘gmac_rx’: drivers/net/ethernet/cortina/gemini.c:1410:50: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 3 has type ‘dma_addr_t {aka long long unsigned int}’ [-Wformat=] dev_err(geth->dev, "could not find mapping %08x (page = %08x, page off = %08x)\n", ~~~^ %08llx drivers/net/ethernet/cortina/gemini.c:1410:63: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 4 has type ‘long long unsigned int’ [-Wformat=] dev_err(geth->dev, "could not find mapping %08x (page = %08x, page off = %08x)\n", ~~~^ %08llx drivers/net/ethernet/cortina/gemini.c: In function ‘gemini_ethernet_port_probe’: drivers/net/ethernet/cortina/gemini.c:2456:28: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 4 has type ‘resource_size_t {aka long long unsigned int}’ [-Wformat=] "irq %d, DMA @ 0x%08x, GMAC @ 0x%08x\n", ~~~^ %08llx port->irq, dmares->start, ~~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2456:43: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 5 has type ‘resource_size_t {aka long long unsigned int}’ [-Wformat=] "irq %d, DMA @ 0x%08x, GMAC @ 0x%08x\n", ~~~^ %08llx drivers/net/ethernet/cortina/gemini.c:2458:8: gmacres->start); ~~~~~~~~~~~~~~ In file included from drivers/net/ethernet/cortina/gemini.c:16:0: drivers/net/ethernet/cortina/gemini.c: At top level: ./include/linux/module.h:129:42: error: redefinition of ‘__inittest’ static inline initcall_t __maybe_unused __inittest(void) \ ^ ./include/linux/device.h:1513:1: note: in expansion of macro ‘module_init’ module_init(__driver##_init); \ ^~~~~~~~~~~ ./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’ module_driver(__platform_driver, platform_driver_register, \ ^~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2567:1: note: in expansion of macro ‘module_platform_driver’ module_platform_driver(gemini_ethernet_driver); ^~~~~~~~~~~~~~~~~~~~~~ ./include/linux/module.h:129:42: note: previous definition of ‘__inittest’ was here static inline initcall_t __maybe_unused __inittest(void) \ ^ ./include/linux/device.h:1513:1: note: in expansion of macro ‘module_init’ module_init(__driver##_init); \ ^~~~~~~~~~~ ./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’ module_driver(__platform_driver, platform_driver_register, \ ^~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2495:1: note: in expansion of macro ‘module_platform_driver’ module_platform_driver(gemini_ethernet_port_driver); ^~~~~~~~~~~~~~~~~~~~~~ ./include/linux/module.h:131:6: error: redefinition of ‘init_module’ int init_module(void) __attribute__((alias(#initfn))); ^ ./include/linux/device.h:1513:1: note: in expansion of macro ‘module_init’ module_init(__driver##_init); \ ^~~~~~~~~~~ ./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’ module_driver(__platform_driver, platform_driver_register, \ ^~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2567:1: note: in expansion of macro ‘module_platform_driver’ module_platform_driver(gemini_ethernet_driver); ^~~~~~~~~~~~~~~~~~~~~~ ./include/linux/module.h:131:6: note: previous definition of ‘init_module’ was here int init_module(void) __attribute__((alias(#initfn))); ^ ./include/linux/device.h:1513:1: note: in expansion of macro ‘module_init’ module_init(__driver##_init); \ ^~~~~~~~~~~ ./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’ module_driver(__platform_driver, platform_driver_register, \ ^~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2495:1: note: in expansion of macro ‘module_platform_driver’ module_platform_driver(gemini_ethernet_port_driver); ^~~~~~~~~~~~~~~~~~~~~~ ./include/linux/module.h:135:42: error: redefinition of ‘__exittest’ static inline exitcall_t __maybe_unused __exittest(void) \ ^ ./include/linux/device.h:1518:1: note: in expansion of macro ‘module_exit’ module_exit(__driver##_exit); ^~~~~~~~~~~ ./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’ module_driver(__platform_driver, platform_driver_register, \ ^~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2567:1: note: in expansion of macro ‘module_platform_driver’ module_platform_driver(gemini_ethernet_driver); ^~~~~~~~~~~~~~~~~~~~~~ ./include/linux/module.h:135:42: note: previous definition of ‘__exittest’ was here static inline exitcall_t __maybe_unused __exittest(void) \ ^ ./include/linux/device.h:1518:1: note: in expansion of macro ‘module_exit’ module_exit(__driver##_exit); ^~~~~~~~~~~ ./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’ module_driver(__platform_driver, platform_driver_register, \ ^~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2495:1: note: in expansion of macro ‘module_platform_driver’ module_platform_driver(gemini_ethernet_port_driver); ^~~~~~~~~~~~~~~~~~~~~~ ./include/linux/module.h:137:7: error: redefinition of ‘cleanup_module’ void cleanup_module(void) __attribute__((alias(#exitfn))); ^ ./include/linux/device.h:1518:1: note: in expansion of macro ‘module_exit’ module_exit(__driver##_exit); ^~~~~~~~~~~ ./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’ module_driver(__platform_driver, platform_driver_register, \ ^~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2567:1: note: in expansion of macro ‘module_platform_driver’ module_platform_driver(gemini_ethernet_driver); ^~~~~~~~~~~~~~~~~~~~~~ ./include/linux/module.h:137:7: note: previous definition of ‘cleanup_module’ was here void cleanup_module(void) __attribute__((alias(#exitfn))); ^ ./include/linux/device.h:1518:1: note: in expansion of macro ‘module_exit’ module_exit(__driver##_exit); ^~~~~~~~~~~ ./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’ module_driver(__platform_driver, platform_driver_register, \ ^~~~~~~~~~~~~ drivers/net/ethernet/cortina/gemini.c:2495:1: note: in expansion of macro ‘module_platform_driver’ module_platform_driver(gemini_ethernet_port_driver); ^~~~~~~~~~~~~~~~~~~~~~ make[4]: *** [scripts/Makefile.build:317: drivers/net/ethernet/cortina/gemini.o] Error 1 make[3]: *** [scripts/Makefile.build:569: drivers/net/ethernet/cortina] Error 2 make[3]: *** Waiting for unfinished jobs....
On Wed, Jan 10, 2018 at 9:43 PM, David Miller <davem@davemloft.net> wrote: > Actually I had to revert these two patches, this stuff doesn't even > build. Sorry about that, I did build it before sending out but I guess not on enough architectures :( I will iterate with the help of the zeroday build servers, my own machines just don't suffice. Yours, Linus Walleij
diff --git a/Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt b/Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt new file mode 100644 index 000000000000..6c559981d110 --- /dev/null +++ b/Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt @@ -0,0 +1,92 @@ +Cortina Systems Gemini Ethernet Controller +========================================== + +This ethernet controller is found in the Gemini SoC family: +StorLink SL3512 and SL3516, also known as Cortina Systems +CS3512 and CS3516. + +Required properties: +- compatible: must be "cortina,gemini-ethernet" +- reg: must contain the global registers and the V-bit and A-bit + memory areas, in total three register sets. +- syscon: a phandle to the system controller +- #address-cells: must be specified, must be <1> +- #size-cells: must be specified, must be <1> +- ranges: should be state like this giving a 1:1 address translation + for the subnodes + +The subnodes represents the two ethernet ports in this device. +They are not independent of each other since they share resources +in the parent node, and are thus children. + +Required subnodes: +- port0: contains the resources for ethernet port 0 +- port1: contains the resources for ethernet port 1 + +Required subnode properties: +- compatible: must be "cortina,gemini-ethernet-port" +- reg: must contain two register areas: the DMA/TOE memory and + the GMAC memory area of the port +- interrupts: should contain the interrupt line of the port. + this is nominally a level interrupt active high. +- resets: this must provide an SoC-integrated reset line for + the port. +- clocks: this should contain a handle to the PCLK clock for + clocking the silicon in this port +- clock-names: must be "PCLK" + +Optional subnode properties: +- phy-mode: see ethernet.txt +- phy-handle: see ethernet.txt + +Example: + +mdio-bus { + (...) + phy0: ethernet-phy@1 { + reg = <1>; + device_type = "ethernet-phy"; + }; + phy1: ethernet-phy@3 { + reg = <3>; + device_type = "ethernet-phy"; + }; +}; + + +ethernet@60000000 { + compatible = "cortina,gemini-ethernet"; + reg = <0x60000000 0x4000>, /* Global registers, queue */ + <0x60004000 0x2000>, /* V-bit */ + <0x60006000 0x2000>; /* A-bit */ + syscon = <&syscon>; + #address-cells = <1>; + #size-cells = <1>; + ranges; + + gmac0: ethernet-port@0 { + compatible = "cortina,gemini-ethernet-port"; + reg = <0x60008000 0x2000>, /* Port 0 DMA/TOE */ + <0x6000a000 0x2000>; /* Port 0 GMAC */ + interrupt-parent = <&intcon>; + interrupts = <1 IRQ_TYPE_LEVEL_HIGH>; + resets = <&syscon GEMINI_RESET_GMAC0>; + clocks = <&syscon GEMINI_CLK_GATE_GMAC0>; + clock-names = "PCLK"; + phy-mode = "rgmii"; + phy-handle = <&phy0>; + }; + + gmac1: ethernet-port@1 { + compatible = "cortina,gemini-ethernet-port"; + reg = <0x6000c000 0x2000>, /* Port 1 DMA/TOE */ + <0x6000e000 0x2000>; /* Port 1 GMAC */ + interrupt-parent = <&intcon>; + interrupts = <2 IRQ_TYPE_LEVEL_HIGH>; + resets = <&syscon GEMINI_RESET_GMAC1>; + clocks = <&syscon GEMINI_CLK_GATE_GMAC1>; + clock-names = "PCLK"; + phy-mode = "rgmii"; + phy-handle = <&phy1>; + }; +};