Skip to content

Commit 21e0e0d

Browse files
Karicheri, Muralidharandavem330
authored andcommitted
net: netcp: use separate reg region for individual ethss modules
Ethss has multiple modules within the sub system - switch sub system - sgmii - mdio - switch module NetCP driver re-uses existing davinci mdio driver. It requires to have its own register region to map the reg space. So restructure the code to use separate reg region for the individual modules it manages. Use range property to define register space of NetCP and use reg property to define individual reg spaces. So MDIO will have its own reg space to map. This is a pre-requisite to enable MDIO driver for NetCP. Signed-off-by: Murali Karicheri <m-karicheri2@ti.com> Signed-off-by: WingMan Kwok <w-kwok2@ti.com> CC: "David S. Miller" <davem@davemloft.net> CC: Mugunthan V N <mugunthanvnm@ti.com> CC: "Lad, Prabhakar" <prabhakar.csengg@gmail.com> CC: Grygorii Strashko <grygorii.strashko@ti.com> CC: Christoph Jaeger <cj@linux.com> CC: Lokesh Vutla <lokeshvutla@ti.com> CC: Markus Pargmann <mpa@pengutronix.de> CC: Kumar Gala <galak@codeaurora.org> CC: Ian Campbell <ijc+devicetree@hellion.org.uk> CC: Mark Rutland <mark.rutland@arm.com> CC: Pawel Moll <pawel.moll@arm.com> CC: Rob Herring <robh+dt@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent e170f40 commit 21e0e0d

File tree

2 files changed

+102
-44
lines changed

2 files changed

+102
-44
lines changed

Documentation/devicetree/bindings/net/keystone-netcp.txt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ Required properties:
4949
- compatible: Should be "ti,netcp-1.0"
5050
- clocks: phandle to the reference clocks for the subsystem.
5151
- dma-id: Navigator packet dma instance id.
52+
- ranges: address range of NetCP (includes, Ethernet SS, PA and SA)
5253

5354
Optional properties:
5455
- reg: register location and the size for the following register
@@ -66,8 +67,10 @@ Required properties:
6667
- label: Must be "netcp-gbe" for 1Gb & "netcp-xgbe" for 10Gb.
6768
- reg: register location and the size for the following register
6869
regions in the specified order.
69-
- subsystem registers
70-
- serdes registers
70+
- switch subsystem registers
71+
- sgmii port3/4 module registers (only for NetCP 1.4)
72+
- switch module registers
73+
- serdes registers (only for 10G)
7174
- tx-channel: the navigator packet dma channel name for tx.
7275
- tx-queue: the navigator queue number associated with the tx dma channel.
7376
- interfaces: specification for each of the switch port to be registered as a
@@ -120,14 +123,13 @@ Optional properties:
120123

121124
Example binding:
122125

