IntelFsp2Pkg: Add FSP*_ARCH_UPD.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2781

Introduce FSPT_ARCH_UPD and FSPS_ARCH_UPD to support debug events
and multi-phase silicon initialization.
For backward compatibility the original structures are kept and
new ARCH_UPD structures will be included only when UPD header
revision equal or greater than 2.

GenCfgOpt script also updated to prevent from generating duplicate
FSPT_ARCH_UPD and FSPS_ARCH_UPD typedef structures.

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Signed-off-by: Chasel Chiu <chasel.chiu@intel.com>
Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
This commit is contained in:
Chasel Chiu 2020-06-04 14:43:40 +08:00 committed by mergify[bot]
parent 00b8bf7eda
commit 89f569ae8e
3 changed files with 156 additions and 9 deletions

View File

@ -1,7 +1,7 @@
;; @file ;; @file
; Provide FSP API entry points. ; Provide FSP API entry points.
; ;
; Copyright (c) 2016, Intel Corporation. All rights reserved.<BR> ; Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent ; SPDX-License-Identifier: BSD-2-Clause-Patent
;; ;;
@ -78,6 +78,23 @@ struc LoadMicrocodeParams
.size: .size:
endstruc endstruc
struc LoadMicrocodeParamsFsp22
; FSP_UPD_HEADER {
.FspUpdHeaderSignature: resd 2
.FspUpdHeaderRevision: resb 1
.FspUpdHeaderReserved: resb 23
; }
; FSPT_ARCH_UPD{
.FsptArchUpd: resd 8
; }
; FSPT_CORE_UPD {
.MicrocodeCodeAddr: resd 1
.MicrocodeCodeSize: resd 1
.CodeRegionBase: resd 1
.CodeRegionSize: resd 1
; }
.size:
endstruc
; ;
; Define SSE macros ; Define SSE macros
@ -169,6 +186,11 @@ ASM_PFX(LoadMicrocodeDefault):
; skip loading Microcode if the MicrocodeCodeSize is zero ; skip loading Microcode if the MicrocodeCodeSize is zero
; and report error if size is less than 2k ; and report error if size is less than 2k
; first check UPD header revision
cmp byte [esp + LoadMicrocodeParamsFsp22.FspUpdHeaderRevision], 2
jae Fsp22UpdHeader
; UPD structure is compliant with FSP spec 2.0/2.1
mov eax, dword [esp + LoadMicrocodeParams.MicrocodeCodeSize] mov eax, dword [esp + LoadMicrocodeParams.MicrocodeCodeSize]
cmp eax, 0 cmp eax, 0
jz Exit2 jz Exit2
@ -178,6 +200,19 @@ ASM_PFX(LoadMicrocodeDefault):
mov esi, dword [esp + LoadMicrocodeParams.MicrocodeCodeAddr] mov esi, dword [esp + LoadMicrocodeParams.MicrocodeCodeAddr]
cmp esi, 0 cmp esi, 0
jnz CheckMainHeader jnz CheckMainHeader
jmp ParamError
Fsp22UpdHeader:
; UPD structure is compliant with FSP spec 2.2
mov eax, dword [esp + LoadMicrocodeParamsFsp22.MicrocodeCodeSize]
cmp eax, 0
jz Exit2
cmp eax, 0800h
jl ParamError
mov esi, dword [esp + LoadMicrocodeParamsFsp22.MicrocodeCodeAddr]
cmp esi, 0
jnz CheckMainHeader
ParamError: ParamError:
mov eax, 080000002h mov eax, 080000002h
@ -276,6 +311,11 @@ CheckAddress:
cmp dword [esi + MicrocodeHdr.MicrocodeHdrVersion], 0ffffffffh cmp dword [esi + MicrocodeHdr.MicrocodeHdrVersion], 0ffffffffh
jz Done jz Done
; Check UPD header revision
cmp byte [esp + LoadMicrocodeParamsFsp22.FspUpdHeaderRevision], 2
jae Fsp22UpdHeader1
; UPD structure is compliant with FSP spec 2.0/2.1
; Is automatic size detection ? ; Is automatic size detection ?
mov eax, dword [esp + LoadMicrocodeParams.MicrocodeCodeSize] mov eax, dword [esp + LoadMicrocodeParams.MicrocodeCodeSize]
cmp eax, 0ffffffffh cmp eax, 0ffffffffh
@ -287,6 +327,19 @@ CheckAddress:
jae Done ;Jif address is outside of microcode region jae Done ;Jif address is outside of microcode region
jmp CheckMainHeader jmp CheckMainHeader
Fsp22UpdHeader1:
; UPD structure is compliant with FSP spec 2.2
; Is automatic size detection ?
mov eax, dword [esp + LoadMicrocodeParamsFsp22.MicrocodeCodeSize]
cmp eax, 0ffffffffh
jz LoadMicrocodeDefault4
; Address >= microcode region address + microcode region size?
add eax, dword [esp + LoadMicrocodeParamsFsp22.MicrocodeCodeAddr]
cmp esi, eax
jae Done ;Jif address is outside of microcode region
jmp CheckMainHeader
LoadMicrocodeDefault4: LoadMicrocodeDefault4:
LoadCheck: LoadCheck:
; Get the revision of the current microcode update loaded ; Get the revision of the current microcode update loaded
@ -349,11 +402,26 @@ ASM_PFX(EstablishStackFsp):
push DATA_LEN_OF_MCUD ; Size of the data region push DATA_LEN_OF_MCUD ; Size of the data region
push 4455434Dh ; Signature of the data region 'MCUD' push 4455434Dh ; Signature of the data region 'MCUD'
push dword [edx + 2Ch] ; Code size sizeof(FSPT_UPD_COMMON) + 12
push dword [edx + 28h] ; Code base sizeof(FSPT_UPD_COMMON) + 8
push dword [edx + 24h] ; Microcode size sizeof(FSPT_UPD_COMMON) + 4
push dword [edx + 20h] ; Microcode base sizeof(FSPT_UPD_COMMON) + 0
; check UPD structure revision (edx + 8)
cmp byte [edx + LoadMicrocodeParamsFsp22.FspUpdHeaderRevision], 2
jae Fsp22UpdHeader2
; UPD structure is compliant with FSP spec 2.0/2.1
push dword [edx + LoadMicrocodeParams.CodeRegionSize] ; Code size sizeof(FSPT_UPD_COMMON) + 12
push dword [edx + LoadMicrocodeParams.CodeRegionBase] ; Code base sizeof(FSPT_UPD_COMMON) + 8
push dword [edx + LoadMicrocodeParams.MicrocodeCodeSize] ; Microcode size sizeof(FSPT_UPD_COMMON) + 4
push dword [edx + LoadMicrocodeParams.MicrocodeCodeAddr] ; Microcode base sizeof(FSPT_UPD_COMMON) + 0
jmp ContinueAfterUpdPush
Fsp22UpdHeader2:
; UPD structure is compliant with FSP spec 2.2
push dword [edx + LoadMicrocodeParamsFsp22.CodeRegionSize] ; Code size sizeof(FSPT_UPD_COMMON) + 12
push dword [edx + LoadMicrocodeParamsFsp22.CodeRegionBase] ; Code base sizeof(FSPT_UPD_COMMON) + 8
push dword [edx + LoadMicrocodeParamsFsp22.MicrocodeCodeSize] ; Microcode size sizeof(FSPT_UPD_COMMON) + 4
push dword [edx + LoadMicrocodeParamsFsp22.MicrocodeCodeAddr] ; Microcode base sizeof(FSPT_UPD_COMMON) + 0
ContinueAfterUpdPush:
; ;
; Save API entry/exit timestamp into stack ; Save API entry/exit timestamp into stack
; ;

