Skip to content

Commit a61bfa6

Browse files
committed
Merge branch 'xgene-next'
Keyur Chudgar says: ==================== drivers: net: xgene: Add second SGMII based 1G interface This patch adds support for second SGMII based 1G interface. ==================== Signed-off-by: Keyur Chudgar <[email protected]> Signed-off-by: Iyappan Subramanian <[email protected]> Signed-off-by: David S. Miller <[email protected]>
2 parents e7a9eee + ca62645 commit a61bfa6

File tree

7 files changed

+98
-12
lines changed

7 files changed

+98
-12
lines changed

Documentation/devicetree/bindings/net/apm-xgene-enet.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Required properties for all the ethernet interfaces:
1515
- "ring_csr": Descriptor ring control and status register address space
1616
- "ring_cmd": Descriptor ring command register address space
1717
- interrupts: Ethernet main interrupt
18+
- port-id: Port number (0 or 1)
1819
- clocks: Reference to the clock entry.
1920
- local-mac-address: MAC address assigned to this device
2021
- phy-connection-type: Interface type between ethernet device and PHY device
@@ -49,6 +50,7 @@ Example:
4950
<0x0 0X10000000 0x0 0X200>;
5051
reg-names = "enet_csr", "ring_csr", "ring_cmd";
5152
interrupts = <0x0 0x3c 0x4>;
53+
port-id = <0>;
5254
clocks = <&menetclk 0>;
5355
local-mac-address = [00 01 73 00 00 01];
5456
phy-connection-type = "rgmii";

arch/arm64/boot/dts/apm/apm-mustang.dts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
status = "ok";
4646
};
4747

48+
&sgenet1 {
49+
status = "ok";
50+
};
51+
4852
&xgenet {
4953
status = "ok";
5054
};

arch/arm64/boot/dts/apm/apm-storm.dtsi

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,16 @@
186186
clock-output-names = "sge0clk";
187187
};
188188

189+
sge1clk: sge1clk@1f21c000 {
190+
compatible = "apm,xgene-device-clock";
191+
#clock-cells = <1>;
192+
clocks = <&socplldiv2 0>;
193+
reg = <0x0 0x1f21c000 0x0 0x1000>;
194+
reg-names = "csr-reg";
195+
csr-mask = <0xc>;
196+
clock-output-names = "sge1clk";
197+
};
198+
189199
xge0clk: xge0clk@1f61c000 {
190200
compatible = "apm,xgene-device-clock";
191201
#clock-cells = <1>;
@@ -635,6 +645,21 @@
635645
phy-connection-type = "sgmii";
636646
};
637647

