/** @file SetCacheMtrr library functions. This library implementation is for AMD processor based platforms. Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include /** This function sets the cache MTRR values for PEI phase. **/ VOID EFIAPI SetCacheMtrr ( VOID ) { EFI_STATUS Status; UINT64 TopOfMemory; Status = MtrrSetMemoryAttribute ( 0, 0xA0000, CacheWriteBack ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "Error(%r) in setting CacheWriteBack for 0-0x9FFFF\n", Status )); } Status = MtrrSetMemoryAttribute ( 0xA0000, 0x20000, CacheWriteThrough ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "Error(%r) in setting CacheUncacheable for 0xA0000-0xBFFFF\n", Status )); } Status = MtrrSetMemoryAttribute ( 0xC0000, 0x40000, CacheWriteProtected ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "Error(%r) in setting CacheWriteProtected for 0xC0000-0xFFFFF\n", Status )); } TopOfMemory = AsmReadMsr64 (0xC001001A); ASSERT (TopOfMemory > 0x100000); if (TopOfMemory > 0x100000) { Status = MtrrSetMemoryAttribute ( 0x100000, TopOfMemory - 0x100000, CacheWriteBack ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "Error(%r) in setting CacheWriteBack for 0x100000-0x%lX\n", Status, TopOfMemory - 1 )); } } Status = MtrrSetMemoryAttribute ( PcdGet32 (PcdFlashAreaBaseAddress), PcdGet32 (PcdFlashAreaSize), CacheWriteProtected ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "Error(%r) in setting CacheWriteProtected for 0x%X-0x%X\n", Status, PcdGet32 (PcdFlashAreaBaseAddress), PcdGet32 (PcdFlashAreaBaseAddress) + PcdGet32 (PcdFlashAreaSize) )); } MtrrDebugPrintAllMtrrs (); return; } /** Update MTRR setting in EndOfPei phase. This function will set the MTRR value as CacheUncacheable for Flash address. @retval EFI_SUCCESS The function completes successfully. @retval Others Some error occurs. **/ EFI_STATUS EFIAPI SetCacheMtrrAfterEndOfPei ( VOID ) { EFI_STATUS Status; UINT32 Mmio64Hi; UINT32 Mmio64Low; UINT64 ROM3MmioBase; Status = MtrrSetMemoryAttribute ( PcdGet32 (PcdFlashAreaBaseAddress), PcdGet32 (PcdFlashAreaSize), CacheUncacheable ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "Error(%r) in setting CacheUncacheable for 0x%X-0x%X\n", Status, PcdGet32 (PcdFlashAreaBaseAddress), PcdGet32 (PcdFlashAreaBaseAddress) + PcdGet32 (PcdFlashAreaSize) )); } // Get ROM3 base addr Mmio64Low = MmioRead32 (FCH_SPI_BASE_ADDRESS + FCH_PMIOA_REG60); Mmio64Low &= 0xFC000000; Mmio64Hi = MmioRead32 (FCH_SPI_BASE_ADDRESS + FCH_PMIOA_REG64); ROM3MmioBase = (UINT64)(Mmio64Low | LShiftU64 (Mmio64Hi, 32)); Status = MtrrSetMemoryAttribute ( ROM3MmioBase, 0x4000000, CacheUncacheable ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "Error(%r) in setting CacheUncacheable for 0x%X-0x%X\n", Status, ROM3MmioBase, ROM3MmioBase + 0x4000000 )); } MtrrDebugPrintAllMtrrs (); return EFI_SUCCESS; }