]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/netapi.git/blob - ti/runtime/netapi/src/pdkv2/netapi_navig.c
Merge pull request #1 in PROCESSOR-SDK/netapi from VER_UPDATE_1_1_0_8 to master
[keystone-rtos/netapi.git] / ti / runtime / netapi / src / pdkv2 / netapi_navig.c
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;
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))
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;