123-
netcp: netcp@2090000 {
126+
netcp: netcp@2000000 {
124127
reg = <0x2620110 0x8>;
125128
reg-names = "efuse";
126129
compatible = "ti,netcp-1.0";
127130
#address-cells = <1>;
128131
#size-cells = <1>;
129-
ranges;
130-
132+
ranges = <0 0x2000000 0xfffff>;
131133
clocks = <&papllclk>, <&clkcpgmac>, <&chipclk12>;
132134
dma-coherent;
133135
/* big-endian; */
@@ -137,9 +139,9 @@ netcp: netcp@2090000 {
137139
#address-cells = <1>;
138140
#size-cells = <1>;
139141
ranges;
140-
gbe@0x2090000 {
142+
gbe@90000 {
141143
label = "netcp-gbe";
142-
reg = <0x2090000 0xf00>;
144+
reg = <0x90000 0x300>, <0x90400 0x400>, <0x90800 0x700>;
143145
/* enable-ale; */
144146
tx-queue = <648>;
145147
tx-channel = <8>;

drivers/net/ethernet/ti/netcp_ethss.c

Lines changed: 93 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,18 @@
4040
#define GBE_MODULE_NAME "netcp-gbe"
4141
#define GBE_SS_VERSION_14 0x4ed21104
4242

43+
#define GBE_SS_REG_INDEX 0
44+
#define GBE_SGMII34_REG_INDEX 1
45+
#define GBE_SM_REG_INDEX 2
46+
/* offset relative to base of GBE_SS_REG_INDEX */
4347
#define GBE13_SGMII_MODULE_OFFSET 0x100
44-
#define GBE13_SGMII34_MODULE_OFFSET 0x400
45-
#define GBE13_SWITCH_MODULE_OFFSET 0x800
46-
#define GBE13_HOST_PORT_OFFSET 0x834
47-
#define GBE13_SLAVE_PORT_OFFSET 0x860
48-
#define GBE13_EMAC_OFFSET 0x900
49-
#define GBE13_SLAVE_PORT2_OFFSET 0xa00
50-
#define GBE13_HW_STATS_OFFSET 0xb00
51-
#define GBE13_ALE_OFFSET 0xe00
48+
/* offset relative to base of GBE_SM_REG_INDEX */
49+
#define GBE13_HOST_PORT_OFFSET 0x34
50+
#define GBE13_SLAVE_PORT_OFFSET 0x60
51+
#define GBE13_EMAC_OFFSET 0x100
52+
#define GBE13_SLAVE_PORT2_OFFSET 0x200
53+
#define GBE13_HW_STATS_OFFSET 0x300
54+
#define GBE13_ALE_OFFSET 0x600
5255
#define GBE13_HOST_PORT_NUM 0
5356
#define GBE13_NUM_SLAVES 4
5457
#define GBE13_NUM_ALE_PORTS (GBE13_NUM_SLAVES + 1)
@@ -58,14 +61,18 @@
5861
#define XGBE_MODULE_NAME "netcp-xgbe"
5962
#define XGBE_SS_VERSION_10 0x4ee42100
6063

61-
#define XGBE_SERDES_REG_INDEX 1
64+
#define XGBE_SS_REG_INDEX 0
65+
#define XGBE_SM_REG_INDEX 1
66+
#define XGBE_SERDES_REG_INDEX 2
67+
68+
/* offset relative to base of XGBE_SS_REG_INDEX */
6269
#define XGBE10_SGMII_MODULE_OFFSET 0x100
63-
#define XGBE10_SWITCH_MODULE_OFFSET 0x1000
64-
#define XGBE10_HOST_PORT_OFFSET 0x1034
65-
#define XGBE10_SLAVE_PORT_OFFSET 0x1064
66-
#define XGBE10_EMAC_OFFSET 0x1400
67-
#define XGBE10_ALE_OFFSET 0x1700
68-
#define XGBE10_HW_STATS_OFFSET 0x1800
70+
/* offset relative to base of XGBE_SM_REG_INDEX */
71+
#define XGBE10_HOST_PORT_OFFSET 0x34
72+
#define XGBE10_SLAVE_PORT_OFFSET 0x64
73+
#define XGBE10_EMAC_OFFSET 0x400
74+
#define XGBE10_ALE_OFFSET 0x700
75+
#define XGBE10_HW_STATS_OFFSET 0x800
6976
#define XGBE10_HOST_PORT_NUM 0
7077
#define XGBE10_NUM_SLAVES 2
7178
#define XGBE10_NUM_ALE_PORTS (XGBE10_NUM_SLAVES + 1)
@@ -1579,9 +1586,9 @@ static int init_slave(struct gbe_priv *gbe_dev, struct gbe_slave *slave,
15791586
else if (gbe_dev->ss_version == XGBE_SS_VERSION_10)
15801587
emac_reg_ofs = XGBE10_EMAC_OFFSET;
15811588

1582-
slave->port_regs = gbe_dev->ss_regs + port_reg_ofs +
1589+
slave->port_regs = gbe_dev->switch_regs + port_reg_ofs +
15831590
(0x30 * port_reg_num);
1584-
slave->emac_regs = gbe_dev->ss_regs + emac_reg_ofs +
1591+
slave->emac_regs = gbe_dev->switch_regs + emac_reg_ofs +
15851592
(0x40 * slave->slave_num);
15861593

15871594
if (gbe_dev->ss_version == GBE_SS_VERSION_14) {
@@ -1732,22 +1739,39 @@ static int set_xgbe_ethss10_priv(struct gbe_priv *gbe_dev,
17321739

17331740
ret = of_address_to_resource(node, 0, &res);
17341741
if (ret) {
1735-
dev_err(gbe_dev->dev, "Can't translate of node(%s) address for xgbe subsystem regs\n",
1736-
node->name);
1742+
dev_err(gbe_dev->dev,
1743+
"Can't xlate xgbe of node(%s) ss address at %d\n",
1744+
node->name, XGBE_SS_REG_INDEX);
17371745
return ret;
17381746
}
17391747

17401748
regs = devm_ioremap_resource(gbe_dev->dev, &res);
17411749
if (IS_ERR(regs)) {
1742-
dev_err(gbe_dev->dev, "Failed to map xgbe register base\n");
1750+
dev_err(gbe_dev->dev, "Failed to map xgbe ss register base\n");
17431751
return PTR_ERR(regs);
17441752
}
17451753
gbe_dev->ss_regs = regs;
17461754

1755+
ret = of_address_to_resource(node, XGBE_SM_REG_INDEX, &res);
1756+
if (ret) {
1757+
dev_err(gbe_dev->dev,
1758+
"Can't xlate xgbe of node(%s) sm address at %d\n",
1759+
node->name, XGBE_SM_REG_INDEX);
1760+
return ret;
1761+
}
1762+
1763+
regs = devm_ioremap_resource(gbe_dev->dev, &res);
1764+
if (IS_ERR(regs)) {
1765+
dev_err(gbe_dev->dev, "Failed to map xgbe sm register base\n");
1766+
return PTR_ERR(regs);
1767+
}
1768+
gbe_dev->switch_regs = regs;
1769+
17471770
ret = of_address_to_resource(node, XGBE_SERDES_REG_INDEX, &res);
17481771
if (ret) {
1749-
dev_err(gbe_dev->dev, "Can't translate of node(%s) address for xgbe serdes regs\n",
1750-
node->name);
1772+
dev_err(gbe_dev->dev,
1773+
"Can't xlate xgbe serdes of node(%s) address at %d\n",
1774+
node->name, XGBE_SERDES_REG_INDEX);
17511775
return ret;
17521776
}
17531777

@@ -1770,11 +1794,10 @@ static int set_xgbe_ethss10_priv(struct gbe_priv *gbe_dev,
17701794
gbe_dev->ss_version = XGBE_SS_VERSION_10;
17711795
gbe_dev->sgmii_port_regs = gbe_dev->ss_regs +
17721796
XGBE10_SGMII_MODULE_OFFSET;
1773-
gbe_dev->switch_regs = gbe_dev->ss_regs + XGBE10_SWITCH_MODULE_OFFSET;
17741797
gbe_dev->host_port_regs = gbe_dev->ss_regs + XGBE10_HOST_PORT_OFFSET;
17751798

17761799
for (i = 0; i < XGBE10_NUM_HW_STATS_MOD; i++)
1777-
gbe_dev->hw_stats_regs[i] = gbe_dev->ss_regs +
1800+
gbe_dev->hw_stats_regs[i] = gbe_dev->switch_regs +
17781801
XGBE10_HW_STATS_OFFSET + (GBE_HW_STATS_REG_MAP_SZ * i);
17791802

17801803
gbe_dev->ale_reg = gbe_dev->ss_regs + XGBE10_ALE_OFFSET;
@@ -1809,10 +1832,11 @@ static int get_gbe_resource_version(struct gbe_priv *gbe_dev,
18091832
void __iomem *regs;
18101833
int ret;
18111834

1812-
ret = of_address_to_resource(node, 0, &res);
1835+
ret = of_address_to_resource(node, GBE_SS_REG_INDEX, &res);
18131836
if (ret) {
1814-
dev_err(gbe_dev->dev, "Can't translate of node(%s) address\n",
1815-
node->name);
1837+
dev_err(gbe_dev->dev,
1838+
"Can't translate of node(%s) of gbe ss address at %d\n",
1839+
node->name, GBE_SS_REG_INDEX);
18161840
return ret;
18171841
}
18181842

@@ -1829,8 +1853,41 @@ static int get_gbe_resource_version(struct gbe_priv *gbe_dev,
18291853
static int set_gbe_ethss14_priv(struct gbe_priv *gbe_dev,
18301854
struct device_node *node)
18311855
{
1856+
struct resource res;
18321857
void __iomem *regs;
1833-
int i;
1858+
int i, ret;
1859+
1860+
ret = of_address_to_resource(node, GBE_SGMII34_REG_INDEX, &res);
1861+
if (ret) {
1862+
dev_err(gbe_dev->dev,
1863+
"Can't translate of gbe node(%s) address at index %d\n",
1864+
node->name, GBE_SGMII34_REG_INDEX);
1865+
return ret;
1866+
}
1867+
1868+
regs = devm_ioremap_resource(gbe_dev->dev, &res);
1869+
if (IS_ERR(regs)) {
1870+
dev_err(gbe_dev->dev,
1871+
"Failed to map gbe sgmii port34 register base\n");
1872+
return PTR_ERR(regs);
1873+
}
1874+
gbe_dev->sgmii_port34_regs = regs;
1875+
1876+
ret = of_address_to_resource(node, GBE_SM_REG_INDEX, &res);
1877+
if (ret) {
1878+
dev_err(gbe_dev->dev,
1879+
"Can't translate of gbe node(%s) address at index %d\n",
1880+
node->name, GBE_SM_REG_INDEX);
1881+
return ret;
1882+
}
1883+
1884+
regs = devm_ioremap_resource(gbe_dev->dev, &res);
1885+
if (IS_ERR(regs)) {
1886+
dev_err(gbe_dev->dev,
1887+
"Failed to map gbe switch module register base\n");
1888+
return PTR_ERR(regs);
1889+
}
1890+
gbe_dev->switch_regs = regs;
18341891

18351892
gbe_dev->hw_stats = devm_kzalloc(gbe_dev->dev,
18361893
GBE13_NUM_HW_STAT_ENTRIES *
@@ -1841,17 +1898,16 @@ static int set_gbe_ethss14_priv(struct gbe_priv *gbe_dev,
18411898
return -ENOMEM;
18421899
}
18431900

1844-
regs = gbe_dev->ss_regs;
1845-
gbe_dev->sgmii_port_regs = regs + GBE13_SGMII_MODULE_OFFSET;
1846-
gbe_dev->sgmii_port34_regs = regs + GBE13_SGMII34_MODULE_OFFSET;
1847-
gbe_dev->switch_regs = regs + GBE13_SWITCH_MODULE_OFFSET;
1848-
gbe_dev->host_port_regs = regs + GBE13_HOST_PORT_OFFSET;
1901+
gbe_dev->sgmii_port_regs = gbe_dev->ss_regs + GBE13_SGMII_MODULE_OFFSET;
1902+
gbe_dev->host_port_regs = gbe_dev->switch_regs + GBE13_HOST_PORT_OFFSET;
18491903

1850-
for (i = 0; i < GBE13_NUM_HW_STATS_MOD; i++)
1851-
gbe_dev->hw_stats_regs[i] = regs + GBE13_HW_STATS_OFFSET +
1852-
(GBE_HW_STATS_REG_MAP_SZ * i);
1904+
for (i = 0; i < GBE13_NUM_HW_STATS_MOD; i++) {
1905+
gbe_dev->hw_stats_regs[i] =
1906+
gbe_dev->switch_regs + GBE13_HW_STATS_OFFSET +
1907+
(GBE_HW_STATS_REG_MAP_SZ * i);
1908+
}
18531909

1854-
gbe_dev->ale_reg = regs + GBE13_ALE_OFFSET;
1910+
gbe_dev->ale_reg = gbe_dev->switch_regs + GBE13_ALE_OFFSET;
18551911
gbe_dev->ale_ports = GBE13_NUM_ALE_PORTS;
18561912
gbe_dev->host_port = GBE13_HOST_PORT_NUM;
18571913
gbe_dev->ale_entries = GBE13_NUM_ALE_ENTRIES;

0 commit comments

Comments
 (0)