Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

263 lines
4.1 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
crusoe.h
Author:
Todd Carpenter (10/31/00) - create file
Environment:
Kernel mode
Notes:
Revision History:
--*/
#ifndef _CRUSOE_H
#define _CRUSOE_H
#include "..\lib\processor.h"
#include "..\eventmsg.h"
#include <pshpack1.h>
//
// CPUID
//
#define LONGRUN_CPUID_MAXFUNCTION 0x80860000 // Max supported CPUID function, (ie 0x80860007)
#define LONGRUN_CPUID_PROCESSOR_INFO 0x80860001
#define LONGRUN_CPUID_GETSTATE 0x80860007 // Current Speed, Voltage, and State
//
// read: upper:lower bound of current performance percentage window
// write: set the upper:lower bound of desired performance percentage window
// Correct:
// if EDX == EAX == 100d, then full performance (ie LongRun disabled)
// if EDX == EAX, then fixed performance
// if EDX > EAX, the performance within upper:lower window
//
// Incorrect: (results in #GP(0))
// if (EDX > 100d) or (EAX > 100d)
// if (EDX < EAX)
//
//
// CMS4.1 MSR
//
#define LONGRUN_CONTROL_STATUS_MSR 0x80868010
//
// CMS4.2 Longrun Table Interface MSR's
//
#define LONGRUN_FLAGS_REGISTER_MSR 0x80868011
#define LONGRUN_TI_READOUT_MSR 0x80868018
#define LONGRUN_TI_PERFORMANCE_INDEX_MSR 0x80868019
#define LONGRUN_TI_VOLTAGE_FREQUENCY_MSR 0x8086801A
#define LONGRUN_TI_MEMORY_DIVISORS_MSR 0x8086801B
#define LONGRUN_TI_IO_DIVISORS_MSR 0x8086801C
#define LONGRUN_TI_GATE_DELAY_MSR 0x8086801D
//
// Processor Feature Flags
//
#define FEATURE_LONGRUN_ENALBED 0x2
#define FEATURE_LRTI_ENABLED 0x8
#define INVALID_LONGRUN_STATE (ULONG)-1
#define MAX_LONGRUN_VALUE 100
#define MAX_LONGRUN_STATES 4
#define CRUSOE_TRANSITION_LATENCY 20 // microseconds
typedef struct _STATE_INFO {
ULONG CpuSpeed;
ULONG Voltage;
ULONG LongRunValue;
} STATE_INFO, *PSTATE_INFO;
typedef struct _LEGACY_INTERFACE_INFO {
ULONG CurrentState;
ULONG MaxSupportedStates;
ULONG CurrentlyAvailableStates;
} LEGACY_INTERFACE_INFO, *PLEGACY_INTERFACE_INFO;
typedef struct _LONGRUN_STATES {
ULONG MaxState;
STATE_INFO States[MAX_LONGRUN_STATES];
} LONGRUN_STATES, *PLONGRUN_STATES;
//
// Acpi 2.0 stuff
//
typedef struct {
union {
struct {
ULONG Min:16; // 15:0 LongRun Lower Bound
ULONG Max:16; // 31:16 LongRun Upper Bound
};
ULONG AsDWord;
};
} CRUSOE_PSS_VALUE;
//
// crusoe.c
//
NTSTATUS
AdjustLegacyProcessorPerformanceStates(
IN OUT PPROCESSOR_PERFORMANCE_STATES PerfStates
);
//
// longrun.c
//
NTSTATUS
InitializeLegacyInterface(
IN PFDO_DATA DeviceExtension
);
NTSTATUS
SetCurrentStateMSR(
IN ULONG State,
IN BOOLEAN InitPhase
);
ULONG
ConvertLongRunValueToPerfState(
IN PLONGRUN_STATES PerfStates,
IN ULONG LongRunValue
);
NTSTATUS
GetCurrentCpuSpeed(
OUT PULONG CpuSpeed
);
NTSTATUS
GetMaxCpuSpeed(
OUT PULONG CpuSpeed
);
VOID
GetProcessorFeatureFlags(
OUT PULONG Flags
);
NTSTATUS
GetCurrentStateInfo(
OUT PSTATE_INFO StateInfo
);
ULONGLONG
GetCurrentPerformanceRange(
VOID
);
VOID
SetCurrentPerformanceRange(
IN ULONG Min,
IN ULONG Max
);
NTSTATUS
CalculateLongRunPerfStates(
IN PLONGRUN_STATES PerfStates
);
NTSTATUS
BuildAcpi2PerformanceStates(
IN PACPI_PSS_PACKAGE PerfStates
);
NTSTATUS
BuildLongRunPerfStatesCMS41(
OUT PACPI_PSS_PACKAGE *PssPackage
);
NTSTATUS
BuildLongRunPerfStatesCMS42(
OUT PACPI_PSS_PACKAGE *PssPackage
);
ULONG
LRTI_GetMaxSupportedLevel(
VOID
);
VOID
LRTI_SetCurrentLevel (
ULONG LongRunLevel
);
ULONG
LRTI_GetPerformanceIndex (
VOID
);
ULONG
LRTI_GetVoltage (
VOID
);
ULONG
LRTI_GetFrequency (
VOID
);
ULONG
GetLongRunFlagsRegister (
VOID
);
VOID
SetLongRunEconomyMode (
VOID
);
VOID
SetLongRunPerformanceMode (
VOID
);
#if DBG
VOID
DisplayStateInfo(
IN PSTATE_INFO State
);
VOID
DisplayLongRunStates(
IN PLONGRUN_STATES States
);
#else
#define DisplayStateInfo(_x_)
#define DisplayLongRunStates(_x_)
#endif
#endif