windows-nt/Source/XPSP1/NT/base/hals/processor/amdk6/amdk6.h
2020-09-26 16:20:57 +08:00

300 lines
6 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
amdk6.h
Author:
Todd Carpenter (7/20/00) - create file
Environment:
Kernel mode
Notes:
Revision History:
--*/
#ifndef _AMDK6_H
#define _AMDK6_H
#include "..\lib\processor.h"
#include "..\eventmsg.h"
#include <pshpack1.h>
#define AMDK6_GEMINI_CPUID_EPM 0x80000007
#define AMDK6_GEMINI_EPMR_MSR 0xC0000086
#define AMDK6_GEMINI_PSOR_MSR 0xC0000087
//
// The follow definitions are taken from information the
// Gemini SMI API Specification, version 0.80
//
#define PLATFORM_AMDK6 0x6
#define PLATFORM_AMDK7 0x7
//
// Function 0, Gemini State Change
//
#define IS_GEMINI_SUPPORTED 0x0000 // Function 0, Sub-function 0
#define GET_GEMINI_STATES 0x0001 // Function 0, Sub-function 1
#define GET_MAX_GEMINI_STATE 0x0002 // Function 0, Sub-function 2
#define SET_MAX_GEMINI_STATE 0x0003 // Function 0, Sub-function 3
#define GET_MIN_GEMINI_STATE 0x0004 // Function 0, Sub-function 4
#define SET_MIN_GEMINI_STATE 0x0005 // Function 0, Sub-function 5
#define GET_CURRENT_GEMINI_STATE 0x0006 // Function 0, Sub-function 6
#define SET_CURRENT_GEMINI_STATE 0x0007 // Function 0, Sub-function 7
//
// Function 1, Gemini Thermal Control
//
#define GET_CURRENT_TALERT_MODES 0x0100 // Function 1, Sub-function 0
#define GET_CURRENT_TALERT_SETTINGS 0x0101 // Function 1, Sub-function 1
#define SET_TALERT_CONTROLS 0x0102 // Function 1, Sub-function 2
#define GET_CURRENT_TPANIC_SETTINGS 0x0103 // Function 1, Sub-function 3
#define SET_TPANIC_SETTINGS 0x0104 // Function 1, Sub-function 4
#define GET_CURRENT_TEMPERATURE 0x0105 // Function 1, Sub-function 5
//
// Function 2, Gemini Connect/Disconnect
//
#define GEMINI_CONNECT 0x0200 // Function 2, Sub-function 0
#define GEMINI_DISCONNECT 0x0201 // Function 2, Sub-function 1
#define GBDT_SIGNATURE 0x54444247 // "GBDT"
#define GBDT_SEARCH_RANGE_BEGIN 0xC0000
#define GBDT_SEARCH_RANGE_END 0xFFFFF
#define GBDT_SEARCH_RANGE_LENGTH (GBDT_SEARCH_RANGE_END-GBDT_SEARCH_RANGE_BEGIN+1)
#define GBDT_SEARCH_INTERVAL 16 // search on 16 byte boundaries
#define CONVERT_PERF_STATE_INDEX(_x_) ((LegacyInterface.GBDT->MaxStateSupported) - _x_)
//
// Gemini Processor Voltage and Frequency information
//
typedef struct _GEMINI_PROCESSOR_STATE {
USHORT CpuVoltage; // format A.BCD
USHORT CpuFrequency; // mhz
UCHAR Vid; // VID[4:0]
UCHAR Bf; // BF[2:0]
} GEMINI_PROCESSOR_STATE, *PGEMINI_PROCESSOR_STATE;
typedef struct _AVAILABLE_STATE_INFO {
UCHAR Vid;
UCHAR Bf;
UCHAR State;
UCHAR Reserved; // should be zero
} AVAILABLE_STATE_INFO, *PAVAILABLE_STATE_INFO;
//
// Gemini BIOS Descriptor Table
//
typedef struct _GBDT {
ULONG Signature; // "GBDT"
UCHAR Length;
UCHAR Revsion;
UCHAR Checksum;
UCHAR Capabilities;
USHORT BusSpeed;
USHORT MaxCpuSpeed;
UCHAR MaxStateSupported; // Min state always = 0, Max state < 16
UCHAR SmiCommandPortType; // defines type, IO or MEM, and access size
ULONG SmiCommandPortAddress; // IO or MEM address
ULONG GeminiSmiCode; // loaded in ESI before SMI call.
GEMINI_PROCESSOR_STATE State[0]; // Processor performance states
} GBDT, *PGBDT, **PPGBDT;
//
// Auto Performance Table
//
typedef struct _GEMINI_AUTO_PERF_TABLE {
UCHAR CpuUtilizationThreshold;
UCHAR GeminiThresholdTargeState;
} GEMINI_AUTO_PERF_TABLE, *PGEMINI_AUTO_PERF_TABLE;
//
// Gemini Processor Voltage and Frequency information
//
typedef struct _LEGACY_GEMINI_SMI {
ULONG SmiAccessType;
ULONG SmiAccessSize;
ULONG SmiAddress;
ULONG GeminiCode;
ULONG CurrentState;
ULONG MaxSupportedStates;
ULONG CurrentlyAvailableStates;
ULONG EpmIoAddress;
PGBDT GBDT;
} LEGACY_GEMINI_SMI, *PLEGACY_GEMINI_SMI;
typedef struct _LEGACY_GEMINI_PERF_STATE {
ULONG Frequency; // in megahertz
USHORT Power; // in milliwatts
UCHAR PercentFrequency; // for quick lookup
ULONG GeminiState;
ULONG GeminiVID;
ULONG GeminiBF;
} LEGACY_GEMINI_PERF_STATE, *PLEGACY_GEMINI_PERF_STATE;
typedef struct _LEGACY_GEMINI_PERF_STATES {
PSET_PROCESSOR_THROTTLE TransitionFunction;
ULONG TransitionLatency; // in milliseconds
UCHAR Current;
UCHAR Count;
LEGACY_GEMINI_PERF_STATE State[1]; // sorted from fastest to slowest
} LEGACY_GEMINI_PERF_STATES, *PLEGACY_GEMINI_PERF_STATES;
//
// bios.c
//
NTSTATUS
FindGBDT (
OUT PPGBDT GeminiInfo
);
NTSTATUS
InitializeLegacyInterface (
VOID
);
NTSTATUS
IsGeminiSupported (
PULONG Results
);
NTSTATUS
GetAvailableStatesSmm (
PULONG Results
);
NTSTATUS
GetMaxStateSmm (
PULONG Results
);
NTSTATUS
SetMaxStateSmm (
VOID
);
NTSTATUS
GetMinStateSmm (
PULONG Results
);
NTSTATUS
SetMinStateSmm (
VOID
);
NTSTATUS
GetCurrentStateSmm (
PULONG Results
);
NTSTATUS
SetCurrentStateSmm (
ULONG State
);
NTSTATUS
ConnectDisconnectGeminiInterface (
BOOLEAN Connect
);
NTSTATUS
GetCpuFrequency (
IN ULONG State,
OUT PULONG CpuSpeed
);
NTSTATUS
GetCpuVoltage (
IN ULONG State,
OUT PULONG Voltage
);
NTSTATUS
GetLegacyMaxProcFrequency (
OUT PULONG CpuSpeed
);
NTSTATUS
ConvertVidBfValueToGeminiState (
IN UCHAR VidBfValue,
OUT PULONG State
);
//
// amdk6msr.c
//
NTSTATUS
GetCurrentCpuSpeedMSR (
OUT PULONG CpuSpeed
);
NTSTATUS
SetCurrentStateMSR (
ULONG State
);
NTSTATUS
ReadEpmInfo (
OUT PULONG EpmInfo
);
NTSTATUS
EnableGeminiTransitionsMSR (
PULONG BaseAddress
);
VOID
DisplayEPM (
IN ULONG Epm
);
VOID
DisplayEPMR (
IN ULONG Epmr
);
VOID
DisplayPSOR (
IN ULONG Psor
);
#endif