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