initial release
[apps/tidep0074.git] / ipu1 / Server.c
1 /*
2  * Copyright (c) 2013-2016, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
33 /*
34  *  ======== Server.c ========
35  *
36  */
38 /* this define must precede inclusion of any xdc header file */
39 #define Registry_CURDESC Test__Desc
40 #define MODULE_NAME "Server"
42 /* xdctools header files */
43 #include <xdc/std.h>
44 #include <xdc/runtime/Assert.h>
45 #include <xdc/runtime/Diags.h>
46 #include <xdc/runtime/Log.h>
47 #include <xdc/runtime/Registry.h>
49 #include <stdio.h>
50 #include <string.h>
52 /* package header files */
53 #include <ti/ipc/MessageQ.h>
54 #include <ti/ipc/MultiProc.h>
56 #include <ti/sysbios/BIOS.h>
57 #include <ti/sysbios/knl/Task.h>
58 #include <ti/sysbios/hal/Cache.h>
59 #include "ti/osal/SemaphoreP.h"
61 /* local header files */
62 #include "../shared/AppCommon.h"
64 /* module header file */
65 #include "Server.h"
67 #define VIRT1 (-0x90000000U) /* PA 0xA0000000<->VA 0x10000000, see RSC table */
68 /* module structure */
69 typedef struct {
70         UInt16              hostProcId;         // host processor id
71         MessageQ_Handle     slaveQue;           // created locally
72 } Server_Module;
74 /* private data */
75 Registry_Desc               Registry_CURDESC;
76 static Server_Module        Module;
78 #define TEST_PORT 0
80 UInt32 *pRxPkt;
81 extern UInt32 packetLength;
83 UInt32 *pGoosePara;
84 UInt32 bGooseFilter = 1;
85 extern void Goose_para_config();
87 extern void *icssRxSem;
88 extern void icss_rx();
90 extern void icss_tx();
91 extern void icss_tx_mpu(UInt32 *PTxPacket, Int TxPacketLen);
93 /*
94  *  ======== Server_init ========
95  */
96 Void Server_init(Void)
97 {
98         Registry_Result result;
100         /* register with xdc.runtime to get a diags mask */
101         result = Registry_addModule(&Registry_CURDESC, MODULE_NAME);
102         Assert_isTrue(result == Registry_SUCCESS, (Assert_Id)NULL);
104         /* initialize module object state */
105         Module.hostProcId = MultiProc_getId("HOST");
109 /*
110  *  ======== Server_create ========
111  */
112 Int Server_create()
114         Int                 status = 0;
115         MessageQ_Params     msgqParams;
116         char                msgqName[32];
118         /* enable some log events */
119         Diags_setMask(MODULE_NAME"+EXF");
121         /* create local message queue (inbound messages) */
122         MessageQ_Params_init(&msgqParams);
123         sprintf(msgqName, App_SlaveMsgQueName, MultiProc_getName(MultiProc_self()));
124         Module.slaveQue = MessageQ_create(msgqName, &msgqParams);
126         if (Module.slaveQue == NULL) {
127                 status = -1;
128                 goto leave;
129         }
131         Log_print0(Diags_INFO,"Server_create: server is ready");
133 leave:
134         Log_print1(Diags_EXIT, "<-- Server_create: %d", (IArg)status);
135         return (status);
141 /*
142  *  ======== Server_exec ========
143  */
144 Int Server_exec()
146         Int                 status;
147         Bool                running = TRUE;
148         App_Msg *           msg;
149         MessageQ_QueueId    queId;
150         UInt32              *pRxPkt0, *pRxPkt1;
152 #ifdef TX_FROM_A15
153         UInt32              *pTxPkt0, *pTxPkt1;
154 #endif
156         Log_print0(Diags_ENTRY | Diags_INFO, "--> Server_exec:");
158         while (running) {
160                 /* wait for inbound message */
161                 status = MessageQ_get(Module.slaveQue, (MessageQ_Msg *)&msg,
162                                 MessageQ_FOREVER);
164                 if (status < 0) {
165                         goto leave;
166                 }
167                 if (msg->cmd == App_CMD_GOOSE_DISABLE)
168                         bGooseFilter = 0;
170                 if (msg->cmd == App_CMD_CMEMBUF) {
172                         pRxPkt0 = (UInt32 *)(msg->RxPhysAddr[TEST_PORT][0] + VIRT1);
173                         pRxPkt1 = (UInt32 *)(msg->RxPhysAddr[TEST_PORT][1] + VIRT1);
175                         pRxPkt = pRxPkt0;
177 #ifdef TX_FROM_A15
178                         pTxPkt0 = (UInt32 *)(msg->TxPhysAddr[TEST_PORT][0] + VIRT1);
179                         pTxPkt1 = (UInt32 *)(msg->TxPhysAddr[TEST_PORT][1] + VIRT1);
180 #endif
181                         pGoosePara = (UInt32 *)(msg->GooseParaPhysAddr + VIRT1);
183                         Goose_para_config();
184                 }
186                 if (msg->cmd == App_CMD_SHUTDOWN) {
187                         running = FALSE;
188                 }
190                 /* process the message */
191                 Log_print1(Diags_INFO, "Server_exec: processed cmd=0x%x", msg->cmd);
193                 /* send message back */
194                 queId = MessageQ_getReplyQueue(msg); /* type-cast not needed */
195                 if(msg->cmd == App_CMD_PACKET)
196                 {
197 #ifdef TX_FROM_A15
198                         /* send packets from host A15 */
199                         numBuf = msg->nTxBuf;
200                         TxPktLen = msg->TxPktLen[TEST_PORT][numBuf];
202                         if(TxPktLen != 0 ) {
203                                 if(numBuf == 0) {
204                                         icss_tx_mpu(pTxPkt0, TxPktLen);
205                                 }
206                                 else {
207                                         icss_tx_mpu(pTxPkt1, TxPktLen);
208                                 }
209                         }
210 #endif
212                         icss_tx();
214                         icss_rx();
216                         if (pRxPkt == pRxPkt0) {
217                                 pRxPkt = pRxPkt1;
218                                 msg->RxPktLen[TEST_PORT][0] = packetLength;
219                                 msg->nRxBuf = 0;
220                         } else {
221                                 pRxPkt = pRxPkt0;
222                                 msg->RxPktLen[TEST_PORT][1] = packetLength;
223                                 msg->nRxBuf = 1;
224                         }
225 #ifdef MONITOR_RECV_PACKET
226                         /* log received packets */
227                         for(j=0; j<packetLength; j++)
228                                 Log_print1(Diags_INFO, "%2x", *((char*)pRxPkt+j));
229 #endif
230                         msg->port = TEST_PORT;
231                 }
232                 MessageQ_put(queId, (MessageQ_Msg)msg);
233         } /* while (running) */
235 leave:
236         Log_print1(Diags_EXIT, "<-- Server_exec: %d", (IArg)status);
237         return(status);
240 /*
241  *  ======== Server_delete ========
242  */
244 Int Server_delete()
246         Int         status;
248         Log_print0(Diags_ENTRY, "--> Server_delete:");
250         /* delete the video message queue */
251         status = MessageQ_delete(&Module.slaveQue);
253         if (status < 0) {
254                 goto leave;
255         }
257 leave:
258         if (status < 0) {
259                 Log_error1("Server_finish: error=0x%x", (IArg)status);
260         }
262         /* disable log events */
263         Log_print1(Diags_EXIT, "<-- Server_delete: %d", (IArg)status);
264         Diags_setMask(MODULE_NAME"-EXF");
266         return(status);
269 /*
270  *  ======== Server_exit ========
271  */
273 Void Server_exit(Void)
275          /* Note that there isn't a Registry_removeModule() yet:
276          *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=315448
277          *
278          * ... but this is where we'd call it.
279          */