From: Duke Zhai <Duke.Zhai@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.yao@amd.com>
Cc: Duke Zhai <duke.zhai@amd.com>
Cc: Eric Xing <eric.xing@amd.com>
Cc: Igniculus Fu <igniculus.fu@amd.com>
Cc: Abner Chang <abner.chang@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/Ia32/Flat32.nasm
create mode 100644 Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/Ia32/Platform.inc
create mode 100644 Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/PlatformSecLib.c
create mode 100644 Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/PlatformSecLib.inf
create mode 100644 Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/PlatformSecLibModStrs.uni
diff --git a/Platform/AMD/VanGoghBoard/ChachaniBoardPkg/Library/PlatformSecLib/Ia32/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.
+;------------------------------------------------------------------------------
+;
+; 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/Ia32/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 (#114054): https://edk2.groups.io/g/devel/message/114054
Mute This Topic: https://groups.io/mt/103831166/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
[AMD Official Use Only - General] > -----Original Message----- > From: duke.zhai@amd.com <duke.zhai@amd.com> > Sent: Thursday, January 18, 2024 2:50 PM > To: devel@edk2.groups.io > Cc: Zhai, MingXin (Duke) <duke.zhai@amd.com>; Xing, Eric > <Eric.Xing@amd.com>; Fu, Igniculus <Igniculus.Fu@amd.com>; Chang, Abner > <Abner.Chang@amd.com> > Subject: [PATCH 05/33] AMD/VanGoghBoard: Check in PlatformSecLib > > From: Duke Zhai <Duke.Zhai@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.yao@amd.com> > > Cc: Duke Zhai <duke.zhai@amd.com> > > Cc: Eric Xing <eric.xing@amd.com> > > Cc: Igniculus Fu <igniculus.fu@amd.com> > > Cc: Abner Chang <abner.chang@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/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2024 Red Hat, Inc.