audk/UefiCpuPkg/Include/Library/MicrocodeLib.h

121 lines
4.2 KiB
C

/** @file
Public include file for Microcode library.
Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef MICROCODE_LIB_H_
#define MICROCODE_LIB_H_
#include <Register/Intel/Microcode.h>
#include <Ppi/ShadowMicrocode.h>
/**
Get microcode update signature of currently loaded microcode update.
@return Microcode signature.
**/
UINT32
EFIAPI
GetProcessorMicrocodeSignature (
VOID
);
/**
Get the processor signature and platform ID for current processor.
@param MicrocodeCpuId Return the processor signature and platform ID.
**/
VOID
EFIAPI
GetProcessorMicrocodeCpuId (
EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId
);
/**
Return the total size of the microcode entry.
Logic follows pseudo code in SDM as below:
N = 512
If (Update.DataSize != 00000000H)
N = Update.TotalSize / 4
If Microcode is NULL, then ASSERT.
@param Microcode Pointer to the microcode entry.
@return The microcode total size.
**/
UINT32
EFIAPI
GetMicrocodeLength (
IN CPU_MICROCODE_HEADER *Microcode
);
/**
Load the microcode to the processor.
If Microcode is NULL, then ASSERT.
@param Microcode Pointer to the microcode entry.
**/
VOID
EFIAPI
LoadMicrocode (
IN CPU_MICROCODE_HEADER *Microcode
);
/**
Detect whether specified processor can find matching microcode patch and load it.
Microcode format is as below:
+----------------------------------------+-------------------------------------------------+
| CPU_MICROCODE_HEADER | |
+----------------------------------------+ V
| Update Data | CPU_MICROCODE_HEADER.Checksum
+----------------------------------------+-------+ ^
| CPU_MICROCODE_EXTENDED_TABLE_HEADER | | |
+----------------------------------------+ V |
| CPU_MICROCODE_EXTENDED_TABLE[0] | CPU_MICROCODE_EXTENDED_TABLE_HEADER.Checksum |
| CPU_MICROCODE_EXTENDED_TABLE[1] | ^ |
| ... | | |
+----------------------------------------+-------+-----------------------------------------+
There may by multiple CPU_MICROCODE_EXTENDED_TABLE in this format.
The count of CPU_MICROCODE_EXTENDED_TABLE is indicated by ExtendedSignatureCount
of CPU_MICROCODE_EXTENDED_TABLE_HEADER structure.
If Microcode is NULL, then ASSERT.
@param Microcode Pointer to a microcode entry.
@param MicrocodeLength The total length of the microcode entry.
@param MinimumRevision The microcode whose revision <= MinimumRevision is treated as invalid.
Caller can supply value get from GetProcessorMicrocodeSignature() to check
whether the microcode is newer than loaded one.
Caller can supply 0 to treat any revision (except 0) microcode as valid.
@param MicrocodeCpuIds Pointer to an array of processor signature and platform ID that represents
a set of processors.
Caller can supply zero-element array to skip the processor signature and
platform ID check.
@param MicrocodeCpuIdCount The number of elements in MicrocodeCpuIds.
@param VerifyChecksum FALSE to skip all the checksum verifications.
@retval TRUE The microcode is valid.
@retval FALSE The microcode is invalid.
**/
BOOLEAN
EFIAPI
IsValidMicrocode (
IN CPU_MICROCODE_HEADER *Microcode,
IN UINTN MicrocodeLength,
IN UINT32 MinimumRevision,
IN EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuIds,
IN UINTN MicrocodeCpuIdCount,
IN BOOLEAN VerifyChecksum
);
#endif