View File

@ -99,12 +99,35 @@ typedef struct {
/// ///
UINT64 Signature; UINT64 Signature;
/// ///
/// Revision of the Data structure. For FSP v2.0 value is 1. /// Revision of the Data structure.
/// For FSP spec 2.0/2.1 value is 1.
/// For FSP spec 2.2 value is 2.
/// ///
UINT8 Revision; UINT8 Revision;
UINT8 Reserved[23]; UINT8 Reserved[23];
} FSP_UPD_HEADER; } FSP_UPD_HEADER;
///
/// FSPT_ARCH_UPD Configuration.
///
typedef struct {
///
/// Revision Revision of the structure is 1 for this version of the specification.
///
UINT8 Revision;
UINT8 Reserved[3];
///
/// Length Length of the structure in bytes. The current value for this field is 32.
///
UINT32 Length;
///
/// FspDebugHandler Optional debug handler for the bootloader to receive debug messages
/// occurring during FSP execution.
///
FSP_DEBUG_HANDLER FspDebugHandler;
UINT8 Reserved1[20];
} FSPT_ARCH_UPD;
/// ///
/// FSPM_ARCH_UPD Configuration. /// FSPM_ARCH_UPD Configuration.
/// ///
@ -146,6 +169,32 @@ typedef struct {
UINT8 Reserved1[4]; UINT8 Reserved1[4];
} FSPM_ARCH_UPD; } FSPM_ARCH_UPD;
typedef struct {
///
/// Revision Revision of the structure is 1 for this version of the specification.
///
UINT8 Revision;
UINT8 Reserved[3];
///
/// Length Length of the structure in bytes. The current value for this field is 32.
///
UINT32 Length;
///
/// FspEventHandler Optional event handler for the bootloader to be informed of events
/// occurring during FSP execution.
///
FSP_EVENT_HANDLER FspEventHandler;
///
/// A FSP binary may optionally implement multi-phase silicon initialization,
/// This is only supported if the FspMultiPhaseSiInitEntryOffset field in FSP_INFO_HEADER
/// is non-zero.
/// To enable multi-phase silicon initialization, the bootloader must set
/// EnableMultiPhaseSiliconInit to a non-zero value.
///
UINT8 EnableMultiPhaseSiliconInit;
UINT8 Reserved1[19];
} FSPS_ARCH_UPD;
/// ///
/// FSPT_UPD_COMMON Configuration. /// FSPT_UPD_COMMON Configuration.
/// ///
@ -156,6 +205,21 @@ typedef struct {
FSP_UPD_HEADER FspUpdHeader; FSP_UPD_HEADER FspUpdHeader;
} FSPT_UPD_COMMON; } FSPT_UPD_COMMON;
///
/// FSPT_UPD_COMMON Configuration for FSP spec. 2.2 and above.
///
typedef struct {
///
/// FSP_UPD_HEADER Configuration.
///
FSP_UPD_HEADER FspUpdHeader;
///
/// FSPT_ARCH_UPD Configuration.
///
FSPT_ARCH_UPD FsptArchUpd;
} FSPT_UPD_COMMON_FSP22;
/// ///
/// FSPM_UPD_COMMON Configuration. /// FSPM_UPD_COMMON Configuration.
/// ///
@ -180,6 +244,21 @@ typedef struct {
FSP_UPD_HEADER FspUpdHeader; FSP_UPD_HEADER FspUpdHeader;
} FSPS_UPD_COMMON; } FSPS_UPD_COMMON;
///
/// FSPS_UPD_COMMON Configuration for FSP spec. 2.2 and above.
///
typedef struct {
///
/// FSP_UPD_HEADER Configuration.
///
FSP_UPD_HEADER FspUpdHeader;
///
/// FSPS_ARCH_UPD Configuration.
///
FSPS_ARCH_UPD FspsArchUpd;
} FSPS_UPD_COMMON_FSP22;
/// ///
/// Enumeration of FSP_INIT_PHASE for NOTIFY_PHASE. /// Enumeration of FSP_INIT_PHASE for NOTIFY_PHASE.
/// ///

