216 lines
4.1 KiB
C
216 lines
4.1 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
xxtimer.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the HAL's timer-related APIs
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Eric Nelson (enelson) July 6, 2000
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "halp.h"
|
|||
|
#include "xxtimer.h"
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text(INIT, HalpSetTimerFunctions)
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// External function prototypes
|
|||
|
//
|
|||
|
ULONG
|
|||
|
HalpAcpiTimerSetTimeIncrement(
|
|||
|
IN ULONG DesiredIncrement
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
HalpAcpiTimerStallExecProc(
|
|||
|
IN ULONG MicroSeconds
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
HalpAcpiTimerCalibratePerfCount(
|
|||
|
IN LONG volatile *Number,
|
|||
|
IN ULONGLONG NewCount
|
|||
|
);
|
|||
|
VOID
|
|||
|
HalpPmTimerCalibratePerfCount(
|
|||
|
IN LONG volatile *Number,
|
|||
|
IN ULONGLONG NewCount
|
|||
|
);
|
|||
|
|
|||
|
LARGE_INTEGER
|
|||
|
HalpAcpiTimerQueryPerfCount(
|
|||
|
OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
LARGE_INTEGER
|
|||
|
HalpPmTimerQueryPerfCount(
|
|||
|
OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Local variables
|
|||
|
//
|
|||
|
static TIMER_FUNCTIONS HalpTimerFunctions = { HalpAcpiTimerStallExecProc,
|
|||
|
#ifdef NO_PM_KEQPC
|
|||
|
HalpAcpiTimerCalibratePerfCount,
|
|||
|
HalpAcpiTimerQueryPerfCount,
|
|||
|
#else
|
|||
|
HalpPmTimerCalibratePerfCount,
|
|||
|
HalpPmTimerQueryPerfCount,
|
|||
|
#endif
|
|||
|
HalpAcpiTimerSetTimeIncrement };
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
HalpSetTimerFunctions(
|
|||
|
IN PTIMER_FUNCTIONS TimerFunctions
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine can be used to override the HALs ACPI-timer functions with
|
|||
|
multimedia event timer functions
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
TimerFunctions - Pointer to a table of timer functions
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
HalpTimerFunctions = *TimerFunctions;
|
|||
|
|
|||
|
#if 1
|
|||
|
HalpTimerFunctions.SetTimeIncrement = HalpAcpiTimerSetTimeIncrement;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ULONG
|
|||
|
HalSetTimeIncrement(
|
|||
|
IN ULONG DesiredIncrement
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine initialize system time clock to generate an
|
|||
|
interrupt at every DesiredIncrement interval
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DesiredIncrement - Desired interval between every timer tick (in
|
|||
|
100ns unit)
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The *REAL* time increment set
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return (HalpTimerFunctions.SetTimeIncrement)(DesiredIncrement);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
HalCalibratePerformanceCounter(
|
|||
|
IN LONG volatile *Number,
|
|||
|
IN ULONGLONG NewCount
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine resets the performance counter value for the current
|
|||
|
processor to zero, the reset is done such that the resulting value
|
|||
|
is closely synchronized with other processors in the configuration
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Number - Supplies a pointer to count of the number of processors in
|
|||
|
the configuration
|
|||
|
|
|||
|
NewCount - Supplies the value to synchronize the counter too
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
(HalpTimerFunctions.CalibratePerfCount)(Number, NewCount);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LARGE_INTEGER
|
|||
|
KeQueryPerformanceCounter(
|
|||
|
OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns current 64-bit performance counter and,
|
|||
|
optionally, the Performance Frequency
|
|||
|
|
|||
|
N.B. The performace counter returned by this routine is
|
|||
|
not necessary the value when this routine is just entered,
|
|||
|
The value returned is actually the counter value at any point
|
|||
|
between the routine is entered and is exited
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
PerformanceFrequency - optionally, supplies the address of a
|
|||
|
variable to receive the performance counter
|
|||
|
frequency
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Current value of the performance counter will be returned
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return (HalpTimerFunctions.QueryPerfCount)(PerformanceFrequency);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
KeStallExecutionProcessor(
|
|||
|
IN ULONG MicroSeconds
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function stalls execution for the specified number of microseconds
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
MicroSeconds - Supplies the number of microseconds that execution is to be
|
|||
|
stalled
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
(HalpTimerFunctions.StallExecProc)(MicroSeconds);
|
|||
|
}
|