aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaricheri, Muralidharan <m-karicheri2@ti.com>2015-03-20 16:11:22 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-20 22:03:09 -0400
commit21e0e0ddda5be2905ca163cab2da5bb1880a790c (patch)
tree01dd5b75b9b674082a56b74d840f551c9cd16687
parente170f409924235478317bd6f2062d3a0c874ff9a (diff)
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>
-rw-r--r--Documentation/devicetree/bindings/net/keystone-netcp.txt16
-rw-r--r--drivers/net/ethernet/ti/netcp_ethss.c130
2 files changed, 102 insertions, 44 deletions
diff --git a/Documentation/devicetree/bindings/net/keystone-netcp.txt b/Documentation/devicetree/bindings/net/keystone-netcp.txt
index f9c07710478d..8368abdd5a34 100644
--- a/Documentation/devicetree/bindings/net/keystone-netcp.txt
+++ b/Documentation/devicetree/bindings/net/keystone-netcp.txt
@@ -49,6 +49,7 @@ Required properties:
49- compatible: Should be "ti,netcp-1.0" 49- compatible: Should be "ti,netcp-1.0"
50- clocks: phandle to the reference clocks for the subsystem. 50- clocks: phandle to the reference clocks for the subsystem.
51- dma-id: Navigator packet dma instance id. 51- dma-id: Navigator packet dma instance id.
52- ranges: address range of NetCP (includes, Ethernet SS, PA and SA)
52 53
53Optional properties: 54Optional properties:
54- reg: register location and the size for the following register 55- reg: register location and the size for the following register
@@ -66,8 +67,10 @@ Required properties:
66- label: Must be "netcp-gbe" for 1Gb & "netcp-xgbe" for 10Gb. 67- label: Must be "netcp-gbe" for 1Gb & "netcp-xgbe" for 10Gb.
67- reg: register location and the size for the following register 68- reg: register location and the size for the following register
68 regions in the specified order. 69 regions in the specified order.
69 - subsystem registers 70 - switch subsystem registers
70 - serdes registers 71 - sgmii port3/4 module registers (only for NetCP 1.4)
72 - switch module registers
73 - serdes registers (only for 10G)
71- tx-channel: the navigator packet dma channel name for tx. 74- tx-channel: the navigator packet dma channel name for tx.
72- tx-queue: the navigator queue number associated with the tx dma channel. 75- tx-queue: the navigator queue number associated with the tx dma channel.
73- interfaces: specification for each of the switch port to be registered as a 76- interfaces: specification for each of the switch port to be registered as a
@@ -120,14 +123,13 @@ Optional properties:
120 123
121Example binding: 124Example binding:
122 125
123netcp: netcp@2090000 { 126netcp: netcp@2000000 {
124 reg = <0x2620110 0x8>; 127 reg = <0x2620110 0x8>;
125 reg-names = "efuse"; 128 reg-names = "efuse";
126 compatible = "ti,netcp-1.0"; 129 compatible = "ti,netcp-1.0";
127 #address-cells = <1>; 130 #address-cells = <1>;
128 #size-cells = <1>; 131 #size-cells = <1>;
129 ranges; 132 ranges = <0 0x2000000 0xfffff>;
130
131 clocks = <&papllclk>, <&clkcpgmac>, <&chipclk12>; 133 clocks = <&papllclk>, <&clkcpgmac>, <&chipclk12>;
132 dma-coherent; 134 dma-coherent;
133 /* big-endian; */ 135 /* big-endian; */
@@ -137,9 +139,9 @@ netcp: netcp@2090000 {
137 #address-cells = <1>; 139 #address-cells = <1>;
138 #size-cells = <1>; 140 #size-cells = <1>;
139 ranges; 141 ranges;
140 gbe@0x2090000 { 142 gbe@90000 {
141 label = "netcp-gbe"; 143 label = "netcp-gbe";
142 reg = <0x2090000 0xf00>; 144 reg = <0x90000 0x300>, <0x90400 0x400>, <0x90800 0x700>;
143 /* enable-ale; */ 145 /* enable-ale; */
144 tx-queue = <648>; 146 tx-queue = <648>;
145 tx-channel = <8>; 147 tx-channel = <8>;
diff --git a/drivers/net/ethernet/ti/netcp_ethss.c b/drivers/net/ethernet/ti/netcp_ethss.c
index 2be90a57b595..42592b8fc344 100644
--- a/drivers/net/ethernet/ti/netcp_ethss.c
+++ b/drivers/net/ethernet/ti/netcp_ethss.c
@@ -40,15 +40,18 @@
40#define GBE_MODULE_NAME "netcp-gbe" 40#define GBE_MODULE_NAME "netcp-gbe"
41#define GBE_SS_VERSION_14 0x4ed21104 41#define GBE_SS_VERSION_14 0x4ed21104
42 42
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 */
43#define GBE13_SGMII_MODULE_OFFSET 0x100 47#define GBE13_SGMII_MODULE_OFFSET 0x100
44#define GBE13_SGMII34_MODULE_OFFSET 0x400 48/* offset relative to base of GBE_SM_REG_INDEX */
45#define GBE13_SWITCH_MODULE_OFFSET 0x800 49#define GBE13_HOST_PORT_OFFSET 0x34
46#define GBE13_HOST_PORT_OFFSET 0x834 50#define GBE13_SLAVE_PORT_OFFSET 0x60
47#define GBE13_SLAVE_PORT_OFFSET 0x860 51#define GBE13_EMAC_OFFSET 0x100
48#define GBE13_EMAC_OFFSET 0x900 52#define GBE13_SLAVE_PORT2_OFFSET 0x200
49#define GBE13_SLAVE_PORT2_OFFSET 0xa00 53#define GBE13_HW_STATS_OFFSET 0x300
50#define GBE13_HW_STATS_OFFSET 0xb00 54#define GBE13_ALE_OFFSET 0x600
51#define GBE13_ALE_OFFSET 0xe00
52#define GBE13_HOST_PORT_NUM 0 55#define GBE13_HOST_PORT_NUM 0
53#define GBE13_NUM_SLAVES 4 56#define GBE13_NUM_SLAVES 4
54#define GBE13_NUM_ALE_PORTS (GBE13_NUM_SLAVES + 1) 57#define GBE13_NUM_ALE_PORTS (GBE13_NUM_SLAVES + 1)
@@ -58,14 +61,18 @@
58#define XGBE_MODULE_NAME "netcp-xgbe" 61#define XGBE_MODULE_NAME "netcp-xgbe"
59#define XGBE_SS_VERSION_10 0x4ee42100 62#define XGBE_SS_VERSION_10 0x4ee42100
60 63
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 */
62#define XGBE10_SGMII_MODULE_OFFSET 0x100 69#define XGBE10_SGMII_MODULE_OFFSET 0x100
63#define XGBE10_SWITCH_MODULE_OFFSET 0x1000 70/* offset relative to base of XGBE_SM_REG_INDEX */
64#define XGBE10_HOST_PORT_OFFSET 0x1034 71#define XGBE10_HOST_PORT_OFFSET 0x34
65#define XGBE10_SLAVE_PORT_OFFSET 0x1064 72#define XGBE10_SLAVE_PORT_OFFSET 0x64
66#define XGBE10_EMAC_OFFSET 0x1400 73#define XGBE10_EMAC_OFFSET 0x400
67#define XGBE10_ALE_OFFSET 0x1700 74#define XGBE10_ALE_OFFSET 0x700
68#define XGBE10_HW_STATS_OFFSET 0x1800 75#define XGBE10_HW_STATS_OFFSET 0x800
69#define XGBE10_HOST_PORT_NUM 0 76#define XGBE10_HOST_PORT_NUM 0
70#define XGBE10_NUM_SLAVES 2 77#define XGBE10_NUM_SLAVES 2
71#define XGBE10_NUM_ALE_PORTS (XGBE10_NUM_SLAVES + 1) 78#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,
1579 else if (gbe_dev->ss_version == XGBE_SS_VERSION_10) 1586 else if (gbe_dev->ss_version == XGBE_SS_VERSION_10)
1580 emac_reg_ofs = XGBE10_EMAC_OFFSET; 1587 emac_reg_ofs = XGBE10_EMAC_OFFSET;
1581 1588
1582 slave->port_regs = gbe_dev->ss_regs + port_reg_ofs + 1589 slave->port_regs = gbe_dev->switch_regs + port_reg_ofs +
1583 (0x30 * port_reg_num); 1590 (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 +
1585 (0x40 * slave->slave_num); 1592 (0x40 * slave->slave_num);
1586 1593
1587 if (gbe_dev->ss_version == GBE_SS_VERSION_14) { 1594 if (gbe_dev->ss_version == GBE_SS_VERSION_14) {
@@ -1732,22 +1739,39 @@ static int set_xgbe_ethss10_priv(struct gbe_priv *gbe_dev,
1732 1739
1733 ret = of_address_to_resource(node, 0, &res); 1740 ret = of_address_to_resource(node, 0, &res);
1734 if (ret) { 1741 if (ret) {
1735 dev_err(gbe_dev->dev, "Can't translate of node(%s) address for xgbe subsystem regs\n", 1742 dev_err(gbe_dev->dev,
1736 node->name); 1743 "Can't xlate xgbe of node(%s) ss address at %d\n",
1744 node->name, XGBE_SS_REG_INDEX);
1737 return ret; 1745 return ret;
1738 } 1746 }
1739 1747
1740 regs = devm_ioremap_resource(gbe_dev->dev, &res); 1748 regs = devm_ioremap_resource(gbe_dev->dev, &res);
1741 if (IS_ERR(regs)) { 1749 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");
1743 return PTR_ERR(regs); 1751 return PTR_ERR(regs);
1744 } 1752 }
1745 gbe_dev->ss_regs = regs; 1753 gbe_dev->ss_regs = regs;
1746 1754
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
1747 ret = of_address_to_resource(node, XGBE_SERDES_REG_INDEX, &res); 1770 ret = of_address_to_resource(node, XGBE_SERDES_REG_INDEX, &res);
1748 if (ret) { 1771 if (ret) {
1749 dev_err(gbe_dev->dev, "Can't translate of node(%s) address for xgbe serdes regs\n", 1772 dev_err(gbe_dev->dev,
1750 node->name); 1773 "Can't xlate xgbe serdes of node(%s) address at %d\n",
1774 node->name, XGBE_SERDES_REG_INDEX);
1751 return ret; 1775 return ret;
1752 } 1776 }
1753 1777
@@ -1770,11 +1794,10 @@ static int set_xgbe_ethss10_priv(struct gbe_priv *gbe_dev,
1770 gbe_dev->ss_version = XGBE_SS_VERSION_10; 1794 gbe_dev->ss_version = XGBE_SS_VERSION_10;
1771 gbe_dev->sgmii_port_regs = gbe_dev->ss_regs + 1795 gbe_dev->sgmii_port_regs = gbe_dev->ss_regs +
1772 XGBE10_SGMII_MODULE_OFFSET; 1796 XGBE10_SGMII_MODULE_OFFSET;
1773 gbe_dev->switch_regs = gbe_dev->ss_regs + XGBE10_SWITCH_MODULE_OFFSET;
1774 gbe_dev->host_port_regs = gbe_dev->ss_regs + XGBE10_HOST_PORT_OFFSET; 1797 gbe_dev->host_port_regs = gbe_dev->ss_regs + XGBE10_HOST_PORT_OFFSET;
1775 1798
1776 for (i = 0; i < XGBE10_NUM_HW_STATS_MOD; i++) 1799 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 +
1778 XGBE10_HW_STATS_OFFSET + (GBE_HW_STATS_REG_MAP_SZ * i); 1801 XGBE10_HW_STATS_OFFSET + (GBE_HW_STATS_REG_MAP_SZ * i);
1779 1802
1780 gbe_dev->ale_reg = gbe_dev->ss_regs + XGBE10_ALE_OFFSET; 1803 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,
1809 void __iomem *regs; 1832 void __iomem *regs;
1810 int ret; 1833 int ret;
1811 1834
1812 ret = of_address_to_resource(node, 0, &res); 1835 ret = of_address_to_resource(node, GBE_SS_REG_INDEX, &res);
1813 if (ret) { 1836 if (ret) {
1814 dev_err(gbe_dev->dev, "Can't translate of node(%s) address\n", 1837 dev_err(gbe_dev->dev,
1815 node->name); 1838 "Can't translate of node(%s) of gbe ss address at %d\n",
1839 node->name, GBE_SS_REG_INDEX);
1816 return ret; 1840 return ret;
1817 } 1841 }
1818 1842
@@ -1829,8 +1853,41 @@ static int get_gbe_resource_version(struct gbe_priv *gbe_dev,
1829static int set_gbe_ethss14_priv(struct gbe_priv *gbe_dev, 1853static int set_gbe_ethss14_priv(struct gbe_priv *gbe_dev,
1830 struct device_node *node) 1854 struct device_node *node)
1831{ 1855{
1856 struct resource res;
1832 void __iomem *regs; 1857 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;
1834 1891
1835 gbe_dev->hw_stats = devm_kzalloc(gbe_dev->dev, 1892 gbe_dev->hw_stats = devm_kzalloc(gbe_dev->dev,
1836 GBE13_NUM_HW_STAT_ENTRIES * 1893 GBE13_NUM_HW_STAT_ENTRIES *
@@ -1841,17 +1898,16 @@ static int set_gbe_ethss14_priv(struct gbe_priv *gbe_dev,
1841 return -ENOMEM; 1898 return -ENOMEM;
1842 } 1899 }
1843 1900
1844 regs = gbe_dev->ss_regs; 1901 gbe_dev->sgmii_port_regs = gbe_dev->ss_regs + GBE13_SGMII_MODULE_OFFSET;
1845 gbe_dev->sgmii_port_regs = regs + GBE13_SGMII_MODULE_OFFSET; 1902 gbe_dev->host_port_regs = gbe_dev->switch_regs + GBE13_HOST_PORT_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;
1849 1903
1850 for (i = 0; i < GBE13_NUM_HW_STATS_MOD; i++) 1904 for (i = 0; i < GBE13_NUM_HW_STATS_MOD; i++) {
1851 gbe_dev->hw_stats_regs[i] = regs + GBE13_HW_STATS_OFFSET + 1905 gbe_dev->hw_stats_regs[i] =
1852 (GBE_HW_STATS_REG_MAP_SZ * i); 1906 gbe_dev->switch_regs + GBE13_HW_STATS_OFFSET +
1907 (GBE_HW_STATS_REG_MAP_SZ * i);
1908 }
1853 1909
1854 gbe_dev->ale_reg = regs + GBE13_ALE_OFFSET; 1910 gbe_dev->ale_reg = gbe_dev->switch_regs + GBE13_ALE_OFFSET;
1855 gbe_dev->ale_ports = GBE13_NUM_ALE_PORTS; 1911 gbe_dev->ale_ports = GBE13_NUM_ALE_PORTS;
1856 gbe_dev->host_port = GBE13_HOST_PORT_NUM; 1912 gbe_dev->host_port = GBE13_HOST_PORT_NUM;
1857 gbe_dev->ale_entries = GBE13_NUM_ALE_ENTRIES; 1913 gbe_dev->ale_entries = GBE13_NUM_ALE_ENTRIES;