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 * ======== TransportShmSetup.c ========
34 */
36 #include <xdc/std.h>
37 #include <xdc/runtime/Assert.h>
38 #include <xdc/runtime/Error.h>
40 #include <ti/sdo/ipc/transports/TransportShm.h>
42 #include "package/internal/TransportShmSetup.xdc.h"
44 #include <ti/sdo/ipc/_Ipc.h>
45 #include <ti/sdo/ipc/_GateMP.h>
46 #include <ti/sdo/ipc/_MessageQ.h>
47 #include <ti/sdo/ipc/_Notify.h>
48 #include <ti/sdo/ipc/_SharedRegion.h>
49 #include <ti/sdo/utils/_MultiProc.h>
51 /*
52 * ======== TransportShmSetup_attach ========
53 */
54 Int TransportShmSetup_attach(UInt16 remoteProcId, Ptr sharedAddr)
55 {
56 TransportShm_Params params;
57 TransportShm_Handle handle;
58 Int status = MessageQ_E_FAIL;
59 Error_Block eb;
61 Error_init(&eb);
63 /* init the transport parameters */
64 TransportShm_Params_init(¶ms);
65 params.gate = (ti_sdo_ipc_GateMP_Handle)GateMP_getDefaultRemote();
66 params.sharedAddr = sharedAddr;
67 params.priority = TransportShmSetup_priority;
69 /* make sure notify driver has been created */
70 if (Notify_intLineRegistered(remoteProcId, 0)) {
71 /* create if self < remoteProcId, otherwise open */
72 if (MultiProc_self() < remoteProcId) {
73 /* create the transport */
74 handle = TransportShm_create(remoteProcId, ¶ms, &eb);
76 if (handle != NULL) {
77 TransportShmSetup_module->handles[remoteProcId] = handle;
78 status = MessageQ_S_SUCCESS;
79 }
80 }
81 else {
82 status = TransportShm_openByAddr(params.sharedAddr, &handle, &eb);
83 TransportShmSetup_module->handles[remoteProcId] = handle;
84 }
85 }
87 return (status);
88 }
90 /*
91 * ======== TransportShmSetup_detach ========
92 */
93 Int TransportShmSetup_detach(UInt16 remoteProcId)
94 {
95 TransportShm_Handle handle;
97 handle = TransportShmSetup_module->handles[remoteProcId];
99 /* Trying to detach an un-attached processor should fail */
100 if (handle == NULL) {
101 return (MessageQ_E_FAIL);
102 }
104 /* Unregister the instance */
105 TransportShmSetup_module->handles[remoteProcId] = NULL;
107 /* Delete/close the transport */
108 if (MultiProc_self() < remoteProcId) {
109 TransportShm_delete(&handle);
110 }
111 else {
112 TransportShm_close(&handle);
113 }
115 return (MessageQ_S_SUCCESS);
116 }
118 /*
119 * ======== TransportShmSetup_isRegistered ========
120 */
121 Bool TransportShmSetup_isRegistered(UInt16 remoteProcId)
122 {
123 Bool registered;
125 registered = (TransportShmSetup_module->handles[remoteProcId] != NULL);
127 return (registered);
128 }
130 /*
131 * ======== TransportShmSetup_sharedMemReq ========
132 */
133 SizeT TransportShmSetup_sharedMemReq(Ptr sharedAddr)
134 {
135 TransportShm_Params params;
136 SizeT memReq = 0;
138 if (ti_sdo_utils_MultiProc_numProcessors > 1) {
139 params.sharedAddr = sharedAddr;
140 memReq += TransportShm_sharedMemReq(¶ms);
141 }
143 return(memReq);
144 }