/* * ======== Hwi_reconfig ======== * Reconfigure a dispatched interrupt. */ Void Hwi_reconfig(Hwi_Object *hwi, Hwi_FuncPtr fxn, const Hwi_Params *params) { UInt intNum; for (intNum = 0; intNum < Hwi_NUM_INTERRUPTS; intNum++) { if (Hwi_module->dispatchTable[intNum] == hwi) { break; } } if (intNum == Hwi_NUM_INTERRUPTS) { Error_raise(NULL, Hwi_E_handleNotFound, hwi, 0); return; } Hwi_disableInterrupt(intNum); hwi->fxn = fxn; hwi->arg = params->arg; switch (params->maskSetting) { case Hwi_MaskingOption_NONE: hwi->disableMask = 0; hwi->restoreMask = 0; break; case Hwi_MaskingOption_ALL: hwi->disableMask = 0xffff; hwi->restoreMask = 0xffff; break; default: case Hwi_MaskingOption_SELF: hwi->disableMask = 1 << intNum; hwi->restoreMask = 1 << intNum; break; case Hwi_MaskingOption_BITMASK: hwi->disableMask = params->disableMask; hwi->restoreMask = params->restoreMask; break; } if (params->eventId != -1) { Hwi_eventMap(intNum, params->eventId); } /* keep intEvents[] current for ROV */ Hwi_module->intEvents[intNum] = Hwi_getEventId(intNum); if (params->enableInt) { Hwi_enableInterrupt(intNum); } }
/*! * ======== InterruptDsp_intRegister ======== */ Void InterruptDsp_intRegister(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo, Fxn func, UArg arg) { UInt key; Int index; InterruptDsp_FxnTable *table; Assert_isTrue(intInfo->intVectorId <= 15, ti_sdo_ipc_Ipc_A_internal); if (remoteProcId == InterruptDsp_hostProcId) { index = 0; } else if (remoteProcId == InterruptDsp_videoProcId) { index = 1; } else if (remoteProcId == InterruptDsp_vpssProcId) { index = 2; } else { Assert_isTrue(FALSE, ti_sdo_ipc_Ipc_A_internal); return; /* keep Coverity happy */ } /* Disable global interrupts */ key = Hwi_disable(); table = &(InterruptDsp_module->fxnTable[index]); table->func = func; table->arg = arg; InterruptDsp_intClear(remoteProcId, intInfo); /* Make sure the interrupt only gets plugged once */ InterruptDsp_module->numPlugged++; if (InterruptDsp_module->numPlugged == 1) { /* Map the interrupt number to HWI vector */ Hwi_eventMap(intInfo->intVectorId, DSPINT); Hwi_create(intInfo->intVectorId, (Hwi_FuncPtr)InterruptDsp_intShmStub, NULL, NULL); Hwi_enableInterrupt(intInfo->intVectorId); } /* Enable the mailbox interrupt to the DSP */ InterruptDsp_intEnable(remoteProcId, intInfo); /* Restore global interrupts */ Hwi_restore(key); }
/* * ======== Hwi_Module_startup ======== */ Int Hwi_Module_startup(Int phase) { Int i; Hwi_Object *hwi; #ifdef ti_sysbios_BIOS_useSK__D UInt32* fxnPtr = &ti_sysbios_family_c64p_Hwi_int2; #endif /* Task and Swi APIs used not called until BIOS_start() */ /* okay to proceed with initialization */ #ifndef ti_sysbios_hal_Hwi_DISABLE_ALL_HOOKS for (i = 0; i < Hwi_hooks.length; i++) { if (Hwi_hooks.elem[i].registerFxn != NULL) { Hwi_hooks.elem[i].registerFxn(i); } } #endif #ifdef ti_sysbios_BIOS_useSK__D /* register interrupts 2-15 with SK */ for (i = 2; i < 16; i++) { SK_registerOSIntr(i, fxnPtr); fxnPtr = fxnPtr + 8; } /* NMI vector */ fxnPtr = &ti_sysbios_family_c64p_Hwi_int1; /* Register NMI vector with SK for exceptions */ SK_registerOSHWE(fxnPtr); /* Register NMI vector with SK for SWE processing */ SK_registerOSSWE(fxnPtr); #else /* Initialize the vector table pointer, ISTP */ ISTP = (UInt) Hwi_module->vectorTableBase; #endif /* * Initialize the pointer to the isrStack. These symbols are part of the * Hwi_module (instead of floating) in order to support ROM. * Leave room for one 32-bit value pushed by xdc_runtime_Startup_reset() * (for cases where intentionally reset as resume from power down), * and maintain double word alignment. */ Hwi_module->isrStack = Hwi_getIsrStackAddress() - 8; Hwi_module->taskSP = (Char *)-1;/* signal that we're executing on the */ /* ISR stack */ /* initialize INTMUX */ for (i = 4; i < Hwi_NUM_INTERRUPTS; i++) { if (Hwi_module->intEvents[i] != -1) { Hwi_eventMap(i, Hwi_module->intEvents[i]); } else { /* keep intEvents[] current for ROV */ Hwi_module->intEvents[i] = Hwi_getEventId(i); } } /* start with a clean slate after initializing INTMUX */ ICR = 0xffff; Hwi_enableIER(Hwi_module->ierMask); /* IER per static Hwi settings */ for (i = 0; i < Hwi_NUM_INTERRUPTS; i++) { hwi = Hwi_module->dispatchTable[i]; if (hwi != NULL) { Hwi_postInit(hwi, NULL); } } return (Startup_DONE); }