648+
sgenet1: ethernet@1f210030 {
649+
compatible = "apm,xgene1-sgenet";
650+
status = "disabled";
651+
reg = <0x0 0x1f210030 0x0 0xd100>,
652+
<0x0 0x1f200000 0x0 0Xc300>,
653+
<0x0 0x1B000000 0x0 0X8000>;
654+
reg-names = "enet_csr", "ring_csr", "ring_cmd";
655+
interrupts = <0x0 0xAC 0x4>;
656+
port-id = <1>;
657+
dma-coherent;
658+
clocks = <&sge1clk 0>;
659+
local-mac-address = [00 00 00 00 00 00];
660+
phy-connection-type = "sgmii";
661+
};
662+
638663
xgenet: ethernet@1f610000 {
639664
compatible = "apm,xgene1-xgenet";
640665
status = "disabled";

drivers/net/ethernet/apm/xgene/xgene_enet_hw.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ enum xgene_enet_rm {
9797
#define QCOHERENT BIT(4)
9898
#define RECOMBBUF BIT(27)
9999

100+
#define MAC_OFFSET 0x30
101+
100102
#define BLOCK_ETH_CSR_OFFSET 0x2000
101103
#define BLOCK_ETH_RING_IF_OFFSET 0x9000
102104
#define BLOCK_ETH_DIAG_CSR_OFFSET 0xD000

drivers/net/ethernet/apm/xgene/xgene_enet_main.c

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -645,9 +645,11 @@ static int xgene_enet_create_desc_rings(struct net_device *ndev)
645645
struct device *dev = ndev_to_dev(ndev);
646646
struct xgene_enet_desc_ring *rx_ring, *tx_ring, *cp_ring;
647647
struct xgene_enet_desc_ring *buf_pool = NULL;
648-
u8 cpu_bufnum = 0, eth_bufnum = START_ETH_BUFNUM;
649-
u8 bp_bufnum = START_BP_BUFNUM;
650-
u16 ring_id, ring_num = START_RING_NUM;
648+
u8 cpu_bufnum = pdata->cpu_bufnum;
649+
u8 eth_bufnum = pdata->eth_bufnum;
650+
u8 bp_bufnum = pdata->bp_bufnum;
651+
u16 ring_num = pdata->ring_num;
652+
u16 ring_id;
651653
int ret;
652654

653655
/* allocate rx descriptor ring */
@@ -752,6 +754,22 @@ static const struct net_device_ops xgene_ndev_ops = {
752754
.ndo_set_mac_address = xgene_enet_set_mac_address,
753755
};
754756

757+
static int xgene_get_port_id(struct device *dev, struct xgene_enet_pdata *pdata)
758+
{
759+
u32 id = 0;
760+
int ret;
761+
762+
ret = device_property_read_u32(dev, "port-id", &id);
763+
if (!ret && id > 1) {
764+
dev_err(dev, "Incorrect port-id specified\n");
765+
return -ENODEV;
766+
}
767+
768+
pdata->port_id = id;
769+
770+
return 0;
771+
}
772+
755773
static int xgene_get_mac_address(struct device *dev,
756774
unsigned char *addr)
757775
{
@@ -843,6 +861,10 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
843861
}
844862
pdata->rx_irq = ret;
845863

864+
ret = xgene_get_port_id(dev, pdata);
865+
if (ret)
866+
return ret;
867+
846868
if (xgene_get_mac_address(dev, ndev->dev_addr) != ETH_ALEN)
847869
eth_hw_addr_random(ndev);
848870

@@ -866,13 +888,13 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
866888
pdata->clk = NULL;
867889
}
868890

869-
base_addr = pdata->base_addr;
891+
base_addr = pdata->base_addr - (pdata->port_id * MAC_OFFSET);
870892
pdata->eth_csr_addr = base_addr + BLOCK_ETH_CSR_OFFSET;
871893
pdata->eth_ring_if_addr = base_addr + BLOCK_ETH_RING_IF_OFFSET;
872894
pdata->eth_diag_csr_addr = base_addr + BLOCK_ETH_DIAG_CSR_OFFSET;
873895
if (pdata->phy_mode == PHY_INTERFACE_MODE_RGMII ||
874896
pdata->phy_mode == PHY_INTERFACE_MODE_SGMII) {
875-
pdata->mcx_mac_addr = base_addr + BLOCK_ETH_MAC_OFFSET;
897+
pdata->mcx_mac_addr = pdata->base_addr + BLOCK_ETH_MAC_OFFSET;
876898
pdata->mcx_mac_csr_addr = base_addr + BLOCK_ETH_MAC_CSR_OFFSET;
877899
} else {
878900
pdata->mcx_mac_addr = base_addr + BLOCK_AXG_MAC_OFFSET;
@@ -935,6 +957,24 @@ static void xgene_enet_setup_ops(struct xgene_enet_pdata *pdata)
935957
pdata->rm = RM0;
936958
break;
937959
}
960+
961+
switch (pdata->port_id) {
962+
case 0:
963+
pdata->cpu_bufnum = START_CPU_BUFNUM_0;
964+
pdata->eth_bufnum = START_ETH_BUFNUM_0;
965+
pdata->bp_bufnum = START_BP_BUFNUM_0;
966+
pdata->ring_num = START_RING_NUM_0;
967+
break;
968+
case 1:
969+
pdata->cpu_bufnum = START_CPU_BUFNUM_1;
970+
pdata->eth_bufnum = START_ETH_BUFNUM_1;
971+
pdata->bp_bufnum = START_BP_BUFNUM_1;
972+
pdata->ring_num = START_RING_NUM_1;
973+
break;
974+
default:
975+
break;
976+
}
977+
938978
}
939979

