|
|
/*++
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
|