xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/fman_ncsw.c (revision 3806950135d2c8633ec0764e8807eacc87cf3e10)
1 /*
2  * Copyright 2008-2012 Freescale Semiconductor Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 
34 #include <linux/math64.h>
35 #include "fsl_fman.h"
36 #include "dpaa_integration_ext.h"
37 
38 uint32_t fman_get_bmi_err_event(struct fman_bmi_regs *bmi_rg)
39 {
40 	uint32_t	event, mask, force;
41 
42 	event = ioread32be(&bmi_rg->fmbm_ievr);
43 	mask = ioread32be(&bmi_rg->fmbm_ier);
44 	event &= mask;
45 	/* clear the forced events */
46 	force = ioread32be(&bmi_rg->fmbm_ifr);
47 	if (force & event)
48 		iowrite32be(force & ~event, &bmi_rg->fmbm_ifr);
49 	/* clear the acknowledged events */
50 	iowrite32be(event, &bmi_rg->fmbm_ievr);
51 	return event;
52 }
53 
54 uint32_t fman_get_qmi_err_event(struct fman_qmi_regs *qmi_rg)
55 {
56 	uint32_t	event, mask, force;
57 
58 	event = ioread32be(&qmi_rg->fmqm_eie);
59 	mask = ioread32be(&qmi_rg->fmqm_eien);
60 	event &= mask;
61 
62 	/* clear the forced events */
63 	force = ioread32be(&qmi_rg->fmqm_eif);
64 	if (force & event)
65 		iowrite32be(force & ~event, &qmi_rg->fmqm_eif);
66 	/* clear the acknowledged events */
67 	iowrite32be(event, &qmi_rg->fmqm_eie);
68 	return event;
69 }
70 
71 uint32_t fman_get_dma_com_id(struct fman_dma_regs *dma_rg)
72 {
73 	return ioread32be(&dma_rg->fmdmtcid);
74 }
75 
76 uint64_t fman_get_dma_addr(struct fman_dma_regs *dma_rg)
77 {
78 	uint64_t addr;
79 
80 	addr = (uint64_t)ioread32be(&dma_rg->fmdmtal);
81 	addr |= ((uint64_t)(ioread32be(&dma_rg->fmdmtah)) << 32);
82 
83 	return addr;
84 }
85 
86 uint32_t fman_get_dma_err_event(struct fman_dma_regs *dma_rg)
87 {
88 	uint32_t status, mask;
89 
90 	status = ioread32be(&dma_rg->fmdmsr);
91 	mask = ioread32be(&dma_rg->fmdmmr);
92 
93 	/* clear DMA_STATUS_BUS_ERR if mask has no DMA_MODE_BER */
94 	if ((mask & DMA_MODE_BER) != DMA_MODE_BER)
95 		status &= ~DMA_STATUS_BUS_ERR;
96 
97 	/* clear relevant bits if mask has no DMA_MODE_ECC */
98 	if ((mask & DMA_MODE_ECC) != DMA_MODE_ECC)
99 		status &= ~(DMA_STATUS_FM_SPDAT_ECC |
100 		        DMA_STATUS_READ_ECC |
101 				DMA_STATUS_SYSTEM_WRITE_ECC |
102 				DMA_STATUS_FM_WRITE_ECC);
103 
104 	/* clear set events */
105 	iowrite32be(status, &dma_rg->fmdmsr);
106 
107 	return status;
108 }
109 
110 uint32_t fman_get_fpm_err_event(struct fman_fpm_regs *fpm_rg)
111 {
112 	uint32_t	event;
113 
114 	event = ioread32be(&fpm_rg->fmfp_ee);
115 	/* clear the all occurred events */
116 	iowrite32be(event, &fpm_rg->fmfp_ee);
117 	return event;
118 }
119 
120 uint32_t fman_get_muram_err_event(struct fman_fpm_regs *fpm_rg)
121 {
122 	uint32_t	event, mask;
123 
124 	event = ioread32be(&fpm_rg->fm_rcr);
125 	mask = ioread32be(&fpm_rg->fm_rie);
126 
127 	/* clear MURAM event bit (do not clear IRAM event) */
128 	iowrite32be(event & ~FPM_RAM_IRAM_ECC, &fpm_rg->fm_rcr);
129 
130 	if ((mask & FPM_MURAM_ECC_ERR_EX_EN))
131 		return event;
132 	else
133 		return 0;
134 }
135 
136 uint32_t fman_get_iram_err_event(struct fman_fpm_regs *fpm_rg)
137 {
138 	uint32_t    event, mask;
139 
140 	event = ioread32be(&fpm_rg->fm_rcr) ;
141 	mask = ioread32be(&fpm_rg->fm_rie);
142 	/* clear IRAM event bit (do not clear MURAM event) */
143 	iowrite32be(event & ~FPM_RAM_MURAM_ECC,
144 			&fpm_rg->fm_rcr);
145 
146 	if ((mask & FPM_IRAM_ECC_ERR_EX_EN))
147 		return event;
148 	else
149 		return 0;
150 }
151 
152 uint32_t fman_get_qmi_event(struct fman_qmi_regs *qmi_rg)
153 {
154 	uint32_t	event, mask, force;
155 
156 	event = ioread32be(&qmi_rg->fmqm_ie);
157 	mask = ioread32be(&qmi_rg->fmqm_ien);
158 	event &= mask;
159 	/* clear the forced events */
160 	force = ioread32be(&qmi_rg->fmqm_if);
161 	if (force & event)
162 		iowrite32be(force & ~event, &qmi_rg->fmqm_if);
163 	/* clear the acknowledged events */
164 	iowrite32be(event, &qmi_rg->fmqm_ie);
165 	return event;
166 }
167 
168 void fman_enable_time_stamp(struct fman_fpm_regs *fpm_rg,
169 				uint8_t count1ubit,
170 				uint16_t fm_clk_freq)
171 {
172 	uint32_t tmp;
173 	uint64_t frac;
174 	uint32_t intgr;
175 	uint32_t ts_freq = (uint32_t)(1 << count1ubit); /* in Mhz */
176 
177 	/* configure timestamp so that bit 8 will count 1 microsecond
178 	 * Find effective count rate at TIMESTAMP least significant bits:
179 	 * Effective_Count_Rate = 1MHz x 2^8 = 256MHz
180 	 * Find frequency ratio between effective count rate and the clock:
181 	 * Effective_Count_Rate / CLK e.g. for 600 MHz clock:
182 	 * 256/600 = 0.4266666... */
183 
184 	intgr = ts_freq / fm_clk_freq;
185 	/* we multiply by 2^16 to keep the fraction of the division
186 	 * we do not div back, since we write this value as a fraction
187 	 * see spec */
188 
189 	frac = ((uint64_t)ts_freq << 16) - ((uint64_t)intgr << 16) * fm_clk_freq;
190 	/* we check remainder of the division in order to round up if not int */
191 	if (do_div(frac, fm_clk_freq))
192 		frac++;
193 
194 	tmp = (intgr << FPM_TS_INT_SHIFT) | (uint16_t)frac;
195 	iowrite32be(tmp, &fpm_rg->fmfp_tsc2);
196 
197 	/* enable timestamp with original clock */
198 	iowrite32be(FPM_TS_CTL_EN, &fpm_rg->fmfp_tsc1);
199 }
200 
201 uint32_t fman_get_fpm_error_interrupts(struct fman_fpm_regs *fpm_rg)
202 {
203 	return ioread32be(&fpm_rg->fm_epi);
204 }
205 
206 
207 int fman_set_erratum_10gmac_a004_wa(struct fman_fpm_regs *fpm_rg)
208 {
209 	int timeout = 100;
210 
211 	iowrite32be(0x40000000, &fpm_rg->fmfp_extc);
212 
213 	while ((ioread32be(&fpm_rg->fmfp_extc) & 0x40000000) && --timeout)
214 		DELAY(10);
215 
216 	if (!timeout)
217 		return -EBUSY;
218 	return 0;
219 }
220 
221 void fman_set_ctrl_intr(struct fman_fpm_regs *fpm_rg,
222 			uint8_t event_reg_id,
223 			uint32_t enable_events)
224 {
225 	iowrite32be(enable_events, &fpm_rg->fmfp_cee[event_reg_id]);
226 }
227 
228 uint32_t fman_get_ctrl_intr(struct fman_fpm_regs *fpm_rg, uint8_t event_reg_id)
229 {
230 	return ioread32be(&fpm_rg->fmfp_cee[event_reg_id]);
231 }
232 
233 void fman_set_num_of_riscs_per_port(struct fman_fpm_regs *fpm_rg,
234 					uint8_t port_id,
235 					uint8_t num_fman_ctrls,
236 					uint32_t or_fman_ctrl)
237 {
238 	uint32_t tmp = 0;
239 
240 	tmp = (uint32_t)(port_id << FPM_PORT_FM_CTL_PORTID_SHIFT);
241 	/*TODO - maybe to put CTL# according to another criteria*/
242 	if (num_fman_ctrls == 2)
243 		tmp = FPM_PRT_FM_CTL2 | FPM_PRT_FM_CTL1;
244 	/* order restoration */
245 	tmp |= (or_fman_ctrl << FPM_PRC_ORA_FM_CTL_SEL_SHIFT) | or_fman_ctrl;
246 
247 	iowrite32be(tmp, &fpm_rg->fmfp_prc);
248 }
249 
250 void fman_set_order_restoration_per_port(struct fman_fpm_regs *fpm_rg,
251 					uint8_t port_id,
252 					bool independent_mode,
253 					bool is_rx_port)
254 {
255 	uint32_t tmp = 0;
256 
257 	tmp = (uint32_t)(port_id << FPM_PORT_FM_CTL_PORTID_SHIFT);
258 	if (independent_mode) {
259 		if (is_rx_port)
260 			tmp |= (FPM_PRT_FM_CTL1 <<
261 				FPM_PRC_ORA_FM_CTL_SEL_SHIFT) | FPM_PRT_FM_CTL1;
262 		else
263 			tmp |= (FPM_PRT_FM_CTL2 <<
264 				FPM_PRC_ORA_FM_CTL_SEL_SHIFT) | FPM_PRT_FM_CTL2;
265 	} else {
266 		tmp |= (FPM_PRT_FM_CTL2|FPM_PRT_FM_CTL1);
267 
268 		/* order restoration */
269 		if (port_id % 2)
270 			tmp |= (FPM_PRT_FM_CTL1 <<
271 					FPM_PRC_ORA_FM_CTL_SEL_SHIFT);
272 		else
273 			tmp |= (FPM_PRT_FM_CTL2 <<
274 					FPM_PRC_ORA_FM_CTL_SEL_SHIFT);
275 	}
276 	iowrite32be(tmp, &fpm_rg->fmfp_prc);
277 }
278 
279 uint8_t fman_get_qmi_deq_th(struct fman_qmi_regs *qmi_rg)
280 {
281 	return (uint8_t)ioread32be(&qmi_rg->fmqm_gc);
282 }
283 
284 uint8_t fman_get_qmi_enq_th(struct fman_qmi_regs *qmi_rg)
285 {
286 	return (uint8_t)(ioread32be(&qmi_rg->fmqm_gc) >> 8);
287 }
288 
289 void fman_set_qmi_enq_th(struct fman_qmi_regs *qmi_rg, uint8_t val)
290 {
291 	uint32_t tmp_reg;
292 
293 	tmp_reg = ioread32be(&qmi_rg->fmqm_gc);
294 	tmp_reg &= ~QMI_CFG_ENQ_MASK;
295 	tmp_reg |= ((uint32_t)val << 8);
296 	iowrite32be(tmp_reg, &qmi_rg->fmqm_gc);
297 }
298 
299 void fman_set_qmi_deq_th(struct fman_qmi_regs *qmi_rg, uint8_t val)
300 {
301 	uint32_t tmp_reg;
302 
303 	tmp_reg = ioread32be(&qmi_rg->fmqm_gc);
304 	tmp_reg &= ~QMI_CFG_DEQ_MASK;
305 	tmp_reg |= (uint32_t)val;
306 	iowrite32be(tmp_reg, &qmi_rg->fmqm_gc);
307 }
308 
309 void fman_qmi_disable_dispatch_limit(struct fman_fpm_regs *fpm_rg)
310 {
311 	iowrite32be(0, &fpm_rg->fmfp_mxd);
312 }
313 
314 void fman_set_liodn_per_port(struct fman_rg *fman_rg, uint8_t port_id,
315 				uint16_t liodn_base,
316 				uint16_t liodn_ofst)
317 {
318 	uint32_t tmp;
319 
320 	if ((port_id > 63) || (port_id < 1))
321 	        return;
322 
323 	/* set LIODN base for this port */
324 	tmp = ioread32be(&fman_rg->dma_rg->fmdmplr[port_id / 2]);
325 	if (port_id % 2) {
326 		tmp &= ~FM_LIODN_BASE_MASK;
327 		tmp |= (uint32_t)liodn_base;
328 	} else {
329 		tmp &= ~(FM_LIODN_BASE_MASK << DMA_LIODN_SHIFT);
330 		tmp |= (uint32_t)liodn_base << DMA_LIODN_SHIFT;
331 	}
332 	iowrite32be(tmp, &fman_rg->dma_rg->fmdmplr[port_id / 2]);
333 	iowrite32be((uint32_t)liodn_ofst,
334 			&fman_rg->bmi_rg->fmbm_spliodn[port_id - 1]);
335 }
336 
337 bool fman_is_port_stalled(struct fman_fpm_regs *fpm_rg, uint8_t port_id)
338 {
339 	return (bool)!!(ioread32be(&fpm_rg->fmfp_ps[port_id]) & FPM_PS_STALLED);
340 }
341 
342 void fman_resume_stalled_port(struct fman_fpm_regs *fpm_rg, uint8_t port_id)
343 {
344 	uint32_t	tmp;
345 
346 	tmp = (uint32_t)((port_id << FPM_PORT_FM_CTL_PORTID_SHIFT) |
347 				FPM_PRC_REALSE_STALLED);
348 	iowrite32be(tmp, &fpm_rg->fmfp_prc);
349 }
350 
351 int fman_reset_mac(struct fman_fpm_regs *fpm_rg, uint8_t mac_id, bool is_10g)
352 {
353 	uint32_t msk, timeout = 100;
354 
355 	/* Get the relevant bit mask */
356 	if (is_10g) {
357 		switch (mac_id) {
358 		case(0):
359 			msk = FPM_RSTC_10G0_RESET;
360 			break;
361         case(1):
362             msk = FPM_RSTC_10G1_RESET;
363             break;
364 		default:
365 			return -EINVAL;
366 		}
367 	} else {
368 		switch (mac_id) {
369 		case(0):
370 			msk = FPM_RSTC_1G0_RESET;
371 			break;
372 		case(1):
373 			msk = FPM_RSTC_1G1_RESET;
374 			break;
375 		case(2):
376 			msk = FPM_RSTC_1G2_RESET;
377 			break;
378 		case(3):
379 			msk = FPM_RSTC_1G3_RESET;
380 			break;
381 		case(4):
382 			msk = FPM_RSTC_1G4_RESET;
383 			break;
384         case (5):
385             msk = FPM_RSTC_1G5_RESET;
386             break;
387         case (6):
388             msk = FPM_RSTC_1G6_RESET;
389             break;
390         case (7):
391             msk = FPM_RSTC_1G7_RESET;
392             break;
393 		default:
394 			return -EINVAL;
395 		}
396 	}
397 	/* reset */
398 	iowrite32be(msk, &fpm_rg->fm_rstc);
399 	while ((ioread32be(&fpm_rg->fm_rstc) & msk) && --timeout)
400 		DELAY(10);
401 
402 	if (!timeout)
403 		return -EBUSY;
404 	return 0;
405 }
406 
407 uint16_t fman_get_size_of_fifo(struct fman_bmi_regs *bmi_rg, uint8_t port_id)
408 {
409 	uint32_t tmp_reg;
410 
411     if ((port_id > 63) || (port_id < 1))
412             return 0;
413 
414 	tmp_reg = ioread32be(&bmi_rg->fmbm_pfs[port_id - 1]);
415 	return (uint16_t)((tmp_reg & BMI_FIFO_SIZE_MASK) + 1);
416 }
417 
418 uint32_t fman_get_total_fifo_size(struct fman_bmi_regs *bmi_rg)
419 {
420 	uint32_t reg, res;
421 
422 	reg = ioread32be(&bmi_rg->fmbm_cfg1);
423 	res = (reg >> BMI_CFG1_FIFO_SIZE_SHIFT) & 0x3ff;
424 	return res * FMAN_BMI_FIFO_UNITS;
425 }
426 
427 uint16_t fman_get_size_of_extra_fifo(struct fman_bmi_regs *bmi_rg,
428 					uint8_t port_id)
429 {
430 	uint32_t tmp_reg;
431 
432     if ((port_id > 63) || (port_id < 1))
433             return 0;
434 
435 	tmp_reg = ioread32be(&bmi_rg->fmbm_pfs[port_id-1]);
436 	return (uint16_t)((tmp_reg & BMI_EXTRA_FIFO_SIZE_MASK) >>
437 				BMI_EXTRA_FIFO_SIZE_SHIFT);
438 }
439 
440 void fman_set_size_of_fifo(struct fman_bmi_regs *bmi_rg,
441 				uint8_t port_id,
442 				uint32_t sz_fifo,
443 				uint32_t extra_sz_fifo)
444 {
445 	uint32_t tmp;
446 
447 	if ((port_id > 63) || (port_id < 1))
448 	        return;
449 
450 	/* calculate reg */
451 	tmp = (uint32_t)((sz_fifo / FMAN_BMI_FIFO_UNITS - 1) |
452 		((extra_sz_fifo / FMAN_BMI_FIFO_UNITS) <<
453 				BMI_EXTRA_FIFO_SIZE_SHIFT));
454 	iowrite32be(tmp, &bmi_rg->fmbm_pfs[port_id - 1]);
455 }
456 
457 uint8_t fman_get_num_of_tasks(struct fman_bmi_regs *bmi_rg, uint8_t port_id)
458 {
459 	uint32_t tmp;
460 
461     if ((port_id > 63) || (port_id < 1))
462         return 0;
463 
464 	tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]);
465 	return (uint8_t)(((tmp & BMI_NUM_OF_TASKS_MASK) >>
466 				BMI_NUM_OF_TASKS_SHIFT) + 1);
467 }
468 
469 uint8_t fman_get_num_extra_tasks(struct fman_bmi_regs *bmi_rg, uint8_t port_id)
470 {
471 	uint32_t tmp;
472 
473     if ((port_id > 63) || (port_id < 1))
474         return 0;
475 
476 	tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]);
477 	return (uint8_t)((tmp & BMI_NUM_OF_EXTRA_TASKS_MASK) >>
478 				BMI_EXTRA_NUM_OF_TASKS_SHIFT);
479 }
480 
481 void fman_set_num_of_tasks(struct fman_bmi_regs *bmi_rg,
482 				uint8_t port_id,
483 				uint8_t num_tasks,
484 				uint8_t num_extra_tasks)
485 {
486 	uint32_t tmp;
487 
488 	if ((port_id > 63) || (port_id < 1))
489 	    return;
490 
491 	/* calculate reg */
492 	tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]) &
493 			~(BMI_NUM_OF_TASKS_MASK | BMI_NUM_OF_EXTRA_TASKS_MASK);
494 	tmp |= (uint32_t)(((num_tasks - 1) << BMI_NUM_OF_TASKS_SHIFT) |
495 			(num_extra_tasks << BMI_EXTRA_NUM_OF_TASKS_SHIFT));
496 	iowrite32be(tmp, &bmi_rg->fmbm_pp[port_id - 1]);
497 }
498 
499 uint8_t fman_get_num_of_dmas(struct fman_bmi_regs *bmi_rg, uint8_t port_id)
500 {
501 	uint32_t tmp;
502 
503     if ((port_id > 63) || (port_id < 1))
504             return 0;
505 
506 	tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]);
507 	return (uint8_t)(((tmp & BMI_NUM_OF_DMAS_MASK) >>
508 			BMI_NUM_OF_DMAS_SHIFT) + 1);
509 }
510 
511 uint8_t fman_get_num_extra_dmas(struct fman_bmi_regs *bmi_rg, uint8_t port_id)
512 {
513 	uint32_t tmp;
514 
515 	if ((port_id > 63) || (port_id < 1))
516 	        return 0;
517 
518 	tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]);
519 	return (uint8_t)((tmp & BMI_NUM_OF_EXTRA_DMAS_MASK) >>
520 			BMI_EXTRA_NUM_OF_DMAS_SHIFT);
521 }
522 
523 void fman_set_num_of_open_dmas(struct fman_bmi_regs *bmi_rg,
524 				uint8_t port_id,
525 				uint8_t num_open_dmas,
526 				uint8_t num_extra_open_dmas,
527 				uint8_t total_num_dmas)
528 {
529 	uint32_t tmp = 0;
530 
531 	if ((port_id > 63) || (port_id < 1))
532 	    return;
533 
534 	/* calculate reg */
535 	tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]) &
536 			~(BMI_NUM_OF_DMAS_MASK | BMI_NUM_OF_EXTRA_DMAS_MASK);
537 	tmp |= (uint32_t)(((num_open_dmas-1) << BMI_NUM_OF_DMAS_SHIFT) |
538 			(num_extra_open_dmas << BMI_EXTRA_NUM_OF_DMAS_SHIFT));
539 	iowrite32be(tmp, &bmi_rg->fmbm_pp[port_id - 1]);
540 
541 	/* update total num of DMA's with committed number of open DMAS,
542 	 * and max uncommitted pool. */
543     if (total_num_dmas)
544     {
545         tmp = ioread32be(&bmi_rg->fmbm_cfg2) & ~BMI_CFG2_DMAS_MASK;
546         tmp |= (uint32_t)(total_num_dmas - 1) << BMI_CFG2_DMAS_SHIFT;
547         iowrite32be(tmp, &bmi_rg->fmbm_cfg2);
548     }
549 }
550 
551 void fman_set_vsp_window(struct fman_bmi_regs *bmi_rg,
552 			    	     uint8_t port_id,
553 				         uint8_t base_storage_profile,
554 				         uint8_t log2_num_of_profiles)
555 {
556 	uint32_t tmp = 0;
557 	if ((port_id > 63) || (port_id < 1))
558 	    return;
559 
560     tmp = ioread32be(&bmi_rg->fmbm_spliodn[port_id-1]);
561     tmp |= (uint32_t)((uint32_t)base_storage_profile & 0x3f) << 16;
562     tmp |= (uint32_t)log2_num_of_profiles << 28;
563     iowrite32be(tmp, &bmi_rg->fmbm_spliodn[port_id-1]);
564 }
565 
566 void fman_set_congestion_group_pfc_priority(uint32_t *cpg_rg,
567                                             uint32_t congestion_group_id,
568                                             uint8_t priority_bit_map,
569                                             uint32_t reg_num)
570 {
571 	uint32_t offset, tmp = 0;
572 
573     offset  = (congestion_group_id%4)*8;
574 
575     tmp = ioread32be(&cpg_rg[reg_num]);
576     tmp &= ~(0xFF<<offset);
577     tmp |= (uint32_t)priority_bit_map << offset;
578 
579     iowrite32be(tmp,&cpg_rg[reg_num]);
580 }
581 
582 /*****************************************************************************/
583 /*                      API Init unit functions                              */
584 /*****************************************************************************/
585 void fman_defconfig(struct fman_cfg *cfg, bool is_master)
586 {
587     memset(cfg, 0, sizeof(struct fman_cfg));
588 
589     cfg->catastrophic_err               = DEFAULT_CATASTROPHIC_ERR;
590     cfg->dma_err                        = DEFAULT_DMA_ERR;
591     cfg->halt_on_external_activ         = DEFAULT_HALT_ON_EXTERNAL_ACTIVATION;
592     cfg->halt_on_unrecov_ecc_err        = DEFAULT_HALT_ON_UNRECOVERABLE_ECC_ERROR;
593     cfg->en_iram_test_mode              = FALSE;
594     cfg->en_muram_test_mode             = FALSE;
595     cfg->external_ecc_rams_enable       = DEFAULT_EXTERNAL_ECC_RAMS_ENABLE;
596 
597 	if (!is_master)
598 	    return;
599 
600     cfg->dma_aid_override               = DEFAULT_AID_OVERRIDE;
601     cfg->dma_aid_mode                   = DEFAULT_AID_MODE;
602     cfg->dma_comm_qtsh_clr_emer         = DEFAULT_DMA_COMM_Q_LOW;
603     cfg->dma_comm_qtsh_asrt_emer        = DEFAULT_DMA_COMM_Q_HIGH;
604     cfg->dma_cache_override             = DEFAULT_CACHE_OVERRIDE;
605     cfg->dma_cam_num_of_entries         = DEFAULT_DMA_CAM_NUM_OF_ENTRIES;
606     cfg->dma_dbg_cnt_mode               = DEFAULT_DMA_DBG_CNT_MODE;
607     cfg->dma_en_emergency               = DEFAULT_DMA_EN_EMERGENCY;
608     cfg->dma_sos_emergency              = DEFAULT_DMA_SOS_EMERGENCY;
609     cfg->dma_watchdog                   = DEFAULT_DMA_WATCHDOG;
610     cfg->dma_en_emergency_smoother      = DEFAULT_DMA_EN_EMERGENCY_SMOOTHER;
611     cfg->dma_emergency_switch_counter   = DEFAULT_DMA_EMERGENCY_SWITCH_COUNTER;
612     cfg->disp_limit_tsh                 = DEFAULT_DISP_LIMIT;
613     cfg->prs_disp_tsh                   = DEFAULT_PRS_DISP_TH;
614     cfg->plcr_disp_tsh                  = DEFAULT_PLCR_DISP_TH;
615     cfg->kg_disp_tsh                    = DEFAULT_KG_DISP_TH;
616     cfg->bmi_disp_tsh                   = DEFAULT_BMI_DISP_TH;
617     cfg->qmi_enq_disp_tsh               = DEFAULT_QMI_ENQ_DISP_TH;
618     cfg->qmi_deq_disp_tsh               = DEFAULT_QMI_DEQ_DISP_TH;
619     cfg->fm_ctl1_disp_tsh               = DEFAULT_FM_CTL1_DISP_TH;
620     cfg->fm_ctl2_disp_tsh               = DEFAULT_FM_CTL2_DISP_TH;
621 
622 	cfg->pedantic_dma                   = FALSE;
623 	cfg->tnum_aging_period              = DEFAULT_TNUM_AGING_PERIOD;
624 	cfg->dma_stop_on_bus_error          = FALSE;
625 	cfg->qmi_deq_option_support         = FALSE;
626 }
627 
628 void fman_regconfig(struct fman_rg *fman_rg, struct fman_cfg *cfg)
629 {
630 	uint32_t tmp_reg;
631 
632     /* read the values from the registers as they are initialized by the HW with
633      * the required values.
634      */
635     tmp_reg = ioread32be(&fman_rg->bmi_rg->fmbm_cfg1);
636     cfg->total_fifo_size =
637         (((tmp_reg & BMI_TOTAL_FIFO_SIZE_MASK) >> BMI_CFG1_FIFO_SIZE_SHIFT) + 1) * FMAN_BMI_FIFO_UNITS;
638 
639     tmp_reg = ioread32be(&fman_rg->bmi_rg->fmbm_cfg2);
640     cfg->total_num_of_tasks =
641         (uint8_t)(((tmp_reg & BMI_TOTAL_NUM_OF_TASKS_MASK) >> BMI_CFG2_TASKS_SHIFT) + 1);
642 
643     tmp_reg = ioread32be(&fman_rg->dma_rg->fmdmtr);
644     cfg->dma_comm_qtsh_asrt_emer = (uint8_t)(tmp_reg >> DMA_THRESH_COMMQ_SHIFT);
645 
646     tmp_reg = ioread32be(&fman_rg->dma_rg->fmdmhy);
647     cfg->dma_comm_qtsh_clr_emer  = (uint8_t)(tmp_reg >> DMA_THRESH_COMMQ_SHIFT);
648 
649     tmp_reg = ioread32be(&fman_rg->dma_rg->fmdmmr);
650     cfg->dma_cache_override      = (enum fman_dma_cache_override)((tmp_reg & DMA_MODE_CACHE_OR_MASK) >> DMA_MODE_CACHE_OR_SHIFT);
651     cfg->dma_cam_num_of_entries  = (uint8_t)((((tmp_reg & DMA_MODE_CEN_MASK) >> DMA_MODE_CEN_SHIFT) +1)*DMA_CAM_UNITS);
652     cfg->dma_aid_override        = (bool)((tmp_reg & DMA_MODE_AID_OR)? TRUE:FALSE);
653     cfg->dma_dbg_cnt_mode        = (enum fman_dma_dbg_cnt_mode)((tmp_reg & DMA_MODE_DBG_MASK) >> DMA_MODE_DBG_SHIFT);
654     cfg->dma_en_emergency        = (bool)((tmp_reg & DMA_MODE_EB)? TRUE : FALSE);
655 
656     tmp_reg = ioread32be(&fman_rg->fpm_rg->fmfp_mxd);
657     cfg->disp_limit_tsh          = (uint8_t)((tmp_reg & FPM_DISP_LIMIT_MASK) >> FPM_DISP_LIMIT_SHIFT);
658 
659     tmp_reg = ioread32be(&fman_rg->fpm_rg->fmfp_dist1);
660     cfg->prs_disp_tsh            = (uint8_t)((tmp_reg & FPM_THR1_PRS_MASK ) >> FPM_THR1_PRS_SHIFT);
661     cfg->plcr_disp_tsh           = (uint8_t)((tmp_reg & FPM_THR1_KG_MASK ) >> FPM_THR1_KG_SHIFT);
662     cfg->kg_disp_tsh             = (uint8_t)((tmp_reg & FPM_THR1_PLCR_MASK ) >> FPM_THR1_PLCR_SHIFT);
663     cfg->bmi_disp_tsh            = (uint8_t)((tmp_reg & FPM_THR1_BMI_MASK ) >> FPM_THR1_BMI_SHIFT);
664 
665     tmp_reg = ioread32be(&fman_rg->fpm_rg->fmfp_dist2);
666     cfg->qmi_enq_disp_tsh        = (uint8_t)((tmp_reg & FPM_THR2_QMI_ENQ_MASK ) >> FPM_THR2_QMI_ENQ_SHIFT);
667     cfg->qmi_deq_disp_tsh        = (uint8_t)((tmp_reg & FPM_THR2_QMI_DEQ_MASK ) >> FPM_THR2_QMI_DEQ_SHIFT);
668     cfg->fm_ctl1_disp_tsh        = (uint8_t)((tmp_reg & FPM_THR2_FM_CTL1_MASK ) >> FPM_THR2_FM_CTL1_SHIFT);
669     cfg->fm_ctl2_disp_tsh        = (uint8_t)((tmp_reg & FPM_THR2_FM_CTL2_MASK ) >> FPM_THR2_FM_CTL2_SHIFT);
670 
671     tmp_reg = ioread32be(&fman_rg->dma_rg->fmdmsetr);
672     cfg->dma_sos_emergency       = tmp_reg;
673 
674     tmp_reg = ioread32be(&fman_rg->dma_rg->fmdmwcr);
675     cfg->dma_watchdog            = tmp_reg/cfg->clk_freq;
676 
677     tmp_reg = ioread32be(&fman_rg->dma_rg->fmdmemsr);
678     cfg->dma_en_emergency_smoother = (bool)((tmp_reg & DMA_EMSR_EMSTR_MASK)? TRUE : FALSE);
679     cfg->dma_emergency_switch_counter = (tmp_reg & DMA_EMSR_EMSTR_MASK);
680 }
681 
682 void fman_reset(struct fman_fpm_regs *fpm_rg)
683 {
684 	iowrite32be(FPM_RSTC_FM_RESET, &fpm_rg->fm_rstc);
685 }
686 
687 /**************************************************************************//**
688  @Function      FM_Init
689 
690  @Description   Initializes the FM module
691 
692  @Param[in]     h_Fm - FM module descriptor
693 
694  @Return        E_OK on success; Error code otherwise.
695 *//***************************************************************************/
696 int fman_dma_init(struct fman_dma_regs *dma_rg, struct fman_cfg *cfg)
697 {
698 	uint32_t    tmp_reg;
699 
700 	/**********************/
701 	/* Init DMA Registers */
702 	/**********************/
703 	/* clear status reg events */
704 	/* oren - check!!!  */
705 	tmp_reg = (DMA_STATUS_BUS_ERR | DMA_STATUS_READ_ECC |
706 			DMA_STATUS_SYSTEM_WRITE_ECC | DMA_STATUS_FM_WRITE_ECC);
707 	iowrite32be(ioread32be(&dma_rg->fmdmsr) | tmp_reg,
708 			&dma_rg->fmdmsr);
709 
710 	/* configure mode register */
711 	tmp_reg = 0;
712 	tmp_reg |= cfg->dma_cache_override << DMA_MODE_CACHE_OR_SHIFT;
713 	if (cfg->dma_aid_override)
714 		tmp_reg |= DMA_MODE_AID_OR;
715 	if (cfg->exceptions & FMAN_EX_DMA_BUS_ERROR)
716 		tmp_reg |= DMA_MODE_BER;
717 	if ((cfg->exceptions & FMAN_EX_DMA_SYSTEM_WRITE_ECC) |
718 		(cfg->exceptions & FMAN_EX_DMA_READ_ECC) |
719 		(cfg->exceptions & FMAN_EX_DMA_FM_WRITE_ECC))
720 		tmp_reg |= DMA_MODE_ECC;
721 	if (cfg->dma_stop_on_bus_error)
722 		tmp_reg |= DMA_MODE_SBER;
723 	if(cfg->dma_axi_dbg_num_of_beats)
724 	    tmp_reg |= (uint32_t)(DMA_MODE_AXI_DBG_MASK &
725 		           ((cfg->dma_axi_dbg_num_of_beats - 1) << DMA_MODE_AXI_DBG_SHIFT));
726 
727 	if (cfg->dma_en_emergency) {
728 		tmp_reg |= cfg->dma_emergency_bus_select;
729 		tmp_reg |= cfg->dma_emergency_level << DMA_MODE_EMER_LVL_SHIFT;
730 	if (cfg->dma_en_emergency_smoother)
731 		iowrite32be(cfg->dma_emergency_switch_counter,
732 				&dma_rg->fmdmemsr);
733 	}
734 	tmp_reg |= ((cfg->dma_cam_num_of_entries / DMA_CAM_UNITS) - 1) <<
735 			DMA_MODE_CEN_SHIFT;
736 	tmp_reg |= DMA_MODE_SECURE_PROT;
737 	tmp_reg |= cfg->dma_dbg_cnt_mode << DMA_MODE_DBG_SHIFT;
738 	tmp_reg |= cfg->dma_aid_mode << DMA_MODE_AID_MODE_SHIFT;
739 
740 	if (cfg->pedantic_dma)
741 		tmp_reg |= DMA_MODE_EMER_READ;
742 
743 	iowrite32be(tmp_reg, &dma_rg->fmdmmr);
744 
745 	/* configure thresholds register */
746 	tmp_reg = ((uint32_t)cfg->dma_comm_qtsh_asrt_emer <<
747 			DMA_THRESH_COMMQ_SHIFT) |
748 			((uint32_t)cfg->dma_read_buf_tsh_asrt_emer <<
749 			DMA_THRESH_READ_INT_BUF_SHIFT) |
750 			((uint32_t)cfg->dma_write_buf_tsh_asrt_emer);
751 
752 	iowrite32be(tmp_reg, &dma_rg->fmdmtr);
753 
754 	/* configure hysteresis register */
755 	tmp_reg = ((uint32_t)cfg->dma_comm_qtsh_clr_emer <<
756 		DMA_THRESH_COMMQ_SHIFT) |
757 		((uint32_t)cfg->dma_read_buf_tsh_clr_emer <<
758 		DMA_THRESH_READ_INT_BUF_SHIFT) |
759 		((uint32_t)cfg->dma_write_buf_tsh_clr_emer);
760 
761 	iowrite32be(tmp_reg, &dma_rg->fmdmhy);
762 
763 	/* configure emergency threshold */
764 	iowrite32be(cfg->dma_sos_emergency, &dma_rg->fmdmsetr);
765 
766 	/* configure Watchdog */
767 	iowrite32be((cfg->dma_watchdog * cfg->clk_freq),
768 			&dma_rg->fmdmwcr);
769 
770 	iowrite32be(cfg->cam_base_addr, &dma_rg->fmdmebcr);
771 
772 	return 0;
773 }
774 
775 int fman_fpm_init(struct fman_fpm_regs *fpm_rg, struct fman_cfg *cfg)
776 {
777 	uint32_t tmp_reg;
778 	int i;
779 
780 	/**********************/
781 	/* Init FPM Registers */
782 	/**********************/
783 	tmp_reg = (uint32_t)(cfg->disp_limit_tsh << FPM_DISP_LIMIT_SHIFT);
784 	iowrite32be(tmp_reg, &fpm_rg->fmfp_mxd);
785 
786 	tmp_reg = (((uint32_t)cfg->prs_disp_tsh << FPM_THR1_PRS_SHIFT) |
787 		((uint32_t)cfg->kg_disp_tsh << FPM_THR1_KG_SHIFT) |
788 		((uint32_t)cfg->plcr_disp_tsh << FPM_THR1_PLCR_SHIFT) |
789 		((uint32_t)cfg->bmi_disp_tsh << FPM_THR1_BMI_SHIFT));
790 	iowrite32be(tmp_reg, &fpm_rg->fmfp_dist1);
791 
792 	tmp_reg = (((uint32_t)cfg->qmi_enq_disp_tsh << FPM_THR2_QMI_ENQ_SHIFT) |
793 		((uint32_t)cfg->qmi_deq_disp_tsh << FPM_THR2_QMI_DEQ_SHIFT) |
794 		((uint32_t)cfg->fm_ctl1_disp_tsh << FPM_THR2_FM_CTL1_SHIFT) |
795 		((uint32_t)cfg->fm_ctl2_disp_tsh << FPM_THR2_FM_CTL2_SHIFT));
796 	iowrite32be(tmp_reg, &fpm_rg->fmfp_dist2);
797 
798 	/* define exceptions and error behavior */
799 	tmp_reg = 0;
800 	/* Clear events */
801 	tmp_reg |= (FPM_EV_MASK_STALL | FPM_EV_MASK_DOUBLE_ECC |
802 		FPM_EV_MASK_SINGLE_ECC);
803 	/* enable interrupts */
804 	if (cfg->exceptions & FMAN_EX_FPM_STALL_ON_TASKS)
805 		tmp_reg |= FPM_EV_MASK_STALL_EN;
806 	if (cfg->exceptions & FMAN_EX_FPM_SINGLE_ECC)
807 		tmp_reg |= FPM_EV_MASK_SINGLE_ECC_EN;
808 	if (cfg->exceptions & FMAN_EX_FPM_DOUBLE_ECC)
809 		tmp_reg |= FPM_EV_MASK_DOUBLE_ECC_EN;
810 	tmp_reg |= (cfg->catastrophic_err  << FPM_EV_MASK_CAT_ERR_SHIFT);
811 	tmp_reg |= (cfg->dma_err << FPM_EV_MASK_DMA_ERR_SHIFT);
812 	if (!cfg->halt_on_external_activ)
813 		tmp_reg |= FPM_EV_MASK_EXTERNAL_HALT;
814 	if (!cfg->halt_on_unrecov_ecc_err)
815 		tmp_reg |= FPM_EV_MASK_ECC_ERR_HALT;
816 	iowrite32be(tmp_reg, &fpm_rg->fmfp_ee);
817 
818 	/* clear all fmCtls event registers */
819 	for (i = 0; i < cfg->num_of_fman_ctrl_evnt_regs; i++)
820 		iowrite32be(0xFFFFFFFF, &fpm_rg->fmfp_cev[i]);
821 
822 	/* RAM ECC -  enable and clear events*/
823 	/* first we need to clear all parser memory,
824 	 * as it is uninitialized and may cause ECC errors */
825 	/* event bits */
826 	tmp_reg = (FPM_RAM_MURAM_ECC | FPM_RAM_IRAM_ECC);
827 	/* Rams enable not effected by RCR bit, but by a COP configuration */
828 	if (cfg->external_ecc_rams_enable)
829 		tmp_reg |= FPM_RAM_RAMS_ECC_EN_SRC_SEL;
830 
831 	/* enable test mode */
832 	if (cfg->en_muram_test_mode)
833 		tmp_reg |= FPM_RAM_MURAM_TEST_ECC;
834 	if (cfg->en_iram_test_mode)
835 		tmp_reg |= FPM_RAM_IRAM_TEST_ECC;
836 	iowrite32be(tmp_reg, &fpm_rg->fm_rcr);
837 
838 	tmp_reg = 0;
839 	if (cfg->exceptions & FMAN_EX_IRAM_ECC) {
840 		tmp_reg |= FPM_IRAM_ECC_ERR_EX_EN;
841 		fman_enable_rams_ecc(fpm_rg);
842 	}
843 	if (cfg->exceptions & FMAN_EX_NURAM_ECC) {
844 		tmp_reg |= FPM_MURAM_ECC_ERR_EX_EN;
845 		fman_enable_rams_ecc(fpm_rg);
846 	}
847 	iowrite32be(tmp_reg, &fpm_rg->fm_rie);
848 
849 	return 0;
850 }
851 
852 int fman_bmi_init(struct fman_bmi_regs *bmi_rg, struct fman_cfg *cfg)
853 {
854 	uint32_t tmp_reg;
855 
856 	/**********************/
857 	/* Init BMI Registers */
858 	/**********************/
859 
860 	/* define common resources */
861 	tmp_reg = cfg->fifo_base_addr;
862 	tmp_reg = tmp_reg / BMI_FIFO_ALIGN;
863 
864 	tmp_reg |= ((cfg->total_fifo_size / FMAN_BMI_FIFO_UNITS - 1) <<
865 			BMI_CFG1_FIFO_SIZE_SHIFT);
866 	iowrite32be(tmp_reg, &bmi_rg->fmbm_cfg1);
867 
868 	tmp_reg = ((uint32_t)(cfg->total_num_of_tasks - 1) <<
869 			BMI_CFG2_TASKS_SHIFT);
870 	/* num of DMA's will be dynamically updated when each port is set */
871 	iowrite32be(tmp_reg, &bmi_rg->fmbm_cfg2);
872 
873 	/* define unmaskable exceptions, enable and clear events */
874 	tmp_reg = 0;
875 	iowrite32be(BMI_ERR_INTR_EN_LIST_RAM_ECC |
876 			BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC |
877 			BMI_ERR_INTR_EN_STATISTICS_RAM_ECC |
878 			BMI_ERR_INTR_EN_DISPATCH_RAM_ECC,
879 			&bmi_rg->fmbm_ievr);
880 
881 	if (cfg->exceptions & FMAN_EX_BMI_LIST_RAM_ECC)
882 		tmp_reg |= BMI_ERR_INTR_EN_LIST_RAM_ECC;
883 	if (cfg->exceptions & FMAN_EX_BMI_PIPELINE_ECC)
884 		tmp_reg |= BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC;
885 	if (cfg->exceptions & FMAN_EX_BMI_STATISTICS_RAM_ECC)
886 		tmp_reg |= BMI_ERR_INTR_EN_STATISTICS_RAM_ECC;
887 	if (cfg->exceptions & FMAN_EX_BMI_DISPATCH_RAM_ECC)
888 		tmp_reg |= BMI_ERR_INTR_EN_DISPATCH_RAM_ECC;
889 	iowrite32be(tmp_reg, &bmi_rg->fmbm_ier);
890 
891 	return 0;
892 }
893 
894 int fman_qmi_init(struct fman_qmi_regs *qmi_rg, struct fman_cfg *cfg)
895 {
896 	uint32_t tmp_reg;
897 	uint16_t period_in_fm_clocks;
898 	uint8_t remainder;
899 	/**********************/
900 	/* Init QMI Registers */
901 	/**********************/
902 	/* Clear error interrupt events */
903 
904 	iowrite32be(QMI_ERR_INTR_EN_DOUBLE_ECC | QMI_ERR_INTR_EN_DEQ_FROM_DEF,
905 			&qmi_rg->fmqm_eie);
906 	tmp_reg = 0;
907 	if (cfg->exceptions & FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID)
908 		tmp_reg |= QMI_ERR_INTR_EN_DEQ_FROM_DEF;
909 	if (cfg->exceptions & FMAN_EX_QMI_DOUBLE_ECC)
910 		tmp_reg |= QMI_ERR_INTR_EN_DOUBLE_ECC;
911 	/* enable events */
912 	iowrite32be(tmp_reg, &qmi_rg->fmqm_eien);
913 
914 	if (cfg->tnum_aging_period) {
915 		/* tnum_aging_period is in units of usec, p_FmClockFreq in Mhz */
916 		period_in_fm_clocks = (uint16_t)
917 				(cfg->tnum_aging_period * cfg->clk_freq);
918 		/* period_in_fm_clocks must be a 64 multiply */
919 		remainder = (uint8_t)(period_in_fm_clocks % 64);
920 		if (remainder)
921 			tmp_reg = (uint32_t)((period_in_fm_clocks / 64) + 1);
922 		else{
923 			tmp_reg = (uint32_t)(period_in_fm_clocks / 64);
924 			if (!tmp_reg)
925 				tmp_reg = 1;
926 		}
927 		tmp_reg <<= QMI_TAPC_TAP;
928 		iowrite32be(tmp_reg, &qmi_rg->fmqm_tapc);
929 	}
930 	tmp_reg = 0;
931 	/* Clear interrupt events */
932 	iowrite32be(QMI_INTR_EN_SINGLE_ECC, &qmi_rg->fmqm_ie);
933 	if (cfg->exceptions & FMAN_EX_QMI_SINGLE_ECC)
934 		tmp_reg |= QMI_INTR_EN_SINGLE_ECC;
935 	/* enable events */
936 	iowrite32be(tmp_reg, &qmi_rg->fmqm_ien);
937 
938 	return 0;
939 }
940 
941 int fman_enable(struct fman_rg *fman_rg, struct fman_cfg *cfg)
942 {
943 	uint32_t cfg_reg = 0;
944 
945 	/**********************/
946 	/* Enable all modules */
947 	/**********************/
948 	/* clear & enable global counters  - calculate reg and save for later,
949 	because it's the same reg for QMI enable */
950 	cfg_reg = QMI_CFG_EN_COUNTERS;
951 	if (cfg->qmi_deq_option_support)
952 		cfg_reg |= (uint32_t)(((cfg->qmi_def_tnums_thresh) << 8) |
953 				(uint32_t)cfg->qmi_def_tnums_thresh);
954 
955 	iowrite32be(BMI_INIT_START, &fman_rg->bmi_rg->fmbm_init);
956 	iowrite32be(cfg_reg | QMI_CFG_ENQ_EN | QMI_CFG_DEQ_EN,
957 			&fman_rg->qmi_rg->fmqm_gc);
958 
959 	return 0;
960 }
961 
962 void fman_free_resources(struct fman_rg *fman_rg)
963 {
964 	/* disable BMI and QMI */
965 	iowrite32be(0, &fman_rg->bmi_rg->fmbm_init);
966 	iowrite32be(0, &fman_rg->qmi_rg->fmqm_gc);
967 
968 	/* release BMI resources */
969 	iowrite32be(0, &fman_rg->bmi_rg->fmbm_cfg2);
970 	iowrite32be(0, &fman_rg->bmi_rg->fmbm_cfg1);
971 
972 	/* disable ECC */
973 	iowrite32be(0, &fman_rg->fpm_rg->fm_rcr);
974 }
975 
976 /****************************************************/
977 /*       API Run-time Control uint functions        */
978 /****************************************************/
979 uint32_t fman_get_normal_pending(struct fman_fpm_regs *fpm_rg)
980 {
981 	return ioread32be(&fpm_rg->fm_npi);
982 }
983 
984 uint32_t fman_get_controller_event(struct fman_fpm_regs *fpm_rg, uint8_t reg_id)
985 {
986 	uint32_t event;
987 
988 	event = ioread32be(&fpm_rg->fmfp_fcev[reg_id]) &
989 			ioread32be(&fpm_rg->fmfp_cee[reg_id]);
990 	iowrite32be(event, &fpm_rg->fmfp_cev[reg_id]);
991 
992 	return event;
993 }
994 
995 uint32_t fman_get_error_pending(struct fman_fpm_regs *fpm_rg)
996 {
997 	return ioread32be(&fpm_rg->fm_epi);
998 }
999 
1000 void fman_set_ports_bandwidth(struct fman_bmi_regs *bmi_rg, uint8_t *weights)
1001 {
1002 	int i;
1003 	uint8_t shift;
1004 	uint32_t tmp = 0;
1005 
1006 	for (i = 0; i < 64; i++) {
1007 		if (weights[i] > 1) { /* no need to write 1 since it is 0 */
1008 			/* Add this port to tmp_reg */
1009 			/* (each 8 ports result in one register)*/
1010 			shift = (uint8_t)(32 - 4 * ((i % 8) + 1));
1011 			tmp |= ((weights[i] - 1) << shift);
1012 		}
1013 		if (i % 8 == 7) { /* last in this set */
1014 			iowrite32be(tmp, &bmi_rg->fmbm_arb[i / 8]);
1015 			tmp = 0;
1016 		}
1017 	}
1018 }
1019 
1020 void fman_enable_rams_ecc(struct fman_fpm_regs *fpm_rg)
1021 {
1022 	uint32_t tmp;
1023 
1024 	tmp = ioread32be(&fpm_rg->fm_rcr);
1025 	if (tmp & FPM_RAM_RAMS_ECC_EN_SRC_SEL)
1026 		iowrite32be(tmp | FPM_RAM_IRAM_ECC_EN,
1027 				&fpm_rg->fm_rcr);
1028 	else
1029 		iowrite32be(tmp | FPM_RAM_RAMS_ECC_EN |
1030 				FPM_RAM_IRAM_ECC_EN,
1031 				&fpm_rg->fm_rcr);
1032 }
1033 
1034 void fman_disable_rams_ecc(struct fman_fpm_regs *fpm_rg)
1035 {
1036 	uint32_t tmp;
1037 
1038 	tmp = ioread32be(&fpm_rg->fm_rcr);
1039 	if (tmp & FPM_RAM_RAMS_ECC_EN_SRC_SEL)
1040 		iowrite32be(tmp & ~FPM_RAM_IRAM_ECC_EN,
1041 				&fpm_rg->fm_rcr);
1042 	else
1043 		iowrite32be(tmp & ~(FPM_RAM_RAMS_ECC_EN | FPM_RAM_IRAM_ECC_EN),
1044 				&fpm_rg->fm_rcr);
1045 }
1046 
1047 int fman_set_exception(struct fman_rg *fman_rg,
1048 			enum fman_exceptions exception,
1049 			bool enable)
1050 {
1051 	uint32_t tmp;
1052 
1053 	switch (exception) {
1054 	case(E_FMAN_EX_DMA_BUS_ERROR):
1055 		tmp = ioread32be(&fman_rg->dma_rg->fmdmmr);
1056 		if (enable)
1057 			tmp |= DMA_MODE_BER;
1058 		else
1059 			tmp &= ~DMA_MODE_BER;
1060 		/* disable bus error */
1061 		iowrite32be(tmp, &fman_rg->dma_rg->fmdmmr);
1062 		break;
1063 	case(E_FMAN_EX_DMA_READ_ECC):
1064 	case(E_FMAN_EX_DMA_SYSTEM_WRITE_ECC):
1065 	case(E_FMAN_EX_DMA_FM_WRITE_ECC):
1066 		tmp = ioread32be(&fman_rg->dma_rg->fmdmmr);
1067 		if (enable)
1068 			tmp |= DMA_MODE_ECC;
1069 		else
1070 			tmp &= ~DMA_MODE_ECC;
1071 		iowrite32be(tmp, &fman_rg->dma_rg->fmdmmr);
1072 		break;
1073 	case(E_FMAN_EX_FPM_STALL_ON_TASKS):
1074 		tmp = ioread32be(&fman_rg->fpm_rg->fmfp_ee);
1075 		if (enable)
1076 			tmp |= FPM_EV_MASK_STALL_EN;
1077 		else
1078 			tmp &= ~FPM_EV_MASK_STALL_EN;
1079 		iowrite32be(tmp, &fman_rg->fpm_rg->fmfp_ee);
1080 		break;
1081 	case(E_FMAN_EX_FPM_SINGLE_ECC):
1082 		tmp = ioread32be(&fman_rg->fpm_rg->fmfp_ee);
1083 		if (enable)
1084 			tmp |= FPM_EV_MASK_SINGLE_ECC_EN;
1085 		else
1086 			tmp &= ~FPM_EV_MASK_SINGLE_ECC_EN;
1087 		iowrite32be(tmp, &fman_rg->fpm_rg->fmfp_ee);
1088 		break;
1089 	case(E_FMAN_EX_FPM_DOUBLE_ECC):
1090 		tmp = ioread32be(&fman_rg->fpm_rg->fmfp_ee);
1091 		if (enable)
1092 			tmp |= FPM_EV_MASK_DOUBLE_ECC_EN;
1093 		else
1094 			tmp &= ~FPM_EV_MASK_DOUBLE_ECC_EN;
1095 		iowrite32be(tmp, &fman_rg->fpm_rg->fmfp_ee);
1096 		break;
1097 	case(E_FMAN_EX_QMI_SINGLE_ECC):
1098 		tmp = ioread32be(&fman_rg->qmi_rg->fmqm_ien);
1099 		if (enable)
1100 			tmp |= QMI_INTR_EN_SINGLE_ECC;
1101 		else
1102 			tmp &= ~QMI_INTR_EN_SINGLE_ECC;
1103 		iowrite32be(tmp, &fman_rg->qmi_rg->fmqm_ien);
1104 		break;
1105 	case(E_FMAN_EX_QMI_DOUBLE_ECC):
1106 		tmp = ioread32be(&fman_rg->qmi_rg->fmqm_eien);
1107 		if (enable)
1108 			tmp |= QMI_ERR_INTR_EN_DOUBLE_ECC;
1109 		else
1110 			tmp &= ~QMI_ERR_INTR_EN_DOUBLE_ECC;
1111 		iowrite32be(tmp, &fman_rg->qmi_rg->fmqm_eien);
1112 		break;
1113 	case(E_FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID):
1114 		tmp = ioread32be(&fman_rg->qmi_rg->fmqm_eien);
1115 		if (enable)
1116 			tmp |= QMI_ERR_INTR_EN_DEQ_FROM_DEF;
1117 		else
1118 			tmp &= ~QMI_ERR_INTR_EN_DEQ_FROM_DEF;
1119 		iowrite32be(tmp, &fman_rg->qmi_rg->fmqm_eien);
1120 		break;
1121 	case(E_FMAN_EX_BMI_LIST_RAM_ECC):
1122 		tmp = ioread32be(&fman_rg->bmi_rg->fmbm_ier);
1123 		if (enable)
1124 			tmp |= BMI_ERR_INTR_EN_LIST_RAM_ECC;
1125 		else
1126 			tmp &= ~BMI_ERR_INTR_EN_LIST_RAM_ECC;
1127 		iowrite32be(tmp, &fman_rg->bmi_rg->fmbm_ier);
1128 		break;
1129 	case(E_FMAN_EX_BMI_STORAGE_PROFILE_ECC):
1130 		tmp = ioread32be(&fman_rg->bmi_rg->fmbm_ier);
1131 		if (enable)
1132 			tmp |= BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC;
1133 		else
1134 			tmp &= ~BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC;
1135 		iowrite32be(tmp, &fman_rg->bmi_rg->fmbm_ier);
1136 		break;
1137 	case(E_FMAN_EX_BMI_STATISTICS_RAM_ECC):
1138 		tmp = ioread32be(&fman_rg->bmi_rg->fmbm_ier);
1139 		if (enable)
1140 			tmp |= BMI_ERR_INTR_EN_STATISTICS_RAM_ECC;
1141 		else
1142 			tmp &= ~BMI_ERR_INTR_EN_STATISTICS_RAM_ECC;
1143 		iowrite32be(tmp, &fman_rg->bmi_rg->fmbm_ier);
1144 		break;
1145 	case(E_FMAN_EX_BMI_DISPATCH_RAM_ECC):
1146 		tmp = ioread32be(&fman_rg->bmi_rg->fmbm_ier);
1147 		if (enable)
1148 			tmp |= BMI_ERR_INTR_EN_DISPATCH_RAM_ECC;
1149 		else
1150 			tmp &= ~BMI_ERR_INTR_EN_DISPATCH_RAM_ECC;
1151 		iowrite32be(tmp, &fman_rg->bmi_rg->fmbm_ier);
1152 		break;
1153 	case(E_FMAN_EX_IRAM_ECC):
1154 		tmp = ioread32be(&fman_rg->fpm_rg->fm_rie);
1155 		if (enable) {
1156 			/* enable ECC if not enabled */
1157 			fman_enable_rams_ecc(fman_rg->fpm_rg);
1158 			/* enable ECC interrupts */
1159 			tmp |= FPM_IRAM_ECC_ERR_EX_EN;
1160 		} else {
1161 			/* ECC mechanism may be disabled,
1162 			 * depending on driver status  */
1163 			fman_disable_rams_ecc(fman_rg->fpm_rg);
1164 			tmp &= ~FPM_IRAM_ECC_ERR_EX_EN;
1165 		}
1166 		iowrite32be(tmp, &fman_rg->fpm_rg->fm_rie);
1167 		break;
1168 	case(E_FMAN_EX_MURAM_ECC):
1169 		tmp = ioread32be(&fman_rg->fpm_rg->fm_rie);
1170 		if (enable) {
1171 			/* enable ECC if not enabled */
1172 			fman_enable_rams_ecc(fman_rg->fpm_rg);
1173 			/* enable ECC interrupts */
1174 			tmp |= FPM_MURAM_ECC_ERR_EX_EN;
1175 		} else {
1176 			/* ECC mechanism may be disabled,
1177 			 * depending on driver status  */
1178 			fman_disable_rams_ecc(fman_rg->fpm_rg);
1179 			tmp &= ~FPM_MURAM_ECC_ERR_EX_EN;
1180 		}
1181 		iowrite32be(tmp, &fman_rg->fpm_rg->fm_rie);
1182 		break;
1183 	default:
1184 		return -EINVAL;
1185 	}
1186 	return 0;
1187 }
1188 
1189 void fman_get_revision(struct fman_fpm_regs *fpm_rg,
1190 			uint8_t *major,
1191 			uint8_t *minor)
1192 {
1193 	uint32_t tmp;
1194 
1195 	tmp = ioread32be(&fpm_rg->fm_ip_rev_1);
1196 	*major = (uint8_t)((tmp & FPM_REV1_MAJOR_MASK) >> FPM_REV1_MAJOR_SHIFT);
1197 	*minor = (uint8_t)((tmp & FPM_REV1_MINOR_MASK) >> FPM_REV1_MINOR_SHIFT);
1198 
1199 }
1200 
1201 uint32_t fman_get_counter(struct fman_rg *fman_rg,
1202 				enum fman_counters reg_name)
1203 {
1204 	uint32_t ret_val;
1205 
1206 	switch (reg_name) {
1207 	case(E_FMAN_COUNTERS_ENQ_TOTAL_FRAME):
1208 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_etfc);
1209 		break;
1210 	case(E_FMAN_COUNTERS_DEQ_TOTAL_FRAME):
1211 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dtfc);
1212 		break;
1213 	case(E_FMAN_COUNTERS_DEQ_0):
1214 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dc0);
1215 		break;
1216 	case(E_FMAN_COUNTERS_DEQ_1):
1217 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dc1);
1218 		break;
1219 	case(E_FMAN_COUNTERS_DEQ_2):
1220 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dc2);
1221 		break;
1222 	case(E_FMAN_COUNTERS_DEQ_3):
1223 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dc3);
1224 		break;
1225 	case(E_FMAN_COUNTERS_DEQ_FROM_DEFAULT):
1226 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dfdc);
1227 		break;
1228 	case(E_FMAN_COUNTERS_DEQ_FROM_CONTEXT):
1229 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dfcc);
1230 		break;
1231 	case(E_FMAN_COUNTERS_DEQ_FROM_FD):
1232 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dffc);
1233 		break;
1234 	case(E_FMAN_COUNTERS_DEQ_CONFIRM):
1235 		ret_val = ioread32be(&fman_rg->qmi_rg->fmqm_dcc);
1236 		break;
1237 	default:
1238 		ret_val = 0;
1239 	}
1240 	return ret_val;
1241 }
1242 
1243 int fman_modify_counter(struct fman_rg *fman_rg,
1244 			enum fman_counters reg_name,
1245 			uint32_t val)
1246 {
1247 	/* When applicable (when there is an 'enable counters' bit,
1248 	 * check that counters are enabled */
1249 	switch (reg_name) {
1250 	case(E_FMAN_COUNTERS_ENQ_TOTAL_FRAME):
1251 	case(E_FMAN_COUNTERS_DEQ_TOTAL_FRAME):
1252 	case(E_FMAN_COUNTERS_DEQ_0):
1253 	case(E_FMAN_COUNTERS_DEQ_1):
1254 	case(E_FMAN_COUNTERS_DEQ_2):
1255 	case(E_FMAN_COUNTERS_DEQ_3):
1256 	case(E_FMAN_COUNTERS_DEQ_FROM_DEFAULT):
1257 	case(E_FMAN_COUNTERS_DEQ_FROM_CONTEXT):
1258 	case(E_FMAN_COUNTERS_DEQ_FROM_FD):
1259 	case(E_FMAN_COUNTERS_DEQ_CONFIRM):
1260 		if (!(ioread32be(&fman_rg->qmi_rg->fmqm_gc) &
1261 				QMI_CFG_EN_COUNTERS))
1262 			return -EINVAL;
1263 		break;
1264 	default:
1265 		break;
1266 	}
1267 	/* Set counter */
1268 	switch (reg_name) {
1269 	case(E_FMAN_COUNTERS_ENQ_TOTAL_FRAME):
1270 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_etfc);
1271 		break;
1272 	case(E_FMAN_COUNTERS_DEQ_TOTAL_FRAME):
1273 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dtfc);
1274 		break;
1275 	case(E_FMAN_COUNTERS_DEQ_0):
1276 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dc0);
1277 		break;
1278 	case(E_FMAN_COUNTERS_DEQ_1):
1279 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dc1);
1280 		break;
1281 	case(E_FMAN_COUNTERS_DEQ_2):
1282 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dc2);
1283 		break;
1284 	case(E_FMAN_COUNTERS_DEQ_3):
1285 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dc3);
1286 		break;
1287 	case(E_FMAN_COUNTERS_DEQ_FROM_DEFAULT):
1288 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dfdc);
1289 		break;
1290 	case(E_FMAN_COUNTERS_DEQ_FROM_CONTEXT):
1291 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dfcc);
1292 		break;
1293 	case(E_FMAN_COUNTERS_DEQ_FROM_FD):
1294 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dffc);
1295 		break;
1296 	case(E_FMAN_COUNTERS_DEQ_CONFIRM):
1297 		iowrite32be(val, &fman_rg->qmi_rg->fmqm_dcc);
1298 		break;
1299 	case(E_FMAN_COUNTERS_SEMAPHOR_ENTRY_FULL_REJECT):
1300 		iowrite32be(val, &fman_rg->dma_rg->fmdmsefrc);
1301 		break;
1302 	case(E_FMAN_COUNTERS_SEMAPHOR_QUEUE_FULL_REJECT):
1303 		iowrite32be(val, &fman_rg->dma_rg->fmdmsqfrc);
1304 		break;
1305 	case(E_FMAN_COUNTERS_SEMAPHOR_SYNC_REJECT):
1306 		iowrite32be(val, &fman_rg->dma_rg->fmdmssrc);
1307 		break;
1308 	default:
1309 		break;
1310 	}
1311 	return 0;
1312 }
1313 
1314 void fman_set_dma_emergency(struct fman_dma_regs *dma_rg,
1315 				bool is_write,
1316 				bool enable)
1317 {
1318 	uint32_t msk;
1319 
1320 	msk = (uint32_t)(is_write ? DMA_MODE_EMER_WRITE : DMA_MODE_EMER_READ);
1321 
1322 	if (enable)
1323 		iowrite32be(ioread32be(&dma_rg->fmdmmr) | msk,
1324 				&dma_rg->fmdmmr);
1325 	else /* disable */
1326 		iowrite32be(ioread32be(&dma_rg->fmdmmr) & ~msk,
1327 				&dma_rg->fmdmmr);
1328 }
1329 
1330 void fman_set_dma_ext_bus_pri(struct fman_dma_regs *dma_rg, uint32_t pri)
1331 {
1332 	uint32_t tmp;
1333 
1334 	tmp = ioread32be(&dma_rg->fmdmmr) |
1335 			(pri << DMA_MODE_BUS_PRI_SHIFT);
1336 
1337 	iowrite32be(tmp, &dma_rg->fmdmmr);
1338 }
1339 
1340 uint32_t fman_get_dma_status(struct fman_dma_regs *dma_rg)
1341 {
1342 	return ioread32be(&dma_rg->fmdmsr);
1343 }
1344 
1345 void fman_force_intr(struct fman_rg *fman_rg,
1346 		enum fman_exceptions exception)
1347 {
1348 	switch (exception) {
1349 	case E_FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID:
1350 		iowrite32be(QMI_ERR_INTR_EN_DEQ_FROM_DEF,
1351 				&fman_rg->qmi_rg->fmqm_eif);
1352 		break;
1353 	case E_FMAN_EX_QMI_SINGLE_ECC:
1354 		iowrite32be(QMI_INTR_EN_SINGLE_ECC,
1355 				&fman_rg->qmi_rg->fmqm_if);
1356 		break;
1357 	case E_FMAN_EX_QMI_DOUBLE_ECC:
1358 		iowrite32be(QMI_ERR_INTR_EN_DOUBLE_ECC,
1359 				&fman_rg->qmi_rg->fmqm_eif);
1360 		break;
1361 	case E_FMAN_EX_BMI_LIST_RAM_ECC:
1362 		iowrite32be(BMI_ERR_INTR_EN_LIST_RAM_ECC,
1363 				&fman_rg->bmi_rg->fmbm_ifr);
1364 		break;
1365 	case E_FMAN_EX_BMI_STORAGE_PROFILE_ECC:
1366 		iowrite32be(BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC,
1367 				&fman_rg->bmi_rg->fmbm_ifr);
1368 		break;
1369 	case E_FMAN_EX_BMI_STATISTICS_RAM_ECC:
1370 		iowrite32be(BMI_ERR_INTR_EN_STATISTICS_RAM_ECC,
1371 				&fman_rg->bmi_rg->fmbm_ifr);
1372 		break;
1373 	case E_FMAN_EX_BMI_DISPATCH_RAM_ECC:
1374 		iowrite32be(BMI_ERR_INTR_EN_DISPATCH_RAM_ECC,
1375 				&fman_rg->bmi_rg->fmbm_ifr);
1376 		break;
1377 	default:
1378 		break;
1379 	}
1380 }
1381 
1382 bool fman_is_qmi_halt_not_busy_state(struct fman_qmi_regs *qmi_rg)
1383 {
1384 	return (bool)!!(ioread32be(&qmi_rg->fmqm_gs) & QMI_GS_HALT_NOT_BUSY);
1385 }
1386 void fman_resume(struct fman_fpm_regs *fpm_rg)
1387 {
1388 	uint32_t tmp;
1389 
1390 	tmp = ioread32be(&fpm_rg->fmfp_ee);
1391 	/* clear tmp_reg event bits in order not to clear standing events */
1392 	tmp &= ~(FPM_EV_MASK_DOUBLE_ECC |
1393 			FPM_EV_MASK_STALL |
1394 			FPM_EV_MASK_SINGLE_ECC);
1395 	tmp |= FPM_EV_MASK_RELEASE_FM;
1396 
1397 	iowrite32be(tmp, &fpm_rg->fmfp_ee);
1398 }
1399