X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=IntelSiliconPkg%2FFeature%2FVTd%2FIntelVTdPmrPei%2FVtdReg.c;fp=IntelSiliconPkg%2FFeature%2FVTd%2FIntelVTdPmrPei%2FVtdReg.c;h=0000000000000000000000000000000000000000;hp=4774a2ae5b7c33cd59d2d833629c835c7b47f1f4;hb=77ff7d6aa2710d5e04b0bd14d8556957a3ed0602;hpb=370f16c5489609062d8ee0940f29f6c3393f1b68
diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
deleted file mode 100644
index 4774a2ae5b..0000000000
--- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/** @file
-
- Copyright (c) 2017, Intel Corporation. All rights reserved.
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "IntelVTdPmrPei.h"
-
-/**
- Flush VTD page table and context table memory.
-
- This action is to make sure the IOMMU engine can get final data in memory.
-
- @param[in] Base The base address of memory to be flushed.
- @param[in] Size The size of memory in bytes to be flushed.
-**/
-VOID
-FlushPageTableMemory (
- IN UINTN Base,
- IN UINTN Size
- )
-{
- WriteBackDataCacheRange ((VOID *)Base, Size);
-}
-
-/**
- Flush VTd engine write buffer.
-
- @param VtdUnitBaseAddress The base address of the VTd engine.
-**/
-VOID
-FlushWriteBuffer (
- IN UINTN VtdUnitBaseAddress
- )
-{
- UINT32 Reg32;
- VTD_CAP_REG CapReg;
-
- CapReg.Uint64 = MmioRead64 (VtdUnitBaseAddress + R_CAP_REG);
-
- if (CapReg.Bits.RWBF != 0) {
- Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
- MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);
- do {
- Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
- } while ((Reg32 & B_GSTS_REG_WBF) != 0);
- }
-}
-
-/**
- Invalidate VTd context cache.
-
- @param VtdUnitBaseAddress The base address of the VTd engine.
-**/
-EFI_STATUS
-InvalidateContextCache (
- IN UINTN VtdUnitBaseAddress
- )
-{
- UINT64 Reg64;
-
- Reg64 = MmioRead64 (VtdUnitBaseAddress + R_CCMD_REG);
- if ((Reg64 & B_CCMD_REG_ICC) != 0) {
- DEBUG ((DEBUG_ERROR,"ERROR: InvalidateContextCache: B_CCMD_REG_ICC is set for VTD(%x)\n",VtdUnitBaseAddress));
- return EFI_DEVICE_ERROR;
- }
-
- Reg64 &= ((~B_CCMD_REG_ICC) & (~B_CCMD_REG_CIRG_MASK));
- Reg64 |= (B_CCMD_REG_ICC | V_CCMD_REG_CIRG_GLOBAL);
- MmioWrite64 (VtdUnitBaseAddress + R_CCMD_REG, Reg64);
-
- do {
- Reg64 = MmioRead64 (VtdUnitBaseAddress + R_CCMD_REG);
- } while ((Reg64 & B_CCMD_REG_ICC) != 0);
-
- return EFI_SUCCESS;
-}
-
-/**
- Invalidate VTd IOTLB.
-
- @param VtdUnitBaseAddress The base address of the VTd engine.
-**/
-EFI_STATUS
-InvalidateIOTLB (
- IN UINTN VtdUnitBaseAddress
- )
-{
- UINT64 Reg64;
- VTD_ECAP_REG ECapReg;
-
- ECapReg.Uint64 = MmioRead64 (VtdUnitBaseAddress + R_ECAP_REG);
-
- Reg64 = MmioRead64 (VtdUnitBaseAddress + (ECapReg.Bits.IRO * 16) + R_IOTLB_REG);
- if ((Reg64 & B_IOTLB_REG_IVT) != 0) {
- DEBUG ((DEBUG_ERROR,"ERROR: InvalidateIOTLB: B_IOTLB_REG_IVT is set for VTD(%x)\n", VtdUnitBaseAddress));
- return EFI_DEVICE_ERROR;
- }
-
- Reg64 &= ((~B_IOTLB_REG_IVT) & (~B_IOTLB_REG_IIRG_MASK));
- Reg64 |= (B_IOTLB_REG_IVT | V_IOTLB_REG_IIRG_GLOBAL);
- MmioWrite64 (VtdUnitBaseAddress + (ECapReg.Bits.IRO * 16) + R_IOTLB_REG, Reg64);
-
- do {
- Reg64 = MmioRead64 (VtdUnitBaseAddress + (ECapReg.Bits.IRO * 16) + R_IOTLB_REG);
- } while ((Reg64 & B_IOTLB_REG_IVT) != 0);
-
- return EFI_SUCCESS;
-}
-
-/**
- Enable DMAR translation.
-
- @param VtdUnitBaseAddress The base address of the VTd engine.
- @param RootEntryTable The address of the VTd RootEntryTable.
-
- @retval EFI_SUCCESS DMAR translation is enabled.
- @retval EFI_DEVICE_ERROR DMAR translation is not enabled.
-**/
-EFI_STATUS
-EnableDmar (
- IN UINTN VtdUnitBaseAddress,
- IN UINTN RootEntryTable
- )
-{
- UINT32 Reg32;
-
- DEBUG((DEBUG_INFO, ">>>>>>EnableDmar() for engine [%x] \n", VtdUnitBaseAddress));
-
- DEBUG((DEBUG_INFO, "RootEntryTable 0x%x \n", RootEntryTable));
- MmioWrite64 (VtdUnitBaseAddress + R_RTADDR_REG, (UINT64)(UINTN)RootEntryTable);
-
- MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, B_GMCD_REG_SRTP);
-
- DEBUG((DEBUG_INFO, "EnableDmar: waiting for RTPS bit to be set... \n"));
- do {
- Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
- } while((Reg32 & B_GSTS_REG_RTPS) == 0);
-
- //
- // Init DMAr Fault Event and Data registers
- //
- Reg32 = MmioRead32 (VtdUnitBaseAddress + R_FEDATA_REG);
-
- //
- // Write Buffer Flush before invalidation
- //
- FlushWriteBuffer (VtdUnitBaseAddress);
-
- //
- // Invalidate the context cache
- //
- InvalidateContextCache (VtdUnitBaseAddress);
-
- //
- // Invalidate the IOTLB cache
- //
- InvalidateIOTLB (VtdUnitBaseAddress);
-
- //
- // Enable VTd
- //
- MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, B_GMCD_REG_TE);
- DEBUG((DEBUG_INFO, "EnableDmar: Waiting B_GSTS_REG_TE ...\n"));
- do {
- Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
- } while ((Reg32 & B_GSTS_REG_TE) == 0);
-
- DEBUG ((DEBUG_INFO,"VTD () enabled!<<<<<<\n"));
-
- return EFI_SUCCESS;
-}
-
-/**
- Disable DMAR translation.
-
- @param VtdUnitBaseAddress The base address of the VTd engine.
-
- @retval EFI_SUCCESS DMAR translation is disabled.
- @retval EFI_DEVICE_ERROR DMAR translation is not disabled.
-**/
-EFI_STATUS
-DisableDmar (
- IN UINTN VtdUnitBaseAddress
- )
-{
- UINT32 Reg32;
-
- DEBUG((DEBUG_INFO, ">>>>>>DisableDmar() for engine [%x] \n", VtdUnitBaseAddress));
-
- //
- // Write Buffer Flush before invalidation
- //
- FlushWriteBuffer (VtdUnitBaseAddress);
-
- //
- // Disable VTd
- //
- MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, B_GMCD_REG_SRTP);
- do {
- Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
- } while((Reg32 & B_GSTS_REG_RTPS) == 0);
-
- Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
- DEBUG((DEBUG_INFO, "DisableDmar: GSTS_REG - 0x%08x\n", Reg32));
-
- MmioWrite64 (VtdUnitBaseAddress + R_RTADDR_REG, 0);
-
- DEBUG ((DEBUG_INFO,"VTD () Disabled!<<<<<<\n"));
-
- return EFI_SUCCESS;
-}
-
-/**
- Enable VTd translation table protection.
-
- @param VTdInfo The VTd engine context information.
- @param EngineMask The mask of the VTd engine to be accessed.
-**/
-VOID
-EnableVTdTranslationProtection (
- IN VTD_INFO *VTdInfo,
- IN UINT64 EngineMask
- )
-{
- UINTN Index;
- VOID *RootEntryTable;
-
- DEBUG ((DEBUG_INFO, "EnableVTdTranslationProtection - 0x%lx\n", EngineMask));
-
- RootEntryTable = AllocatePages (1);
- ASSERT (RootEntryTable != NULL);
- if (RootEntryTable == NULL) {
- DEBUG ((DEBUG_INFO, " EnableVTdTranslationProtection : OutOfResource\n"));
- return ;
- }
-
- ZeroMem (RootEntryTable, EFI_PAGES_TO_SIZE(1));
- FlushPageTableMemory ((UINTN)RootEntryTable, EFI_PAGES_TO_SIZE(1));
-
- for (Index = 0; Index < VTdInfo->VTdEngineCount; Index++) {
- if ((EngineMask & LShiftU64(1, Index)) == 0) {
- continue;
- }
- EnableDmar ((UINTN)VTdInfo->VTdEngineAddress[Index], (UINTN)RootEntryTable);
- }
-
- return ;
-}
-
-/**
- Disable VTd translation table protection.
-
- @param VTdInfo The VTd engine context information.
- @param EngineMask The mask of the VTd engine to be accessed.
-**/
-VOID
-DisableVTdTranslationProtection (
- IN VTD_INFO *VTdInfo,
- IN UINT64 EngineMask
- )
-{
- UINTN Index;
-
- DEBUG ((DEBUG_INFO, "DisableVTdTranslationProtection - 0x%lx\n", EngineMask));
-
- for (Index = 0; Index < VTdInfo->VTdEngineCount; Index++) {
- if ((EngineMask & LShiftU64(1, Index)) == 0) {
- continue;
- }
- DisableDmar ((UINTN)VTdInfo->VTdEngineAddress[Index]);
- }
-
- return ;
-}