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 2010-2012
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 ***********************************************/
41 #include <stdint.h>
42 #include <stdio.h>
43 #include <string.h>
44 #include <sys/types.h>
45 #include <sys/stat.h>
46 #include <fcntl.h>
47 #include <sys/mman.h>
48 #include <errno.h>
49 #include <unistd.h>
51 #include <ti/csl/cslr_device.h>
52 #include <ti/drv/qmss/qmss_qm.h>
53 #include "netapi.h"
54 #include "hplib.h"
56 //pull in device config for qmss, cppi
57 #include "qmss_device.c"
58 #include "cppi_device.c"
60 /******************************************************************************
61 * Macro to convert to IP Register Virtual Address from a mapped base Virtual
62 * Address
63 * Input: virtBaseAddr: Virtual base address mapped using mmap for IP
64 * phyBaseAddr: Physical base address for the IP
65 * phyRegAddr: Physical register address
66 ******************************************************************************/
67 static inline void* NETAPI_GET_REG_VADDR (void * virtBaseAddr,
68 uint32_t phyBaseAddr,
69 uint32_t phyRegAddr)
70 {
71 return((void *)((uint8_t *)virtBaseAddr + (phyRegAddr - phyBaseAddr)));
72 }
75 //*************************************************
76 //initilaize CPPI (once per soc)
77 //*************************************************
78 int netapi_init_cppi(void)
79 {
80 int32_t result, i;
81 Cppi_GlobalConfigParams netapi_cppiGblCfgParams[CPPI_MAX_CPDMA];
83 for (i=0; i<CPPI_MAX_CPDMA; i++)
84 netapi_cppiGblCfgParams[i] = cppiGblCfgParams[i];
86 /* SRIO CPDMA regs */
87 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].gblCfgRegs =
88 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
89 CSL_SRIO_CONFIG_REGS,
90 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].gblCfgRegs);
92 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txChRegs =
93 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
94 CSL_SRIO_CONFIG_REGS,
95 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txChRegs);
97 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxChRegs =
98 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
99 CSL_SRIO_CONFIG_REGS,
100 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxChRegs);
102 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txSchedRegs =
103 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
104 CSL_SRIO_CONFIG_REGS,
105 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txSchedRegs);
107 netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxFlowRegs =
108 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
109 CSL_SRIO_CONFIG_REGS,
110 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxFlowRegs);
112 /* PASS CPDMA regs */
113 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].gblCfgRegs =
114 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
115 CSL_PA_SS_CFG_REGS,
116 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].gblCfgRegs);
118 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txChRegs =
119 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
120 CSL_PA_SS_CFG_REGS,
121 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txChRegs);
123 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxChRegs =
124 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
125 CSL_PA_SS_CFG_REGS,
126 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxChRegs);
128 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txSchedRegs =
129 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
130 CSL_PA_SS_CFG_REGS,
131 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txSchedRegs);
133 netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxFlowRegs =
134 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
135 CSL_PA_SS_CFG_REGS,
136 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxFlowRegs);
138 /* QMSS CPDMA regs */
139 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].gblCfgRegs =
140 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
141 QMSS_CFG_BASE_ADDR,
142 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].gblCfgRegs);
144 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txChRegs =
145 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
146 QMSS_CFG_BASE_ADDR,
147 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txChRegs);
149 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxChRegs =
150 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
151 QMSS_CFG_BASE_ADDR,
152 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxChRegs);
154 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txSchedRegs =
155 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
156 QMSS_CFG_BASE_ADDR,
157 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txSchedRegs);
159 netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxFlowRegs =
160 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
161 QMSS_CFG_BASE_ADDR,
162 (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxFlowRegs);
164 result = Cppi_init (netapi_cppiGblCfgParams);
165 if (result != CPPI_SOK)
166 {
167 printf (">function cppi_init: Cppi_init failed with error code %d\n", result);
168 return (-1);
169 }
170 return 1;
171 }
173 //****************************************************
174 // initialize QM (per SOC)
175 //***************************************************
176 int netapi_init_qm(int max_descriptors)
177 {
178 Qmss_InitCfg qmssInitConfig;
179 int32_t result;
180 Qmss_GlobalConfigParams netapi_qmssGblCfgParams;
182 memset (&qmssInitConfig, 0, sizeof (Qmss_InitCfg));
184 /* Use Internal Linking RAM for optimal performance */
185 qmssInitConfig.linkingRAM0Base = 0;
186 qmssInitConfig.linkingRAM0Size = 0;
187 qmssInitConfig.linkingRAM1Base = 0;
188 qmssInitConfig.maxDescNum = max_descriptors;
189 qmssInitConfig.qmssHwStatus =QMSS_HW_INIT_COMPLETE; //bypass some of the hw init
190 netapi_qmssGblCfgParams = qmssGblCfgParams[0];
192 netapi_qmssGblCfgParams.qmConfigReg =
193 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
194 QMSS_CFG_BASE_ADDR,
195 (uint32_t)netapi_qmssGblCfgParams.qmConfigReg);
197 netapi_qmssGblCfgParams.qmDescReg =
198 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
199 QMSS_CFG_BASE_ADDR,
200 (uint32_t)netapi_qmssGblCfgParams.qmDescReg);
202 netapi_qmssGblCfgParams.qmQueMgmtReg =
203 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
204 QMSS_CFG_BASE_ADDR,
205 (uint32_t)netapi_qmssGblCfgParams.qmQueMgmtReg);
207 netapi_qmssGblCfgParams.qmQueMgmtProxyReg =
208 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
209 QMSS_CFG_BASE_ADDR,
210 (uint32_t)netapi_qmssGblCfgParams.qmQueMgmtProxyReg);
212 netapi_qmssGblCfgParams.qmQueStatReg =
213 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
214 QMSS_CFG_BASE_ADDR,
215 (uint32_t)netapi_qmssGblCfgParams.qmQueStatReg);
217 netapi_qmssGblCfgParams.qmQueIntdReg =
218 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
219 QMSS_CFG_BASE_ADDR,
220 (uint32_t)netapi_qmssGblCfgParams.qmQueIntdReg);
222 netapi_qmssGblCfgParams.qmPdspCmdReg[0] =
223 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
224 QMSS_CFG_BASE_ADDR,
225 (uint32_t)netapi_qmssGblCfgParams.qmPdspCmdReg[0]);
227 netapi_qmssGblCfgParams.qmPdspCmdReg[1] =
228 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
229 QMSS_CFG_BASE_ADDR,
230 (uint32_t)netapi_qmssGblCfgParams.qmPdspCmdReg[1]);
232 netapi_qmssGblCfgParams.qmPdspCtrlReg[0] =
233 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
234 QMSS_CFG_BASE_ADDR,
235 (uint32_t)netapi_qmssGblCfgParams.qmPdspCtrlReg[0]);
237 netapi_qmssGblCfgParams.qmPdspCtrlReg[1] =
238 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
239 QMSS_CFG_BASE_ADDR,
240 (uint32_t)netapi_qmssGblCfgParams.qmPdspCtrlReg[1]);
242 netapi_qmssGblCfgParams.qmPdspIRamReg[0] =
243 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
244 QMSS_CFG_BASE_ADDR,
245 (uint32_t)netapi_qmssGblCfgParams.qmPdspIRamReg[0]);
247 netapi_qmssGblCfgParams.qmPdspIRamReg[1] =
248 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
249 QMSS_CFG_BASE_ADDR,
250 (uint32_t)netapi_qmssGblCfgParams.qmPdspIRamReg[1]);
252 netapi_qmssGblCfgParams.qmStatusRAM =
253 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
254 QMSS_CFG_BASE_ADDR,
255 (uint32_t)netapi_qmssGblCfgParams.qmStatusRAM);
256 netapi_qmssGblCfgParams.qmLinkingRAMReg =
257 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
258 QMSS_CFG_BASE_ADDR,
259 (uint32_t)netapi_qmssGblCfgParams.qmLinkingRAMReg);
260 netapi_qmssGblCfgParams.qmMcDMAReg =
261 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
262 QMSS_CFG_BASE_ADDR,
263 (uint32_t)netapi_qmssGblCfgParams.qmMcDMAReg);
265 netapi_qmssGblCfgParams.qmTimer16Reg[0] =
266 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
267 QMSS_CFG_BASE_ADDR,
268 (uint32_t)netapi_qmssGblCfgParams.qmTimer16Reg[0]);
270 netapi_qmssGblCfgParams.qmTimer16Reg[1] =
271 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
272 QMSS_CFG_BASE_ADDR,
273 (uint32_t)netapi_qmssGblCfgParams.qmTimer16Reg[1]);
276 netapi_qmssGblCfgParams.qmQueMgmtDataReg =
277 (void *)((uint32_t)netapi_VM_VirtAddr->qmssDataVaddr);
279 netapi_qmssGblCfgParams.qmQueMgmtProxyDataReg =
280 NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssDataVaddr,
281 QMSS_DATA_BASE_ADDR,
282 QMSS_DATA_ARM_PROXY_QUEUE_DEQUEUE_REGS);
284 result = Qmss_init (&qmssInitConfig, &netapi_qmssGblCfgParams);
285 if (result != QMSS_SOK) {
286 printf (">function init_qm: qmss_Init failed with error code %d\n", result);
287 return (nwal_FALSE);
288 }
290 return 1;
291 }