mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-08 17:05:09 +02:00
Add MTRR library for IA32 & X64 processor architectures.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8394 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d09651693b
commit
e50466da24
288
UefiCpuPkg/Include/Library/MtrrLib.h
Normal file
288
UefiCpuPkg/Include/Library/MtrrLib.h
Normal file
@ -0,0 +1,288 @@
|
||||
/** @file
|
||||
MTRR setting library
|
||||
|
||||
Copyright (c) 2008 - 2009, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _MTRR_LIB_H_
|
||||
#define _MTRR_LIB_H_
|
||||
|
||||
//
|
||||
// According to IA32 SDM, MTRRs number and msr offset are always consistent
|
||||
// for IA32 processor family
|
||||
//
|
||||
#define MTRR_NUMBER_OF_VARIABLE_MTRR 8
|
||||
#define MTRR_NUMBER_OF_FIXED_MTRR 11
|
||||
#define FIRMWARE_VARIABLE_MTRR_NUMBER 6
|
||||
#define MTRR_LIB_IA32_MTRR_FIX64K_00000 0x250
|
||||
#define MTRR_LIB_IA32_MTRR_FIX16K_80000 0x258
|
||||
#define MTRR_LIB_IA32_MTRR_FIX16K_A0000 0x259
|
||||
#define MTRR_LIB_IA32_MTRR_FIX4K_C0000 0x268
|
||||
#define MTRR_LIB_IA32_MTRR_FIX4K_C8000 0x269
|
||||
#define MTRR_LIB_IA32_MTRR_FIX4K_D0000 0x26A
|
||||
#define MTRR_LIB_IA32_MTRR_FIX4K_D8000 0x26B
|
||||
#define MTRR_LIB_IA32_MTRR_FIX4K_E0000 0x26C
|
||||
#define MTRR_LIB_IA32_MTRR_FIX4K_E8000 0x26D
|
||||
#define MTRR_LIB_IA32_MTRR_FIX4K_F0000 0x26E
|
||||
#define MTRR_LIB_IA32_MTRR_FIX4K_F8000 0x26F
|
||||
#define MTRR_LIB_IA32_VARIABLE_MTRR_BASE 0x200
|
||||
#define MTRR_LIB_IA32_VARIABLE_MTRR_END 0x20F
|
||||
#define MTRR_LIB_IA32_MTRR_DEF_TYPE 0x2FF
|
||||
#define MTRR_LIB_MSR_VALID_MASK 0xFFFFFFFFFULL
|
||||
#define MTRR_LIB_CACHE_VALID_ADDRESS 0xFFFFFF000ULL
|
||||
#define MTRR_LIB_CACHE_MTRR_ENABLED 0x800
|
||||
#define MTRR_LIB_CACHE_FIXED_MTRR_ENABLED 0x400
|
||||
|
||||
//
|
||||
// Structure to describe a fixed MTRR
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Msr;
|
||||
UINT32 BaseAddress;
|
||||
UINT32 Length;
|
||||
} FIXED_MTRR;
|
||||
|
||||
//
|
||||
// Structure to describe a variable MTRR
|
||||
//
|
||||
typedef struct {
|
||||
UINT64 BaseAddress;
|
||||
UINT64 Length;
|
||||
UINT64 Type;
|
||||
UINT32 Msr;
|
||||
BOOLEAN Valid;
|
||||
BOOLEAN Used;
|
||||
} VARIABLE_MTRR;
|
||||
|
||||
//
|
||||
// Structure to hold base and mask pair for variable MTRR register
|
||||
//
|
||||
typedef struct _MTRR_VARIABLE_SETTING_ {
|
||||
UINT64 Base;
|
||||
UINT64 Mask;
|
||||
} MTRR_VARIABLE_SETTING;
|
||||
|
||||
//
|
||||
// Array for variable MTRRs
|
||||
//
|
||||
typedef struct _MTRR_VARIABLE_SETTINGS_ {
|
||||
MTRR_VARIABLE_SETTING Mtrr[MTRR_NUMBER_OF_VARIABLE_MTRR];
|
||||
} MTRR_VARIABLE_SETTINGS;
|
||||
|
||||
//
|
||||
// Array for fixed mtrrs
|
||||
//
|
||||
typedef struct _MTRR_FIXED_SETTINGS_ {
|
||||
UINT64 Mtrr[MTRR_NUMBER_OF_FIXED_MTRR];
|
||||
} MTRR_FIXED_SETTINGS;
|
||||
|
||||
//
|
||||
// Structure to hold all MTRRs
|
||||
//
|
||||
typedef struct _MTRR_SETTINGS_ {
|
||||
MTRR_FIXED_SETTINGS Fixed;
|
||||
MTRR_VARIABLE_SETTINGS Variables;
|
||||
UINT64 MtrrDefType;
|
||||
} MTRR_SETTINGS;
|
||||
|
||||
//
|
||||
// Memory cache types
|
||||
//
|
||||
typedef enum {
|
||||
CacheUncacheable = 0,
|
||||
CacheWriteCombining = 1,
|
||||
CacheWriteThrough = 4,
|
||||
CacheWriteProtected = 5,
|
||||
CacheWriteBack = 6
|
||||
} MTRR_MEMORY_CACHE_TYPE;
|
||||
|
||||
#define MTRR_CACHE_UNCACHEABLE 0
|
||||
#define MTRR_CACHE_WRITE_COMBINING 1
|
||||
#define MTRR_CACHE_WRITE_THROUGH 4
|
||||
#define MTRR_CACHE_WRITE_PROTECTED 5
|
||||
#define MTRR_CACHE_WRITE_BACK 6
|
||||
#define MTRR_CACHE_INVALID_TYPE 7
|
||||
|
||||
//
|
||||
// structure for memory attribute descriptor according MTRR setting
|
||||
//
|
||||
typedef struct _MTRR_MEMORY_ATTRIBUTE_MAP_ {
|
||||
PHYSICAL_ADDRESS StartAddress;
|
||||
PHYSICAL_ADDRESS EndAddress;
|
||||
MTRR_MEMORY_CACHE_TYPE Attribute;
|
||||
} MTRR_MEMORY_ATTRIBUTE_MAP;
|
||||
|
||||
|
||||
/**
|
||||
This function attempts to set the attributes for a memory range.
|
||||
|
||||
@param BaseAddress The physical address that is the start address of a memory region.
|
||||
@param Length The size in bytes of the memory region.
|
||||
@param Attributes The bit mask of attributes to set for the memory region.
|
||||
|
||||
@retval RETURN_SUCCESS The attributes were set for the memory region.
|
||||
@retval RETURN_INVALID_PARAMETER Length is zero.
|
||||
@retval RETURN_UNSUPPORTED The processor does not support one or more bytes of the
|
||||
memory resource range specified by BaseAddress and Length.
|
||||
@retval RETURN_UNSUPPORTED The bit mask of attributes is not support for the memory resource
|
||||
range specified by BaseAddress and Length.
|
||||
@retval RETURN_ACCESS_DENIED The attributes for the memory resource range specified by
|
||||
BaseAddress and Length cannot be modified.
|
||||
@retval RETURN_OUT_OF_RESOURCES There are not enough system resources to modify the attributes of
|
||||
the memory resource range.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
MtrrSetMemoryAttribute (
|
||||
IN PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length,
|
||||
IN MTRR_MEMORY_CACHE_TYPE Attribute
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function will get the memory cache type of the specific address.
|
||||
This function is mainly for debugging purposes.
|
||||
|
||||
@param Address The specific address
|
||||
|
||||
@return The memory cache type of the specific address
|
||||
|
||||
**/
|
||||
MTRR_MEMORY_CACHE_TYPE
|
||||
EFIAPI
|
||||
MtrrGetMemoryAttribute (
|
||||
IN PHYSICAL_ADDRESS Address
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function will get the raw value in variable MTRRs
|
||||
|
||||
@param VariableSettings A buffer to hold variable MTRRs content.
|
||||
|
||||
@return The buffer point to MTRR_VARIABLE_SETTINGS in which holds the content of the variable mtrr
|
||||
|
||||
**/
|
||||
MTRR_VARIABLE_SETTINGS*
|
||||
EFIAPI
|
||||
MtrrGetVariableMtrr (
|
||||
OUT MTRR_VARIABLE_SETTINGS *VariableSettings
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function sets fixed MTRRs
|
||||
|
||||
@param VariableSettings A buffer to hold variable MTRRs content.
|
||||
|
||||
@return The pointer of VariableSettings
|
||||
|
||||
**/
|
||||
MTRR_VARIABLE_SETTINGS*
|
||||
EFIAPI
|
||||
MtrrSetVariableMtrr (
|
||||
IN MTRR_VARIABLE_SETTINGS *VariableSettings
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function gets the content in fixed MTRRs
|
||||
|
||||
@param FixedSettings A buffer to hold fixed MTRRs content.
|
||||
|
||||
@return The pointer of FixedSettings
|
||||
|
||||
**/
|
||||
MTRR_FIXED_SETTINGS*
|
||||
EFIAPI
|
||||
MtrrGetFixedMtrr (
|
||||
OUT MTRR_FIXED_SETTINGS *FixedSettings
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function sets fixed MTRRs
|
||||
|
||||
@param FixedSettings A buffer holding fixed MTRRs content.
|
||||
|
||||
@return The pointer of FixedSettings
|
||||
|
||||
**/
|
||||
MTRR_FIXED_SETTINGS*
|
||||
EFIAPI
|
||||
MtrrSetFixedMtrr (
|
||||
IN MTRR_FIXED_SETTINGS *FixedSettings
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function gets the content in all MTRRs (variable and fixed)
|
||||
|
||||
@param MtrrSetting A buffer to hold all MTRRs content.
|
||||
|
||||
@return The pointer of MtrrSetting
|
||||
|
||||
**/
|
||||
MTRR_SETTINGS *
|
||||
EFIAPI
|
||||
MtrrGetAllMtrrs (
|
||||
OUT MTRR_SETTINGS *MtrrSetting
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function sets all MTRRs (variable and fixed)
|
||||
|
||||
@param MtrrSetting A buffer to hold all MTRRs content.
|
||||
|
||||
@return The pointer of MtrrSetting
|
||||
|
||||
**/
|
||||
MTRR_SETTINGS *
|
||||
EFIAPI
|
||||
MtrrSetAllMtrrs (
|
||||
IN MTRR_SETTINGS *MtrrSetting
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Get the attribute of variable MTRRs.
|
||||
|
||||
This function shadows the content of variable MTRRs into
|
||||
an internal array: VariableMtrr
|
||||
|
||||
@param MtrrValidBitsMask The mask for the valid bit of the MTRR
|
||||
@param MtrrValidAddressMask The valid address mask for MTRR since the base address in
|
||||
MTRR must align to 4K, so valid address mask equal to
|
||||
MtrrValidBitsMask & 0xfffffffffffff000ULL
|
||||
@param VariableMtrr The array to shadow variable MTRRs content
|
||||
@return The ruturn value of this paramter indicates the number of
|
||||
MTRRs which has been used.
|
||||
**/
|
||||
UINT32
|
||||
EFIAPI
|
||||
MtrrGetMemoryAttributeInVariableMtrr (
|
||||
IN UINT64 MtrrValidBitsMask,
|
||||
IN UINT64 MtrrValidAddressMask,
|
||||
OUT VARIABLE_MTRR *VariableMtrr
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function prints all MTRRs for debugging.
|
||||
**/
|
||||
VOID
|
||||
MtrrDebugPrintAllMtrrs (
|
||||
);
|
||||
|
||||
#endif // _MTRR_LIB_H_
|
1386
UefiCpuPkg/Library/MtrrLib/MtrrLib.c
Normal file
1386
UefiCpuPkg/Library/MtrrLib/MtrrLib.c
Normal file
File diff suppressed because it is too large
Load Diff
44
UefiCpuPkg/Library/MtrrLib/MtrrLib.inf
Normal file
44
UefiCpuPkg/Library/MtrrLib/MtrrLib.inf
Normal file
@ -0,0 +1,44 @@
|
||||
#/** @file
|
||||
# MTRR library provides API for MTRR operation
|
||||
#
|
||||
# Copyright (c) 2006 - 2008, Intel Corporation. <BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = MtrrLib
|
||||
FILE_GUID = 6826b408-f4f3-47ee-917f-af7047f9d937
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = MtrrLib
|
||||
EDK_RELEASE_VERSION = 0x00020000
|
||||
EFI_SPECIFICATION_VERSION = 0x00020000
|
||||
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64
|
||||
#
|
||||
|
||||
[Sources.common]
|
||||
MtrrLib.c
|
||||
|
||||
[Packages]
|
||||
OvmfPkg/OvmfPkg.dec
|
||||
MdePkg/MdePkg.dec
|
||||
UefiCpuPkg/UefiCpuPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseMemoryLib
|
||||
BaseLib
|
||||
CpuLib
|
||||
|
@ -1,24 +1,26 @@
|
||||
## @file UefiCpuPkg.dec
|
||||
#
|
||||
# This Package provides UEFI compatible CPU modules and libraries.
|
||||
#
|
||||
# Copyright (c) 2007 - 2009, Intel Corporation.
|
||||
#
|
||||
# All rights reserved.
|
||||
# This program and the accompanying materials are licensed and made available under
|
||||
# the terms and conditions of the BSD License which accompanies this distribution.
|
||||
# The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
DEC_SPECIFICATION = 0x00010005
|
||||
PACKAGE_NAME = UefiCpuPkg
|
||||
PACKAGE_GUID = 2171df9b-0d39-45aa-ac37-2de190010d23
|
||||
PACKAGE_VERSION = 0.1
|
||||
|
||||
## @file UefiCpuPkg.dec
|
||||
#
|
||||
# This Package provides UEFI compatible CPU modules and libraries.
|
||||
#
|
||||
# Copyright (c) 2007 - 2009, Intel Corporation.
|
||||
#
|
||||
# All rights reserved.
|
||||
# This program and the accompanying materials are licensed and made available under
|
||||
# the terms and conditions of the BSD License which accompanies this distribution.
|
||||
# The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
DEC_SPECIFICATION = 0x00010005
|
||||
PACKAGE_NAME = UefiCpuPkg
|
||||
PACKAGE_GUID = 2171df9b-0d39-45aa-ac37-2de190010d23
|
||||
PACKAGE_VERSION = 0.1
|
||||
|
||||
[Includes.common]
|
||||
Include
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user