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