Example #1
0
/*
 * Called by the power management kext to register itself and to get the
 * callbacks it might need into other kernel functions.  This interface
 * is versioned to allow for slight mis-matches between the kext and the
 * kernel.
 */
void
pmKextRegister(uint32_t version, pmDispatch_t *cpuFuncs,
    pmCallBacks_t *callbacks)
{
	if (callbacks != NULL && version == PM_DISPATCH_VERSION) {
		callbacks->setRTCPop            = setPop;
		callbacks->resyncDeadlines      = pmReSyncDeadlines;
		callbacks->initComplete         = pmInitComplete;
		callbacks->GetLCPU              = pmGetLogicalCPU;
		callbacks->GetCore              = pmGetCore;
		callbacks->GetDie               = pmGetDie;
		callbacks->GetPackage           = pmGetPackage;
		callbacks->GetMyLCPU            = pmGetMyLogicalCPU;
		callbacks->GetMyCore            = pmGetMyCore;
		callbacks->GetMyDie             = pmGetMyDie;
		callbacks->GetMyPackage         = pmGetMyPackage;
		callbacks->GetPkgRoot           = pmGetPkgRoot;
		callbacks->LockCPUTopology      = pmLockCPUTopology;
		callbacks->GetHibernate         = pmCPUGetHibernate;
		callbacks->LCPUtoProcessor      = pmLCPUtoProcessor;
		callbacks->ThreadBind           = thread_bind;
		callbacks->GetSavedRunCount     = pmGetSavedRunCount;
		callbacks->GetNanotimeInfo	= pmGetNanotimeInfo;
		callbacks->ThreadGetUrgency	= pmThreadGetUrgency;
		callbacks->RTCClockAdjust	= rtc_clock_adjust;
		callbacks->timerQueueMigrate    = pmTimerQueueMigrate;
		callbacks->topoParms            = &topoParms;
		callbacks->pmSendIPI		= pmSendIPI;
		callbacks->InterruptPending	= lapic_is_interrupt_pending;
		callbacks->IsInterrupting	= lapic_is_interrupting;
		callbacks->InterruptStats	= lapic_interrupt_counts;
		callbacks->DisableApicTimer	= lapic_disable_timer;
	} else {
		panic("Version mis-match between Kernel and CPU PM");
	}

	if (cpuFuncs != NULL) {
		if (pmDispatch) {
			panic("Attempt to re-register power management interface--AICPM present in xcpm mode? %p->%p", pmDispatch, cpuFuncs);
		}

		pmDispatch = cpuFuncs;

		if (earlyTopology
		    && pmDispatch->pmCPUStateInit != NULL) {
			(*pmDispatch->pmCPUStateInit)();
			earlyTopology = FALSE;
		}

		if (pmDispatch->pmIPIHandler != NULL) {
			lapic_set_pm_func((i386_intr_func_t)pmDispatch->pmIPIHandler);
		}
	}
}
Example #2
0
File: pmCPU.c Project: SbIm/xnu-env
/*
 * Called by the power management kext to register itself and to get the
 * callbacks it might need into other kernel functions.  This interface
 * is versioned to allow for slight mis-matches between the kext and the
 * kernel.
 */
void
pmKextRegister(uint32_t version, pmDispatch_t *cpuFuncs,
	       pmCallBacks_t *callbacks)
{
    if (callbacks != NULL && version == PM_DISPATCH_VERSION) {
	callbacks->setRTCPop            = setPop;
	callbacks->resyncDeadlines      = pmReSyncDeadlines;
	callbacks->initComplete         = pmInitComplete;
	callbacks->GetLCPU              = pmGetLogicalCPU;
	callbacks->GetCore              = pmGetCore;
	callbacks->GetDie               = pmGetDie;
	callbacks->GetPackage           = pmGetPackage;
	callbacks->GetMyLCPU            = pmGetMyLogicalCPU;
	callbacks->GetMyCore            = pmGetMyCore;
	callbacks->GetMyDie             = pmGetMyDie;
	callbacks->GetMyPackage         = pmGetMyPackage;
	callbacks->GetPkgRoot           = pmGetPkgRoot;
	callbacks->LockCPUTopology      = pmLockCPUTopology;
	callbacks->GetHibernate         = pmCPUGetHibernate;
	callbacks->LCPUtoProcessor      = pmLCPUtoProcessor;
	callbacks->ThreadBind           = thread_bind;
	callbacks->GetSavedRunCount     = pmGetSavedRunCount;
	callbacks->pmSendIPI		= pmSendIPI;
	callbacks->GetNanotimeInfo	= pmGetNanotimeInfo;
	callbacks->RTCClockAdjust       = rtc_clock_adjust;
	callbacks->topoParms            = &topoParms;
    } else {
	panic("Version mis-match between Kernel and CPU PM");
    }

    if (cpuFuncs != NULL) {
	pmDispatch = cpuFuncs;

	if (pmDispatch->pmIPIHandler != NULL) {
	    lapic_set_pm_func((i386_intr_func_t)pmDispatch->pmIPIHandler);
	}
    }
}