]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/netapi.git/blob - ti/runtime/netapi/src/pdkv2/netapi_navig.c
Incorporated code review comments, source file cleanup, implemented support for GMAC...
[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 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"
61 /********************************************************************
62  * FUNCTION PURPOSE:  Internal NETAPI macro to convert to IP Register
63  *                    Virtual Address from a mapped base Virtual
64  *                    Address.
65  ********************************************************************
66  * DESCRIPTION:  Arguments:
67  *      virtBaseAddr: Virtual base address mapped using mmap for IP
68  *       phyBaseAddr: Physical base address for the IP
69  *       phyRegAddr:  Physical register address
70  ********************************************************************/
73 static inline void* NETAPI_GET_REG_VADDR (void *    virtBaseAddr,
74                                           uint32_t  phyBaseAddr,
75                                           uint32_t  phyRegAddr)
76 {
77     return((void *)((uint8_t *)virtBaseAddr + (phyRegAddr - phyBaseAddr)));
78 }
81 /********************************************************************
82  * FUNCTION PURPOSE:  Internal NETAI function ti initialize CPPI. 
83  ********************************************************************
84  * DESCRIPTION:  Internal NETAI function ti initialize CPPI
85  ********************************************************************/
86 int netapi_init_cppi(void)
87 {
88     int32_t result, i;
89     Cppi_GlobalConfigParams     netapi_cppiGblCfgParams[CPPI_MAX_CPDMA];
91     for (i=0; i<CPPI_MAX_CPDMA; i++)
92         netapi_cppiGblCfgParams[i] = cppiGblCfgParams[i];
94     /* SRIO CPDMA regs */
95     netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].gblCfgRegs =
96      NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
97                         CSL_SRIO_CONFIG_REGS,
98                         (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].gblCfgRegs);
100     netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txChRegs =
101      NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
102                           CSL_SRIO_CONFIG_REGS,
103                           (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txChRegs);
105     netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxChRegs =
106      NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
107                           CSL_SRIO_CONFIG_REGS,
108                           (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxChRegs);
110     netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txSchedRegs =
111      NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
112                           CSL_SRIO_CONFIG_REGS,
113                           (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].txSchedRegs);
115    netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxFlowRegs =
116      NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->srioCfgVaddr,
117                           CSL_SRIO_CONFIG_REGS,
118                           (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_SRIO_CPDMA].rxFlowRegs);
120     /* PASS CPDMA regs */
121     netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].gblCfgRegs =
122       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
123                            CSL_PA_SS_CFG_REGS,
124                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].gblCfgRegs);
126     netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txChRegs =
127       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
128                            CSL_PA_SS_CFG_REGS,
129                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txChRegs);
131     netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxChRegs =
132       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
133                            CSL_PA_SS_CFG_REGS,
134                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxChRegs);
136     netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txSchedRegs =
137       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
138                            CSL_PA_SS_CFG_REGS,
139                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].txSchedRegs);
141     netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxFlowRegs =
142       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->passCfgVaddr,
143                            CSL_PA_SS_CFG_REGS,
144                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_PASS_CPDMA].rxFlowRegs);
146    /* QMSS CPDMA regs */
147     netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].gblCfgRegs =
148       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
149                            QMSS_CFG_BASE_ADDR,
150                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].gblCfgRegs);
152     netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txChRegs =
153       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
154                            QMSS_CFG_BASE_ADDR,
155                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txChRegs);
157     netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxChRegs =
158       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
159                            QMSS_CFG_BASE_ADDR,
160                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxChRegs);
162     netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txSchedRegs =
163       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
164                            QMSS_CFG_BASE_ADDR,
165                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].txSchedRegs);
167     netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxFlowRegs =
168       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
169                            QMSS_CFG_BASE_ADDR,
170                            (uint32_t)netapi_cppiGblCfgParams[Cppi_CpDma_QMSS_CPDMA].rxFlowRegs);
172     result = Cppi_init (netapi_cppiGblCfgParams);
173     if (result != CPPI_SOK)
174     {
175       printf (">function cppi_init: Cppi_init failed with error code %d\n", result);
176       return (-1);
177     }
178      return 1;
181 /********************************************************************
182  * FUNCTION PURPOSE:  Internal NETAI function ti initialize QM. 
183  ********************************************************************
184  * DESCRIPTION:  Internal NETAI function ti initialize QM (once per SOC)
185  ********************************************************************/
186 int netapi_init_qm(int max_descriptors)
188     Qmss_InitCfg     qmssInitConfig;
189     int32_t          result;
190     Qmss_GlobalConfigParams netapi_qmssGblCfgParams;
192     memset (&qmssInitConfig, 0, sizeof (Qmss_InitCfg));
194     /* Use Internal Linking RAM for optimal performance */
195     qmssInitConfig.linkingRAM0Base = 0;
196     qmssInitConfig.linkingRAM0Size = 0;
197     qmssInitConfig.linkingRAM1Base = 0;
198     qmssInitConfig.maxDescNum      = max_descriptors;
199     qmssInitConfig.qmssHwStatus =QMSS_HW_INIT_COMPLETE; //bypass some of the hw init
200     netapi_qmssGblCfgParams = qmssGblCfgParams[0];
202     netapi_qmssGblCfgParams.qmConfigReg =
203       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
204                            QMSS_CFG_BASE_ADDR,
205                            (uint32_t)netapi_qmssGblCfgParams.qmConfigReg);
207     netapi_qmssGblCfgParams.qmDescReg =
208       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
209                            QMSS_CFG_BASE_ADDR,
210                            (uint32_t)netapi_qmssGblCfgParams.qmDescReg);
212     netapi_qmssGblCfgParams.qmQueMgmtReg =
213       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
214                            QMSS_CFG_BASE_ADDR,
215                            (uint32_t)netapi_qmssGblCfgParams.qmQueMgmtReg);
217     netapi_qmssGblCfgParams.qmQueMgmtProxyReg =
218       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
219                            QMSS_CFG_BASE_ADDR,
220                            (uint32_t)netapi_qmssGblCfgParams.qmQueMgmtProxyReg);
222     netapi_qmssGblCfgParams.qmQueStatReg =
223       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
224                            QMSS_CFG_BASE_ADDR,
225                            (uint32_t)netapi_qmssGblCfgParams.qmQueStatReg);
227     netapi_qmssGblCfgParams.qmQueIntdReg =
228       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
229                            QMSS_CFG_BASE_ADDR,
230                            (uint32_t)netapi_qmssGblCfgParams.qmQueIntdReg);
232     netapi_qmssGblCfgParams.qmPdspCmdReg[0] =
233       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
234                            QMSS_CFG_BASE_ADDR,
235                            (uint32_t)netapi_qmssGblCfgParams.qmPdspCmdReg[0]);
237     netapi_qmssGblCfgParams.qmPdspCmdReg[1] =
238       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
239                            QMSS_CFG_BASE_ADDR,
240                            (uint32_t)netapi_qmssGblCfgParams.qmPdspCmdReg[1]);
242     netapi_qmssGblCfgParams.qmPdspCtrlReg[0] =
243       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
244                            QMSS_CFG_BASE_ADDR,
245                            (uint32_t)netapi_qmssGblCfgParams.qmPdspCtrlReg[0]);
247     netapi_qmssGblCfgParams.qmPdspCtrlReg[1] =
248       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
249                            QMSS_CFG_BASE_ADDR,
250                            (uint32_t)netapi_qmssGblCfgParams.qmPdspCtrlReg[1]);
252     netapi_qmssGblCfgParams.qmPdspIRamReg[0] =
253       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
254                            QMSS_CFG_BASE_ADDR,
255                            (uint32_t)netapi_qmssGblCfgParams.qmPdspIRamReg[0]);
257     netapi_qmssGblCfgParams.qmPdspIRamReg[1] =
258       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
259                            QMSS_CFG_BASE_ADDR,
260                            (uint32_t)netapi_qmssGblCfgParams.qmPdspIRamReg[1]);
262     netapi_qmssGblCfgParams.qmStatusRAM =
263       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
264                            QMSS_CFG_BASE_ADDR,
265                            (uint32_t)netapi_qmssGblCfgParams.qmStatusRAM);
267     netapi_qmssGblCfgParams.qmLinkingRAMReg =
268       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
269                            QMSS_CFG_BASE_ADDR,
270                            (uint32_t)netapi_qmssGblCfgParams.qmLinkingRAMReg);
272     netapi_qmssGblCfgParams.qmMcDMAReg =
273       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
274                            QMSS_CFG_BASE_ADDR,
275                            (uint32_t)netapi_qmssGblCfgParams.qmMcDMAReg);
277     netapi_qmssGblCfgParams.qmTimer16Reg[0] =
278       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
279                            QMSS_CFG_BASE_ADDR,
280                            (uint32_t)netapi_qmssGblCfgParams.qmTimer16Reg[0]);
282     netapi_qmssGblCfgParams.qmTimer16Reg[1] =
283       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssCfgVaddr,
284                            QMSS_CFG_BASE_ADDR,
285                            (uint32_t)netapi_qmssGblCfgParams.qmTimer16Reg[1]);
287     netapi_qmssGblCfgParams.qmQueMgmtDataReg = 
288                                                       (void *)((uint32_t)netapi_VM_VirtAddr->qmssDataVaddr);
290     netapi_qmssGblCfgParams.qmQueMgmtProxyDataReg =
291       NETAPI_GET_REG_VADDR(netapi_VM_VirtAddr->qmssDataVaddr,
292                            QMSS_DATA_BASE_ADDR,
293                            QMSS_DATA_ARM_PROXY_QUEUE_DEQUEUE_REGS);
295     result = Qmss_init (&qmssInitConfig, &netapi_qmssGblCfgParams);
296     if (result != QMSS_SOK)  {
297         printf (">function init_qm: qmss_Init failed with error code %d\n", result);
298         return (nwal_FALSE);
299     }
300     return 1;