1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#include <asm/cpu-info.h>
36#include <linux/irq.h>
37#include <linux/interrupt.h>
38
39#include <asm/cpu.h>
40#include <asm/mipsregs.h>
41#include <asm/netlogic/xlr/fmn.h>
42#include <asm/netlogic/xlr/xlr.h>
43#include <asm/netlogic/common.h>
44#include <asm/netlogic/haldefs.h>
45
46struct xlr_board_fmn_config xlr_board_fmn_config;
47
48static void __maybe_unused print_credit_config(struct xlr_fmn_info *fmn_info)
49{
50 int bkt;
51
52 pr_info("Bucket size :\n");
53 pr_info("Station\t: Size\n");
54 for (bkt = 0; bkt < 16; bkt++)
55 pr_info(" %d %d %d %d %d %d %d %d\n",
56 xlr_board_fmn_config.bucket_size[(bkt * 8) + 0],
57 xlr_board_fmn_config.bucket_size[(bkt * 8) + 1],
58 xlr_board_fmn_config.bucket_size[(bkt * 8) + 2],
59 xlr_board_fmn_config.bucket_size[(bkt * 8) + 3],
60 xlr_board_fmn_config.bucket_size[(bkt * 8) + 4],
61 xlr_board_fmn_config.bucket_size[(bkt * 8) + 5],
62 xlr_board_fmn_config.bucket_size[(bkt * 8) + 6],
63 xlr_board_fmn_config.bucket_size[(bkt * 8) + 7]);
64 pr_info("\n");
65
66 pr_info("Credits distribution :\n");
67 pr_info("Station\t: Size\n");
68 for (bkt = 0; bkt < 16; bkt++)
69 pr_info(" %d %d %d %d %d %d %d %d\n",
70 fmn_info->credit_config[(bkt * 8) + 0],
71 fmn_info->credit_config[(bkt * 8) + 1],
72 fmn_info->credit_config[(bkt * 8) + 2],
73 fmn_info->credit_config[(bkt * 8) + 3],
74 fmn_info->credit_config[(bkt * 8) + 4],
75 fmn_info->credit_config[(bkt * 8) + 5],
76 fmn_info->credit_config[(bkt * 8) + 6],
77 fmn_info->credit_config[(bkt * 8) + 7]);
78 pr_info("\n");
79}
80
81static void check_credit_distribution(void)
82{
83 struct xlr_board_fmn_config *cfg = &xlr_board_fmn_config;
84 int bkt, n, total_credits, ncores;
85
86 ncores = hweight32(nlm_current_node()->coremask);
87 for (bkt = 0; bkt < 128; bkt++) {
88 total_credits = 0;
89 for (n = 0; n < ncores; n++)
90 total_credits += cfg->cpu[n].credit_config[bkt];
91 total_credits += cfg->gmac[0].credit_config[bkt];
92 total_credits += cfg->gmac[1].credit_config[bkt];
93 total_credits += cfg->dma.credit_config[bkt];
94 total_credits += cfg->cmp.credit_config[bkt];
95 total_credits += cfg->sae.credit_config[bkt];
96 total_credits += cfg->xgmac[0].credit_config[bkt];
97 total_credits += cfg->xgmac[1].credit_config[bkt];
98 if (total_credits > cfg->bucket_size[bkt])
99 pr_err("ERROR: Bucket %d: credits (%d) > size (%d)\n",
100 bkt, total_credits, cfg->bucket_size[bkt]);
101 }
102 pr_info("Credit distribution complete.\n");
103}
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120static void setup_fmn_cc(struct xlr_fmn_info *dev_info, int start_stn_id,
121 int end_stn_id, int num_buckets, int cpu_credits, int size)
122{
123 int i, j, num_core, n, credits_per_cpu;
124 struct xlr_fmn_info *cpu = xlr_board_fmn_config.cpu;
125
126 num_core = hweight32(nlm_current_node()->coremask);
127 dev_info->num_buckets = num_buckets;
128 dev_info->start_stn_id = start_stn_id;
129 dev_info->end_stn_id = end_stn_id;
130
131 n = num_core;
132 if (num_core == 3)
133 n = 4;
134
135 for (i = start_stn_id; i <= end_stn_id; i++) {
136 xlr_board_fmn_config.bucket_size[i] = size;
137
138
139 credits_per_cpu = size / n;
140 for (j = 0; j < num_core; j++)
141 cpu[j].credit_config[i] = credits_per_cpu;
142
143
144 credits_per_cpu = size - (credits_per_cpu * num_core);
145
146
147 for (j = 0; (j < num_core) && (credits_per_cpu >= 4); j++) {
148 cpu[j].credit_config[i] += 4;
149 credits_per_cpu -= 4;
150 }
151 }
152
153
154 for (i = 0; i < num_core; i++) {
155 for (j = 0; j < FMN_CORE_NBUCKETS; j++)
156 dev_info->credit_config[(i * 8) + j] = cpu_credits;
157 }
158}
159
160
161
162
163
164static void setup_cpu_fmninfo(struct xlr_fmn_info *cpu, int num_core)
165{
166 int i, j;
167
168 for (i = 0; i < num_core; i++) {
169 cpu[i].start_stn_id = (8 * i);
170 cpu[i].end_stn_id = (8 * i + 8);
171
172 for (j = cpu[i].start_stn_id; j < cpu[i].end_stn_id; j++)
173 xlr_board_fmn_config.bucket_size[j] = 32;
174 }
175}
176
177
178
179
180
181
182
183void xlr_board_info_setup(void)
184{
185 struct xlr_fmn_info *cpu = xlr_board_fmn_config.cpu;
186 struct xlr_fmn_info *gmac = xlr_board_fmn_config.gmac;
187 struct xlr_fmn_info *xgmac = xlr_board_fmn_config.xgmac;
188 struct xlr_fmn_info *dma = &xlr_board_fmn_config.dma;
189 struct xlr_fmn_info *cmp = &xlr_board_fmn_config.cmp;
190 struct xlr_fmn_info *sae = &xlr_board_fmn_config.sae;
191 int processor_id, num_core;
192
193 num_core = hweight32(nlm_current_node()->coremask);
194 processor_id = read_c0_prid() & PRID_IMP_MASK;
195
196 setup_cpu_fmninfo(cpu, num_core);
197 switch (processor_id) {
198 case PRID_IMP_NETLOGIC_XLS104:
199 case PRID_IMP_NETLOGIC_XLS108:
200 setup_fmn_cc(&gmac[0], FMN_STNID_GMAC0,
201 FMN_STNID_GMAC0_TX3, 8, 16, 32);
202 setup_fmn_cc(dma, FMN_STNID_DMA_0,
203 FMN_STNID_DMA_3, 4, 8, 64);
204 setup_fmn_cc(sae, FMN_STNID_SEC0,
205 FMN_STNID_SEC1, 2, 8, 128);
206 break;
207
208 case PRID_IMP_NETLOGIC_XLS204:
209 case PRID_IMP_NETLOGIC_XLS208:
210 setup_fmn_cc(&gmac[0], FMN_STNID_GMAC0,
211 FMN_STNID_GMAC0_TX3, 8, 16, 32);
212 setup_fmn_cc(dma, FMN_STNID_DMA_0,
213 FMN_STNID_DMA_3, 4, 8, 64);
214 setup_fmn_cc(sae, FMN_STNID_SEC0,
215 FMN_STNID_SEC1, 2, 8, 128);
216 break;
217
218 case PRID_IMP_NETLOGIC_XLS404:
219 case PRID_IMP_NETLOGIC_XLS408:
220 case PRID_IMP_NETLOGIC_XLS404B:
221 case PRID_IMP_NETLOGIC_XLS408B:
222 case PRID_IMP_NETLOGIC_XLS416B:
223 case PRID_IMP_NETLOGIC_XLS608B:
224 case PRID_IMP_NETLOGIC_XLS616B:
225 setup_fmn_cc(&gmac[0], FMN_STNID_GMAC0,
226 FMN_STNID_GMAC0_TX3, 8, 8, 32);
227 setup_fmn_cc(&gmac[1], FMN_STNID_GMAC1_FR_0,
228 FMN_STNID_GMAC1_TX3, 8, 8, 32);
229 setup_fmn_cc(dma, FMN_STNID_DMA_0,
230 FMN_STNID_DMA_3, 4, 4, 64);
231 setup_fmn_cc(cmp, FMN_STNID_CMP_0,
232 FMN_STNID_CMP_3, 4, 4, 64);
233 setup_fmn_cc(sae, FMN_STNID_SEC0,
234 FMN_STNID_SEC1, 2, 8, 128);
235 break;
236
237 case PRID_IMP_NETLOGIC_XLS412B:
238 setup_fmn_cc(&gmac[0], FMN_STNID_GMAC0,
239 FMN_STNID_GMAC0_TX3, 8, 8, 32);
240 setup_fmn_cc(&gmac[1], FMN_STNID_GMAC1_FR_0,
241 FMN_STNID_GMAC1_TX3, 8, 8, 32);
242 setup_fmn_cc(dma, FMN_STNID_DMA_0,
243 FMN_STNID_DMA_3, 4, 4, 64);
244 setup_fmn_cc(cmp, FMN_STNID_CMP_0,
245 FMN_STNID_CMP_3, 4, 4, 64);
246 setup_fmn_cc(sae, FMN_STNID_SEC0,
247 FMN_STNID_SEC1, 2, 8, 128);
248 break;
249
250 case PRID_IMP_NETLOGIC_XLR308:
251 case PRID_IMP_NETLOGIC_XLR308C:
252 setup_fmn_cc(&gmac[0], FMN_STNID_GMAC0,
253 FMN_STNID_GMAC0_TX3, 8, 16, 32);
254 setup_fmn_cc(dma, FMN_STNID_DMA_0,
255 FMN_STNID_DMA_3, 4, 8, 64);
256 setup_fmn_cc(sae, FMN_STNID_SEC0,
257 FMN_STNID_SEC1, 2, 4, 128);
258 break;
259
260 case PRID_IMP_NETLOGIC_XLR532:
261 case PRID_IMP_NETLOGIC_XLR532C:
262 case PRID_IMP_NETLOGIC_XLR516C:
263 case PRID_IMP_NETLOGIC_XLR508C:
264 setup_fmn_cc(&gmac[0], FMN_STNID_GMAC0,
265 FMN_STNID_GMAC0_TX3, 8, 16, 32);
266 setup_fmn_cc(dma, FMN_STNID_DMA_0,
267 FMN_STNID_DMA_3, 4, 8, 64);
268 setup_fmn_cc(sae, FMN_STNID_SEC0,
269 FMN_STNID_SEC1, 2, 4, 128);
270 break;
271
272 case PRID_IMP_NETLOGIC_XLR732:
273 case PRID_IMP_NETLOGIC_XLR716:
274 setup_fmn_cc(&xgmac[0], FMN_STNID_XMAC0_00_TX,
275 FMN_STNID_XMAC0_15_TX, 8, 0, 32);
276 setup_fmn_cc(&xgmac[1], FMN_STNID_XMAC1_00_TX,
277 FMN_STNID_XMAC1_15_TX, 8, 0, 32);
278 setup_fmn_cc(&gmac[0], FMN_STNID_GMAC0,
279 FMN_STNID_GMAC0_TX3, 8, 24, 32);
280 setup_fmn_cc(dma, FMN_STNID_DMA_0,
281 FMN_STNID_DMA_3, 4, 4, 64);
282 setup_fmn_cc(sae, FMN_STNID_SEC0,
283 FMN_STNID_SEC1, 2, 4, 128);
284 break;
285 default:
286 pr_err("Unknown CPU with processor ID [%d]\n", processor_id);
287 pr_err("Error: Cannot initialize FMN credits.\n");
288 }
289
290 check_credit_distribution();
291
292#if 0
293 print_credit_config(&cpu[0]);
294 print_credit_config(&gmac[0]);
295#endif
296}
297