aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMuralidharan Karicheri2019-12-10 15:31:58 -0600
committerMuralidharan Karicheri2019-12-10 15:31:58 -0600
commit165303b402f0d6bf1b0e7d2ed54782c64834f266 (patch)
tree5a85eb959c110e93c8d3a9456cd90feca70aa9e7
parent078a3b8701f4224c59a27a238732e0bc034c0159 (diff)
parent8e7ad5c94d872f6fc312b35036707133ccffa4ee (diff)
downloadprocessor-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.dtsi5
-rw-r--r--arch/arm/dts/k3-am654-idk.dtso137
-rw-r--r--drivers/net/ti/icssg-prueth.c230
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
89struct prueth { 82struct 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
119static int icssg_phy_init(struct udevice *dev) 107static 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
152static int icssg_mdio_init(struct udevice *dev, int icssg) 140static 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
165static void icssg_config_set(struct prueth *prueth, int icssg, int slice) 153static 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
189static int prueth_start(struct udevice *dev) 163static 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)
306static void prueth_stop(struct udevice *dev) 268static 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
331static const struct eth_ops prueth_ops = { 286static 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
405static 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
441static int prueth_probe(struct udevice *dev) 360static 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;
599out: 498out:
@@ -605,7 +504,6 @@ out:
605 504
606static const struct udevice_id prueth_ids[] = { 505static 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