SDOCM00106584 Notify mailbox driver support on DRA7xx (IPU, HOST) - Part 1
[ipc/ipcdev.git] / packages / ti / sdo / ipc / family / vayu / NotifySetup.c
1 /*
2  * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
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  *  ======== NotifySetup.c ========
35  */
36 #include <xdc/std.h>
37 #include <xdc/runtime/Assert.h>
38 #include <xdc/runtime/Error.h>
39 #include <xdc/runtime/Startup.h>
41 #include <ti/sdo/ipc/Ipc.h>
42 #include <ti/sdo/ipc/_Notify.h>
43 #include <ti/sdo/ipc/family/vayu/NotifyDriverMbx.h>
44 #include <ti/sdo/ipc/notifyDrivers/NotifyDriverShm.h>
45 #include <ti/sdo/utils/_MultiProc.h>
47 #if defined(xdc_target__isaCompatible_64P)
49 #include <ti/sysbios/family/c64p/EventCombiner.h>
50 #include <ti/sysbios/family/c64p/Hwi.h>
51 #include <ti/sysbios/family/shared/vayu/IntXbar.h>
53 #elif defined(xdc_target__isaCompatible_arp32)
55 #include <ti/sysbios/family/arp32/Hwi.h>
57 #elif defined(xdc_target__isaCompatible_v7M)
59 #include <ti/sysbios/BIOS.h>
60 #include <ti/sysbios/family/arm/ducati/Core.h>
61 #include <ti/sysbios/family/arm/m3/Hwi.h>
62 #include <ti/sysbios/family/shared/vayu/IntXbar.h>
64 #elif defined(xdc_target__isaCompatible_v7A)
66 #include <ti/sysbios/family/arm/gic/Hwi.h>
68 #else
69 #error Invalid target
70 #endif
72 #include "package/internal/NotifySetup.xdc.h"
75 #define EVENT_GROUP_SIZE 32
77 /* register access methods */
78 #define REG16(A)        (*(volatile UInt16 *)(A))
79 #define REG32(A)        (*(volatile UInt32 *)(A))
81 /* ipc helper macros */
82 #define MAILBOX_REG_VAL(m) (0x1 << (2 * (m)))
84 #define VIRTID(procId) (NotifySetup_procIdTable[(procId)])
86 #define MBX_BASEADDR_IDX(idx) ((NotifySetup_mailboxTable[(idx)] >> 16) & 0xFFFF)
88 #define MBX_USER_IDX(idx) ((NotifySetup_mailboxTable[(idx)] >> 8) & 0xFF)
90 #define SUBMBX_IDX(idx) (NotifySetup_mailboxTable[(idx)] & 0xFF)
92 #define MAILBOX_ADDR(idx) \
93         (NotifySetup_mailboxBaseAddr[MBX_BASEADDR_IDX(idx)])
95 #define MAILBOX_STATUS(idx) \
96         (MAILBOX_ADDR((idx)) + 0xC0 + (0x4 * SUBMBX_IDX((idx))))
98 #define MAILBOX_IRQENABLE_SET(idx) \
99         (MAILBOX_ADDR((idx)) + 0x108 + (0x10 * MBX_USER_IDX((idx))))
101 #define MBOX_IRQ_ENABLE(idx) \
102     ((REG32(MAILBOX_IRQENABLE_SET((idx))) & \
103     MAILBOX_REG_VAL(SUBMBX_IDX((idx)))) != 0)
105 #define MBOX_MSG_COUNT(idx) (REG32(MAILBOX_STATUS((idx))))
108 /*
109  *************************************************************************
110  *                      Module functions
111  *************************************************************************
112  */
114 /*
115  *  ======== NotifySetup_Module_startup ========
116  */
117 Int NotifySetup_Module_startup(Int phase)
119 #if defined(xdc_target__isaCompatible_64P)
121     extern cregister volatile UInt DNUM;
123     if (IntXbar_Module_startupDone()) {
124         /* connect mailbox interrupts at startup */
125         if (DNUM == 0) {               /* DSP1 */
126             IntXbar_connect(24, 284);  // eve1 mailbox 0 user 1
127             IntXbar_connect(25, 293);  // eve2 mailbox 0 user 1
128             IntXbar_connect(26, 249);  // system mailbox 5 user 0
129             NotifySetup_module->interruptTable[6] = 57; // IPU1-0
130             NotifySetup_module->interruptTable[9] = 57; // IPU1-1
132             /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
133             if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
134                 (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
135                 IntXbar_connect(27, 302);  // eve3 mailbox 0 user 1
136                 IntXbar_connect(28, 311);  // eve4 mailbox 0 user 1
137             }
139             /* plug mbx7 only if DSP2 or IPU2 exists */
140             if ((MultiProc_getId("DSP2") != MultiProc_INVALIDID) ||
141                 (MultiProc_getId("IPU2") != MultiProc_INVALIDID) ||
142                 (MultiProc_getId("IPU2-0") != MultiProc_INVALIDID)) {
143                 IntXbar_connect(29, 257);  // system mailbox 7 user 0
144                 NotifySetup_module->interruptTable[7] = 60; // IPU2-0
145             }
147             /* plug mbx8 only if IPU2-1 exists */
148             if (MultiProc_getId("IPU2-1") != MultiProc_INVALIDID) {
149                 IntXbar_connect(30, 261);  // system mailbox 8 user 0
150                 NotifySetup_module->interruptTable[10] = 61; // IPU2-1
151             }
152         }
153         else if (DNUM == 1) {          /* DSP2 */
154             IntXbar_connect(24, 287);  // eve1 mailbox 1 user 1
155             IntXbar_connect(25, 296);  // eve2 mailbox 1 user 1
156             IntXbar_connect(26, 253);  // system mailbox 6 user 0
157             NotifySetup_module->interruptTable[7] = 57; // IPU2-0
158             NotifySetup_module->interruptTable[10] = 57; // IPU2-1
160             /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
161             if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
162                 (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
163                 IntXbar_connect(27, 305);  // eve3 mailbox 1 user 1
164                 IntXbar_connect(28, 314);  // eve4 mailbox 1 user 1
165             }
167             /* plug mbx7 only if DSP1 or IPU1 exists */
168             if ((MultiProc_getId("DSP1") != MultiProc_INVALIDID) ||
169                 (MultiProc_getId("IPU1") != MultiProc_INVALIDID) ||
170                 (MultiProc_getId("IPU1-0") != MultiProc_INVALIDID)) {
171                 IntXbar_connect(29, 258);  // system mailbox 7 user 1
172                 NotifySetup_module->interruptTable[6] = 60; // IPU1-0
173             }
175             /* plug mbx8 only if IPU1-1 exists */
176             if (MultiProc_getId("IPU1-1") != MultiProc_INVALIDID) {
177                 IntXbar_connect(30, 262);  // system mailbox 8 user 1
178                 NotifySetup_module->interruptTable[9] = 61; // IPU1-1
179             }
180         }
181         return (Startup_DONE);
182     }
184     return (Startup_NOTDONE);
186 #elif defined(xdc_target__isaCompatible_arp32)
188     /* nothing to do on this processor */
189     return (Startup_DONE);
191 #elif defined(xdc_target__isaCompatible_v7M)
193     if (!IntXbar_Module_startupDone()) {
194         return (Startup_NOTDONE);
195     }
197     /* connect mailbox interrupts at startup */
198     if (Core_ipuId == 1) {
199         if ((BIOS_smpEnabled) || (Core_getId() == 0)) {
200             /* IPU1-0 */
201             IntXbar_connect(42, 285);  // eve1 mailbox 0 user 2
202             IntXbar_connect(43, 294);  // eve2 mailbox 0 user 2
203             IntXbar_connect(44, 250);  // system mailbox 5 user 1
205             /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
206             if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
207                 (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
208                 IntXbar_connect(45, 303);  // eve3 mailbox 0 user 2
209                 IntXbar_connect(46, 312);  // eve4 mailbox 0 user 2
210             }
212             /* plug mbx7 only if DSP2, IPU1-1, or IPU2 exists */
213             if ((MultiProc_getId("DSP2") != MultiProc_INVALIDID) ||
214                 (MultiProc_getId("IPU1-1") != MultiProc_INVALIDID) ||
215                 (MultiProc_getId("IPU2") != MultiProc_INVALIDID) ||
216                 (MultiProc_getId("IPU2-0") != MultiProc_INVALIDID)) {
217                 IntXbar_connect(47, 259);  // system mailbox 7 user 2
218             }
220             /* plug mbx8 only if IPU2-1 exists */
221             if (MultiProc_getId("IPU2-1") != MultiProc_INVALIDID) {
222                 IntXbar_connect(48, 263);  // system mailbox 8 user 2
223             }
224         }
225         else { /* IPU1-1 */
226             IntXbar_connect(49, 289);  // eve1 mailbox 1 user 3
227             IntXbar_connect(50, 298);  // eve2 mailbox 1 user 3
228             IntXbar_connect(51, 252);  // system mailbox 5 user 3
230             /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
231             if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
232                 (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
233                 IntXbar_connect(52, 307);  // eve3 mailbox 1 user 3
234                 IntXbar_connect(53, 316);  // eve4 mailbox 1 user 3
235             }
237             /* plug mbx8 only if DSP2, IPU1-0, or IPU2 exists */
238             if ((MultiProc_getId("DSP2") != MultiProc_INVALIDID) ||
239                 (MultiProc_getId("IPU1-0") != MultiProc_INVALIDID) ||
240                 (MultiProc_getId("IPU2") != MultiProc_INVALIDID) ||
241                 (MultiProc_getId("IPU2-0") != MultiProc_INVALIDID)) {
242                 IntXbar_connect(54, 263);  // system mailbox 8 user 2
243             }
244         }
245     }
246     else {
247         if ((BIOS_smpEnabled) || (Core_getId() == 0)) {
248             /* IPU2-0 */
249             IntXbar_connect(42, 288);  // eve1 mailbox 1 user 2
250             IntXbar_connect(43, 297);  // eve2 mailbox 1 user 2
251             IntXbar_connect(44, 254);  // system mailbox 6 user 1
253             /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
254             if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
255                 (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
256                 IntXbar_connect(45, 306);  // eve3 mailbox 1 user 2
257                 IntXbar_connect(46, 315);  // eve4 mailbox 1 user 2
258             }
260             /* plug mbx7 only if DSP1 or IPU1 exists */
261             if ((MultiProc_getId("DSP1") != MultiProc_INVALIDID) ||
262                 (MultiProc_getId("IPU1") != MultiProc_INVALIDID) ||
263                 (MultiProc_getId("IPU1-0") != MultiProc_INVALIDID)) {
264                 IntXbar_connect(47, 260);  // system mailbox 7 user 3
265             }
267             /* plug mbx8 only if IPU1-1 exists */
268             if (MultiProc_getId("IPU1-1") != MultiProc_INVALIDID) {
269                 IntXbar_connect(48, 264);  // system mailbox 8 user 3
270             }
271         }
272         else { /* IPU2-1 */
273             IntXbar_connect(49, 289);  // eve1 mailbox 1 user 3
274             IntXbar_connect(50, 298);  // eve2 mailbox 1 user 3
275             IntXbar_connect(51, 256);  // system mailbox 6 user 3
277             /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
278             if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
279                 (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
280                 IntXbar_connect(52, 307);  // eve3 mailbox 1 user 3
281                 IntXbar_connect(53, 316);  // eve4 mailbox 1 user 3
282             }
284             /* plug mbx8 only if DSP2 or IPU2 exists */
285             if ((MultiProc_getId("DSP1") != MultiProc_INVALIDID) ||
286                 (MultiProc_getId("IPU1") != MultiProc_INVALIDID) ||
287                 (MultiProc_getId("IPU1-0") != MultiProc_INVALIDID)) {
288                 IntXbar_connect(54, 264);  // system mailbox 8 user 3
289             }
290         }
291     }
293     return (Startup_DONE);
295 #elif defined(xdc_target__isaCompatible_v7A)
297     /* TODO */
298     return (Startup_DONE);
300 #else
301 #error Invalid target
302 #endif
305 /*
306  *  ======== NotifySetup_interruptTable ========
307  */
308 UInt16 NotifySetup_interruptTable(Int srcVirtId)
310     return (NotifySetup_module->interruptTable[srcVirtId]);
313 /*
314  *  ======== NotifySetup_attach ========
315  *  Create driver instance specified at config time.
316  *
317  *  This functions is generated by the NotifySetup.xdt template.
318  */
320 /*
321  *  ======== NotifySetup_sharedMemReq ========
322  *  Compute how much shared memory is required by the driver.
323  *
324  *  This functions is generated by the NotifySetup.xdt template.
325  */
327 /*
328  * ======== NotifySetup_numIntLines ========
329  * Return number of available interrupt lines to the current processor.
330  */
331 UInt16 NotifySetup_numIntLines(UInt16 remoteProcId)
333     return (1);
336 /*
337  *  ======== NotifySetup_driverType ========
338  *  Find driver type for given connection.
339  *
340  *  Search the connection array for the given remote processor. If
341  *  found, return the requested notify driver type.
342  */
343 NotifySetup_Driver NotifySetup_driverType(UInt16 remoteProcId)
345     Int i;
346     NotifySetup_Driver driver = NotifySetup_Driver_SHAREDMEMORY;
348     /* look for remote processor in connection array */
349     for (i = 0; i < NotifySetup_module->connAry.length; i++) {
350         if (remoteProcId == NotifySetup_module->connAry.elem[i].procId) {
351             driver = NotifySetup_module->connAry.elem[i].driver;
352             break;
353         }
354     }
356     return (driver);
359 /*
360  *  ======== NotifySetup_plugHwi ========
361  */
362 Void NotifySetup_plugHwi(UInt16 remoteProcId, Int cpuIntrNum,
363         NotifySetup_DriverIsr isr)
365     Error_Block eb;
366     UInt        key;
367 #if !defined(xdc_target__isaCompatible_v7A)
368     Hwi_Params  hwiParams;
369 #endif
370     UInt16      srcVirtId;
371 #if defined(xdc_target__isaCompatible_64P)
372     Int         eventId;
373     UInt        combinedEventId;
374 #elif defined(xdc_target__isaCompatible_arp32)
375     UInt        mbxIdx;
376     Int         eventId;
377     Bits16      mask;
378 #elif defined(xdc_target__isaCompatible_v7M)
379     UInt16      idx;
380     UInt        mbxIdx;
381 #endif
383     Error_init(&eb);
385     /* disable interrupts */
386     key = Hwi_disable();
388     /* map processor id to virtual id */
389     srcVirtId = VIRTID(remoteProcId);
391     /* save driver isr in dispatch table */
392     NotifySetup_module->isrDispatchTable[srcVirtId] = isr;
394 #if defined(xdc_target__isaCompatible_64P)
396     /* program the event dispatcher */
397     eventId = NotifySetup_module->interruptTable[srcVirtId];
398     EventCombiner_dispatchPlug(eventId, NotifySetup_dispatchIsr, eventId, TRUE);
400     /* make sure the interrupt is plugged only once */
401     NotifySetup_module->numPlugged[0]++;
403     if (NotifySetup_module->numPlugged[0] == 1) {
404         combinedEventId = eventId / EVENT_GROUP_SIZE;
406         Hwi_Params_init(&hwiParams);
407         hwiParams.eventId = combinedEventId;
408         hwiParams.arg = combinedEventId;
409         hwiParams.enableInt = TRUE;
411         Hwi_create(cpuIntrNum, &ti_sysbios_family_c64p_EventCombiner_dispatch,
412                 &hwiParams, &eb);
413         /* TODO: add error handling */
415         Hwi_enableInterrupt(cpuIntrNum);
416     }
418 #elif defined(xdc_target__isaCompatible_arp32)
420     if ((remoteProcId == NotifySetup_dsp1ProcId) ||
421         (remoteProcId == NotifySetup_ipu1_0ProcId) ||
422         (remoteProcId == NotifySetup_hostProcId)) {
424         mbxIdx = 0;
425     }
426     else if ((remoteProcId == NotifySetup_dsp2ProcId) ||
427         (remoteProcId == NotifySetup_ipu2_0ProcId) ||
428         (remoteProcId == NotifySetup_ipu1_1ProcId) ||
429         (remoteProcId == NotifySetup_ipu2_1ProcId)) {
431         mbxIdx = 1;
432     }
433     else {
434         mbxIdx = 2; /* remote processor must be EVEx */
435     }
437     /* make sure the interrupt is plugged only once */
438     NotifySetup_module->numPlugged[mbxIdx]++;
440     if (NotifySetup_module->numPlugged[mbxIdx] == 1) {
441         eventId = NotifySetup_module->interruptTable[srcVirtId];
443         /* compute the hwi mask */
444         mask = (1 << NotifySetup_eveIntVectId_INTC0)
445                 | (1 << NotifySetup_eveIntVectId_INTC1);
447         Hwi_Params_init(&hwiParams);
448         hwiParams.arg = eventId;
449         hwiParams.vectorNum = cpuIntrNum;
450         hwiParams.maskSetting = Hwi_MaskingOption_BITMASK;
451         hwiParams.disableIerMask = mask;
452         hwiParams.restoreIerMask = mask;
454         Hwi_create(eventId, NotifySetup_dispatchIsr, &hwiParams, &eb);
455         /* TODO: add error handling */
457         Hwi_enableInterrupt(NotifySetup_module->interruptTable[srcVirtId]);
458     }
460 #elif defined(xdc_target__isaCompatible_v7M)
462     /* compute table index for given source and destination */
463     idx = (srcVirtId * NotifySetup_NUM_CORES) + MultiProc_self();
465     /* compute mailbox index */
466     mbxIdx = MBX_BASEADDR_IDX(idx);
468     /* make sure the interrupt is plugged only once */
469     NotifySetup_module->numPlugged[mbxIdx]++;
471     if (NotifySetup_module->numPlugged[mbxIdx] == 1) {
473         Hwi_Params_init(&hwiParams);
474         hwiParams.maskSetting = Hwi_MaskingOption_LOWER;
475         hwiParams.arg = cpuIntrNum;
477         Hwi_create(cpuIntrNum, NotifySetup_dispatchIsr, &hwiParams, &eb);
478         /* TODO: add error handling */
480         Hwi_enableInterrupt(cpuIntrNum);
481     }
483 #elif defined(xdc_target__isaCompatible_v7A)
485     /* TODO */
487 #else
488 #error Invalid target
489 #endif
491     /* restore interrupts */
492     Hwi_restore(key);
495 /*
496  *  ======== NotifySetup_unplugHwi ========
497  */
498 Void NotifySetup_unplugHwi(UInt16 remoteProcId, Int cpuIntrNum)
500     UInt        key;
501 #if !defined(xdc_target__isaCompatible_v7A)
502     Hwi_Handle  hwi;
503 #endif
504     UInt16      srcVirtId;
505 #if defined(xdc_target__isaCompatible_64P)
506     Int         eventId;
507 #elif defined(xdc_target__isaCompatible_arp32)
508     UInt        mbxIdx;
509 #elif defined(xdc_target__isaCompatible_v7M)
510     UInt16      idx;
511     UInt        mbxIdx;
512 #endif
514     /* disable global interrupts (TODO: should be a gated module) */
515     key = Hwi_disable();
517     /* map processor id to virtual id */
518     srcVirtId = VIRTID(remoteProcId);
520     /* remove driver isr from dispatch table */
521     NotifySetup_module->isrDispatchTable[srcVirtId] = NULL;
523 #if defined(xdc_target__isaCompatible_64P)
525     /* unplug interrupt if last user */
526     NotifySetup_module->numPlugged[0]--;
528     if (NotifySetup_module->numPlugged[0] == 0) {
529         hwi = Hwi_getHandle(cpuIntrNum);
530         Hwi_delete(&hwi);
531     }
533     /* unprogram the event dispatcher */
534     eventId = NotifySetup_module->interruptTable[srcVirtId];
535     EventCombiner_disableEvent(eventId);
537 #elif defined(xdc_target__isaCompatible_arp32)
539     if ((remoteProcId == NotifySetup_dsp1ProcId) ||
540         (remoteProcId == NotifySetup_ipu1_0ProcId) ||
541         (remoteProcId == NotifySetup_hostProcId)) {
543         mbxIdx = 0;
544     }
545     else if ((remoteProcId == NotifySetup_dsp2ProcId) ||
546         (remoteProcId == NotifySetup_ipu2_0ProcId) ||
547         (remoteProcId == NotifySetup_ipu1_1ProcId) ||
548         (remoteProcId == NotifySetup_ipu2_1ProcId)) {
550         mbxIdx = 1;
551     }
552     else {
553         mbxIdx = 2; /* remote processor must be EVEx */
554     }
556     /* unplug interrupt if last user */
557     NotifySetup_module->numPlugged[mbxIdx]--;
559     if (NotifySetup_module->numPlugged[0] == 0) {
560         hwi = Hwi_getHandle(cpuIntrNum);
561         Hwi_delete(&hwi);
562     }
564 #elif defined(xdc_target__isaCompatible_v7M)
566     /* decrement plug count */
567     idx = (srcVirtId * NotifySetup_NUM_CORES) + MultiProc_self();
568     mbxIdx = MBX_BASEADDR_IDX(idx);
569     NotifySetup_module->numPlugged[mbxIdx]--;
571     /* unplug interrupt if last user */
572     if (NotifySetup_module->numPlugged[0] == 0) {
573         hwi = Hwi_getHandle(cpuIntrNum);
574         Hwi_delete(&hwi);
575     }
577 #elif defined(xdc_target__isaCompatible_v7A)
579     /* TODO */
581 #else
582 #error Invalid target
583 #endif
585     /* restore global interrupts */
586     Hwi_restore(key);
589 /*
590  *  ======== NotifySetup_Shm_attach ========
591  */
592 Int NotifySetup_Shm_attach(UInt16 remoteProcId, Ptr sharedAddr)
594     NotifyDriverShm_Params notifyShmParams;
595     NotifyDriverShm_Handle shmDrvHandle;
596     ti_sdo_ipc_Notify_Handle notifyHandle;
597     Int status = Notify_S_SUCCESS;
598     Error_Block eb;
600     Error_init(&eb);
602     NotifyDriverShm_Params_init(&notifyShmParams);
603     notifyShmParams.sharedAddr = sharedAddr;
604     notifyShmParams.remoteProcId  = remoteProcId;
606     /* Set the intVectorId if on the DSP */
607     if ((MultiProc_self() == NotifySetup_dsp1ProcId) ||
608         (MultiProc_self() == NotifySetup_dsp2ProcId)) {
609             notifyShmParams.intVectorId = NotifySetup_dspIntVectId;
610     }
612     /* Set the intVectorId if on the EVE */
613     if ((MultiProc_self() == NotifySetup_eve1ProcId) ||
614         (MultiProc_self() == NotifySetup_eve2ProcId) ||
615         (MultiProc_self() == NotifySetup_eve3ProcId) ||
616         (MultiProc_self() == NotifySetup_eve4ProcId)) {
618         if (VIRTID(remoteProcId) < 4) {
619             notifyShmParams.intVectorId = NotifySetup_eveIntVectId_INTC1;
620         }
621         else {
622             notifyShmParams.intVectorId = NotifySetup_eveIntVectId_INTC0;
623         }
624     }
626     /* create the notify driver instance */
627     shmDrvHandle = NotifyDriverShm_create(&notifyShmParams, &eb);
629     if (shmDrvHandle == NULL) {
630         return (Notify_E_FAIL);
631     }
633     /* create the front-end notify instance */
634     notifyHandle = ti_sdo_ipc_Notify_create(
635             NotifyDriverShm_Handle_upCast(shmDrvHandle), remoteProcId, 0,
636             NULL, &eb);
638     if (notifyHandle == NULL) {
639         NotifyDriverShm_delete(&shmDrvHandle);
640         status = Notify_E_FAIL;
641     }
643     return (status);
646 /*!
647  *  ======== NotifySetup_Shm_sharedMemReq ========
648  */
649 SizeT NotifySetup_Shm_sharedMemReq(UInt16 remoteProcId, Ptr sharedAddr)
651     SizeT memReq;
652     NotifyDriverShm_Params notifyShmParams;
654     NotifyDriverShm_Params_init(&notifyShmParams);
655     notifyShmParams.sharedAddr = sharedAddr;
657     memReq = NotifyDriverShm_sharedMemReq(&notifyShmParams);
659     return (memReq);
662 /*
663  *  ======== NotifySetup_Mbx_attach ========
664  */
665 Int NotifySetup_Mbx_attach(UInt16 remoteProcId, Ptr sharedAddr)
667     Int status = Notify_S_SUCCESS;
668     NotifyDriverMbx_Params params;
669     NotifyDriverMbx_Handle driver;
670     ti_sdo_ipc_Notify_Handle notify;
671     UInt16 virtId;
672     Error_Block eb;
674     Error_init(&eb);
676     NotifyDriverMbx_Params_init(&params);
677     params.remoteProcId = remoteProcId;
679     /* set the intVectorId if on the DSP */
680     if ((MultiProc_self() == NotifySetup_dsp1ProcId) ||
681         (MultiProc_self() == NotifySetup_dsp2ProcId)) {
682         params.intVectorId = NotifySetup_dspIntVectId;
683     }
685     /* set the intVectorId if on the EVE */
686     if ((MultiProc_self() == NotifySetup_eve1ProcId) ||
687         (MultiProc_self() == NotifySetup_eve2ProcId) ||
688         (MultiProc_self() == NotifySetup_eve3ProcId) ||
689         (MultiProc_self() == NotifySetup_eve4ProcId)) {
691         if (VIRTID(remoteProcId) < 4) {
692             params.intVectorId = NotifySetup_eveIntVectId_INTC1;
693         }
694         else {
695             params.intVectorId = NotifySetup_eveIntVectId_INTC0;
696         }
697     }
699     /* set the intVectorId if on the IPU */
700     if ((MultiProc_self() == NotifySetup_ipu1_0ProcId) ||
701         (MultiProc_self() == NotifySetup_ipu1_1ProcId) ||
702         (MultiProc_self() == NotifySetup_ipu2_0ProcId) ||
703         (MultiProc_self() == NotifySetup_ipu2_1ProcId)) {
705         /* map processor id to virtual id */
706         virtId = VIRTID(remoteProcId);
707         params.intVectorId = NotifySetup_module->interruptTable[virtId];
708     }
710     /* create the notify driver instance */
711     driver = NotifyDriverMbx_create(&params, &eb);
713     if (driver == NULL) {
714         return (Notify_E_FAIL);
715     }
717     /* create the front-end notify instance */
718     notify = ti_sdo_ipc_Notify_create(NotifyDriverMbx_Handle_upCast(driver),
719             remoteProcId, 0, NULL, &eb);
721     if (notify == NULL) {
722         NotifyDriverMbx_delete(&driver);
723         status = Notify_E_FAIL;
724     }
726     return (status);
729 /*!
730  *  ======== NotifySetup_Mbx_sharedMemReq ========
731  */
732 SizeT NotifySetup_Mbx_sharedMemReq(UInt16 remoteProcId, Ptr sharedAddr)
734     SizeT memReq = 0;
736     return (memReq);
739 /*
740  *************************************************************************
741  *                       Internal functions
742  *************************************************************************
743  */
745 /*
746  *  ======== NotifySetup_dispatchIsr ========
747  *  Dispatch the current interrupt to the appropriate notify driver
748  *
749  *  The given interrupt may be shared by multiple notify drivers. This
750  *  ISR inspects the mailbox which raised the interrupt and looks for
751  *  all FIFOs which have data and raise the given interrupt. For each
752  *  one, the interrupt is dispatched to the registered driver for that
753  *  FIFO.
754  *
755  *  @param(arg) The eventId which raised the interrupt.
756  */
757 Void NotifySetup_dispatchIsr(UArg arg)
759     Int numProcessed;
760     UInt16 idx;
761     UInt16 srcVirtId;
762     UInt16 dstVirtId = VIRTID(MultiProc_self());
763     NotifySetup_DriverIsr driver;
765     do {
766         numProcessed = 0;
768         for (srcVirtId = 0; srcVirtId < NotifySetup_NUM_CORES; srcVirtId++) {
770             /* skip null drivers, processor not in system or self */
771             driver = NotifySetup_module->isrDispatchTable[srcVirtId];
773             if (driver == NULL) {
774                 continue;
775             }
777             /* check if processor would raise the given hardware eventId */
778             if (arg == NotifySetup_module->interruptTable[srcVirtId]) {
780                 /* compute table index for given source and destination */
781                 idx = (srcVirtId * NotifySetup_NUM_CORES) + dstVirtId;
783                 /* check if submailbox has a message and irq is enabled */
784                 if ((MBOX_MSG_COUNT(idx) != 0) && MBOX_IRQ_ENABLE(idx)) {
786                     /* invoke driver isr to deliver the event */
787                     (*driver)(idx);
789                     /* event has been delivered */
790                     numProcessed++;
791                 }
792             }
793         }
794     } while (numProcessed != 0);