xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/Pcd/fman_prs.c (revision c2c014f24c10f90d85126ac5fbd4d8524de32b1c)
1*852ba100SJustin Hibbits /*
2*852ba100SJustin Hibbits  * Copyright 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 #include "fsl_fman_prs.h"
34*852ba100SJustin Hibbits 
fman_prs_get_err_event(struct fman_prs_regs * regs,uint32_t ev_mask)35*852ba100SJustin Hibbits uint32_t fman_prs_get_err_event(struct fman_prs_regs *regs, uint32_t ev_mask)
36*852ba100SJustin Hibbits {
37*852ba100SJustin Hibbits 	return ioread32be(&regs->fmpr_perr) & ev_mask;
38*852ba100SJustin Hibbits }
39*852ba100SJustin Hibbits 
fman_prs_get_err_ev_mask(struct fman_prs_regs * regs)40*852ba100SJustin Hibbits uint32_t fman_prs_get_err_ev_mask(struct fman_prs_regs *regs)
41*852ba100SJustin Hibbits {
42*852ba100SJustin Hibbits 	return ioread32be(&regs->fmpr_perer);
43*852ba100SJustin Hibbits }
44*852ba100SJustin Hibbits 
fman_prs_ack_err_event(struct fman_prs_regs * regs,uint32_t event)45*852ba100SJustin Hibbits void fman_prs_ack_err_event(struct fman_prs_regs *regs, uint32_t event)
46*852ba100SJustin Hibbits {
47*852ba100SJustin Hibbits 	iowrite32be(event, &regs->fmpr_perr);
48*852ba100SJustin Hibbits }
49*852ba100SJustin Hibbits 
fman_prs_get_expt_event(struct fman_prs_regs * regs,uint32_t ev_mask)50*852ba100SJustin Hibbits uint32_t fman_prs_get_expt_event(struct fman_prs_regs *regs, uint32_t ev_mask)
51*852ba100SJustin Hibbits {
52*852ba100SJustin Hibbits 	return ioread32be(&regs->fmpr_pevr) & ev_mask;
53*852ba100SJustin Hibbits }
54*852ba100SJustin Hibbits 
fman_prs_get_expt_ev_mask(struct fman_prs_regs * regs)55*852ba100SJustin Hibbits uint32_t fman_prs_get_expt_ev_mask(struct fman_prs_regs *regs)
56*852ba100SJustin Hibbits {
57*852ba100SJustin Hibbits 	return ioread32be(&regs->fmpr_pever);
58*852ba100SJustin Hibbits }
59*852ba100SJustin Hibbits 
fman_prs_ack_expt_event(struct fman_prs_regs * regs,uint32_t event)60*852ba100SJustin Hibbits void fman_prs_ack_expt_event(struct fman_prs_regs *regs, uint32_t event)
61*852ba100SJustin Hibbits {
62*852ba100SJustin Hibbits 	iowrite32be(event, &regs->fmpr_pevr);
63*852ba100SJustin Hibbits }
64*852ba100SJustin Hibbits 
fman_prs_defconfig(struct fman_prs_cfg * cfg)65*852ba100SJustin Hibbits void fman_prs_defconfig(struct fman_prs_cfg *cfg)
66*852ba100SJustin Hibbits {
67*852ba100SJustin Hibbits 	cfg->port_id_stat = 0;
68*852ba100SJustin Hibbits 	cfg->max_prs_cyc_lim = DEFAULT_MAX_PRS_CYC_LIM;
69*852ba100SJustin Hibbits 	cfg->prs_exceptions = 0x03000000;
70*852ba100SJustin Hibbits }
71*852ba100SJustin Hibbits 
fman_prs_init(struct fman_prs_regs * regs,struct fman_prs_cfg * cfg)72*852ba100SJustin Hibbits int fman_prs_init(struct fman_prs_regs *regs, struct fman_prs_cfg *cfg)
73*852ba100SJustin Hibbits {
74*852ba100SJustin Hibbits 	uint32_t tmp;
75*852ba100SJustin Hibbits 
76*852ba100SJustin Hibbits 	iowrite32be(cfg->max_prs_cyc_lim, &regs->fmpr_rpclim);
77*852ba100SJustin Hibbits 	iowrite32be((FM_PCD_PRS_SINGLE_ECC | FM_PCD_PRS_PORT_IDLE_STS),
78*852ba100SJustin Hibbits 			&regs->fmpr_pevr);
79*852ba100SJustin Hibbits 
80*852ba100SJustin Hibbits 	if (cfg->prs_exceptions & FM_PCD_EX_PRS_SINGLE_ECC)
81*852ba100SJustin Hibbits 		iowrite32be(FM_PCD_PRS_SINGLE_ECC, &regs->fmpr_pever);
82*852ba100SJustin Hibbits 	else
83*852ba100SJustin Hibbits 		iowrite32be(0, &regs->fmpr_pever);
84*852ba100SJustin Hibbits 
85*852ba100SJustin Hibbits 	iowrite32be(FM_PCD_PRS_DOUBLE_ECC, &regs->fmpr_perr);
86*852ba100SJustin Hibbits 
87*852ba100SJustin Hibbits 	tmp = 0;
88*852ba100SJustin Hibbits 	if (cfg->prs_exceptions & FM_PCD_EX_PRS_DOUBLE_ECC)
89*852ba100SJustin Hibbits 		tmp |= FM_PCD_PRS_DOUBLE_ECC;
90*852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->fmpr_perer);
91*852ba100SJustin Hibbits 
92*852ba100SJustin Hibbits 	iowrite32be(cfg->port_id_stat, &regs->fmpr_ppsc);
93*852ba100SJustin Hibbits 
94*852ba100SJustin Hibbits 	return 0;
95*852ba100SJustin Hibbits }
96*852ba100SJustin Hibbits 
fman_prs_enable(struct fman_prs_regs * regs)97*852ba100SJustin Hibbits void fman_prs_enable(struct fman_prs_regs *regs)
98*852ba100SJustin Hibbits {
99*852ba100SJustin Hibbits 	uint32_t tmp;
100*852ba100SJustin Hibbits 
101*852ba100SJustin Hibbits 	tmp = ioread32be(&regs->fmpr_rpimac) | FM_PCD_PRS_RPIMAC_EN;
102*852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->fmpr_rpimac);
103*852ba100SJustin Hibbits }
104*852ba100SJustin Hibbits 
fman_prs_disable(struct fman_prs_regs * regs)105*852ba100SJustin Hibbits void fman_prs_disable(struct fman_prs_regs *regs)
106*852ba100SJustin Hibbits {
107*852ba100SJustin Hibbits 	uint32_t tmp;
108*852ba100SJustin Hibbits 
109*852ba100SJustin Hibbits 	tmp = ioread32be(&regs->fmpr_rpimac) & ~FM_PCD_PRS_RPIMAC_EN;
110*852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->fmpr_rpimac);
111*852ba100SJustin Hibbits }
112*852ba100SJustin Hibbits 
fman_prs_is_enabled(struct fman_prs_regs * regs)113*852ba100SJustin Hibbits int fman_prs_is_enabled(struct fman_prs_regs *regs)
114*852ba100SJustin Hibbits {
115*852ba100SJustin Hibbits 	return ioread32be(&regs->fmpr_rpimac) & FM_PCD_PRS_RPIMAC_EN;
116*852ba100SJustin Hibbits }
117*852ba100SJustin Hibbits 
fman_prs_set_stst_port_msk(struct fman_prs_regs * regs,uint32_t pid_msk)118*852ba100SJustin Hibbits void fman_prs_set_stst_port_msk(struct fman_prs_regs *regs, uint32_t pid_msk)
119*852ba100SJustin Hibbits {
120*852ba100SJustin Hibbits 	iowrite32be(pid_msk, &regs->fmpr_ppsc);
121*852ba100SJustin Hibbits }
122*852ba100SJustin Hibbits 
fman_prs_set_stst(struct fman_prs_regs * regs,bool enable)123*852ba100SJustin Hibbits void fman_prs_set_stst(struct fman_prs_regs *regs, bool enable)
124*852ba100SJustin Hibbits {
125*852ba100SJustin Hibbits 	if (enable)
126*852ba100SJustin Hibbits 		iowrite32be(FM_PCD_PRS_PPSC_ALL_PORTS, &regs->fmpr_ppsc);
127*852ba100SJustin Hibbits 	else
128*852ba100SJustin Hibbits 		iowrite32be(0, &regs->fmpr_ppsc);
129*852ba100SJustin Hibbits }
130