SrvMgr: Pulled in ServiceMgr (and OmxSrvMgr) from omapzoom sysbios-rpmsg.
[ipc/ipcdev.git] / packages / ti / srvmgr / omx / OmxSrvMgr.c
1 /*
2  * Copyright (c) 2012-2013, 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  */
32 /*
33  *  ======== OmxSrvMgr.c ========
34  *
35  *  The primary task function that serves the incoming requests on the OMX
36  *  Service.
37  */
39 #include <xdc/std.h>
40 #include <xdc/cfg/global.h>
41 #include <xdc/runtime/System.h>
42 #include <xdc/runtime/Startup.h>
43 #include <xdc/runtime/Error.h>
45 #include <ti/sysbios/knl/Task.h>
47 #include <ti/ipc/MultiProc.h>
49 #include <ti/ipc/rpmsg/MessageQCopy.h>
50 /* TBD: ONLY WORKS FORM OMAP5 FOR NOW! */
51 #include <ti/ipc/family/omap54xx/VirtQueue.h>
52 #include <ti/ipc/rpmsg/NameMap.h>
53 #include <ti/srvmgr/rpmsg_omx.h>
54 #include <ti/srvmgr/ServiceMgr.h>
56 #include "package/internal/OmxSrvMgr.xdc.h"
58 /* Hard coded to match rpmsg-omx Host side driver */
59 #define  OMX_MGR_PORT   60
61 Void OmxSrvMgr_taskFxn(UArg arg0, UArg arg1)
62 {
63     MessageQCopy_Handle msgq;
64     UInt32 local;
65     UInt32 remote;
66     Char msg[HDRSIZE + sizeof(struct omx_connect_req)];
67     struct omx_msg_hdr * hdr = (struct omx_msg_hdr *)msg;
68     struct omx_connect_rsp * rsp = (struct omx_connect_rsp *)hdr->data;
69     struct omx_connect_req * req = (struct omx_connect_req *)hdr->data;
70     struct omx_disc_req * disc_req = (struct omx_disc_req *)hdr->data;
71     struct omx_disc_rsp * disc_rsp = (struct omx_disc_rsp *)hdr->data;
72     UInt16 dstProc;
73     UInt16 len;
74     UInt32 newAddr = 0;
76 #ifdef BIOS_ONLY_TEST
77     dstProc = MultiProc_self();
78 #else
79     dstProc = MultiProc_getId("HOST");
80 #endif
82     msgq = MessageQCopy_create(OMX_MGR_PORT, NULL, NULL, &local);
84     System_printf("OmxSrvMgr: started on port: %d\n", OMX_MGR_PORT);
86 #ifdef SMP
87     NameMap_register("rpmsg-omx1", OMX_MGR_PORT);
88     System_printf("OmxSrvMgr: Proc#%d sending BOOTINIT_DONE\n",
89                         MultiProc_self());
90     VirtQueue_postInitDone();
91 #else
92     if (MultiProc_self() == MultiProc_getId("CORE0")) {
93         NameMap_register("rpmsg-omx0", OMX_MGR_PORT);
94     }
95     if (MultiProc_self() == MultiProc_getId("CORE1")) {
96         NameMap_register("rpmsg-omx1", OMX_MGR_PORT);
97     }
98     if (MultiProc_self() == MultiProc_getId("DSP")) {
99         NameMap_register("rpmsg-omx2", OMX_MGR_PORT);
100     }
102     if ((MultiProc_self() == MultiProc_getId("CORE1")) ||
103         (MultiProc_self() == MultiProc_getId("DSP"))) {
104         System_printf("OmxSrvMgr: Proc#%d sending BOOTINIT_DONE\n",
105                         MultiProc_self());
106         VirtQueue_postInitDone();
107     }
108 #endif
110     while (1) {
111        MessageQCopy_recv(msgq, (Ptr)msg, &len, &remote, MessageQCopy_FOREVER);
112        System_printf("OmxSrvMgr: received msg type: %d from addr: %d\n",
113                       hdr->type, remote);
114        switch (hdr->type) {
115            case OMX_CONN_REQ:
116             /* This is a request to create a new service, and return
117              * it's connection endpoint.
118              */
119             System_printf("OmxSrvMgr: CONN_REQ: len: %d, name: %s\n",
120                  hdr->len, req->name);
122             rsp->status = ServiceMgr_createService(req->name, &newAddr);
124             hdr->type = OMX_CONN_RSP;
125             rsp->addr = newAddr;
126             hdr->len = sizeof(struct omx_connect_rsp);
127             len = HDRSIZE + hdr->len;
128             break;
130            case OMX_DISC_REQ:
131             /* Destroy the service instance at given service addr: */
132             System_printf("OmxSrvMgr: OMX_DISCONNECT: len %d, addr: %d\n",
133                  hdr->len, disc_req->addr);
135             disc_rsp->status = ServiceMgr_deleteService(disc_req->addr);
137             /* currently, no response expected from rpmsg_omx: */
138             continue;
139 #if 0       // rpmsg_omx is not listening for this ... yet.
140             hdr->type = OMX_DISC_RSP;
141             hdr->len = sizeof(struct omx_disc_rsp);
142             len = HDRSIZE + hdr->len;
143             break;
144 #endif
146            default:
147             System_printf("unexpected msg type: %d\n", hdr->type);
148             hdr->type = OMX_NOTSUPP;
149             break;
150        }
152        System_printf("OmxSrvMgr: Replying with msg type: %d to addr: %d "
153                       " from: %d\n",
154                       hdr->type, remote, local);
155        MessageQCopy_send(dstProc, remote, local, msg, len);
156     }
159 Int OmxSrvMgr_Module_startup(Int phase)
161     Task_Params params;
163     if (Task_Module_startupDone()) {
164         ServiceMgr_init();
166         /* Create our ServiceMgr Thread: */
167         Task_Params_init(&params);
168         params.instance->name = "OmxSrvMgr";
169         params.priority = 1;   /* Lowest priority thread */
171         ServiceMgr_registerSrvTask(0, OmxSrvMgr_taskFxn, &params);
173         return (Startup_DONE);
174     }
175     else {
176         return (Startup_NOTDONE);
177     }