View File

@ -1175,7 +1175,7 @@ EndList
UpdRegionCheck = ['FSPT', 'FSPM', 'FSPS'] # FSPX_UPD_REGION UpdRegionCheck = ['FSPT', 'FSPM', 'FSPS'] # FSPX_UPD_REGION
UpdConfigCheck = ['FSP_T', 'FSP_M', 'FSP_S'] # FSP_X_CONFIG, FSP_X_TEST_CONFIG, FSP_X_RESTRICTED_CONFIG UpdConfigCheck = ['FSP_T', 'FSP_M', 'FSP_S'] # FSP_X_CONFIG, FSP_X_TEST_CONFIG, FSP_X_RESTRICTED_CONFIG
UpdSignatureCheck = ['FSPT_UPD_SIGNATURE', 'FSPM_UPD_SIGNATURE', 'FSPS_UPD_SIGNATURE'] UpdSignatureCheck = ['FSPT_UPD_SIGNATURE', 'FSPM_UPD_SIGNATURE', 'FSPS_UPD_SIGNATURE']
ExcludedSpecificUpd = 'FSPM_ARCH_UPD' ExcludedSpecificUpd = ['FSPT_ARCH_UPD', 'FSPM_ARCH_UPD', 'FSPS_ARCH_UPD']
if InputHeaderFile != '': if InputHeaderFile != '':
if not os.path.exists(InputHeaderFile): if not os.path.exists(InputHeaderFile):
@ -1229,7 +1229,7 @@ EndList
if Match: if Match:
StartIndex = Index - 1 StartIndex = Index - 1
Match = re.match("}\s([_A-Z0-9]+);", Line) Match = re.match("}\s([_A-Z0-9]+);", Line)
if Match and (UpdRegionCheck[item] in Match.group(1) or UpdConfigCheck[item] in Match.group(1)) and (ExcludedSpecificUpd not in Match.group(1)): if Match and (UpdRegionCheck[item] in Match.group(1) or UpdConfigCheck[item] in Match.group(1)) and (ExcludedSpecificUpd[item] not in Match.group(1)):
EndIndex = Index EndIndex = Index
StructStart.append(StartIndex) StructStart.append(StartIndex)
StructEnd.append(EndIndex) StructEnd.append(EndIndex)
@ -1466,7 +1466,7 @@ EndList
def Usage(): def Usage():
print ("GenCfgOpt Version 0.54") print ("GenCfgOpt Version 0.55")
print ("Usage:") print ("Usage:")
print (" GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [-D Macros]") print (" GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [-D Macros]")
print (" GenCfgOpt HEADER PlatformDscFile BuildFvDir InputHFile [-D Macros]") print (" GenCfgOpt HEADER PlatformDscFile BuildFvDir InputHFile [-D Macros]")