940980
static int xgene_enet_probe(struct platform_device *pdev)

drivers/net/ethernet/apm/xgene/xgene_enet_main.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,15 @@
4141
#define SKB_BUFFER_SIZE (XGENE_ENET_MAX_MTU - NET_IP_ALIGN)
4242
#define NUM_PKT_BUF 64
4343
#define NUM_BUFPOOL 32
44-
#define START_ETH_BUFNUM 2
45-
#define START_BP_BUFNUM 0x22
46-
#define START_RING_NUM 8
44+
45+
#define START_CPU_BUFNUM_0 0
46+
#define START_ETH_BUFNUM_0 2
47+
#define START_BP_BUFNUM_0 0x22
48+
#define START_RING_NUM_0 8
49+
#define START_CPU_BUFNUM_1 12
50+
#define START_ETH_BUFNUM_1 10
51+
#define START_BP_BUFNUM_1 0x2A
52+
#define START_RING_NUM_1 264
4753

4854
#define PHY_POLL_LINK_ON (10 * HZ)
4955
#define PHY_POLL_LINK_OFF (PHY_POLL_LINK_ON / 5)
@@ -125,6 +131,11 @@ struct xgene_enet_pdata {
125131
struct xgene_mac_ops *mac_ops;
126132
struct xgene_port_ops *port_ops;
127133
struct delayed_work link_work;
134+
u32 port_id;
135+
u8 cpu_bufnum;
136+
u8 eth_bufnum;
137+
u8 bp_bufnum;
138+
u16 ring_num;
128139
};
129140

130141
struct xgene_indirect_ctl {

drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ static u32 xgene_enet_link_status(struct xgene_enet_pdata *p)
226226
static void xgene_sgmac_init(struct xgene_enet_pdata *p)
227227
{
228228
u32 data, loop = 10;
229+
u32 offset = p->port_id * 4;
229230

230231
xgene_sgmac_reset(p);
231232

@@ -272,9 +273,9 @@ static void xgene_sgmac_init(struct xgene_enet_pdata *p)
272273
xgene_enet_wr_csr(p, RSIF_RAM_DBG_REG0_ADDR, 0);
273274

274275
/* Bypass traffic gating */
275-
xgene_enet_wr_csr(p, CFG_LINK_AGGR_RESUME_0_ADDR, TX_PORT0);
276+
xgene_enet_wr_csr(p, CFG_LINK_AGGR_RESUME_0_ADDR + offset, TX_PORT0);
276277
xgene_enet_wr_csr(p, CFG_BYPASS_ADDR, RESUME_TX);
277-
xgene_enet_wr_csr(p, SG_RX_DV_GATE_REG_0_ADDR, RESUME_RX0);
278+
xgene_enet_wr_csr(p, SG_RX_DV_GATE_REG_0_ADDR + offset, RESUME_RX0);
278279
}
279280

280281
static void xgene_sgmac_rxtx(struct xgene_enet_pdata *p, u32 bits, bool set)
@@ -330,13 +331,14 @@ static void xgene_enet_cle_bypass(struct xgene_enet_pdata *p,
330331
u32 dst_ring_num, u16 bufpool_id)
331332
{
332333
u32 data, fpsel;
334+
u32 offset = p->port_id * MAC_OFFSET;
333335

334336
data = CFG_CLE_BYPASS_EN0;
335-
xgene_enet_wr_csr(p, CLE_BYPASS_REG0_0_ADDR, data);
337+
xgene_enet_wr_csr(p, CLE_BYPASS_REG0_0_ADDR + offset, data);
336338

337339
fpsel = xgene_enet_ring_bufnum(bufpool_id) - 0x20;
338340
data = CFG_CLE_DSTQID0(dst_ring_num) | CFG_CLE_FPSEL0(fpsel);
339-
xgene_enet_wr_csr(p, CLE_BYPASS_REG1_0_ADDR, data);
341+
xgene_enet_wr_csr(p, CLE_BYPASS_REG1_0_ADDR + offset, data);
340342
}
341343

342344
static void xgene_enet_shutdown(struct xgene_enet_pdata *p)

0 commit comments

Comments
 (0)