636 lines
19 KiB
C
636 lines
19 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1995 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
podata.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the global read/write data for the I/O system.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
N. Yoshiyama [IBM Corp] 07-April-1994 ( Depends on Microsoft's design )
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "pop.h"
|
|||
|
|
|||
|
#ifdef ALLOC_DATA_PRAGMA
|
|||
|
#pragma const_seg("PAGECONST")
|
|||
|
#endif // ALLOC_DATA_PRAGMA
|
|||
|
#include "initguid.h" // define PO guids
|
|||
|
#include "poclass.h"
|
|||
|
#ifdef ALLOC_DATA_PRAGMA
|
|||
|
#pragma const_seg()
|
|||
|
#endif // ALLOC_DATA_PRAGMA
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Define the global data for the Power Management.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Power Locks
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Protects the IRP serial list.
|
|||
|
//
|
|||
|
KSPIN_LOCK PopIrpSerialLock;
|
|||
|
|
|||
|
//
|
|||
|
// Protects all Dope structures and dependents,
|
|||
|
// including all Notify and Idle operations.
|
|||
|
//
|
|||
|
KSPIN_LOCK PopDopeGlobalLock;
|
|||
|
|
|||
|
//
|
|||
|
// Must be held during creation or
|
|||
|
// destruction of power notify channel
|
|||
|
// structures.
|
|||
|
ERESOURCE PopNotifyLock;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// PoPowerSequence - The current power sequence value. Forever counts
|
|||
|
// up each time the machine is resumed from a suspend or hibernate
|
|||
|
//
|
|||
|
ULONG PoPowerSequence;
|
|||
|
|
|||
|
//
|
|||
|
// PopInvalidNotifyBlockCount is the number of power notify blocks which
|
|||
|
// have been invalidated but not fully closed up and freed. Should be 0
|
|||
|
// most of the time. Non-0 indicates callers have failed to clean up
|
|||
|
// in response to an Invalidate notify.
|
|||
|
//
|
|||
|
ULONG PopInvalidNotifyBlockCount;
|
|||
|
|
|||
|
//
|
|||
|
// Irp serializtion and Inrush serialization - pocall.c and related
|
|||
|
//
|
|||
|
LIST_ENTRY PopIrpSerialList;
|
|||
|
ULONG PopIrpSerialListLength;
|
|||
|
BOOLEAN PopInrushPending;
|
|||
|
PIRP PopInrushIrpPointer;
|
|||
|
LONG PopInrushIrpReferenceCount;
|
|||
|
|
|||
|
//
|
|||
|
// PopSystemIrpDisptachWorker control, etc
|
|||
|
//
|
|||
|
KSPIN_LOCK PopWorkerLock;
|
|||
|
ULONG PopCallSystemState;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// For debugging, a list of all the outstanding PoRequestPowerIrps
|
|||
|
//
|
|||
|
LIST_ENTRY PopRequestedIrps;
|
|||
|
|
|||
|
//
|
|||
|
// Idle detection service - see idle.c
|
|||
|
//
|
|||
|
// When adding to, removing from, or scanning the IdleDetectList, code
|
|||
|
// must be at DPC_LEVEL and must hold the PopGlobalDopeLock
|
|||
|
//
|
|||
|
LIST_ENTRY PopIdleDetectList;
|
|||
|
|
|||
|
//
|
|||
|
// A timer & defered procedure call to process idle scans
|
|||
|
//
|
|||
|
KTIMER PopIdleScanTimer;
|
|||
|
KDPC PopIdleScanDpc;
|
|||
|
LARGE_INTEGER PopIdleScanTime;
|
|||
|
|
|||
|
//
|
|||
|
// Two scan modes, performance, conservation...
|
|||
|
//
|
|||
|
BOOLEAN PopIdleDetectionMode = PO_IDLE_PERFORMANCE;
|
|||
|
|
|||
|
//
|
|||
|
// This value holds all Power Management Simulation Flags
|
|||
|
//
|
|||
|
ULONG PopSimulate = POP_ENABLE_HIBER_PERF;
|
|||
|
|
|||
|
//
|
|||
|
// These defines are only used to initialize these global variables,
|
|||
|
// so it makes sense to pair them all up. The global variables are
|
|||
|
// all used for idle state transition calculations
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// When throttling down an idle processor, keep it at least 30% active
|
|||
|
//
|
|||
|
#define IDLE_DEFAULT_MIN_THROTTLE 30
|
|||
|
ULONG PopIdleDefaultMinThrottle = IDLE_DEFAULT_MIN_THROTTLE;
|
|||
|
|
|||
|
//
|
|||
|
// When a processor is throttled down, queue a timer to verify that a
|
|||
|
// processor does not go significantly "busy" and never returns to
|
|||
|
// the idle loop for a throttle adjustment
|
|||
|
// N.B idle values are in microseconds
|
|||
|
//
|
|||
|
#define IDLE_THROTTLE_CHECK_RATE 30000 // 30ms
|
|||
|
ULONG PopIdleThrottleCheckRate = IDLE_THROTTLE_CHECK_RATE;
|
|||
|
|
|||
|
//
|
|||
|
// If the throttle check timer noticies a processor has not returned
|
|||
|
// to the idle loop for at least 100ms, then abort it's throttle
|
|||
|
//
|
|||
|
#define IDLE_THROTTLE_CHECK_TIMEOUT 100000 // 100ms
|
|||
|
ULONG PopIdleThrottleCheckTimeout = IDLE_THROTTLE_CHECK_TIMEOUT;
|
|||
|
|
|||
|
//
|
|||
|
// To promote from Idle 0 the processor must be more then 90% idle over
|
|||
|
// the last 10 seconds
|
|||
|
//
|
|||
|
#define IDLE_FROM_0_DELAY 10000000 // 10 seconds
|
|||
|
#define IDLE_FROM_0_IDLE_PERCENT 90 // > 90% to promote from idle 0
|
|||
|
ULONG PopIdleFrom0Delay = IDLE_FROM_0_DELAY;
|
|||
|
ULONG PopIdleFrom0IdlePercent = IDLE_FROM_0_IDLE_PERCENT;
|
|||
|
|
|||
|
//
|
|||
|
// First idle handler checks no more then every 100ms
|
|||
|
// idle below 20%
|
|||
|
//
|
|||
|
#define IDLE_0_TIME_CHECK 500000 // 500ms
|
|||
|
ULONG PopIdle0TimeCheck = IDLE_0_TIME_CHECK;
|
|||
|
|
|||
|
//
|
|||
|
// When in other idle state check every 100ms
|
|||
|
//
|
|||
|
#define IDLE_TIME_CHECK 100000 // 100ms
|
|||
|
ULONG PopIdleTimeCheck = IDLE_TIME_CHECK;
|
|||
|
|
|||
|
//
|
|||
|
// To demote to Idle 0 the processor must be less then 80% idle in a 100ms window
|
|||
|
//
|
|||
|
#define IDLE_TO_0_PERCENT 80
|
|||
|
ULONG PopIdleTo0Percent = IDLE_TO_0_PERCENT;
|
|||
|
|
|||
|
//
|
|||
|
// The default demotion occurs at less then 50% idle for 100ms
|
|||
|
// N.B. The implementation assumes that IDLE_DEFAULT_DEMOTE_TIME divides
|
|||
|
// into IDLE_DEFAULT_PROMOTE_TIME evenly
|
|||
|
//
|
|||
|
#define IDLE_DEFAULT_DEMOTE_PERCENT 50
|
|||
|
#define IDLE_DEFAULT_DEMOTE_TIME 100000
|
|||
|
ULONG PopIdleDefaultDemotePercent = IDLE_DEFAULT_DEMOTE_PERCENT;
|
|||
|
ULONG PopIdleDefaultDemoteTime = IDLE_DEFAULT_DEMOTE_TIME;
|
|||
|
|
|||
|
//
|
|||
|
// The default promotion occurs at more then 70% idle for 500ms
|
|||
|
//
|
|||
|
#define IDLE_DEFAULT_PROMOTE_TIME 500000 // 500ms
|
|||
|
#define IDLE_DEFAULT_PROMOTE_PERCENT 70
|
|||
|
ULONG PopIdleDefaultPromotePercent = IDLE_DEFAULT_PROMOTE_PERCENT;
|
|||
|
ULONG PopIdleDefaultPromoteTime = IDLE_DEFAULT_PROMOTE_TIME;
|
|||
|
|
|||
|
//
|
|||
|
// We define special extra global variables to handle promotion to/from
|
|||
|
// C1. The reason that we do this is so that we can more finely tune these
|
|||
|
// values.
|
|||
|
//
|
|||
|
ULONG PopIdleDefaultDemoteToC1Percent = IDLE_DEFAULT_DEMOTE_PERCENT;
|
|||
|
ULONG PopIdleDefaultDemoteToC1Time = IDLE_DEFAULT_DEMOTE_TIME;
|
|||
|
ULONG PopIdleDefaultPromoteFromC1Percent = IDLE_DEFAULT_PROMOTE_PERCENT;
|
|||
|
ULONG PopIdleDefaultPromoteFromC1Time = IDLE_DEFAULT_PROMOTE_TIME;
|
|||
|
|
|||
|
//
|
|||
|
// We convert PopIdleFrom0Delay (which is in ms) over to KeTimeIncrement
|
|||
|
// intervals. This is the number of ticks needed for processor to be idle before
|
|||
|
// we consider a promotion out of the Idle0 state
|
|||
|
//
|
|||
|
ULONG PopIdle0PromoteTicks;
|
|||
|
|
|||
|
//
|
|||
|
// We convert PopIdleFrom0Delay and PopIdleFrom0IdlePercent percent into
|
|||
|
// KeTimeIncrement inverals. This is the number of ticks allowed to acculate the
|
|||
|
// the PromoteTicks time
|
|||
|
//
|
|||
|
ULONG PopIdle0PromoteLimit;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// These global variables and definitions all relate to CPU throttle management
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// A value that defines the period of time, in microseconds (us) between
|
|||
|
// intervals to check the processor busyness for the purposes of processor
|
|||
|
// throttling by the idle thread. Note that we need to convert this value
|
|||
|
// to KeTimeIncrement intervals. We store the converted number in
|
|||
|
// PopPerfTimeTicks
|
|||
|
//
|
|||
|
#define PROC_PERF_TIME_DELTA 50000 // 50ms
|
|||
|
ULONG PopPerfTimeDelta = PROC_PERF_TIME_DELTA;
|
|||
|
ULONG PopPerfTimeTicks = 0;
|
|||
|
|
|||
|
//
|
|||
|
// A value that defines the period of time, in microseconds (us) between
|
|||
|
// intervals to check the processor busyness for the purposes of processor
|
|||
|
// throttling by a DPC routine. Note that we need to convert this value
|
|||
|
// to KeTimeIncrement intervals. We store the converted number in
|
|||
|
// PopPerfCriticalTimeTicks.
|
|||
|
//
|
|||
|
#define PROC_PERF_CRITICAL_TIME_DELTA 300000 // 300ms
|
|||
|
ULONG PopPerfCriticalTimeDelta = PROC_PERF_CRITICAL_TIME_DELTA;
|
|||
|
ULONG PopPerfCriticalTimeTicks = 0;
|
|||
|
|
|||
|
//
|
|||
|
// A percentage value that is added to the current CPU busyness percentage
|
|||
|
// to determine if the processor is too busy for the current performance
|
|||
|
// state and must be promoted. The closer the value is to zero, the harder it
|
|||
|
// is for the processor to promote itself during times of extreme workloads
|
|||
|
//
|
|||
|
#define PROC_PERF_CRITICAL_FREQUENCY_DELTA 0 // 0%
|
|||
|
ULONG PopPerfCriticalFrequencyDelta = PROC_PERF_CRITICAL_FREQUENCY_DELTA;
|
|||
|
|
|||
|
//
|
|||
|
// A percentage value where lower means that the overall IncreaseLevel will
|
|||
|
// actually be higher (and thus promotions won't occur as frequently) that
|
|||
|
// indicates what percentage of the delta betwene the current state and the
|
|||
|
// state to promote to should be used to set the promote level. A suggested
|
|||
|
// value would be 20%
|
|||
|
//
|
|||
|
#define PROC_PERF_INCREASE_PERC_MOD 20 // 20%
|
|||
|
ULONG PopPerfIncreasePercentModifier = PROC_PERF_INCREASE_PERC_MOD;
|
|||
|
|
|||
|
//
|
|||
|
// A percentage value where lower means that the overall IncreaseLevel will
|
|||
|
// actually be higher (and thus promotions won't occur as frequently) that
|
|||
|
// indicates how many extra percentage points to remove from the promote level.
|
|||
|
// It should be noted that if this value is particularly high, confusion migh
|
|||
|
// result due to overlapping windows. A suggested value would be 1%
|
|||
|
//
|
|||
|
#define PROC_PERF_INCREASE_ABS_MOD 1 // 1%
|
|||
|
ULONG PopPerfIncreaseAbsoluteModifier = PROC_PERF_INCREASE_ABS_MOD;
|
|||
|
|
|||
|
//
|
|||
|
// A percentage value where higher means that the overall DecreaseLevel will
|
|||
|
// actually be lower (and thus demotions won't occur as frequently) that
|
|||
|
// indicates what percentage of the delta between the current state and the
|
|||
|
// state to demote to should be used to set the demote level. A suggested
|
|||
|
// value is 30%
|
|||
|
//
|
|||
|
#define PROC_PERF_DECREASE_PERC_MOD 30 // 50%
|
|||
|
ULONG PopPerfDecreasePercentModifier = PROC_PERF_DECREASE_PERC_MOD;
|
|||
|
|
|||
|
//
|
|||
|
// A percentage value where higher means that the overall DecreaseLevel will
|
|||
|
// actually be lower (and thus demotions won't occur as frequently) that
|
|||
|
// indicates how many extra percentage points to subtract from the demote
|
|||
|
// level. It should be noted that if the value is particularly high, then it
|
|||
|
// might not be possible to demote from this state. A suggested value would be
|
|||
|
// 1%
|
|||
|
//
|
|||
|
#define PROC_PERF_DECREASE_ABS_MOD 1 // 1%
|
|||
|
ULONG PopPerfDecreaseAbsoluteModifier = PROC_PERF_DECREASE_ABS_MOD;
|
|||
|
|
|||
|
//
|
|||
|
// A value that defines the period of time, in microseconds (us) that must
|
|||
|
// have occured before a throttle increase can be considered. This value is
|
|||
|
// used as the basis for calculating the promotion time for each throttle
|
|||
|
// step
|
|||
|
//
|
|||
|
#define PROC_PERF_INCREASE_TIME 10000 // 10 ms
|
|||
|
#define PROC_PERF_INCREASE_MINIMUM_TIME 150000 // 150 ms
|
|||
|
ULONG PopPerfIncreaseTimeValue = PROC_PERF_INCREASE_TIME;
|
|||
|
ULONG PopPerfIncreaseMinimumTime = PROC_PERF_INCREASE_MINIMUM_TIME;
|
|||
|
//
|
|||
|
// A value that defines the period of time, in microseconds (us) that must
|
|||
|
// have occured before a throttle decrease can be considered. This value is
|
|||
|
// used as the basis for calculating the demotion time for each throttle
|
|||
|
// step
|
|||
|
//
|
|||
|
#define PROC_PERF_DECREASE_TIME 10000 // 10 ms
|
|||
|
#define PROC_PERF_DECREASE_MINIMUM_TIME 500000 // 500 ms
|
|||
|
ULONG PopPerfDecreaseTimeValue = PROC_PERF_DECREASE_TIME;
|
|||
|
ULONG PopPerfDecreaseMinimumTime = PROC_PERF_DECREASE_MINIMUM_TIME;
|
|||
|
|
|||
|
//
|
|||
|
// A percentage value that represents at what point of battery capacity we
|
|||
|
// will start forcing down the throttle when we are in Degraded Throttling
|
|||
|
// mode. For example, a value of 50% means that we will start throttling
|
|||
|
// down the CPU when the battery reaches 50%
|
|||
|
//
|
|||
|
#define PROC_PERF_DEGRADE_MIN_CAP 50 // 50%
|
|||
|
ULONG PopPerfDegradeThrottleMinCapacity = PROC_PERF_DEGRADE_MIN_CAP;
|
|||
|
|
|||
|
//
|
|||
|
// A percentage value that represents the lowest frequency we can force the
|
|||
|
// throttle down to when we are in the Degraded Throttling mode. For example,
|
|||
|
// a value of 30% means that we will never force the CPU below 30%
|
|||
|
//
|
|||
|
#define PROC_PERF_DEGRADE_MIN_FREQ 30 // 30%
|
|||
|
ULONG PopPerfDegradeThrottleMinFrequency = PROC_PERF_DEGRADE_MIN_FREQ;
|
|||
|
|
|||
|
//
|
|||
|
// A percentage value that represents the maximum amount of time that was
|
|||
|
// spent in C3 for the last quanta before the idle loop will deside that
|
|||
|
// it should optimize power for C3 usage. A sample value would be 50%
|
|||
|
//
|
|||
|
#define PROC_PERF_MAX_C3_FREQUENCY 50 // 50%
|
|||
|
ULONG PopPerfMaxC3Frequency = PROC_PERF_MAX_C3_FREQUENCY;
|
|||
|
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
//
|
|||
|
// PoDebug - Debug level
|
|||
|
//
|
|||
|
|
|||
|
ULONG PoDebug = PO_ERROR;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// PopPolicyLock - Protects policy data structures
|
|||
|
//
|
|||
|
ERESOURCE PopPolicyLock;
|
|||
|
|
|||
|
//
|
|||
|
// PopWorkerSpinLock - Protects worker dispatch data
|
|||
|
// PopWorkerPending - A set bit for each worker cataogry which is pending
|
|||
|
// PopWorkerStatus - A clear bit for each worker catagory being serived
|
|||
|
//
|
|||
|
KSPIN_LOCK PopWorkerSpinLock;
|
|||
|
ULONG PopWorkerPending;
|
|||
|
ULONG PopWorkerStatus;
|
|||
|
|
|||
|
//
|
|||
|
// PopNotifyEvents - PO_NOTIFY_xxx events which have fired.
|
|||
|
//
|
|||
|
ULONG PopNotifyEvents;
|
|||
|
|
|||
|
//
|
|||
|
// PopVolumeLock - protects PopVolumeDevices from insertion. (removal is
|
|||
|
// protected by the policy lock
|
|||
|
//
|
|||
|
FAST_MUTEX PopVolumeLock;
|
|||
|
FAST_MUTEX PopRequestWakeLock;
|
|||
|
|
|||
|
//
|
|||
|
// PopVolumeDevices - a list of off device objects which have had a VPBs attached
|
|||
|
//
|
|||
|
LIST_ENTRY PopVolumeDevices = {0};
|
|||
|
|
|||
|
//
|
|||
|
// PopRequestWakeLock - synchronizes NtRequest/CancelDeviceWakeup
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// PopPolicyWorker - Work queue item to get another worker thread
|
|||
|
//
|
|||
|
WORK_QUEUE_ITEM PopPolicyWorker;
|
|||
|
|
|||
|
//
|
|||
|
// PopIdle - Pointer to Array of idle handlers.
|
|||
|
//
|
|||
|
PPOP_IDLE_HANDLER PopIdle;
|
|||
|
|
|||
|
//
|
|||
|
// PopIdleHandlerLookAsideList - List to allocate storage from for idle
|
|||
|
// handlers.
|
|||
|
//
|
|||
|
NPAGED_LOOKASIDE_LIST PopIdleHandlerLookAsideList;
|
|||
|
|
|||
|
//
|
|||
|
// PopAttribute - Book keeping
|
|||
|
//
|
|||
|
POP_STATE_ATTRIBUTE PopAttributes[POP_NUMBER_ATTRIBUTES] = {
|
|||
|
0, PopSystemRequiredSet, FALSE, 0,
|
|||
|
0, PopDisplayRequired, TRUE, 0, // 0, PopSetNotificationWork, TRUE, PO_NOTIFY_DISPLAY_REQUIRED,
|
|||
|
0, PopUserPresentSet, FALSE, 0,
|
|||
|
0, PopAttribNop, FALSE, 0,
|
|||
|
0, PopSetNotificationWork, TRUE, PO_NOTIFY_CAPABILITIES
|
|||
|
};
|
|||
|
|
|||
|
//
|
|||
|
// PopFullWake - Flag to indicate the system has transistioned from
|
|||
|
// a quite wake to a full wake
|
|||
|
//
|
|||
|
ULONG PopFullWake;
|
|||
|
|
|||
|
//
|
|||
|
// PoHiberInProgress - True when in the critical hibernation section
|
|||
|
//
|
|||
|
BOOLEAN PoHiberInProgress;
|
|||
|
|
|||
|
//
|
|||
|
// PopShutdownCleanly - Controls whether clean shutdown sequence should
|
|||
|
// be used.
|
|||
|
//
|
|||
|
ULONG PopShutdownCleanly = 0;
|
|||
|
|
|||
|
//
|
|||
|
// PopDispatchPolicyIrps - Used to prevent policy irps from dispatching
|
|||
|
// until the base drivers are loaded
|
|||
|
//
|
|||
|
BOOLEAN PopDispatchPolicyIrps;
|
|||
|
|
|||
|
//
|
|||
|
// PopSystemIdleTimer - Timer used to get idle system detection worker
|
|||
|
//
|
|||
|
KTIMER PoSystemIdleTimer;
|
|||
|
|
|||
|
//
|
|||
|
// PopSIdle - tracks the idle state of the system
|
|||
|
//
|
|||
|
POP_SYSTEM_IDLE PopSIdle;
|
|||
|
|
|||
|
//
|
|||
|
// PopPolicyLockThread - Conains the current owning thread of the
|
|||
|
// policy mutex.
|
|||
|
//
|
|||
|
PKTHREAD PopPolicyLockThread = NULL;
|
|||
|
|
|||
|
//
|
|||
|
// PopAcPolicy - current power policy being implemented while on AC
|
|||
|
// PopDcPolicy - current power policy being implemented while not on AC
|
|||
|
// PopPolicy - current active policy
|
|||
|
//
|
|||
|
SYSTEM_POWER_POLICY PopAcPolicy = {0};
|
|||
|
SYSTEM_POWER_POLICY PopDcPolicy = {0};
|
|||
|
PSYSTEM_POWER_POLICY PopPolicy = NULL;
|
|||
|
|
|||
|
//
|
|||
|
// PopAcProcessorPolicy - current processor power policy being implemented on AC
|
|||
|
// PopDcProcessorPolicy - current processor power policy being implemented on DC
|
|||
|
// PopProcessorPolicy - current active policy
|
|||
|
//
|
|||
|
PROCESSOR_POWER_POLICY PopAcProcessorPolicy = {0};
|
|||
|
PROCESSOR_POWER_POLICY PopDcProcessorPolicy = {0};
|
|||
|
PPROCESSOR_POWER_POLICY PopProcessorPolicy = NULL;
|
|||
|
|
|||
|
//
|
|||
|
// PopAction - Current power action being taken
|
|||
|
//
|
|||
|
POP_POWER_ACTION PopAction = {0};
|
|||
|
|
|||
|
//
|
|||
|
// Spinlock that protects the thermal zones
|
|||
|
//
|
|||
|
KSPIN_LOCK PopThermalLock;
|
|||
|
|
|||
|
//
|
|||
|
// PopSwitches - list of button and lid devices currently opened
|
|||
|
//
|
|||
|
LIST_ENTRY PopSwitches = {0};
|
|||
|
|
|||
|
//
|
|||
|
// User-present work item
|
|||
|
//
|
|||
|
WORK_QUEUE_ITEM PopUserPresentWorkItem = {0};
|
|||
|
|
|||
|
//
|
|||
|
// Performance counter frequency used by throttle.c
|
|||
|
//
|
|||
|
LARGE_INTEGER PopPerfCounterFrequency;
|
|||
|
|
|||
|
#ifdef ALLOC_DATA_PRAGMA
|
|||
|
#pragma data_seg("PAGEDATA")
|
|||
|
#pragma const_seg("PAGECONST")
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// Notify worker dispatch
|
|||
|
//
|
|||
|
const POP_NOTIFY_WORK PopNotifyWork[PO_NUMBER_NOTIFY] = {
|
|||
|
PopDispatchCallback, PO_CB_BUTTON_COLLISION,
|
|||
|
PopDispatchFullWake, 0,
|
|||
|
PopDispatchCallback, PO_CB_SYSTEM_POWER_POLICY,
|
|||
|
PopDispatchAcDcCallback, 0,
|
|||
|
PopDispatchPolicyCallout, 0,
|
|||
|
PopDispatchDisplayRequired, 0,
|
|||
|
PopDispatchCallout, PsW32SystemPowerState,
|
|||
|
PopDispatchEventCodes, 0,
|
|||
|
PopDispatchCallout, PsW32CapabilitiesChanged,
|
|||
|
PopDispatchSetStateFailure, 0,
|
|||
|
PopDispatchCallback, PO_CB_PROCESSOR_POWER_POLICY,
|
|||
|
PopDispatchProcessorPolicyCallout, 0
|
|||
|
};
|
|||
|
|
|||
|
//
|
|||
|
// PopAcRegName
|
|||
|
// PopDcRegName - registry location under current control set to store
|
|||
|
// and retrieve current policy settings from
|
|||
|
//
|
|||
|
const WCHAR PopRegKey[] = L"Control\\Session Manager\\Power";
|
|||
|
const WCHAR PopAcRegName[] = L"AcPolicy";
|
|||
|
const WCHAR PopDcRegName[] = L"DcPolicy";
|
|||
|
const WCHAR PopUndockPolicyRegName[] = L"UndockPowerPolicy";
|
|||
|
const WCHAR PopAdminRegName[] = L"PolicyOverrides";
|
|||
|
const WCHAR PopHeuristicsRegName[] = L"Heuristics";
|
|||
|
const WCHAR PopCompositeBatteryName[] = L"\\Device\\CompositeBattery";
|
|||
|
const WCHAR PopSimulateRegKey[] = L"Control\\Session Manager";
|
|||
|
const WCHAR PopSimulateRegName[] = L"PowerPolicySimulate";
|
|||
|
const WCHAR PopHiberFileName[] = L"\\hiberfil.sys";
|
|||
|
const WCHAR PopDebugHiberFileName[] = L"\\hiberfil.dbg";
|
|||
|
const WCHAR PopDumpStackPrefix[] = L"hiber_";
|
|||
|
const WCHAR PopApmActiveFlag[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\ApmActive";
|
|||
|
const WCHAR PopApmFlag[] = L"Active";
|
|||
|
const WCHAR PopAcProcessorRegName[] = L"AcProcessorPolicy";
|
|||
|
const WCHAR PopDcProcessorRegName[] = L"DcProcessorPolicy";
|
|||
|
|
|||
|
//
|
|||
|
// PopAdminPolcy - Administrator overrides to apply to the current policy
|
|||
|
//
|
|||
|
ADMINISTRATOR_POWER_POLICY PopAdminPolicy = {0};
|
|||
|
|
|||
|
//
|
|||
|
// PopCapabilities - Misc information on how the systems actual functions
|
|||
|
//
|
|||
|
SYSTEM_POWER_CAPABILITIES PopCapabilities; // nonpaged
|
|||
|
|
|||
|
//
|
|||
|
// PopEventCallout - callout to USER for power events
|
|||
|
//
|
|||
|
PKWIN32_POWEREVENT_CALLOUT PopEventCallout; // nonpaged
|
|||
|
|
|||
|
//
|
|||
|
// PopStateCallout - callout to USER for power state changes
|
|||
|
//
|
|||
|
PKWIN32_POWERSTATE_CALLOUT PopStateCallout = NULL;
|
|||
|
|
|||
|
//
|
|||
|
// PopThermal - list of thermal zones currently opened
|
|||
|
//
|
|||
|
LIST_ENTRY PopThermal; // nonpaged
|
|||
|
|
|||
|
//
|
|||
|
// PopCoolingMode - system is in active or passive cooling mode
|
|||
|
//
|
|||
|
ULONG PopCoolingMode = 0;
|
|||
|
|
|||
|
//
|
|||
|
// PopCB - composite battery
|
|||
|
//
|
|||
|
POP_COMPOSITE_BATTERY PopCB; // nonpaged
|
|||
|
|
|||
|
//
|
|||
|
// PopPolicyIrpQueue - Policy irps which have completed are put onto
|
|||
|
// this queue for processingby the worker thread
|
|||
|
//
|
|||
|
LIST_ENTRY PopPolicyIrpQueue; // nonpaged
|
|||
|
|
|||
|
//
|
|||
|
// PopEventCode - Queued event codes
|
|||
|
//
|
|||
|
ULONG PopEventCode[POP_MAX_EVENT_CODES] = {0};
|
|||
|
|
|||
|
//
|
|||
|
// PopWorkerTypes - Worker functions for each policy worker type
|
|||
|
//
|
|||
|
const POP_WORKER_TYPES PopWorkerTypes[] = {
|
|||
|
PopPolicyWorkerMain,
|
|||
|
PopPolicyWorkerActionPromote,
|
|||
|
PopPolicyWorkerAction,
|
|||
|
PopPolicyWorkerNotify,
|
|||
|
PopPolicySystemIdle,
|
|||
|
PopPolicyTimeChange
|
|||
|
};
|
|||
|
|
|||
|
//
|
|||
|
// PopActionWaiters - Queue of synchronous action requests
|
|||
|
//
|
|||
|
LIST_ENTRY PopActionWaiters = {0};
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// PopHeuristics - Presistant settings are heuristics which are not part
|
|||
|
// of the saved policy structures
|
|||
|
//
|
|||
|
POP_HEURISTICS PopHeuristics = {0};
|
|||
|
|
|||
|
#ifdef ALLOC_DATA_PRAGMA
|
|||
|
#pragma const_seg()
|
|||
|
#pragma data_seg()
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// PopPowerStateHandler - Handlers for the various supported power states
|
|||
|
//
|
|||
|
POWER_STATE_HANDLER PopPowerStateHandlers[PowerStateMaximum] = {0};
|
|||
|
|
|||
|
//
|
|||
|
// PopPowerStateNotifyHandler - Handler to be notify before and after invoking
|
|||
|
// PopPowerStateHandlers
|
|||
|
//
|
|||
|
|
|||
|
POWER_STATE_NOTIFY_HANDLER PopPowerStateNotifyHandler = {0};
|
|||
|
|
|||
|
//
|
|||
|
// PopHiberFile - information on the hibernation file
|
|||
|
// PopHiberFileDebug - a second hibernation file for debugging
|
|||
|
//
|
|||
|
POP_HIBER_FILE PopHiberFile = { NULL };
|
|||
|
POP_HIBER_FILE PopHiberFileDebug = { NULL };
|