diff options
author | Muralidharan Karicheri | 2019-12-10 15:31:58 -0600 |
---|---|---|
committer | Muralidharan Karicheri | 2019-12-10 15:31:58 -0600 |
commit | 165303b402f0d6bf1b0e7d2ed54782c64834f266 (patch) | |
tree | 5a85eb959c110e93c8d3a9456cd90feca70aa9e7 | |
parent | 078a3b8701f4224c59a27a238732e0bc034c0159 (diff) | |
parent | 8e7ad5c94d872f6fc312b35036707133ccffa4ee (diff) | |
download | processor-sdk-u-boot-165303b402f0d6bf1b0e7d2ed54782c64834f266.tar.gz processor-sdk-u-boot-165303b402f0d6bf1b0e7d2ed54782c64834f266.tar.xz processor-sdk-u-boot-165303b402f0d6bf1b0e7d2ed54782c64834f266.zip |
Merge pull request #9 in PROCESSOR-SDK/processor-sdk-u-boot from PLSDK-3150 to processor-sdk-u-boot-2019.01
* commit '8e7ad5c94d872f6fc312b35036707133ccffa4ee':
Revert "arm: dts: k3-am654: add support for interposer card."
Revert "net: ti: icssg-prueth: update for interposer card"
-rw-r--r-- | arch/arm/dts/k3-am654-base-board-u-boot.dtsi | 5 | ||||
-rw-r--r-- | arch/arm/dts/k3-am654-idk.dtso | 137 | ||||
-rw-r--r-- | drivers/net/ti/icssg-prueth.c | 230 |
3 files changed, 176 insertions, 196 deletions
diff --git a/arch/arm/dts/k3-am654-base-board-u-boot.dtsi b/arch/arm/dts/k3-am654-base-board-u-boot.dtsi index 29ba8fc4ef..b62940df27 100644 --- a/arch/arm/dts/k3-am654-base-board-u-boot.dtsi +++ b/arch/arm/dts/k3-am654-base-board-u-boot.dtsi | |||
@@ -496,7 +496,10 @@ | |||
496 | 496 | ||
497 | &msmc_ram { | 497 | &msmc_ram { |
498 | icssg0_sram: icssg0-sram@40000 { | 498 | icssg0_sram: icssg0-sram@40000 { |
499 | reg = <0x40000 0x20000>; | 499 | reg = <0x40000 0x10000>; |
500 | }; | ||
501 | icssg1_sram: icssg1-sram@50000 { | ||
502 | reg = <0x50000 0x10000>; | ||
500 | }; | 503 | }; |
501 | icssg2_sram: icssg2-sram@60000 { | 504 | icssg2_sram: icssg2-sram@60000 { |
502 | reg = <0x60000 0x10000>; | 505 | reg = <0x60000 0x10000>; |
diff --git a/arch/arm/dts/k3-am654-idk.dtso b/arch/arm/dts/k3-am654-idk.dtso index c149eb497d..eaf1363c4d 100644 --- a/arch/arm/dts/k3-am654-idk.dtso +++ b/arch/arm/dts/k3-am654-idk.dtso | |||
@@ -20,54 +20,47 @@ | |||
20 | __overlay__ { | 20 | __overlay__ { |
21 | aliases { | 21 | aliases { |
22 | ethernet2 = &pruss0_eth; | 22 | ethernet2 = &pruss0_eth; |
23 | ethernet3 = &pruss1_eth; | ||
23 | }; | 24 | }; |
24 | 25 | ||
25 | /* Dual Ethernet application node on PRU-ICSSG0 */ | 26 | /* Dual Ethernet application node on PRU-ICSSG0 */ |
26 | pruss0_eth: pruss0_eth { | 27 | pruss0_eth: pruss0_eth { |
27 | compatible = "ti,am654-dualicssg-prueth"; | 28 | compatible = "ti,am654-icssg-prueth"; |
28 | pinctrl-names = "default"; | 29 | pinctrl-names = "default"; |
29 | pinctrl-0 = <&icssg01_rgmii_pins_default>; | 30 | pinctrl-0 = <&icssg0_rgmii_pins_default>; |
30 | sram = <&icssg0_sram>; | 31 | sram = <&icssg0_sram>; |
31 | clocks = <&k3_clks 62 3>, <&k3_clks 63 3>; | 32 | clocks = <&k3_clks 62 3>; |
32 | clock-names = "mdio_fck", "mdio1_fck"; | 33 | clock-names = "mdio_fck"; |
33 | 34 | ||
34 | prus = <&pru0_0>, <&rtu0_0>, <&pru0_1>, <&rtu0_1>, <&pru1_0>, <&rtu1_0>, <&pru1_1>, <&rtu1_1>; | 35 | prus = <&pru0_0>, <&rtu0_0>, <&pru0_1>, <&rtu0_1>; |
35 | firmware-name = "ti-pruss/am65x-pru0-prueth-fw.elf", | 36 | firmware-name = "ti-pruss/am65x-pru0-prueth-fw.elf", |
36 | "ti-pruss/am65x-rtu0-prueth-fw.elf", | 37 | "ti-pruss/am65x-rtu0-prueth-fw.elf", |
37 | "ti-pruss/am65x-pru1-prueth-fw.elf", | 38 | "ti-pruss/am65x-pru1-prueth-fw.elf", |
38 | "ti-pruss/am65x-rtu1-prueth-fw.elf", | ||
39 | "ti-pruss/am65x-pru0-prueth-fw.elf", | ||
40 | "ti-pruss/am65x-rtu0-prueth-fw.elf", | ||
41 | "ti-pruss/am65x-pru1-prueth-fw.elf", | ||
42 | "ti-pruss/am65x-rtu1-prueth-fw.elf"; | 39 | "ti-pruss/am65x-rtu1-prueth-fw.elf"; |
43 | mii-g-rt = <&icssg0_mii_g_rt>; | 40 | mii-g-rt = <&icssg0_mii_g_rt>; |
44 | mii-g-rt-paired = <&icssg1_mii_g_rt>; | ||
45 | dma-coherent; | 41 | dma-coherent; |
46 | dmas = <&mcu_udmap &icssg0 4 UDMA_DIR_TX>, /* egress icssg0 slice 1 */ | 42 | dmas = <&mcu_udmap &icssg0 0 UDMA_DIR_TX>, /* egress slice 0 */ |
47 | <&mcu_udmap &icssg0 5 UDMA_DIR_TX>, /* egress icssg0 slice 1 */ | 43 | <&mcu_udmap &icssg0 1 UDMA_DIR_TX>, /* egress slice 0 */ |
48 | <&mcu_udmap &icssg0 6 UDMA_DIR_TX>, /* egress icssg0 slice 1 */ | 44 | <&mcu_udmap &icssg0 2 UDMA_DIR_TX>, /* egress slice 0 */ |
49 | <&mcu_udmap &icssg0 7 UDMA_DIR_TX>, /* egress icssg0 mgmnt cmd slice 1 */ | 45 | <&mcu_udmap &icssg0 3 UDMA_DIR_TX>, /* egress slice 0 */ |
50 | 46 | <&mcu_udmap &icssg0 4 UDMA_DIR_TX>, /* egress slice 1 */ | |
51 | <&mcu_udmap &icssg0 0 UDMA_DIR_RX>, /* ingress icssg0 slice 0 */ | 47 | <&mcu_udmap &icssg0 5 UDMA_DIR_TX>, /* egress slice 1 */ |
52 | <&mcu_udmap &icssg0 2 UDMA_DIR_RX>, /* ingress icssg0 mgmnt resp slice 0 */ | 48 | <&mcu_udmap &icssg0 6 UDMA_DIR_TX>, /* egress slice 1 */ |
53 | 49 | <&mcu_udmap &icssg0 7 UDMA_DIR_TX>, /* egress slice 1 */ | |
54 | <&mcu_udmap &icssg1 4 UDMA_DIR_TX>, /* egress icssg1 slice 1 */ | ||
55 | <&mcu_udmap &icssg1 5 UDMA_DIR_TX>, /* egress icssg1 slice 1 */ | ||
56 | <&mcu_udmap &icssg1 6 UDMA_DIR_TX>, /* egress icssg1 slice 1 */ | ||
57 | <&mcu_udmap &icssg1 7 UDMA_DIR_TX>, /* egress icssg1 mgmnt cmd slice 1 */ | ||
58 | 50 | ||
59 | 51 | <&mcu_udmap &icssg0 0 UDMA_DIR_RX>, /* ingress slice 0 */ | |
60 | <&mcu_udmap &icssg1 0 UDMA_DIR_RX>, /* ingress icssg1 slice 0 */ | 52 | <&mcu_udmap &icssg0 1 UDMA_DIR_RX>, /* ingress slice 1 */ |
61 | <&mcu_udmap &icssg1 2 UDMA_DIR_RX>; /* ingress icssg1 mgmnt resp slice 0 */ | 53 | <&mcu_udmap &icssg0 2 UDMA_DIR_RX>, /* mgmnt rsp slice 0 */ |
54 | <&mcu_udmap &icssg0 3 UDMA_DIR_RX>; /* mgmnt rsp slice 1 */ | ||
62 | dma-names = "tx0-0", "tx0-1", "tx0-2", "tx0-3", | 55 | dma-names = "tx0-0", "tx0-1", "tx0-2", "tx0-3", |
63 | "rx0", "rxmgm0", | ||
64 | "tx1-0", "tx1-1", "tx1-2", "tx1-3", | 56 | "tx1-0", "tx1-1", "tx1-2", "tx1-3", |
65 | "rx1", "rxmgm1"; | 57 | "rx0", "rx1", |
58 | "rxmgm0", "rxmgm1"; | ||
66 | 59 | ||
67 | pruss0_emac0: ethernet-mii0 { | 60 | pruss0_emac0: ethernet-mii0 { |
68 | phy-handle = <&pruss0_eth0_phy>; | 61 | phy-handle = <&pruss0_eth0_phy>; |
69 | phy-mode = "rgmii-rxid"; | 62 | phy-mode = "rgmii-rxid"; |
70 | syscon-rgmii-delay = <&scm_conf 0x4114>; | 63 | syscon-rgmii-delay = <&scm_conf 0x4100>; |
71 | /* Filled in by bootloader */ | 64 | /* Filled in by bootloader */ |
72 | local-mac-address = [00 00 00 00 00 00]; | 65 | local-mac-address = [00 00 00 00 00 00]; |
73 | }; | 66 | }; |
@@ -86,6 +79,61 @@ | |||
86 | */ | 79 | */ |
87 | }; | 80 | }; |
88 | 81 | ||
82 | /* Dual Ethernet application node on PRU-ICSSG1 */ | ||
83 | pruss1_eth: pruss1_eth { | ||
84 | compatible = "ti,am654-icssg-prueth"; | ||
85 | pinctrl-names = "default"; | ||
86 | pinctrl-0 = <&icssg1_rgmii_pins_default>; | ||
87 | sram = <&icssg1_sram>; | ||
88 | clocks = <&k3_clks 63 3>; | ||
89 | clock-names = "mdio_fck"; | ||
90 | |||
91 | prus = <&pru1_0>, <&rtu1_0>, <&pru1_1>, <&rtu1_1>; | ||
92 | firmware-name = "ti-pruss/am65x-pru0-prueth-fw.elf", | ||
93 | "ti-pruss/am65x-rtu0-prueth-fw.elf", | ||
94 | "ti-pruss/am65x-pru1-prueth-fw.elf", | ||
95 | "ti-pruss/am65x-rtu1-prueth-fw.elf"; | ||
96 | mii-g-rt = <&icssg1_mii_g_rt>; | ||
97 | dma-coherent; | ||
98 | dmas = <&mcu_udmap &icssg1 0 UDMA_DIR_TX>, /* egress slice 0 */ | ||
99 | <&mcu_udmap &icssg1 1 UDMA_DIR_TX>, /* egress slice 0 */ | ||
100 | <&mcu_udmap &icssg1 2 UDMA_DIR_TX>, /* egress slice 0 */ | ||
101 | <&mcu_udmap &icssg1 3 UDMA_DIR_TX>, /* egress slice 0 */ | ||
102 | <&mcu_udmap &icssg1 4 UDMA_DIR_TX>, /* egress slice 1 */ | ||
103 | <&mcu_udmap &icssg1 5 UDMA_DIR_TX>, /* egress slice 1 */ | ||
104 | <&mcu_udmap &icssg1 6 UDMA_DIR_TX>, /* egress slice 1 */ | ||
105 | <&mcu_udmap &icssg1 7 UDMA_DIR_TX>, /* egress slice 1 */ | ||
106 | |||
107 | <&mcu_udmap &icssg1 0 UDMA_DIR_RX>, /* ingress slice 0 */ | ||
108 | <&mcu_udmap &icssg1 1 UDMA_DIR_RX>, /* ingress slice 1 */ | ||
109 | <&mcu_udmap &icssg1 2 UDMA_DIR_RX>, /* mgmnt rsp slice 0 */ | ||
110 | <&mcu_udmap &icssg1 3 UDMA_DIR_RX>; /* mgmnt rsp slice 1 */ | ||
111 | dma-names = "tx0-0", "tx0-1", "tx0-2", "tx0-3", | ||
112 | "tx1-0", "tx1-1", "tx1-2", "tx1-3", | ||
113 | "rx0", "rx1", | ||
114 | "rxmgm0", "rxmgm1"; | ||
115 | |||
116 | pruss1_emac0: ethernet-mii0 { | ||
117 | phy-handle = <&pruss1_eth0_phy>; | ||
118 | phy-mode = "rgmii-rxid"; | ||
119 | syscon-rgmii-delay = <&scm_conf 0x4110>; | ||
120 | /* Filled in by bootloader */ | ||
121 | local-mac-address = [00 00 00 00 00 00]; | ||
122 | }; | ||
123 | |||
124 | /* | ||
125 | * Commenting out the second mii interface as the framework | ||
126 | * supports one interface in a single probe | ||
127 | * So either mii1 or mii2 can be used. In case mii1 is needed | ||
128 | * uncomment mii1 and comment out mii0 | ||
129 | pruss1_emac1: ethernet-mii1 { | ||
130 | phy-handle = <&pruss1_eth1_phy>; | ||
131 | phy-mode = "rgmii-rxid"; | ||
132 | syscon-rgmii-delay = <&scm_conf 0x4114>; | ||
133 | local-mac-address = [00 00 00 00 00 00]; | ||
134 | }; | ||
135 | */ | ||
136 | }; | ||
89 | }; | 137 | }; |
90 | }; | 138 | }; |
91 | }; | 139 | }; |
@@ -98,7 +146,7 @@ | |||
98 | >; | 146 | >; |
99 | }; | 147 | }; |
100 | 148 | ||
101 | icssg01_rgmii_pins_default: icssg01_rgmii_pins_default { | 149 | icssg0_rgmii_pins_default: icssg0_rgmii_pins_default { |
102 | pinctrl-single,pins = < | 150 | pinctrl-single,pins = < |
103 | AM65X_IOPAD(0x0244, PIN_INPUT, 2) /* (AB28) PRG0_PRU1_GPO0.PRG0_RGMII2_RD0 */ | 151 | AM65X_IOPAD(0x0244, PIN_INPUT, 2) /* (AB28) PRG0_PRU1_GPO0.PRG0_RGMII2_RD0 */ |
104 | AM65X_IOPAD(0x0248, PIN_INPUT, 2) /* (AC28) PRG0_PRU1_GPO1.PRG0_RGMII2_RD1 */ | 152 | AM65X_IOPAD(0x0248, PIN_INPUT, 2) /* (AC28) PRG0_PRU1_GPO1.PRG0_RGMII2_RD1 */ |
@@ -128,7 +176,18 @@ | |||
128 | /* HACK As there is no driver for mdio */ | 176 | /* HACK As there is no driver for mdio */ |
129 | AM65X_IOPAD(0x0294, PIN_INPUT , 0) /* (AE26) PRG0_MDIO0_MDIO */ | 177 | AM65X_IOPAD(0x0294, PIN_INPUT , 0) /* (AE26) PRG0_MDIO0_MDIO */ |
130 | AM65X_IOPAD(0x0298, PIN_OUTPUT , 0) /* (AE28) PRG0_MDIO0_MDC */ | 178 | AM65X_IOPAD(0x0298, PIN_OUTPUT , 0) /* (AE28) PRG0_MDIO0_MDC */ |
179 | >; | ||
180 | }; | ||
131 | 181 | ||
182 | icssg1_mdio_pins_default: icssg1_mdio_pins_default { | ||
183 | pinctrl-single,pins = < | ||
184 | AM65X_IOPAD(0x0180, PIN_INPUT, 0) /* (AD18) PRG1_MDIO0_MDIO */ | ||
185 | AM65X_IOPAD(0x0184, PIN_OUTPUT, 0) /* (AH18) PRG1_MDIO0_MDC */ | ||
186 | >; | ||
187 | }; | ||
188 | |||
189 | icssg1_rgmii_pins_default: icssg1_rgmii_pins_default { | ||
190 | pinctrl-single,pins = < | ||
132 | AM65X_IOPAD(0x0130, PIN_INPUT, 2) /* (AH24) PRG1_PRU1_GPO0.PRG1_RGMII2_RD0 */ | 191 | AM65X_IOPAD(0x0130, PIN_INPUT, 2) /* (AH24) PRG1_PRU1_GPO0.PRG1_RGMII2_RD0 */ |
133 | AM65X_IOPAD(0x0134, PIN_INPUT, 2) /* (AH23) PRG1_PRU1_GPO1.PRG1_RGMII2_RD1 */ | 192 | AM65X_IOPAD(0x0134, PIN_INPUT, 2) /* (AH23) PRG1_PRU1_GPO1.PRG1_RGMII2_RD1 */ |
134 | AM65X_IOPAD(0x0138, PIN_INPUT, 2) /* (AG21) PRG1_PRU1_GPO2.PRG1_RGMII2_RD2 */ | 193 | AM65X_IOPAD(0x0138, PIN_INPUT, 2) /* (AG21) PRG1_PRU1_GPO2.PRG1_RGMII2_RD2 */ |
@@ -209,3 +268,23 @@ | |||
209 | ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>; | 268 | ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>; |
210 | }; | 269 | }; |
211 | }; | 270 | }; |
271 | |||
272 | &icssg1_mdio { | ||
273 | status = "okay"; | ||
274 | pinctrl-names = "default"; | ||
275 | pinctrl-0 = <&icssg1_mdio_pins_default>; | ||
276 | #address-cells = <1>; | ||
277 | #size-cells = <0>; | ||
278 | |||
279 | pruss1_eth0_phy: ethernet-phy@0 { | ||
280 | reg = <0>; | ||
281 | ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>; | ||
282 | ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>; | ||
283 | }; | ||
284 | |||
285 | pruss1_eth1_phy: ethernet-phy@3 { | ||
286 | reg = <3>; | ||
287 | ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>; | ||
288 | ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>; | ||
289 | }; | ||
290 | }; | ||
diff --git a/drivers/net/ti/icssg-prueth.c b/drivers/net/ti/icssg-prueth.c index 8564389d5a..3a7f39da4b 100644 --- a/drivers/net/ti/icssg-prueth.c +++ b/drivers/net/ti/icssg-prueth.c | |||
@@ -33,8 +33,6 @@ | |||
33 | #define ICSS_SLICE0 0 | 33 | #define ICSS_SLICE0 0 |
34 | #define ICSS_SLICE1 1 | 34 | #define ICSS_SLICE1 1 |
35 | 35 | ||
36 | #define MSMC_RAM_SIZE 0x10000 | ||
37 | |||
38 | #ifdef PKTSIZE_ALIGN | 36 | #ifdef PKTSIZE_ALIGN |
39 | #define UDMA_RX_BUF_SIZE PKTSIZE_ALIGN | 37 | #define UDMA_RX_BUF_SIZE PKTSIZE_ALIGN |
40 | #else | 38 | #else |
@@ -59,11 +57,6 @@ enum prueth_port { | |||
59 | PRUETH_PORT_MII1, /* physical port MII 1 */ | 57 | PRUETH_PORT_MII1, /* physical port MII 1 */ |
60 | }; | 58 | }; |
61 | 59 | ||
62 | /* Below used to support 2 icssgs per pru port */ | ||
63 | #define ICSSG0 0 | ||
64 | #define ICSSG1 1 | ||
65 | #define NUM_ICSSG 2 | ||
66 | |||
67 | /* Config region lies in shared RAM */ | 60 | /* Config region lies in shared RAM */ |
68 | #define ICSS_CONFIG_OFFSET_SLICE0 0 | 61 | #define ICSS_CONFIG_OFFSET_SLICE0 0 |
69 | #define ICSS_CONFIG_OFFSET_SLICE1 0x8000 | 62 | #define ICSS_CONFIG_OFFSET_SLICE1 0x8000 |
@@ -88,19 +81,19 @@ enum pruss_pru_id { | |||
88 | 81 | ||
89 | struct prueth { | 82 | struct prueth { |
90 | struct udevice *dev; | 83 | struct udevice *dev; |
91 | struct regmap *miig_rt[NUM_ICSSG]; | 84 | struct regmap *miig_rt; |
92 | fdt_addr_t mdio_base; | 85 | fdt_addr_t mdio_base; |
93 | phys_addr_t pruss_shrdram2[NUM_ICSSG]; | 86 | phys_addr_t pruss_shrdram2; |
94 | phys_addr_t tmaddr[NUM_ICSSG]; | 87 | phys_addr_t tmaddr; |
95 | struct mii_dev *bus; | 88 | struct mii_dev *bus; |
96 | u32 port_id; | 89 | u32 port_id; |
97 | u32 sram_pa[NUM_ICSSG]; | 90 | u32 sram_pa; |
98 | struct phy_device *phydev; | 91 | struct phy_device *phydev; |
99 | bool has_phy; | 92 | bool has_phy; |
100 | ofnode phy_node; | 93 | ofnode phy_node; |
101 | u32 phy_addr; | 94 | u32 phy_addr; |
102 | ofnode eth_node[PRUETH_NUM_MACS]; | 95 | ofnode eth_node[PRUETH_NUM_MACS]; |
103 | struct icssg_config config[NUM_ICSSG][PRUSS_NUM_PRUS]; | 96 | struct icssg_config config[PRUSS_NUM_PRUS]; |
104 | u32 mdio_freq; | 97 | u32 mdio_freq; |
105 | int phy_interface; | 98 | int phy_interface; |
106 | struct clk mdiofck; | 99 | struct clk mdiofck; |
@@ -108,12 +101,7 @@ struct prueth { | |||
108 | struct dma dma_rx; | 101 | struct dma dma_rx; |
109 | u32 rx_next; | 102 | u32 rx_next; |
110 | u32 rx_pend; | 103 | u32 rx_pend; |
111 | int slice[NUM_ICSSG]; | 104 | int slice; |
112 | int ingress_icssg; | ||
113 | int ingress_slice; | ||
114 | int egress_icssg; | ||
115 | int egress_slice; | ||
116 | bool dual_icssg; | ||
117 | }; | 105 | }; |
118 | 106 | ||
119 | static int icssg_phy_init(struct udevice *dev) | 107 | static int icssg_phy_init(struct udevice *dev) |
@@ -149,7 +137,7 @@ static int icssg_phy_init(struct udevice *dev) | |||
149 | return ret; | 137 | return ret; |
150 | } | 138 | } |
151 | 139 | ||
152 | static int icssg_mdio_init(struct udevice *dev, int icssg) | 140 | static int icssg_mdio_init(struct udevice *dev) |
153 | { | 141 | { |
154 | struct prueth *prueth = dev_get_priv(dev); | 142 | struct prueth *prueth = dev_get_priv(dev); |
155 | 143 | ||
@@ -162,28 +150,14 @@ static int icssg_mdio_init(struct udevice *dev, int icssg) | |||
162 | return 0; | 150 | return 0; |
163 | } | 151 | } |
164 | 152 | ||
165 | static void icssg_config_set(struct prueth *prueth, int icssg, int slice) | 153 | static void icssg_config_set(struct prueth *prueth) |
166 | { | 154 | { |
167 | struct icssg_config *config; | ||
168 | void __iomem *va; | 155 | void __iomem *va; |
169 | int i; | ||
170 | 156 | ||
171 | config = &prueth->config[icssg][0]; | 157 | va = (void __iomem *)prueth->pruss_shrdram2 + prueth->slice * |
172 | memset(config, 0, sizeof(*config)); | 158 | ICSSG_CONFIG_OFFSET_SLICE1; |
173 | config->addr_lo = cpu_to_le32(lower_32_bits(prueth->sram_pa[icssg])); | ||
174 | config->addr_hi = cpu_to_le32(upper_32_bits(prueth->sram_pa[icssg])); | ||
175 | config->num_tx_threads = 0; | ||
176 | config->rx_flow_id = 0; /* flow id for host port */ | ||
177 | |||
178 | for (i = 8; i < 16; i++) | ||
179 | config->tx_buf_sz[i] = cpu_to_le32(0x1800); | ||
180 | 159 | ||
181 | 160 | memcpy_toio(va, &prueth->config[0], sizeof(prueth->config[0])); | |
182 | va = (void __iomem *)prueth->pruss_shrdram2[icssg] + | ||
183 | slice * ICSSG_CONFIG_OFFSET_SLICE1; | ||
184 | |||
185 | memcpy_toio(va, &prueth->config[icssg][0], | ||
186 | sizeof(prueth->config[icssg][0])); | ||
187 | } | 161 | } |
188 | 162 | ||
189 | static int prueth_start(struct udevice *dev) | 163 | static int prueth_start(struct udevice *dev) |
@@ -194,26 +168,14 @@ static int prueth_start(struct udevice *dev) | |||
194 | char tx_chn_name[16]; | 168 | char tx_chn_name[16]; |
195 | char rx_chn_name[16]; | 169 | char rx_chn_name[16]; |
196 | 170 | ||
197 | icssg_class_set_mac_addr(priv->miig_rt[priv->ingress_icssg], | 171 | icssg_class_set_mac_addr(priv->miig_rt, priv->slice, |
198 | priv->ingress_slice, | ||
199 | (u8 *)pdata->enetaddr); | 172 | (u8 *)pdata->enetaddr); |
200 | icssg_class_default(priv->miig_rt[priv->ingress_icssg], | 173 | icssg_class_default(priv->miig_rt, priv->slice); |
201 | priv->ingress_slice); | 174 | |
175 | /* To differentiate channels for SLICE0 vs SLICE1 */ | ||
176 | snprintf(tx_chn_name, sizeof(tx_chn_name), "tx%d-0", priv->slice); | ||
177 | snprintf(rx_chn_name, sizeof(rx_chn_name), "rx%d", priv->slice); | ||
202 | 178 | ||
203 | /* To differentiate channels for SLICE0 vs SLICE1 for single icssg | ||
204 | * and ICSSG0 vs ICSSG1 for dual icssg | ||
205 | */ | ||
206 | if (!priv->dual_icssg) { | ||
207 | snprintf(tx_chn_name, sizeof(tx_chn_name), "tx%d-0", | ||
208 | priv->egress_slice); | ||
209 | snprintf(rx_chn_name, sizeof(rx_chn_name), "rx%d", | ||
210 | priv->ingress_slice); | ||
211 | } else { | ||
212 | snprintf(tx_chn_name, sizeof(tx_chn_name), "tx%d-0", | ||
213 | priv->egress_icssg); | ||
214 | snprintf(rx_chn_name, sizeof(rx_chn_name), "rx%d", | ||
215 | priv->ingress_icssg); | ||
216 | } | ||
217 | ret = dma_get_by_name(dev, tx_chn_name, &priv->dma_tx); | 179 | ret = dma_get_by_name(dev, tx_chn_name, &priv->dma_tx); |
218 | if (ret) | 180 | if (ret) |
219 | dev_err(dev, "TX dma get failed %d\n", ret); | 181 | dev_err(dev, "TX dma get failed %d\n", ret); |
@@ -306,9 +268,8 @@ static int prueth_free_pkt(struct udevice *dev, uchar *packet, int length) | |||
306 | static void prueth_stop(struct udevice *dev) | 268 | static void prueth_stop(struct udevice *dev) |
307 | { | 269 | { |
308 | struct prueth *priv = dev_get_priv(dev); | 270 | struct prueth *priv = dev_get_priv(dev); |
309 | int icssg = priv->ingress_icssg, slice = priv->ingress_slice; | ||
310 | 271 | ||
311 | icssg_class_disable(priv->miig_rt[icssg], slice); | 272 | icssg_class_disable(priv->miig_rt, priv->slice); |
312 | 273 | ||
313 | phy_shutdown(priv->phydev); | 274 | phy_shutdown(priv->phydev); |
314 | 275 | ||
@@ -319,13 +280,7 @@ static void prueth_stop(struct udevice *dev) | |||
319 | dma_free(&priv->dma_rx); | 280 | dma_free(&priv->dma_rx); |
320 | 281 | ||
321 | /* Workaround for shutdown command */ | 282 | /* Workaround for shutdown command */ |
322 | writel(0x0, priv->tmaddr[icssg] + slice * 0x200); | 283 | writel(0x0, priv->tmaddr + priv->slice * 0x200); |
323 | if (!priv->dual_icssg) | ||
324 | return; | ||
325 | |||
326 | icssg = priv->egress_icssg; | ||
327 | slice = priv->egress_slice; | ||
328 | writel(0x0, priv->tmaddr[icssg] + slice * 0x200); | ||
329 | } | 284 | } |
330 | 285 | ||
331 | static const struct eth_ops prueth_ops = { | 286 | static const struct eth_ops prueth_ops = { |
@@ -402,82 +357,43 @@ static int prueth_config_rgmiidelay(struct prueth *prueth, | |||
402 | return 0; | 357 | return 0; |
403 | } | 358 | } |
404 | 359 | ||
405 | static int get_pruss_info(struct prueth *prueth, | ||
406 | ofnode node, ofnode *pruss_node, int icssg) | ||
407 | { | ||
408 | struct udevice **prussdev = NULL; | ||
409 | int err; | ||
410 | |||
411 | *pruss_node = ofnode_get_parent(node); | ||
412 | err = misc_init_by_ofnode(*pruss_node); | ||
413 | if (err) | ||
414 | return err; | ||
415 | |||
416 | err = device_find_global_by_ofnode(*pruss_node, prussdev); | ||
417 | if (err) | ||
418 | dev_err(dev, "error getting the pruss dev\n"); | ||
419 | |||
420 | err = pruss_request_shrmem_region(*prussdev, | ||
421 | &prueth->pruss_shrdram2[icssg]); | ||
422 | if (err) | ||
423 | return err; | ||
424 | |||
425 | if (icssg) | ||
426 | prueth->miig_rt[icssg] = | ||
427 | syscon_regmap_lookup_by_phandle(prueth->dev, | ||
428 | "mii-g-rt-paired"); | ||
429 | else | ||
430 | prueth->miig_rt[icssg] = | ||
431 | syscon_regmap_lookup_by_phandle(prueth->dev, | ||
432 | "mii-g-rt"); | ||
433 | if (!prueth->miig_rt[icssg]) { | ||
434 | dev_err(dev, "No mii-g-rt syscon regmap for icssg %d\n", icssg); | ||
435 | return -ENODEV; | ||
436 | } | ||
437 | |||
438 | return pruss_request_tm_region(*prussdev, &prueth->tmaddr[icssg]); | ||
439 | } | ||
440 | |||
441 | static int prueth_probe(struct udevice *dev) | 360 | static int prueth_probe(struct udevice *dev) |
442 | { | 361 | { |
443 | ofnode eth0_node, eth1_node, node, pruss_node, mdio_node, sram_node, | ||
444 | dev_node; | ||
445 | struct prueth *prueth; | 362 | struct prueth *prueth; |
446 | u32 err, sp, tmp[8]; | 363 | int ret = 0, i; |
447 | int ret = 0; | 364 | ofnode eth0_node, eth1_node, node, pruss_node, mdio_node, sram_node; |
365 | u32 phandle, err, sp; | ||
366 | struct udevice **prussdev = NULL; | ||
367 | struct icssg_config *config; | ||
448 | 368 | ||
449 | prueth = dev_get_priv(dev); | 369 | prueth = dev_get_priv(dev); |
450 | prueth->dev = dev; | 370 | prueth->dev = dev; |
451 | dev_node = dev_ofnode(dev); | 371 | err = ofnode_read_u32(dev_ofnode(dev), "prus", &phandle); |
452 | |||
453 | if (ofnode_device_is_compatible(dev_node, "ti,am654-dualicssg-prueth")) | ||
454 | prueth->dual_icssg = true; | ||
455 | |||
456 | if (prueth->dual_icssg) | ||
457 | err = ofnode_read_u32_array(dev_node, "prus", tmp, 8); | ||
458 | else | ||
459 | err = ofnode_read_u32_array(dev_node, "prus", tmp, 4); | ||
460 | if (err) | 372 | if (err) |
461 | return err; | 373 | return err; |
462 | 374 | ||
463 | node = ofnode_get_by_phandle(tmp[0]); | 375 | node = ofnode_get_by_phandle(phandle); |
464 | if (!ofnode_valid(node)) | 376 | if (!ofnode_valid(node)) |
465 | return -EINVAL; | 377 | return -EINVAL; |
466 | 378 | ||
467 | ret = get_pruss_info(prueth, node, &pruss_node, ICSSG0); | 379 | pruss_node = ofnode_get_parent(node); |
380 | err = misc_init_by_ofnode(pruss_node); | ||
381 | if (err) | ||
382 | return err; | ||
383 | |||
384 | ret = device_find_global_by_ofnode(pruss_node, prussdev); | ||
468 | if (ret) | 385 | if (ret) |
469 | return ret; | 386 | dev_err(dev, "error getting the pruss dev\n"); |
470 | 387 | ||
471 | if (prueth->dual_icssg) { | 388 | ret = pruss_request_shrmem_region(*prussdev, &prueth->pruss_shrdram2); |
472 | ofnode pruss_node_pair; | 389 | if (ret) |
390 | return ret; | ||
473 | 391 | ||
474 | node = ofnode_get_by_phandle(tmp[4]); | 392 | ret = pruss_request_tm_region(*prussdev, &prueth->tmaddr); |
475 | ret = get_pruss_info(prueth, node, &pruss_node_pair, ICSSG1); | 393 | if (ret) |
476 | if (ret) | 394 | return ret; |
477 | return ret; | ||
478 | } | ||
479 | 395 | ||
480 | node = dev_node; | 396 | node = dev_ofnode(dev); |
481 | eth0_node = ofnode_find_subnode(node, "ethernet-mii0"); | 397 | eth0_node = ofnode_find_subnode(node, "ethernet-mii0"); |
482 | eth1_node = ofnode_find_subnode(node, "ethernet-mii1"); | 398 | eth1_node = ofnode_find_subnode(node, "ethernet-mii1"); |
483 | /* one node must be present and available else we fail */ | 399 | /* one node must be present and available else we fail */ |
@@ -497,43 +413,23 @@ static int prueth_probe(struct udevice *dev) | |||
497 | } | 413 | } |
498 | 414 | ||
499 | if (ofnode_valid(eth0_node)) { | 415 | if (ofnode_valid(eth0_node)) { |
500 | if (!prueth->dual_icssg) { | 416 | prueth->slice = 0; |
501 | prueth->slice[ICSSG0] = 0; | ||
502 | prueth->egress_icssg = ICSSG0; | ||
503 | prueth->egress_slice = 0; | ||
504 | prueth->ingress_icssg = ICSSG0; | ||
505 | prueth->ingress_slice = 0; | ||
506 | } else { | ||
507 | prueth->slice[ICSSG0] = 0; | ||
508 | prueth->slice[ICSSG1] = 1; | ||
509 | prueth->egress_icssg = ICSSG1; | ||
510 | prueth->egress_slice = 1; | ||
511 | prueth->ingress_icssg = ICSSG0; | ||
512 | prueth->ingress_slice = 0; | ||
513 | } | ||
514 | icssg_ofdata_parse_phy(dev, eth0_node); | 417 | icssg_ofdata_parse_phy(dev, eth0_node); |
515 | prueth->eth_node[PRUETH_MAC0] = eth0_node; | 418 | prueth->eth_node[PRUETH_MAC0] = eth0_node; |
516 | } | 419 | } |
517 | 420 | ||
518 | if (ofnode_valid(eth1_node)) { | 421 | if (ofnode_valid(eth1_node)) { |
519 | if (!prueth->dual_icssg) { | 422 | prueth->slice = 1; |
520 | prueth->slice[ICSSG0] = 1; | ||
521 | prueth->egress_icssg = ICSSG0; | ||
522 | prueth->egress_slice = 0; | ||
523 | prueth->ingress_icssg = ICSSG0; | ||
524 | prueth->ingress_slice = 0; | ||
525 | } else { | ||
526 | prueth->slice[ICSSG0] = 1; | ||
527 | prueth->slice[ICSSG1] = 0; | ||
528 | prueth->egress_icssg = ICSSG0; | ||
529 | prueth->egress_slice = 1; | ||
530 | prueth->ingress_icssg = ICSSG1; | ||
531 | prueth->ingress_slice = 0; | ||
532 | } | ||
533 | icssg_ofdata_parse_phy(dev, eth1_node); | 423 | icssg_ofdata_parse_phy(dev, eth1_node); |
534 | prueth->eth_node[PRUETH_MAC0] = eth1_node; | 424 | prueth->eth_node[PRUETH_MAC0] = eth1_node; |
535 | } | 425 | } |
536 | 426 | ||
427 | prueth->miig_rt = syscon_regmap_lookup_by_phandle(dev, "mii-g-rt"); | ||
428 | if (!prueth->miig_rt) { | ||
429 | dev_err(dev, "couldn't get mii-g-rt syscon regmap\n"); | ||
430 | return -ENODEV; | ||
431 | } | ||
432 | |||
537 | ret = clk_get_by_name(dev, "mdio_fck", &prueth->mdiofck); | 433 | ret = clk_get_by_name(dev, "mdio_fck", &prueth->mdiofck); |
538 | if (ret) { | 434 | if (ret) { |
539 | dev_err(dev, "failed to get clock %d\n", ret); | 435 | dev_err(dev, "failed to get clock %d\n", ret); |
@@ -545,7 +441,7 @@ static int prueth_probe(struct udevice *dev) | |||
545 | return ret; | 441 | return ret; |
546 | } | 442 | } |
547 | 443 | ||
548 | ret = ofnode_read_u32(node, "sram", &sp); | 444 | ret = ofnode_read_u32(dev_ofnode(dev), "sram", &sp); |
549 | if (ret) { | 445 | if (ret) { |
550 | dev_err(dev, "sram node fetch failed %d\n", ret); | 446 | dev_err(dev, "sram node fetch failed %d\n", ret); |
551 | return ret; | 447 | return ret; |
@@ -555,20 +451,15 @@ static int prueth_probe(struct udevice *dev) | |||
555 | if (!ofnode_valid(node)) | 451 | if (!ofnode_valid(node)) |
556 | return -EINVAL; | 452 | return -EINVAL; |
557 | 453 | ||
558 | prueth->sram_pa[ICSSG0] = ofnode_get_addr(sram_node); | 454 | prueth->sram_pa = ofnode_get_addr(sram_node); |
559 | if (prueth->dual_icssg) | ||
560 | prueth->sram_pa[ICSSG1] = | ||
561 | prueth->sram_pa[ICSSG0] + MSMC_RAM_SIZE; | ||
562 | 455 | ||
563 | if (ofnode_valid(eth0_node)) { | 456 | if (!prueth->slice) { |
564 | ret = prueth_config_rgmiidelay(prueth, eth0_node); | 457 | ret = prueth_config_rgmiidelay(prueth, eth0_node); |
565 | if (ret) { | 458 | if (ret) { |
566 | dev_err(dev, "prueth_config_rgmiidelay failed\n"); | 459 | dev_err(dev, "prueth_config_rgmiidelay failed\n"); |
567 | return ret; | 460 | return ret; |
568 | } | 461 | } |
569 | } | 462 | } else { |
570 | |||
571 | if (ofnode_valid(eth1_node)) { | ||
572 | ret = prueth_config_rgmiidelay(prueth, eth1_node); | 463 | ret = prueth_config_rgmiidelay(prueth, eth1_node); |
573 | if (ret) { | 464 | if (ret) { |
574 | dev_err(dev, "prueth_config_rgmiidelay failed\n"); | 465 | dev_err(dev, "prueth_config_rgmiidelay failed\n"); |
@@ -580,7 +471,7 @@ static int prueth_probe(struct udevice *dev) | |||
580 | prueth->mdio_base = ofnode_get_addr(mdio_node); | 471 | prueth->mdio_base = ofnode_get_addr(mdio_node); |
581 | ofnode_read_u32(mdio_node, "bus_freq", &prueth->mdio_freq); | 472 | ofnode_read_u32(mdio_node, "bus_freq", &prueth->mdio_freq); |
582 | 473 | ||
583 | ret = icssg_mdio_init(dev, ICSSG0); | 474 | ret = icssg_mdio_init(dev); |
584 | if (ret) | 475 | if (ret) |
585 | return ret; | 476 | return ret; |
586 | 477 | ||
@@ -591,9 +482,17 @@ static int prueth_probe(struct udevice *dev) | |||
591 | } | 482 | } |
592 | 483 | ||
593 | /* Set Load time configuration */ | 484 | /* Set Load time configuration */ |
594 | icssg_config_set(prueth, ICSSG0, prueth->slice[ICSSG0]); | 485 | config = &prueth->config[0]; |
595 | if (prueth->dual_icssg) | 486 | memset(config, 0, sizeof(*config)); |
596 | icssg_config_set(prueth, ICSSG1, prueth->slice[ICSSG1]); | 487 | config->addr_lo = cpu_to_le32(lower_32_bits(prueth->sram_pa)); |
488 | config->addr_hi = cpu_to_le32(upper_32_bits(prueth->sram_pa)); | ||
489 | config->num_tx_threads = 0; | ||
490 | config->rx_flow_id = 0; /* flow id for host port */ | ||
491 | |||
492 | for (i = 8; i < 16; i++) | ||
493 | config->tx_buf_sz[i] = cpu_to_le32(0x1800); | ||
494 | |||
495 | icssg_config_set(prueth); | ||
597 | 496 | ||
598 | return 0; | 497 | return 0; |
599 | out: | 498 | out: |
@@ -605,7 +504,6 @@ out: | |||
605 | 504 | ||
606 | static const struct udevice_id prueth_ids[] = { | 505 | static const struct udevice_id prueth_ids[] = { |
607 | { .compatible = "ti,am654-icssg-prueth" }, | 506 | { .compatible = "ti,am654-icssg-prueth" }, |
608 | { .compatible = "ti,am654-dualicssg-prueth" }, | ||
609 | { } | 507 | { } |
610 | }; | 508 | }; |
611 | 509 | ||