kernel: remove GENERIC_NET_UTILS from platform configs
[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