PRSDK-3125: Update remainig
[keystone-rtos/edma3_lld.git] / packages / ti / sdo / edma3 / rm / sample / src / sample_cs.c
1 /*\r
2  * sample_cs.c\r
3  *\r
4  * Sample functions showing the implementation of critical section entry/exit\r
5  * routines and various semaphore related routines (all OS depenedent). These\r
6  * implementations MUST be provided by the user / application, using the EDMA3\r
7  * Resource Manager, for its correct functioning.\r
8  *\r
9  * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
10  *\r
11  *\r
12  *  Redistribution and use in source and binary forms, with or without\r
13  *  modification, are permitted provided that the following conditions\r
14  *  are met:\r
15  *\r
16  *    Redistributions of source code must retain the above copyright\r
17  *    notice, this list of conditions and the following disclaimer.\r
18  *\r
19  *    Redistributions in binary form must reproduce the above copyright\r
20  *    notice, this list of conditions and the following disclaimer in the\r
21  *    documentation and/or other materials provided with the\r
22  *    distribution.\r
23  *\r
24  *    Neither the name of Texas Instruments Incorporated nor the names of\r
25  *    its contributors may be used to endorse or promote products derived\r
26  *    from this software without specific prior written permission.\r
27  *\r
28  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
29  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
30  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
31  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
32  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
33  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
34  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
35  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
36  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
37  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
38  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
39  *\r
40 */\r
41 \r
42 #include <ti/sysbios/family/c64p/EventCombiner.h>\r
43 #include <ti/sysbios/hal/Hwi.h>\r
44 #include <ti/sysbios/knl/Task.h>\r
45 #include <ti/sysbios/knl/Semaphore.h>\r
46 \r
47 #include <ti/sdo/edma3/rm/sample/bios6_edma3_rm_sample.h>\r
48 \r
49 extern uint32_t ccXferCompInt[EDMA3_MAX_EDMA3_INSTANCES][EDMA3_MAX_REGIONS];\r
50 extern uint32_t ccErrorInt[EDMA3_MAX_EDMA3_INSTANCES];\r
51 extern uint32_t tcErrorInt[EDMA3_MAX_EDMA3_INSTANCES][EDMA3_MAX_TC];\r
52 \r
53 /**\r
54  * Shadow Region on which the executable is running. Its value is\r
55  * populated with the DSP Instance Number here in this case.\r
56  */\r
57 extern uint32_t region_id;\r
58 \r
59 /**\r
60  * \brief   EDMA3 OS Protect Entry\r
61  *\r
62  *      This function saves the current state of protection in 'intState'\r
63  *      variable passed by caller, if the protection level is\r
64  *      EDMA3_OS_PROTECT_INTERRUPT. It then applies the requested level of\r
65  *      protection.\r
66  *      For EDMA3_OS_PROTECT_INTERRUPT_XFER_COMPLETION and\r
67  *      EDMA3_OS_PROTECT_INTERRUPT_CC_ERROR, variable 'intState' is ignored,\r
68  *      and the requested interrupt is disabled.\r
69  *      For EDMA3_OS_PROTECT_INTERRUPT_TC_ERROR, '*intState' specifies the\r
70  *      Transfer Controller number whose interrupt needs to be disabled.\r
71  *\r
72  * \param   level is numeric identifier of the desired degree of protection.\r
73  * \param   intState is memory location where current state of protection is\r
74  *      saved for future use while restoring it via edma3OsProtectExit() (Only\r
75  *      for EDMA3_OS_PROTECT_INTERRUPT protection level).\r
76  * \return  None\r
77  */\r
78 void edma3OsProtectEntry (uint32_t edma3InstanceId,\r
79                                                         int32_t level, uint32_t *intState)\r
80     {\r
81     if (((level == EDMA3_OS_PROTECT_INTERRUPT)\r
82         || (level == EDMA3_OS_PROTECT_INTERRUPT_TC_ERROR))\r
83         && (intState == NULL))\r
84         {\r
85             /* Nothing to be done here */\r
86         }\r
87         else\r
88         {\r
89         switch (level)\r
90             {\r
91             /* Disable all (global) interrupts */\r
92             case EDMA3_OS_PROTECT_INTERRUPT :\r
93                 *intState = Hwi_disable();\r
94                 break;\r
95 \r
96             /* Disable scheduler */\r
97             case EDMA3_OS_PROTECT_SCHEDULER :\r
98                                 Task_disable();\r
99                 break;\r
100 \r
101             /* Disable EDMA3 transfer completion interrupt only */\r
102             case EDMA3_OS_PROTECT_INTERRUPT_XFER_COMPLETION :\r
103                 EventCombiner_disableEvent(ccXferCompInt[edma3InstanceId][region_id]);\r
104                 break;\r
105 \r
106             /* Disable EDMA3 CC error interrupt only */\r
107             case EDMA3_OS_PROTECT_INTERRUPT_CC_ERROR :\r
108                 EventCombiner_disableEvent(ccErrorInt[edma3InstanceId]);\r
109                 break;\r
110 \r
111             /* Disable EDMA3 TC error interrupt only */\r
112             case EDMA3_OS_PROTECT_INTERRUPT_TC_ERROR :\r
113                 switch (*intState)\r
114                     {\r
115                     case 0:\r
116                     case 1:\r
117                     case 2:\r
118                     case 3:\r
119                     case 4:\r
120                     case 5:\r
121                     case 6:\r
122                     case 7:\r
123                         /* Fall through... */\r
124                         /* Disable the corresponding interrupt */\r
125                         EventCombiner_disableEvent(tcErrorInt[edma3InstanceId][*intState]);\r
126                         break;\r
127 \r
128                      default:\r
129                         break;\r
130                     }\r
131 \r
132                 break;\r
133 \r
134             default:\r
135                 break;\r
136             }\r
137         }\r
138         return;\r
139     }\r
140 \r
141 \r
142 /**\r
143  * \brief   EDMA3 OS Protect Exit\r
144  *\r
145  *      This function undoes the protection enforced to original state\r
146  *      as is specified by the variable 'intState' passed, if the protection\r
147  *      level is EDMA3_OS_PROTECT_INTERRUPT.\r
148  *      For EDMA3_OS_PROTECT_INTERRUPT_XFER_COMPLETION and\r
149  *      EDMA3_OS_PROTECT_INTERRUPT_CC_ERROR, variable 'intState' is ignored,\r
150  *      and the requested interrupt is enabled.\r
151  *      For EDMA3_OS_PROTECT_INTERRUPT_TC_ERROR, 'intState' specifies the\r
152  *      Transfer Controller number whose interrupt needs to be enabled.\r
153  * \param   level is numeric identifier of the desired degree of protection.\r
154  * \param   intState is original state of protection at time when the\r
155  *      corresponding edma3OsProtectEntry() was called (Only\r
156  *      for EDMA3_OS_PROTECT_INTERRUPT protection level).\r
157  * \return  None\r
158  */\r
159 void edma3OsProtectExit (uint32_t edma3InstanceId,\r
160                         int32_t level, uint32_t intState)\r
161     {\r
162     switch (level)\r
163         {\r
164         /* Enable all (global) interrupts */\r
165         case EDMA3_OS_PROTECT_INTERRUPT :\r
166             Hwi_restore(intState);\r
167             break;\r
168 \r
169         /* Enable scheduler */\r
170         case EDMA3_OS_PROTECT_SCHEDULER :\r
171             Task_enable();\r
172             break;\r
173 \r
174         /* Enable EDMA3 transfer completion interrupt only */\r
175         case EDMA3_OS_PROTECT_INTERRUPT_XFER_COMPLETION :\r
176             EventCombiner_enableEvent(ccXferCompInt[edma3InstanceId][region_id]);\r
177             break;\r
178 \r
179         /* Enable EDMA3 CC error interrupt only */\r
180         case EDMA3_OS_PROTECT_INTERRUPT_CC_ERROR :\r
181             EventCombiner_enableEvent(ccErrorInt[edma3InstanceId]);\r
182             break;\r
183 \r
184         /* Enable EDMA3 TC error interrupt only */\r
185         case EDMA3_OS_PROTECT_INTERRUPT_TC_ERROR :\r
186             switch ((int32_t)intState)\r
187                 {\r
188                 case 0:\r
189                 case 1:\r
190                 case 2:\r
191                 case 3:\r
192                 case 4:\r
193                 case 5:\r
194                 case 6:\r
195                 case 7:\r
196                     /* Fall through... */\r
197                     /* Enable the corresponding interrupt */\r
198                     EventCombiner_enableEvent(tcErrorInt[edma3InstanceId][intState]);\r
199                     break;\r
200 \r
201                  default:\r
202                     break;\r
203                 }\r
204 \r
205             break;\r
206 \r
207         default:\r
208             break;\r
209         }\r
210     }\r
211 \r
212 \r
213 /**\r
214   * Counting Semaphore related functions (OS dependent) should be\r
215   * called/implemented by the application. A handle to the semaphore\r
216   * is required while opening the resource manager instance.\r
217   */\r
218 \r
219 /**\r
220  * \brief   EDMA3 OS Semaphore Create\r
221  *\r
222  *      This function creates a counting semaphore with specified\r
223  *      attributes and initial value. It should be used to create a semaphore\r
224  *      with initial value as '1'. The semaphore is then passed by the user\r
225  *      to the EDMA3 RM for proper sharing of resources.\r
226  * \param   initVal [IN] is initial value for semaphore\r
227  * \param   semParams [IN] is the semaphore attributes.\r
228  * \param   hSem [OUT] is location to recieve the handle to just created\r
229  *      semaphore\r
230  * \return  EDMA3_RM_SOK if succesful, else a suitable error code.\r
231  */\r
232 EDMA3_RM_Result edma3OsSemCreate(int32_t initVal,\r
233                                                         const Semaphore_Params *semParams,\r
234                                 EDMA3_OS_Sem_Handle *hSem)\r
235     {\r
236     EDMA3_RM_Result semCreateResult = EDMA3_RM_SOK;\r
237 \r
238     if(NULL == hSem)\r
239         {\r
240         semCreateResult = EDMA3_RM_E_INVALID_PARAM;\r
241         }\r
242     else\r
243         {\r
244         *hSem = (EDMA3_OS_Sem_Handle)Semaphore_create(initVal, semParams, NULL);\r
245         if ( (*hSem) == NULL )\r
246             {\r
247             semCreateResult = EDMA3_RM_E_SEMAPHORE;\r
248             }\r
249         }\r
250 \r
251     return semCreateResult;\r
252     }\r
253 \r
254 \r
255 /**\r
256  * \brief   EDMA3 OS Semaphore Delete\r
257  *\r
258  *      This function deletes or removes the specified semaphore\r
259  *      from the system. Associated dynamically allocated memory\r
260  *      if any is also freed up.\r
261  * \param   hSem [IN] handle to the semaphore to be deleted\r
262  * \return  EDMA3_RM_SOK if succesful else a suitable error code\r
263  */\r
264 EDMA3_RM_Result edma3OsSemDelete(EDMA3_OS_Sem_Handle hSem)\r
265     {\r
266     EDMA3_RM_Result semDeleteResult = EDMA3_RM_SOK;\r
267 \r
268     if(NULL == hSem)\r
269         {\r
270         semDeleteResult = EDMA3_RM_E_INVALID_PARAM;\r
271         }\r
272     else\r
273         {\r
274                 Semaphore_delete(hSem);\r
275         }\r
276 \r
277     return semDeleteResult;\r
278     }\r
279 \r
280 \r
281 /**\r
282  * \brief   EDMA3 OS Semaphore Take\r
283  *\r
284  *      This function takes a semaphore token if available.\r
285  *      If a semaphore is unavailable, it blocks currently\r
286  *      running thread in wait (for specified duration) for\r
287  *      a free semaphore.\r
288  * \param   hSem [IN] is the handle of the specified semaphore\r
289  * \param   mSecTimeout [IN] is wait time in milliseconds\r
290  * \return  EDMA3_Result if successful else a suitable error code\r
291  */\r
292 EDMA3_Result edma3OsSemTake(EDMA3_OS_Sem_Handle hSem, int32_t mSecTimeout)\r
293     {\r
294     EDMA3_Result semTakeResult = EDMA3_RM_SOK;\r
295 \r
296     if(NULL == hSem)\r
297         {\r
298         semTakeResult = EDMA3_RM_E_INVALID_PARAM;\r
299         }\r
300     else\r
301         {\r
302         if((Semaphore_pend(hSem, (uint32_t)mSecTimeout)) == FALSE)\r
303             {\r
304                 semTakeResult = EDMA3_RM_E_SEMAPHORE;\r
305             }\r
306         }\r
307 \r
308     return semTakeResult;\r
309     }\r
310 \r
311 \r
312 /**\r
313  * \brief   EDMA3 OS Semaphore Give\r
314  *\r
315  *      This function gives or relinquishes an already\r
316  *      acquired semaphore token\r
317  * \param   hSem [IN] is the handle of the specified semaphore\r
318  * \return  EDMA3_Result if successful else a suitable error code\r
319  */\r
320 EDMA3_Result edma3OsSemGive(EDMA3_OS_Sem_Handle hSem)\r
321     {\r
322     EDMA3_Result semGiveResult = EDMA3_RM_SOK;\r
323 \r
324     if(NULL == hSem)\r
325         {\r
326         semGiveResult = EDMA3_RM_E_INVALID_PARAM;\r
327         }\r
328     else\r
329         {\r
330                 Semaphore_post(hSem);\r
331         }\r
332 \r
333     return semGiveResult;\r
334     }\r
335 \r
336 /* End of File */\r
337 \r