EFI_STATUS QNCSmmCoreUnRegister ( IN QNC_SMM_GENERIC_PROTOCOL *This, IN EFI_HANDLE DispatchHandle ) /*++ Routine Description: Arguments: Returns: --*/ // GC_TODO: This - add argument and description to function comment // GC_TODO: DispatchHandle - add argument and description to function comment // GC_TODO: EFI_INVALID_PARAMETER - add return value to function comment // GC_TODO: EFI_INVALID_PARAMETER - add return value to function comment // GC_TODO: EFI_SUCCESS - add return value to function comment { BOOLEAN SafeToDisable; DATABASE_RECORD *RecordToDelete; DATABASE_RECORD *RecordInDb; LIST_ENTRY *LinkInDb; if (DispatchHandle == NULL) { return EFI_INVALID_PARAMETER; } if (BASE_CR (DispatchHandle, DATABASE_RECORD, Link)->Signature != DATABASE_RECORD_SIGNATURE) { return EFI_INVALID_PARAMETER; } RecordToDelete = DATABASE_RECORD_FROM_LINK (DispatchHandle); RemoveEntryList (&RecordToDelete->Link); RecordToDelete->Signature = 0; // // See if we can disable the source, reserved for future use since this might // not be the only criteria to disable // SafeToDisable = TRUE; LinkInDb = GetFirstNode (&mPrivateData.CallbackDataBase); while(!IsNull (&mPrivateData.CallbackDataBase, LinkInDb)) { RecordInDb = DATABASE_RECORD_FROM_LINK (LinkInDb); if (CompareEnables (&RecordToDelete->SrcDesc, &RecordInDb->SrcDesc)) { SafeToDisable = FALSE; break; } LinkInDb = GetNextNode (&mPrivateData.CallbackDataBase, &RecordInDb->Link); } if (SafeToDisable) { QNCSmmDisableSource( &RecordToDelete->SrcDesc ); } FreePool (RecordToDelete); return EFI_SUCCESS; }
VOID QNCSmmPeriodicTimerProgramTimers ( VOID ) { UINT32 GpePmcwValue; SUPPORTED_TIMER Timer; DATABASE_RECORD *RecordInDb; LIST_ENTRY *LinkInDb; TIMER_INTERVAL *TimerInterval; // // Find the minimum required interval for each timer // for (Timer = (SUPPORTED_TIMER)0; Timer < NUM_TIMERS; Timer++) { mTimers[Timer].MinReqInterval = ~(UINT64)0x0; mTimers[Timer].NumChildren = 0; } LinkInDb = GetFirstNode (&mPrivateData.CallbackDataBase); while (!IsNull (&mPrivateData.CallbackDataBase, LinkInDb)) { RecordInDb = DATABASE_RECORD_FROM_LINK (LinkInDb); if (RecordInDb->ProtocolType == PeriodicTimerType) { // // This child is registerd with the PeriodicTimer protocol // TimerInterval = ContextToTimerInterval (&RecordInDb->ChildContext); if(TimerInterval != NULL) { Timer = (SUPPORTED_TIMER)((TIMER_INTERVAL *) (TimerInterval))->AssociatedTimer; ASSERT (Timer >= 0 && Timer < NUM_TIMERS); if (mTimers[Timer].MinReqInterval > RecordInDb->ChildContext.PeriodicTimer.SmiTickInterval) { mTimers[Timer].MinReqInterval = RecordInDb->ChildContext.PeriodicTimer.SmiTickInterval; } mTimers[Timer].NumChildren++; } } LinkInDb = GetNextNode (&mPrivateData.CallbackDataBase, &RecordInDb->Link); } // // Program the hardware // GpePmcwValue = 0; if (mTimers[PERIODIC_TIMER].NumChildren > 0) { switch (mTimers[PERIODIC_TIMER].MinReqInterval) { case TIME_64s: GpePmcwValue = INDEX_TIME_64s; mTimers[PERIODIC_TIMER].CurrentSetting = INDEX_TIME_64s; break; case TIME_32s: GpePmcwValue = INDEX_TIME_32s; mTimers[PERIODIC_TIMER].CurrentSetting = INDEX_TIME_32s; break; case TIME_16s: GpePmcwValue = INDEX_TIME_16s; mTimers[PERIODIC_TIMER].CurrentSetting = INDEX_TIME_16s; break; case TIME_8s: GpePmcwValue = INDEX_TIME_8s; mTimers[PERIODIC_TIMER].CurrentSetting = INDEX_TIME_8s; break; case TIME_64ms: GpePmcwValue = INDEX_TIME_64ms; mTimers[PERIODIC_TIMER].CurrentSetting = INDEX_TIME_64ms; break; case TIME_32ms: GpePmcwValue = INDEX_TIME_32ms; mTimers[PERIODIC_TIMER].CurrentSetting = INDEX_TIME_32ms; break; case TIME_16ms: GpePmcwValue = INDEX_TIME_16ms; mTimers[PERIODIC_TIMER].CurrentSetting = INDEX_TIME_16ms; break; case TIME_1_5ms: GpePmcwValue = INDEX_TIME_1_5ms; mTimers[PERIODIC_TIMER].CurrentSetting = INDEX_TIME_1_5ms; break; default: ASSERT (FALSE); break; }; GpePmcwValue |= B_QNC_GPE0BLK_PMCW_PSE; IoOr32(((UINT16)(LpcPciCfg32 (R_QNC_LPC_GPE0BLK) & 0xFFFF) + R_QNC_GPE0BLK_PMCW), GpePmcwValue); // // Restart the timer here, just need to clear the SMI // QNCSmmClearSource (&mTIMER_SOURCE_DESCS[PERIODIC_TIMER]); } else { QNCSmmDisableSource (&mTIMER_SOURCE_DESCS[PERIODIC_TIMER]); } }