1 /************************************************
2 * FILE: netapi_device.c
3 * Device specific initialization for NETAPI
4 *
5 * DESCRIPTION: Functions to initialize multicore navigator related global
6 * resources
7 *
8 * REVISION HISTORY:
9 *
10 * Copyright (c) Texas Instruments Incorporated 2013
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 *
16 * Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 *
19 * Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the
22 * distribution.
23 *
24 * Neither the name of Texas Instruments Incorporated nor the names of
25 * its contributors may be used to endorse or promote products derived
26 * from this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 *
40 ***********************************************/
42 #include "netapi.h"
43 #include <sys/types.h>
44 #include <sys/stat.h>
45 #include <fcntl.h>
46 #include <sys/mman.h>
47 #include <errno.h>
48 #include <unistd.h>
50 #include <ti/csl/cslr_device.h>
51 #include <ti/drv/qmss/qmss_qm.h>
53 //pull in device config for qmss, cppi
54 #include "qmss_device.c"
55 #include "cppi_device.c"
57 /********************************************************************
58 * FUNCTION PURPOSE: Internal NETAPI macro to convert to IP Register
59 * Virtual Address from a mapped base Virtual
60 * Address.
61 ********************************************************************
62 * DESCRIPTION: Arguments:
63 * virtBaseAddr: Virtual base address mapped using mmap for IP
64 * phyBaseAddr: Physical base address for the IP
65 * phyRegAddr: Physical register address
66 ********************************************************************/
69 static inline void* NETAPI_GET_REG_VADDR (void * virtBaseAddr,
70 uint32_t phyBaseAddr,
71 uint32_t phyRegAddr)
72 {
73 return((void *)((uint8_t *)virtBaseAddr + (phyRegAddr - phyBaseAddr)));
74 }
77 /********************************************************************
78 * FUNCTION PURPOSE: Internal NETAI function ti initialize CPPI.
79 ********************************************************************
80 * DESCRIPTION: Internal NETAI function ti initialize CPPI
81 ********************************************************************/
82 int netapip_initCppi(void* rmClientServiceHandle)
83 {
84 int32_t result, i;
85 Cppi_GlobalConfigParams netapi_cppiGblCfgParams[CPPI_MAX_CPDMA];
86 Cppi_StartCfg netapi_cppiStartCfg;
88 memset(&netapi_cppiStartCfg, 0, sizeof(Cppi_StartCfg));
90 for (i=0; i<CPPI_MAX_CPDMA; i++)
91 netapi_cppiGblCfgParams[i] = cppiGblCfgParams[i];
93 /* SRIO CPDMA regs */
94 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].gblCfgRegs =
95 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
96 CSL_SRIO_CONFIG_REGS,
97 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].gblCfgRegs);
99 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txChRegs =
100 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
101 CSL_SRIO_CONFIG_REGS,
102 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txChRegs);
104 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxChRegs =
105 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
106 CSL_SRIO_CONFIG_REGS,
107 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxChRegs);
109 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txSchedRegs =
110 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
111 CSL_SRIO_CONFIG_REGS,
112 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txSchedRegs);
114 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxFlowRegs =
115 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
116 CSL_SRIO_CONFIG_REGS,
117 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxFlowRegs);
119 /* PASS CPDMA regs */
120 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].gblCfgRegs =
121 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
122 CSL_PA_SS_CFG_REGS,
123 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].gblCfgRegs);
125 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txChRegs =
126 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
127 CSL_PA_SS_CFG_REGS,
128 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txChRegs);
130 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxChRegs =
131 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
132 CSL_PA_SS_CFG_REGS,
133 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxChRegs);
135 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txSchedRegs =
136 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
137 CSL_PA_SS_CFG_REGS,
138 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txSchedRegs);
140 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxFlowRegs =
141 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
142 CSL_PA_SS_CFG_REGS,
143 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxFlowRegs);
145 /* QMSS CPDMA regs */
146 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].gblCfgRegs =
147 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
148 QMSS_CFG_BASE_ADDR,
149 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].gblCfgRegs);
151 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txChRegs =
152 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
153 QMSS_CFG_BASE_ADDR,
154 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txChRegs);
156 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxChRegs =
157 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
158 QMSS_CFG_BASE_ADDR,
159 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxChRegs);
161 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txSchedRegs =
162 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
163 QMSS_CFG_BASE_ADDR,
164 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txSchedRegs);
166 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxFlowRegs =
167 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
168 QMSS_CFG_BASE_ADDR,
169 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxFlowRegs);
171 result = Cppi_init (netapi_cppiGblCfgParams);
172 if (result != CPPI_SOK)
173 {
174 return (-1);
175 }
176 if (rmClientServiceHandle)
177 {
178 netapi_cppiStartCfg.rmServiceHandle = rmClientServiceHandle;
179 Cppi_startCfg(&netapi_cppiStartCfg);
180 }
181 return 1;
182 }
184 /********************************************************************
185 * FUNCTION PURPOSE: Internal NETAI function ti initialize QM.
186 ********************************************************************
187 * DESCRIPTION: Internal NETAI function ti initialize QM (once per SOC)
188 ********************************************************************/
189 int netapip_initQm(int max_descriptors, void* rmClientServiceHandle))
190 {
191 Qmss_InitCfg qmssInitConfig;
192 int32_t result;
193 Qmss_GlobalConfigParams netapi_qmssGblCfgParams;
195 memset (&qmssInitConfig, 0, sizeof (Qmss_InitCfg));
197 /* Use Internal Linking RAM for optimal performance */
198 qmssInitConfig.linkingRAM0Base = 0;
199 qmssInitConfig.linkingRAM0Size = 0;
200 qmssInitConfig.linkingRAM1Base = 0;
201 qmssInitConfig.maxDescNum = max_descriptors;
202 qmssInitConfig.qmssHwStatus =QMSS_HW_INIT_COMPLETE; //bypass some of the hw init
203 netapi_qmssGblCfgParams = qmssGblCfgParams[0];
205 netapi_qmssGblCfgParams.qmConfigReg =
206 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
207 QMSS_CFG_BASE_ADDR,
208 (uint32_t)netapi_qmssGblCfgParams.qmConfigReg);
210 netapi_qmssGblCfgParams.qmDescReg =
211 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
212 QMSS_CFG_BASE_ADDR,
213 (uint32_t)netapi_qmssGblCfgParams.qmDescReg);
215 netapi_qmssGblCfgParams.qmQueMgmtReg =
216 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
217 QMSS_CFG_BASE_ADDR,
218 (uint32_t)netapi_qmssGblCfgParams.qmQueMgmtReg);
220 netapi_qmssGblCfgParams.qmQueMgmtProxyReg =
221 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
222 QMSS_CFG_BASE_ADDR,
223 (uint32_t)netapi_qmssGblCfgParams.qmQueMgmtProxyReg);
225 netapi_qmssGblCfgParams.qmQueStatReg =
226 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
227 QMSS_CFG_BASE_ADDR,
228 (uint32_t)netapi_qmssGblCfgParams.qmQueStatReg);
230 netapi_qmssGblCfgParams.qmQueIntdReg =
231 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
232 QMSS_CFG_BASE_ADDR,
233 (uint32_t)netapi_qmssGblCfgParams.qmQueIntdReg);
235 netapi_qmssGblCfgParams.qmPdspCmdReg[0] =
236 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
237 QMSS_CFG_BASE_ADDR,
238 (uint32_t)netapi_qmssGblCfgParams.qmPdspCmdReg[0]);
240 netapi_qmssGblCfgParams.qmPdspCmdReg[1] =
241 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
242 QMSS_CFG_BASE_ADDR,
243 (uint32_t)netapi_qmssGblCfgParams.qmPdspCmdReg[1]);
245 netapi_qmssGblCfgParams.qmPdspCtrlReg[0] =
246 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
247 QMSS_CFG_BASE_ADDR,
248 (uint32_t)netapi_qmssGblCfgParams.qmPdspCtrlReg[0]);
250 netapi_qmssGblCfgParams.qmPdspCtrlReg[1] =
251 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
252 QMSS_CFG_BASE_ADDR,
253 (uint32_t)netapi_qmssGblCfgParams.qmPdspCtrlReg[1]);
255 netapi_qmssGblCfgParams.qmPdspIRamReg[0] =
256 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
257 QMSS_CFG_BASE_ADDR,
258 (uint32_t)netapi_qmssGblCfgParams.qmPdspIRamReg[0]);
260 netapi_qmssGblCfgParams.qmPdspIRamReg[1] =
261 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
262 QMSS_CFG_BASE_ADDR,
263 (uint32_t)netapi_qmssGblCfgParams.qmPdspIRamReg[1]);
265 netapi_qmssGblCfgParams.qmStatusRAM =
266 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
267 QMSS_CFG_BASE_ADDR,
268 (uint32_t)netapi_qmssGblCfgParams.qmStatusRAM);
270 netapi_qmssGblCfgParams.qmLinkingRAMReg =
271 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
272 QMSS_CFG_BASE_ADDR,
273 (uint32_t)netapi_qmssGblCfgParams.qmLinkingRAMReg);
275 netapi_qmssGblCfgParams.qmMcDMAReg =
276 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
277 QMSS_CFG_BASE_ADDR,
278 (uint32_t)netapi_qmssGblCfgParams.qmMcDMAReg);
280 netapi_qmssGblCfgParams.qmTimer16Reg[0] =
281 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
282 QMSS_CFG_BASE_ADDR,
283 (uint32_t)netapi_qmssGblCfgParams.qmTimer16Reg[0]);
285 netapi_qmssGblCfgParams.qmTimer16Reg[1] =
286 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
287 QMSS_CFG_BASE_ADDR,
288 (uint32_t)netapi_qmssGblCfgParams.qmTimer16Reg[1]);
290 netapi_qmssGblCfgParams.qmQueMgmtDataReg =
291 (void *)((uint32_t)netapi_VM_VirtAddr->qmssDataVaddr);
294 if (rmClientServiceHandle)
295 netapi_qmssGblCfgParams.qmRmServiceHandle = rmClientServiceHandle;
297 netapi_qmssGblCfgParams.qmQueMgmtProxyDataReg = NULL;
298 result = Qmss_init (&qmssInitConfig, &netapi_qmssGblCfgParams);
299 if (result != QMSS_SOK) {
300 return (nwal_FALSE);
301 }
302 return 1;
303 }