[AMD Official Use Only - General] > -----Original Message----- > From: duke.z...@amd.com <duke.z...@amd.com> > Sent: Thursday, January 18, 2024 2:50 PM > To: devel@edk2.groups.io > Cc: Zhai, MingXin (Duke) <duke.z...@amd.com>; Xing, Eric > <eric.x...@amd.com>; Fu, Igniculus <igniculus...@amd.com>; Chang, Abner > <abner.ch...@amd.com> > Subject: [PATCH 05/33] AMD/VanGoghBoard: Check in PlatformSecLib > > From: Duke Zhai <duke.z...@amd.com> > > > BZ #:4640 > > Chachani board jump to PlatformSec function after x86 releasing. > > This module provides the SEC entry function, which does platform-related > > early initialization. > > > > Signed-off-by: Ken Yao <ken....@amd.com> > > Cc: Duke Zhai <duke.z...@amd.com> > > Cc: Eric Xing <eric.x...@amd.com> > > Cc: Igniculus Fu <igniculus...@amd.com> > > Cc: Abner Chang <abner.ch...@amd.com> > > --- > > .../Library/PlatformSecLib/Ia32/Flat32.nasm | 551 ++++++++++++++++++ > > .../Library/PlatformSecLib/Ia32/Platform.inc | 69 +++ > > .../Library/PlatformSecLib/PlatformSecLib.c | 208 +++++++ > > .../Library/PlatformSecLib/PlatformSecLib.inf | 68 +++ > > .../PlatformSecLib/PlatformSecLibModStrs.uni | 28 + > > 5 files changed, 924 insertions(+) > > create mode 100644 > Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/Ia > 32/Flat32.nasm > > create mode 100644 > Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/Ia > 32/Platform.inc > > create mode 100644 > Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/Pl > atformSecLib.c > > create mode 100644 > Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/Pl > atformSecLib.inf > > create mode 100644 > Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/Pl > atformSecLibModStrs.uni > > > > diff --git > a/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/I > a32/Flat32.nasm > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > Ia32/Flat32.nasm > > new file mode 100644 > > index 0000000000..b11f45768c > > --- /dev/null > > +++ > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > Ia32/Flat32.nasm > > @@ -0,0 +1,551 @@ > > +;/** @file > > +; AMD VanGoghBoard PlatformSecLib > > +; > > +; Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > > +; SPDX-License-Identifier: BSD-2-Clause-Patent > > +; > > +;**/ > > + > > +; This file includes code originally published under the following license. > Same here. We should remove below Intel copyright block and put below above or below AMD copy right. Copyright (c) 2013-2015 Intel Corporation.
Please check the similar instances in this patch set. Thanks Abner > +;------------------------------------------------------------------------------ > > +; > > +; Copyright (c) 2013-2015 Intel Corporation. > > +; > > +; SPDX-License-Identifier: BSD-2-Clause-Patent > > +; > > +; Module Name: > > +; > > +; Flat32.asm > > +; > > +; Abstract: > > +; > > +; This is the code that goes from real-mode to protected mode. > > +; It consumes the reset vector, configures the stack. > > +; > > +; > > +;------------------------------------------------------------------------------ > > + > > + > > +; > > +; Include processor definitions > > +; > > +%use masm > > + > > + > > +%include "Platform.inc" > > + > > +; > > +; CR0 cache control bit definition > > +; > > +CR0_CACHE_DISABLE EQU 040000000h > > +CR0_NO_WRITE EQU 020000000h > > +BSP_STACK_BASE_ADDR EQU FixedPcdGet32 > (PcdPeiCorePeiPreMemoryStackBaseAddress) ; Base address for core 0 stack > > +PRE_MEM_STACK_SIZE EQU FixedPcdGet32 > (PcdPeiCorePeiPreMemoryStackSize) > > +PCIEX_LENGTH_BIT_SETTING EQU 011000b > > + > > +MSR_IA32_EFER EQU 0c0000080h ; Extended Feature Enable > Register > > +MSR_IA32_EFER_LME EQU 8 ; Long Mode Enable > > + > > +MSR_SMM_BASE EQU 0c0010111h ; SMBASE Register > > + > > +SMM_BASE_DEFAULT EQU 30000h ; reset value of MSR > MSR_SMM_BASE > > + > > +SMMMASK_ADDRESS EQU 0c0010113h ; SMM TSeg Base Address > > +SMMMASK_ADDRESS_AE EQU 0 ; Aseg Address Range Enable > > +SMMMASK_ADDRESS_TE EQU 1 ; Tseg Address Range Enable > > + > > +; > > +; In Modified Conventional Resume S3 Design: > > +; With Modified Conventional Resume path, the x86 resumes from sleep, > > +; begins executing code from a predefined SMM resume vector and then > > +; jump to ROM code to continue conventional resume. > > +; EDX is filled with special signature "0x55AABB66" when jump to Sec, > > +; this signature can be used to identify if resume back from SMM resume. > > +; > > +SMM_RESUME_SIGNATURE EQU 055AABB66h > > + > > +PCAT_RTC_ADDRESS_REGISTER EQU 0x70 > > +PCAT_RTC_DATA_REGISTER EQU 0x71 > > + > > +NMI_DISABLE_BIT EQU 0x80 > > + > > +RTC_ADDRESS_REGISTER_A EQU 0x0A ; R/W[0..6] R0[7] > > +RTC_ADDRESS_REGISTER_B EQU 0x0B ; R/W > > +RTC_ADDRESS_REGISTER_C EQU 0x0C ; RO > > +RTC_ADDRESS_REGISTER_D EQU 0x0D ; R/W > > + > > +; > > +; External and public declarations > > +; TopOfStack is used by C code > > +; SecStartup is the entry point to the C code > > +; Neither of these names can be modified without > > +; updating the C code. > > +; > > +extern ASM_PFX(SecStartup) > > + > > +SECTION .text > > +; > > +; Protected mode portion initializes stack, configures cache, and calls C > entry > point > > +; > > + > > +;---------------------------------------------------------------------------- > > +; > > +; Procedure: ProtectedModeEntryPoint > > +; > > +; Input: Executing in 32 Bit Protected (flat) mode > > +; cs: 0-4GB > > +; ds: 0-4GB > > +; es: 0-4GB > > +; fs: 0-4GB > > +; gs: 0-4GB > > +; ss: 0-4GB > > +; > > +; Output: This function never returns > > +; > > +; Destroys: > > +; ecx > > +; edi > > +; esi > > +; esp > > +; > > +; Description: > > +; Perform any essential early platform initilaisation > > +; Setup a stack > > +; Call the main EDKII Sec C code > > +; > > +;---------------------------------------------------------------------------- > > + > > +global ASM_PFX(_ModuleEntryPoint) > > +ASM_PFX(_ModuleEntryPoint): > > + ; > > + ; Check if system resumes from S3 SMM mode, if yes, continue to use S3 > preserved stack setting > > + ; > > + cmp edi, SMM_RESUME_SIGNATURE > > + je S3_SecRoutine > > + > > + JMP32 ASM_PFX(stackless_EarlyPlatformInit) > > + mov esp, BSP_STACK_BASE_ADDR+PRE_MEM_STACK_SIZE > > + > > + ; > > + ; Push processor count to stack first, then BIST status (AP then BSP) > > + ; > > + mov eax, 1 > > + cpuid > > + shr ebx, 16 > > + and ebx, 0000000FFh > > + cmp bl, 1 > > + jae PushProcessorCount > > + > > + ; > > + ; Some processors report 0 logical processors. Effectively 0 = 1. > > + ; So we fix up the processor count > > + ; > > + inc ebx > > + > > +PushProcessorCount: > > + push ebx > > + > > + movd eax, mm0 ; BIST saved in mm0 at reset vector. > > + ; > > + ; We need to implement a long-term solution for BIST capture. For now, we > just copy BSP BIST > > + ; for all processor threads > > + ; > > + mov ecx, ebx > > +PushBist: > > + push eax > > + loop PushBist > > + > > + ;Clear Long Mode Enable > > + mov ecx, MSR_IA32_EFER > > + rdmsr > > + btr eax, MSR_IA32_EFER_LME ; Set LME=0 > > + wrmsr > > + > > + ;Open smm ram > > + mov ecx, SMMMASK_ADDRESS > > + rdmsr > > + btr eax, SMMMASK_ADDRESS_AE ; Set AValid=0 > > + btr eax, SMMMASK_ADDRESS_TE ; Set TValid=0 > > + wrmsr > > + > > + ;Rebase SMRAM Base Address to power on default value > > + mov ecx, MSR_SMM_BASE > > + rdmsr > > + mov eax, SMM_BASE_DEFAULT > > + wrmsr > > + > > + mov ecx, APIC_BASE_ADDRESS > > + rdmsr > > + bt eax, APIC_BSC ; Is this the BSC? > > + jc IsBsp > > + > > +IsAp: > > + cli ; Family 17h AP just halt here > > + hlt > > + jmp IsAp > > + > > +IsBsp: > > + push ebp ; BFV base address > > + ; > > + ; Pass stack base into the PEI Core > > + ; > > + push BSP_STACK_BASE_ADDR > > + > > + ; > > + ; Pass stack size into the PEI Core > > + ; > > + push PRE_MEM_STACK_SIZE > > + ; > > + ; Pass Control into the PEI Core > > + ; > > + ; UefiCpuPkg\SecCore\SecMain.c: > > + ; > > + ; VOID > > + ; EFIAPI > > + ; SecStartup ( > > + ; IN UINT32 SizeOfRam, > > + ; IN UINT32 TempRamBase, > > + ; IN VOID *BootFirmwareVolume > > + ; ); > > + call ASM_PFX(SecStartup) > > + > > + ; > > + ; Sec Core should never return to here, this is just to capture an invalid > return. > > + ; > > + jmp $ > > + > > +S3_SecRoutine: > > + ;Clear Long Mode Enable > > + mov ecx, MSR_IA32_EFER > > + rdmsr > > + btr eax, MSR_IA32_EFER_LME ; Set LME=0 > > + wrmsr > > + > > + ;Open smm ram > > + mov ecx, SMMMASK_ADDRESS > > + rdmsr > > + btr eax, SMMMASK_ADDRESS_AE ; Set AValid=0 > > + btr eax, SMMMASK_ADDRESS_TE ; Set TValid=0 > > + wrmsr > > + > > + ;Rebase SMRAM Base Address to power on default value > > + mov ecx, MSR_SMM_BASE > > + rdmsr > > + mov eax, SMM_BASE_DEFAULT > > + wrmsr > > + > > + mov ecx, APIC_BASE_ADDRESS > > + rdmsr > > + bt eax, APIC_BSC ; Is this the BSC? > > + jc IsBspInS3 > > + > > +IsApInS3: > > + cli ; Family 17h AP just halt here > > + hlt > > + jmp IsApInS3 > > + > > +IsBspInS3: > > + > > + ;; > > + ;; Enable eSPI port 80 and FCH UART2 during S3 resume start > > + ;; > > + push eax > > + push ebx > > + push ecx > > + push edx > > + push esi > > + push edi > > + > > + mov eax, FixedPcdGet64 (PcdPciExpressBaseAddress) > > + or eax, (PCIEX_LENGTH_BIT_SETTING | 1) > > + xor edx, edx > > + mov ecx, 0C0010058h > > + wrmsr > > + > > + ; > > + ; Enable port 80 decode to eSPI ; > > + ; > > + mov ebx, FixedPcdGet64 (PcdPciExpressBaseAddress) | (LPC_PFA << 12) | > LPC_SPI_BASE_ADDR ; PCI Configuration address > > + mov ebx, dword ptr [ebx] > > + and ebx, 0xFFFFFF00 > > + add ebx, 0x10000 ; Get the eSPI base address > > + add ebx, ESPI_SLAVE0_DECODE_EN > > + mov eax, dword ptr [ebx] > > + or eax, ESPI_SLAVE0_DECODE_EN_IO_80_EN > > + mov dword ptr [ebx], eax > > + > > + ; > > + ; Program IOMUX for eSPI port 80, GPIO 30 and 31 to function 1 > > + ; > > + mov ebx, 0xFED80D1E > > + mov eax, dword ptr [ebx] > > + or eax, 1 > > + mov dword ptr [ebx], eax > > + > > + mov ebx, 0xFED80D1F > > + mov eax, dword ptr [ebx] > > + or eax, 1 > > + mov dword ptr [ebx], eax > > + > > + mov al, 0x33 > > + out 0x80, al > > + > > + ; > > + ; Program IOMUX for FCH UART2, GPIO 136 and 138 to function 1 > > + ; > > + mov ebx, 0xFED80D88 > > + mov eax, dword ptr [ebx] > > + or eax, 1 > > + mov dword ptr [ebx], eax > > + > > + mov ebx, 0xFED80D8A > > + mov eax, dword ptr [ebx] > > + or eax, 1 > > + mov dword ptr [ebx], eax > > + > > + pop edi > > + pop esi > > + pop edx > > + pop ecx > > + pop ebx > > + pop eax > > + ;; > > + ;; Enable eSPI port 80 and FCH UART2 during S3 resume end > > + ;; > > + > > + pop ebx > > + mov edi, ebx > > + > > + pop ebx > > + mov esi, ebx > > + > > + pop edx > > + pop eax > > + > > + pop ebx > > + mov esp, ebx > > + > > + push 1 ; set Processor Count to 1 for S3 resume path which is not > used > finally. > > + push 0 ; set BIST to 0 > > + > > + push ebp ; BFV base address > > + > > + ; > > + ; Pass stack base into the PEI Core > > + ; > > + sub ebx, PRE_MEM_STACK_SIZE > > + push ebx > > + > > + ; > > + ; Pass stack size into the PEI Core > > + ; > > + push PRE_MEM_STACK_SIZE > > + > > + ; > > + ; Pass Control into the PEI Core > > + ; > > + call ASM_PFX(SecStartup) > > + > > + ; > > + ; Sec Core should never return to here, this is just to capture an invalid > return. > > + ; > > + jmp $ > > + > > +;---------------------------------------------------------------------------- > > +; > > +; Procedure: stackless_EarlyPlatformInit > > +; > > +; Input: esp - Return address > > +; > > +; Output: None > > +; > > +; Destroys: > > +; eax > > +; ecx > > +; dx > > +; ebp > > +; > > +; Description: > > +; Any essential early platform initialisation required: > > +; (1) Setup PCIEXBAR access mechanism > > +; (2) enable IO port 80 to eSPI > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(stackless_EarlyPlatformInit) > > +ASM_PFX(stackless_EarlyPlatformInit): > > + > > + ; > > + ;PcRtcInit start > > + ; > > + ;; > > + ;; Initialize RTC Register > > + ;; > > + ;; Make sure Division Chain is properly configured, > > + ;; or RTC clock won't "tick" -- time won't increment > > + ;; > > + in al, PCAT_RTC_ADDRESS_REGISTER > > + > > + mov al, RTC_ADDRESS_REGISTER_A | NMI_DISABLE_BIT > > + out PCAT_RTC_ADDRESS_REGISTER, al > > + > > + mov al, FixedPcdGet8 (PcdInitialValueRtcRegisterA) > > + out PCAT_RTC_DATA_REGISTER, al > > + > > + > > + ;; > > + ;; Read Register B > > + ;; > > + in al, PCAT_RTC_ADDRESS_REGISTER > > + > > + mov al, RTC_ADDRESS_REGISTER_B | NMI_DISABLE_BIT > > + out PCAT_RTC_ADDRESS_REGISTER, al > > + > > + in al, PCAT_RTC_DATA_REGISTER > > + > > + > > + ;; > > + ;; Clear RTC flag register > > + ;; > > + in al, PCAT_RTC_ADDRESS_REGISTER > > + > > + mov al, RTC_ADDRESS_REGISTER_C | NMI_DISABLE_BIT > > + out PCAT_RTC_ADDRESS_REGISTER, al > > + > > + in al, PCAT_RTC_DATA_REGISTER > > + > > + > > + ;; > > + ;; Clear RTC register D > > + ;; > > + in al, PCAT_RTC_ADDRESS_REGISTER > > + > > + mov al, RTC_ADDRESS_REGISTER_D | NMI_DISABLE_BIT > > + out PCAT_RTC_ADDRESS_REGISTER, al > > + > > + mov al, FixedPcdGet8 (PcdInitialValueRtcRegisterD) > > + out PCAT_RTC_DATA_REGISTER, al > > + ; > > + ;PcRtcInit end > > + ; > > + > > + mov eax, FixedPcdGet64 (PcdPciExpressBaseAddress) > > + or eax, (PCIEX_LENGTH_BIT_SETTING | 1) > > + xor edx, edx > > + mov ecx, 0C0010058h > > + wrmsr > > + > > + ; > > + ; Enable port 80 decode to eSPI ; > > + ; > > + mov ebx, FixedPcdGet64 (PcdPciExpressBaseAddress) | (LPC_PFA << 12) | > LPC_SPI_BASE_ADDR ; PCI Configuration address > > + mov ebx, dword ptr [ebx] > > + and ebx, 0xFFFFFF00 > > + add ebx, 0x10000 ; Get the eSPI base address > > + add ebx, ESPI_SLAVE0_DECODE_EN > > + mov eax, dword ptr [ebx] > > + or eax, ESPI_SLAVE0_DECODE_EN_IO_80_EN > > + mov dword ptr [ebx], eax > > + > > + ; > > + ; Program IOMUX for eSPI port 80, GPIO 30 and 31 to function 1 > > + ; > > + mov ebx, 0xFED80D1E > > + mov eax, dword ptr [ebx] > > + or eax, 1 > > + mov dword ptr [ebx], eax > > + > > + mov ebx, 0xFED80D1F > > + mov eax, dword ptr [ebx] > > + or eax, 1 > > + mov dword ptr [ebx], eax > > + > > + mov al, 0x88 > > + out 0x80, al > > + > > + > > + ; > > + ; Program IOMUX for FCH UART2, GPIO 136 and 138 to function 1 > > + ; > > + mov ebx, 0xFED80D88 > > + mov eax, dword ptr [ebx] > > + or eax, 1 > > + mov dword ptr [ebx], eax > > + > > + mov ebx, 0xFED80D8A > > + mov eax, dword ptr [ebx] > > + or eax, 1 > > + mov dword ptr [ebx], eax > > + > > + RET32 > > + > > +;---------------------------------------------------------------------------- > > +; > > +; Procedure: stackless_PCIConfig_Write > > +; > > +; Input: esp - return address > > +; eax - Data to write > > +; ebx - PCI Config Address > > +; > > +; Output: None > > +; > > +; Destroys: > > +; dx > > +; > > +; Description: > > +; Perform a DWORD PCI Configuration write > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(stackless_PCIConfig_Write) > > +ASM_PFX(stackless_PCIConfig_Write): > > + > > + ; > > + ; Write the PCI Config Address to the address port > > + ; > > + xchg eax, ebx > > + mov dx, PCI_ADDRESS_PORT > > + out dx, eax > > + xchg eax, ebx > > + > > + ; > > + ; Write the PCI DWORD Data to the data port > > + ; > > + mov dx, PCI_DATA_PORT > > + out dx, eax > > + > > + RET32 > > + > > + > > +;---------------------------------------------------------------------------- > > +; > > +; Procedure: stackless_PCIConfig_Read > > +; > > +; Input: esp - return address > > +; ebx - PCI Config Address > > +; > > +; Output: eax - Data read > > +; > > +; Destroys: > > +; eax > > +; dx > > +; > > +; Description: > > +; Perform a DWORD PCI Configuration read > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(stackless_PCIConfig_Read) > > +ASM_PFX(stackless_PCIConfig_Read): > > + ; > > + ; Write the PCI Config Address to the address port > > + ; > > + xchg eax, ebx > > + mov dx, PCI_ADDRESS_PORT > > + out dx, eax > > + xchg eax, ebx > > + > > + ; > > + ; Read the PCI DWORD Data from the data port > > + ; > > + mov dx, PCI_DATA_PORT > > + in eax, dx > > + > > + RET32 > > diff --git > a/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/I > a32/Platform.inc > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > Ia32/Platform.inc > > new file mode 100644 > > index 0000000000..c057d157d9 > > --- /dev/null > > +++ > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > Ia32/Platform.inc > > @@ -0,0 +1,69 @@ > > +;/** @file > > +; AMD VanGoghBoard PlatformSecLib > > +; > > +; Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > > +; SPDX-License-Identifier: BSD-2-Clause-Patent > > +; > > +;**/ > > + > > +; This file includes code originally published under the following license. > > +; > > +; Copyright (c) 2013-2015 Intel Corporation. > > +; > > +; SPDX-License-Identifier: BSD-2-Clause-Patent > > +; > > +;------------------------------------------------------------------------------ > > +; > > +; Module Name: > > +; > > +; Platform.inc > > +; > > +; Abstract: > > +; > > +; Platform Specific Definitions > > +; > > +;------------------------------------------------------------------------------ > > + > > +%macro JMP32 1 > > + lea esp, %%target > > + jmp %1 > > +%%target: > > +%endmacro > > + > > +%macro RET32 0 > > + jmp esp > > +%endmacro > > + > > +; > > +; RTC/CMOS definitions > > +; > > +RTC_INDEX EQU 070h > > + NMI_DISABLE EQU 080h ; Bit7=1 disables NMI > > + NMI_ENABLE EQU 000h ; Bit7=0 disables NMI > > +RTC_DATA EQU 071h > > + > > +; > > +; PCI Configuration definitions > > +; > > +PCI_CFG EQU 1 << 01Fh ; PCI configuration access mechanism > > +PCI_ADDRESS_PORT EQU 0CF8h > > +PCI_DATA_PORT EQU 0CFCh > > + > > +; > > +; LPC-ISA Bridge PCI Config Registers > > +; > > +LPC_PFA EQU 00A3h ; B0:D14:F3 (Legacy Block) > > + LPC_IO_PDE EQU 0044h ; IO Port Decode Enable > > + LPC_IOMEM_PDE EQU 0048h ; IO or Memory Port Decode Enable > > + LPC_BASE_WIDE_PORT EQU 0064H > > + LPC_WIDE_IO_EN EQU 0074H > > + LPC_WIDE_IO2 EQU 0090H > > + LPC_SPI_BASE_ADDR EQU 00A0H ; SPI BAR = > {SPI_BaseAddr[31:8],8'b0} > > + ; HFP BAR = {SPI_BaseAddr[31:8],8'b0} > + 0x0000_1000 > > + ; eSPI BAR = {SPI_BaseAddr[31:8],8'b0} > + 0x0001_0000 > > + > > +ESPI_SLAVE0_DECODE_EN EQU 0040h > > + ESPI_SLAVE0_DECODE_EN_IO_80_EN EQU 04h ; Port 80 decode enabled > > + > > +APIC_BASE_ADDRESS EQU 0000001Bh > > +APIC_BSC EQU 8 ; Boot Strap Core > > diff --git > a/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLib.c > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLib.c > > new file mode 100644 > > index 0000000000..4c27d9b5a2 > > --- /dev/null > > +++ > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLib.c > > @@ -0,0 +1,208 @@ > > +/** @file > > + Implements PlatformSecLib.c > > + > > + Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +/* This file includes code originally published under the following license. > */ > > + > > +/** @file > > +Platform SEC Library for Quark. > > + > > +Copyright (c) 2013-2015 Intel Corporation. > > + > > +SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > + > > +**/ > > + > > +#include <PiPei.h> > > + > > +#include <Ppi/SecPlatformInformation.h> > > +#include <Ppi/TemporaryRamSupport.h> > > +#include <Library/PcdLib.h> > > +#include <Library/BaseLib.h> > > +#include <Library/DebugLib.h> > > +#include <Library/BaseMemoryLib.h> > > +#include <Library/HobLib.h> > > +#include <Library/MtrrLib.h> > > + > > +/** > > + > > + Entry point to the C language phase of SEC. After the SEC assembly > > + code has initialized some temporary memory and set up the stack, > > + the control is transferred to this function. > > + > > + @param SizeOfRam Size of the temporary memory available for use. > > + @param TempRamBase Base address of temporary ram > > + @param BootFirmwareVolume Base address of the Boot Firmware Volume. > > + > > +**/ > > +VOID > > +EFIAPI > > +SecStartup ( > > + IN UINT32 SizeOfRam, > > + IN UINT32 TempRamBase, > > + IN VOID *BootFirmwareVolume > > + ); > > + > > +/** > > + Auto-generated function that calls the library constructors for all of the > module's > > + dependent libraries. This function must be called by the SEC Core once a > stack has > > + been established. > > + > > +**/ > > +VOID > > +EFIAPI > > +ProcessLibraryConstructorList ( > > + VOID > > + ); > > + > > +/** > > + > > + Entry point to the C language phase of PlatformSecLib. After the SEC > assembly > > + code has initialized some temporary memory and set up the stack, control is > > + transferred to this function. > > + > > +**/ > > +VOID > > +EFIAPI > > +PlatformSecLibStartup ( > > + VOID > > + ) > > +{ > > + // > > + // Process all library constructor functions linked to SecCore. > > + // This function must be called before any library functions are called > > + // > > + ProcessLibraryConstructorList (); > > + > > + // > > + // Set write back cache attribute for SPI FLASH > > + // > > + > > + // > > + // Set write back cache attribute for 512KB Embedded SRAM > > + // > > + > > + // > > + // Pass control to SecCore module passing in the size of the temporary RAM > in > > + // Embedded SRAM, the base address of the temporary RAM in Embedded > SRAM, and > > + // the base address of the boot firmware volume. The top 32KB of the 512 > KB > > + // embedded SRAM are used as temporary RAM. > > + // > > + SecStartup ( > > + SIZE_128KB, > > + BASE_64KB + BASE_128KB, > > + (VOID *)(UINTN)(PcdGet32 (PcdMemoryFvRecoveryBase)) > > + ); > > +} > > + > > +/** > > + A developer supplied function to perform platform specific operations. > > + > > + It's a developer supplied function to perform any operations appropriate to > a > > + given platform. It's invoked just before passing control to PEI core by SEC > > + core. Platform developer may modify the SecCoreData and PPI list that is > > + passed to PEI Core. > > + > > + @param SecCoreData The same parameter as passing to PEI core. It > > + could be overridden by this function. > > + @param PpiList The default PPI list passed from generic SEC > > + part. > > + > > + @return The final PPI list that platform wishes to passed to PEI core. > > + > > +**/ > > +EFI_PEI_PPI_DESCRIPTOR * > > +EFIAPI > > +SecPlatformMain ( > > + IN OUT EFI_SEC_PEI_HAND_OFF *SecCoreData > > + ) > > +{ > > + MtrrSetMemoryAttribute (PcdGet32 (PcdMemoryFvRecoveryBase), > PcdGet32 (PcdMemoryFvMainSize) + PcdGet32 (PcdFlashFvRecoverySize), > CacheWriteBack); > > + return NULL; > > +} > > + > > +/** > > + This interface conveys state information out of the Security (SEC) phase > into > PEI. > > + > > + @param PeiServices Pointer to the PEI Services Table. > > + @param StructureSize Pointer to the variable describing size > of the > input buffer. > > + @param PlatformInformationRecord Pointer to the > EFI_SEC_PLATFORM_INFORMATION_RECORD. > > + > > + @retval EFI_SUCCESS The data was successfully returned. > > + @retval EFI_BUFFER_TOO_SMALL The buffer was too small. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +SecPlatformInformation ( > > + IN CONST EFI_PEI_SERVICES **PeiServices, > > + IN OUT UINT64 *StructureSize, > > + OUT EFI_SEC_PLATFORM_INFORMATION_RECORD > *PlatformInformationRecord > > + ) > > +{ > > + UINT32 *BIST; > > + UINT32 Size; > > + UINT32 Count; > > + EFI_HOB_GUID_TYPE *GuidHob; > > + UINT32 *TopOfStack; > > + > > + // > > + // Top of the stack is the top of the 512KB Embedded SRAM region > > + // > > + TopOfStack = (UINT32 *)(FixedPcdGet32 > (PcdPeiCorePeiPreMemoryStackBaseAddress) + > > + FixedPcdGet32 (PcdPeiCorePeiPreMemoryStackSize)); > > + > > + GuidHob = GetFirstGuidHob (&gEfiSecPlatformInformationPpiGuid); > > + if (GuidHob != NULL) { > > + Size = GET_GUID_HOB_DATA_SIZE (GuidHob); > > + BIST = GET_GUID_HOB_DATA (GuidHob); > > + } else { > > + // > > + // The entries of BIST information, together with the number of them, > > + // reside in the bottom of stack, left untouched by normal stack > operation. > > + // This routine copies the BIST information to the buffer pointed by > > + // PlatformInformationRecord for output. > > + // > > + Count = *(TopOfStack - 1); > > + Size = Count * sizeof (IA32_HANDOFF_STATUS); > > + BIST = (UINT32 *)((UINT32)TopOfStack - sizeof (UINT32) - Size); > > + > > + // > > + // Copy Data from Stack to Hob to avoid data is lost after memory is > ready. > > + // > > + BuildGuidDataHob ( > > + &gEfiSecPlatformInformationPpiGuid, > > + BIST, > > + (UINTN)Size > > + ); > > + GuidHob = GetFirstGuidHob (&gEfiSecPlatformInformationPpiGuid); > > + Size = GET_GUID_HOB_DATA_SIZE (GuidHob); > > + BIST = GET_GUID_HOB_DATA (GuidHob); > > + } > > + > > + if ((*StructureSize) < (UINT64)Size) { > > + *StructureSize = Size; > > + return EFI_BUFFER_TOO_SMALL; > > + } > > + > > + *StructureSize = Size; > > + CopyMem (PlatformInformationRecord, BIST, Size); > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This interface disables temporary memory in SEC Phase. > > +**/ > > +VOID > > +EFIAPI > > +SecPlatformDisableTemporaryMemory ( > > + VOID > > + ) > > +{ > > +} > > diff --git > a/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLib.inf > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLib.inf > > new file mode 100644 > > index 0000000000..1c23fd4949 > > --- /dev/null > > +++ > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLib.inf > > @@ -0,0 +1,68 @@ > > +## @file > > +# Platform Sec Lib Module > > +# > > +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > > +# SPDX-License-Identifier: BSD-2-Clause-Patent > > +# > > +## > > +# This file includes code originally published under the following license. > > +#/** @file > > +# Platform SEC Library for Quark. > > +# > > +# Copyright (c) 2013-2015 Intel Corporation. > > +# > > +# SPDX-License-Identifier: BSD-2-Clause-Patent > > +# > > +#**/ > > + > > +[Defines] > > + INF_VERSION = 0x00010005 > > + BASE_NAME = PlatformSecLib > > + FILE_GUID = E9536686-F280-4908-88DA-DBBCD0186A6A > > + MODULE_TYPE = SEC > > + VERSION_STRING = 1.0 > > + LIBRARY_CLASS = PlatformSecLib > > + MODULE_UNI_FILE = PlatformSecLibModStrs.uni > > + > > +# > > +# The following information is for reference only and not required by the > build > tools. > > +# > > +# VALID_ARCHITECTURES = IA32 > > +# > > + > > +[Sources] > > + PlatformSecLib.c > > + > > +[Sources.IA32] > > + Ia32/Flat32.nasm > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + MdeModulePkg/MdeModulePkg.dec > > + PcAtChipsetPkg/PcAtChipsetPkg.dec > > + UefiCpuPkg/UefiCpuPkg.dec > > + VanGoghCommonPkg/AmdCommonPkg.dec > > + ChachaniBoardPkg/Project.dec > > + > > +[LibraryClasses] > > + DebugLib > > + BaseLib > > + BaseMemoryLib > > + PciLib > > + PcdLib > > + HobLib > > + MtrrLib > > + > > +[Pcd] > > + gPlatformPkgTokenSpaceGuid.PcdFlashFvRecoverySize ## CONSUMES > > + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress > > + gPlatformPkgTokenSpaceGuid.PcdMemoryFvRecoveryBase > > + gAmdCommonPkgTokenSpaceGuid.PcdMemoryFvMainSize > > + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate > > + gPlatformPkgTokenSpaceGuid.PcdPeiCorePeiPreMemoryStackBaseAddress > > + gPlatformPkgTokenSpaceGuid.PcdPeiCorePeiPreMemoryStackSize > > + gPcAtChipsetPkgTokenSpaceGuid.PcdInitialValueRtcRegisterA ## > CONSUMES > > + gPcAtChipsetPkgTokenSpaceGuid.PcdInitialValueRtcRegisterD ## > CONSUMES > > + > > +[Ppis] > > + gEfiSecPlatformInformationPpiGuid ## UNDEFINED # it is used as GUIDED > HOB > > diff --git > a/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLibModStrs.uni > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLibModStrs.uni > > new file mode 100644 > > index 0000000000..f728e07695 > > --- /dev/null > > +++ > b/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/ > PlatformSecLibModStrs.uni > > @@ -0,0 +1,28 @@ > > +// /** @file > > +// AMD PlatformSecLibModStrs.uni > > +// > > +// Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR> > > +// > > +// SPDX-License-Identifier: BSD-2-Clause-Patent > > +// > > +// **/ > > + > > +// This file includes code originally published under the following license. > > +// /** @file > > +// PlatformSecLib Localized Abstract and Description Content > > +// > > +// Copyright (c) 2012 - 2013, Intel Corporation. All rights reserved.<BR> > > +// > > +// SPDX-License-Identifier: BSD-2-Clause-Patent > > +// > > +// **/ > > + > > +#string STR_MODULE_ABSTRACT > > +#language en-US > > +"SEC Platform Library " > > + > > +#string STR_MODULE_DESCRIPTION > > +#language en-US > > +"Provides a platform-specific function to be used during the SEC stage of > POST. " > > + > > + > > -- > > 2.31.1 > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#114171): https://edk2.groups.io/g/devel/message/114171 Mute This Topic: https://groups.io/mt/103831166/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-