kernel: refresh patches
[openwrt/openwrt.git] / target / linux / octeon / patches-3.14 / 0010-MIPS-octeon-Add-interface-mode-detection-for-Octeon-.patch
1 From d8ce75934b888df0bd73dfd9c030a2b034a04977 Mon Sep 17 00:00:00 2001
2 From: Alex Smith <alex.smith@imgtec.com>
3 Date: Thu, 29 May 2014 11:10:01 +0100
4 Subject: [PATCH] MIPS: octeon: Add interface mode detection for Octeon II
5
6 Add interface mode detection for Octeon II. This is necessary to detect
7 the interface modes correctly on the UBNT E200 board. Code is taken
8 from the UBNT GPL source release, with some alterations: SRIO, ILK and
9 RXAUI interface modes are removed and instead return disabled as these
10 modes are not currently supported.
11
12 Signed-off-by: Alex Smith <alex.smith@imgtec.com>
13 Tested-by: David Daney <david.daney@cavium.com>
14 Cc: linux-mips@linux-mips.org
15 Patchwork: https://patchwork.linux-mips.org/patch/7039/
16 Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
17 ---
18 arch/mips/cavium-octeon/executive/cvmx-helper.c | 166 ++++++++++++++++++++++++
19 1 file changed, 166 insertions(+)
20
21 --- a/arch/mips/cavium-octeon/executive/cvmx-helper.c
22 +++ b/arch/mips/cavium-octeon/executive/cvmx-helper.c
23 @@ -106,6 +106,158 @@ int cvmx_helper_ports_on_interface(int i
24 EXPORT_SYMBOL_GPL(cvmx_helper_ports_on_interface);
25
26 /**
27 + * @INTERNAL
28 + * Return interface mode for CN68xx.
29 + */
30 +static cvmx_helper_interface_mode_t __cvmx_get_mode_cn68xx(int interface)
31 +{
32 + union cvmx_mio_qlmx_cfg qlm_cfg;
33 + switch (interface) {
34 + case 0:
35 + qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(0));
36 + /* QLM is disabled when QLM SPD is 15. */
37 + if (qlm_cfg.s.qlm_spd == 15)
38 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
39 +
40 + if (qlm_cfg.s.qlm_cfg == 2)
41 + return CVMX_HELPER_INTERFACE_MODE_SGMII;
42 + else if (qlm_cfg.s.qlm_cfg == 3)
43 + return CVMX_HELPER_INTERFACE_MODE_XAUI;
44 + else
45 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
46 + case 2:
47 + case 3:
48 + case 4:
49 + qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(interface));
50 + /* QLM is disabled when QLM SPD is 15. */
51 + if (qlm_cfg.s.qlm_spd == 15)
52 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
53 +
54 + if (qlm_cfg.s.qlm_cfg == 2)
55 + return CVMX_HELPER_INTERFACE_MODE_SGMII;
56 + else if (qlm_cfg.s.qlm_cfg == 3)
57 + return CVMX_HELPER_INTERFACE_MODE_XAUI;
58 + else
59 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
60 + case 7:
61 + qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(3));
62 + /* QLM is disabled when QLM SPD is 15. */
63 + if (qlm_cfg.s.qlm_spd == 15) {
64 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
65 + } else if (qlm_cfg.s.qlm_cfg != 0) {
66 + qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(1));
67 + if (qlm_cfg.s.qlm_cfg != 0)
68 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
69 + }
70 + return CVMX_HELPER_INTERFACE_MODE_NPI;
71 + case 8:
72 + return CVMX_HELPER_INTERFACE_MODE_LOOP;
73 + default:
74 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
75 + }
76 +}
77 +
78 +/**
79 + * @INTERNAL
80 + * Return interface mode for an Octeon II
81 + */
82 +static cvmx_helper_interface_mode_t __cvmx_get_mode_octeon2(int interface)
83 +{
84 + union cvmx_gmxx_inf_mode mode;
85 +
86 + if (OCTEON_IS_MODEL(OCTEON_CN68XX))
87 + return __cvmx_get_mode_cn68xx(interface);
88 +
89 + if (interface == 2)
90 + return CVMX_HELPER_INTERFACE_MODE_NPI;
91 +
92 + if (interface == 3)
93 + return CVMX_HELPER_INTERFACE_MODE_LOOP;
94 +
95 + /* Only present in CN63XX & CN66XX Octeon model */
96 + if ((OCTEON_IS_MODEL(OCTEON_CN63XX) &&
97 + (interface == 4 || interface == 5)) ||
98 + (OCTEON_IS_MODEL(OCTEON_CN66XX) &&
99 + interface >= 4 && interface <= 7)) {
100 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
101 + }
102 +
103 + if (OCTEON_IS_MODEL(OCTEON_CN66XX)) {
104 + union cvmx_mio_qlmx_cfg mio_qlm_cfg;
105 +
106 + /* QLM2 is SGMII0 and QLM1 is SGMII1 */
107 + if (interface == 0)
108 + mio_qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(2));
109 + else if (interface == 1)
110 + mio_qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(1));
111 + else
112 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
113 +
114 + if (mio_qlm_cfg.s.qlm_spd == 15)
115 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
116 +
117 + if (mio_qlm_cfg.s.qlm_cfg == 9)
118 + return CVMX_HELPER_INTERFACE_MODE_SGMII;
119 + else if (mio_qlm_cfg.s.qlm_cfg == 11)
120 + return CVMX_HELPER_INTERFACE_MODE_XAUI;
121 + else
122 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
123 + } else if (OCTEON_IS_MODEL(OCTEON_CN61XX)) {
124 + union cvmx_mio_qlmx_cfg qlm_cfg;
125 +
126 + if (interface == 0) {
127 + qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(2));
128 + if (qlm_cfg.s.qlm_cfg == 2)
129 + return CVMX_HELPER_INTERFACE_MODE_SGMII;
130 + else if (qlm_cfg.s.qlm_cfg == 3)
131 + return CVMX_HELPER_INTERFACE_MODE_XAUI;
132 + else
133 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
134 + } else if (interface == 1) {
135 + qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(0));
136 + if (qlm_cfg.s.qlm_cfg == 2)
137 + return CVMX_HELPER_INTERFACE_MODE_SGMII;
138 + else if (qlm_cfg.s.qlm_cfg == 3)
139 + return CVMX_HELPER_INTERFACE_MODE_XAUI;
140 + else
141 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
142 + }
143 + } else if (OCTEON_IS_MODEL(OCTEON_CNF71XX)) {
144 + if (interface == 0) {
145 + union cvmx_mio_qlmx_cfg qlm_cfg;
146 + qlm_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(0));
147 + if (qlm_cfg.s.qlm_cfg == 2)
148 + return CVMX_HELPER_INTERFACE_MODE_SGMII;
149 + }
150 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
151 + }
152 +
153 + if (interface == 1 && OCTEON_IS_MODEL(OCTEON_CN63XX))
154 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
155 +
156 + mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
157 +
158 + if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
159 + switch (mode.cn63xx.mode) {
160 + case 0:
161 + return CVMX_HELPER_INTERFACE_MODE_SGMII;
162 + case 1:
163 + return CVMX_HELPER_INTERFACE_MODE_XAUI;
164 + default:
165 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
166 + }
167 + } else {
168 + if (!mode.s.en)
169 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
170 +
171 + if (mode.s.type)
172 + return CVMX_HELPER_INTERFACE_MODE_GMII;
173 + else
174 + return CVMX_HELPER_INTERFACE_MODE_RGMII;
175 + }
176 +}
177 +
178 +/**
179 * Get the operating mode of an interface. Depending on the Octeon
180 * chip and configuration, this function returns an enumeration
181 * of the type of packet I/O supported by an interface.
182 @@ -118,6 +270,20 @@ EXPORT_SYMBOL_GPL(cvmx_helper_ports_on_i
183 cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int interface)
184 {
185 union cvmx_gmxx_inf_mode mode;
186 +
187 + if (interface < 0 ||
188 + interface >= cvmx_helper_get_number_of_interfaces())
189 + return CVMX_HELPER_INTERFACE_MODE_DISABLED;
190 +
191 + /*
192 + * Octeon II models
193 + */
194 + if (OCTEON_IS_MODEL(OCTEON_CN6XXX) || OCTEON_IS_MODEL(OCTEON_CNF71XX))
195 + return __cvmx_get_mode_octeon2(interface);
196 +
197 + /*
198 + * Octeon and Octeon Plus models
199 + */
200 if (interface == 2)
201 return CVMX_HELPER_INTERFACE_MODE_NPI;
202