public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-devel] [PATCH] IntelSiliconPkg/VTd: Reset the one-shot bits before modifing GCMD_REG
@ 2024-02-20  3:36 Sheng Wei
  0 siblings, 0 replies; 3+ messages in thread
From: Sheng Wei @ 2024-02-20  3:36 UTC (permalink / raw)
  To: devel; +Cc: Ray Ni, Rangasai V Chaganty, Jenny Huang

Here is the process of modify GCMD_REG.
  Read GSTS_REG
  Reset the one-shot bits.
  Modify the target comamnd value.
  Write the command value to GCMD_REG.
  Wait until GSTS_REG indicates command is serviced.

Cc: Ray Ni <ray.ni@intel.com>
Cc: Rangasai V Chaganty <rangasai.v.chaganty@intel.com>
Cc: Jenny Huang <jenny.huang@intel.com>
Signed-off-by: Sheng Wei <w.sheng@intel.com>
---
 .../Feature/VTd/IntelVTdCoreDxe/VtdReg.c      | 13 ++----
 .../VTd/IntelVTdCorePei/IntelVTdDmar.c        |  9 +---
 .../VTd/IntelVTdDmarPei/IntelVTdDmar.c        | 43 +++++++++---------
 .../Feature/VTd/IntelVTdDxe/VtdReg.c          | 44 +++++++++----------
 .../Feature/VTd/IntelVTdPmrPei/VtdReg.c       |  1 +
 .../IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c     | 12 ++---
 6 files changed, 51 insertions(+), 71 deletions(-)

diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
index edeb4b3ff..21e2d5f1b 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
@@ -112,13 +112,8 @@ PerpareCacheInvalidationInterface (
   // Enable the queued invalidation interface through the Global Command Register.
   // When enabled, hardware sets the QIES field in the Global Status Register.
   //
-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  Reg32 |= B_GMCD_REG_QIE;
-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));
-  do {
-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  } while ((Reg32 & B_GSTS_REG_QIES) == 0);
+  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));
+  VtdLibSetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
 
   VTdLogAddEvent (VTDLOG_DXE_QUEUED_INVALIDATION, VTD_LOG_QI_ENABLE, VtdUnitBaseAddress);
 
@@ -577,7 +572,7 @@ DumpVtdCapRegs (
   IN VTD_CAP_REG *CapReg
   )
 {
-  DEBUG((DEBUG_INFO, "  CapReg   - 0x%x\n", CapReg->Uint64));
+  DEBUG((DEBUG_INFO, "  CapReg   - 0x%lx\n", CapReg->Uint64));
   DEBUG((DEBUG_INFO, "    ND     - 0x%x\n", CapReg->Bits.ND));
   DEBUG((DEBUG_INFO, "    AFL    - 0x%x\n", CapReg->Bits.AFL));
   DEBUG((DEBUG_INFO, "    RWBF   - 0x%x\n", CapReg->Bits.RWBF));
@@ -737,7 +732,7 @@ DumpVtdIfError (
     if (HasError) {
       REPORT_STATUS_CODE (EFI_ERROR_CODE, PcdGet32 (PcdErrorCodeVTdError));
       DEBUG((DEBUG_INFO, "\n#### ERROR ####\n"));
-      DumpVtdRegs (mVtdUnitInformation[Num].VtdUnitBaseAddress);
+      DumpVtdRegs (mVtdUnitInformation[Num].VtdUnitBaseAddress);
       DEBUG((DEBUG_INFO, "#### ERROR ####\n\n"));
       //
       // Clear
diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
index 93207ba52..549313dbf 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
@@ -120,13 +120,8 @@ PerpareCacheInvalidationInterface (
   // Enable the queued invalidation interface through the Global Command Register.
   // When enabled, hardware sets the QIES field in the Global Status Register.
   //
-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  Reg32 |= B_GMCD_REG_QIE;
-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));
-  do {
-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  } while ((Reg32 & B_GSTS_REG_QIES) == 0);
+  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));
+  VtdLibSetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
 
   VTdLogAddEvent (VTDLOG_PEI_QUEUED_INVALIDATION, VTD_LOG_QI_ENABLE, VtdUnitBaseAddress);
 
diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
index e1b867973..533fb2b9a 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
@@ -20,6 +20,18 @@
 #include <Ppi/IoMmu.h>
 #include "IntelVTdDmarPei.h"
 
+VOID
+SetGlobalCommandRegisterBits (
+  IN UINTN     VtdUnitBaseAddress,
+  IN UINT32    BitMask
+  );
+
+VOID
+ClearGlobalCommandRegisterBits (
+  IN UINTN     VtdUnitBaseAddress,
+  IN UINT32    BitMask
+  );
+
 /**
   Flush VTD page table and context table memory.
 
@@ -58,6 +70,7 @@ FlushWriteBuffer (
 
   if (CapReg.Bits.RWBF != 0) {
     Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
+    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits
     MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);
     do {
       Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
@@ -104,11 +117,7 @@ PerpareCacheInvalidationInterface (
   Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
   if ((Reg32 & B_GSTS_REG_QIES) != 0) {
     DEBUG ((DEBUG_INFO,"Queued Invalidation Interface was enabled.\n"));
-    Reg32 &= (~B_GSTS_REG_QIES);
-    MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-    do {
-      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-    } while ((Reg32 & B_GSTS_REG_QIES) != 0);
+    ClearGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
     MmioWrite64 (VtdUnitBaseAddress + R_IQA_REG, 0);
   }
 
@@ -144,13 +153,8 @@ PerpareCacheInvalidationInterface (
   // Enable the queued invalidation interface through the Global Command Register.
   // When enabled, hardware sets the QIES field in the Global Status Register.
   //
-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  Reg32 |= B_GMCD_REG_QIE;
-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));
-  do {
-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  } while ((Reg32 & B_GSTS_REG_QIES) == 0);
+  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));
+  SetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
 
   return EFI_SUCCESS;
 }
@@ -165,16 +169,9 @@ DisableQueuedInvalidationInterface (
   IN VTD_UNIT_INFO *VTdUnitInfo
   )
 {
-  UINT32         Reg32;
-
   if (VTdUnitInfo->EnableQueuedInvalidation != 0) {
-    Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);
-    Reg32 &= (~B_GMCD_REG_QIE);
-    MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));
-    do {
-      Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);
-    } while ((Reg32 & B_GSTS_REG_QIES) != 0);
+    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface.\n"));
+    ClearGlobalCommandRegisterBits (VTdUnitInfo->VtdUnitBaseAddress, B_GMCD_REG_QIE);
 
     if (VTdUnitInfo->QiDescBuffer != NULL) {
       FreePages(VTdUnitInfo->QiDescBuffer, EFI_SIZE_TO_PAGES (VTdUnitInfo->QiDescBufferSize));
@@ -206,7 +203,7 @@ QueuedInvalidationCheckFault (
   if (FaultReg & (B_FSTS_REG_IQE | B_FSTS_REG_ITE | B_FSTS_REG_ICE)) {
     IqercdReg.Uint64 = MmioRead64 (VTdUnitInfo->VtdUnitBaseAddress + R_IQERCD_REG);
 
-    DEBUG((DEBUG_ERROR, "Detect Queue Invalidation Error [0x%08x] - IQERCD [0x%016lx]\n", FaultReg, IqercdReg.Uint64));
+    DEBUG((DEBUG_ERROR, "VTD 0x%x Detect Queue Invalidation Error [0x%08x] - IQERCD [0x%016lx]\n", VTdUnitInfo->VtdUnitBaseAddress, FaultReg, IqercdReg.Uint64));
 
     MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_FSTS_REG, FaultReg);
     return RETURN_DEVICE_ERROR;
@@ -763,7 +760,7 @@ EnableVTdTranslationProtection (
 
     if (VtdUnitInfo->ExtRootEntryTable != 0) {
       DEBUG ((DEBUG_INFO, "EnableVtdDmar (%d) ExtRootEntryTable 0x%x\n", Index, VtdUnitInfo->ExtRootEntryTable));
-      Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->ExtRootEntryTable | BIT11);
+      Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->ExtRootEntryTable | BIT11);
     } else {
       DEBUG ((DEBUG_INFO, "EnableVtdDmar (%d) RootEntryTable 0x%x\n", Index, VtdUnitInfo->RootEntryTable));
       Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->RootEntryTable);
diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
index 30dab4a64..2c48eefe9 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
@@ -12,6 +12,18 @@ VTD_UNIT_INFORMATION             *mVtdUnitInformation;
 
 BOOLEAN  mVtdEnabled;
 
+VOID
+SetGlobalCommandRegisterBits (
+  IN UINTN     VtdUnitBaseAddress,
+  IN UINT32    BitMask
+  );
+
+VOID
+ClearGlobalCommandRegisterBits (
+  IN UINTN     VtdUnitBaseAddress,
+  IN UINT32    BitMask
+  );
+
 /**
   Flush VTD page table and context table memory.
 
@@ -47,6 +59,7 @@ FlushWriteBuffer (
 
   if (mVtdUnitInformation[VtdIndex].CapReg.Bits.RWBF != 0) {
     Reg32 = MmioRead32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_GSTS_REG);
+    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits
     MmioWrite32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);
     do {
       Reg32 = MmioRead32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_GSTS_REG);
@@ -93,11 +106,7 @@ PerpareCacheInvalidationInterface (
   Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
   if ((Reg32 & B_GSTS_REG_QIES) != 0) {
     DEBUG ((DEBUG_ERROR,"Queued Invalidation Interface was enabled.\n"));
-    Reg32 &= (~B_GSTS_REG_QIES);
-    MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-    do {
-      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-    } while ((Reg32 & B_GSTS_REG_QIES) != 0);
+    ClearGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
   }
 
   //
@@ -132,13 +141,8 @@ PerpareCacheInvalidationInterface (
   // Enable the queued invalidation interface through the Global Command Register.
   // When enabled, hardware sets the QIES field in the Global Status Register.
   //
-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  Reg32 |= B_GMCD_REG_QIE;
-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));
-  do {
-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  } while ((Reg32 & B_GSTS_REG_QIES) == 0);
+  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));
+  SetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
 
   return EFI_SUCCESS;
 }
@@ -153,19 +157,13 @@ DisableQueuedInvalidationInterface (
   IN UINTN  VtdIndex
   )
 {
-  UINT32                Reg32;
   VTD_UNIT_INFORMATION  *VTdUnitInfo;
 
   VTdUnitInfo = &mVtdUnitInformation[VtdIndex];
 
   if (VTdUnitInfo->EnableQueuedInvalidation != 0) {
-    Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);
-    Reg32 &= (~B_GMCD_REG_QIE);
-    MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));
-    do {
-      Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);
-    } while ((Reg32 & B_GSTS_REG_QIES) != 0);
+    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface.\n"));
+    ClearGlobalCommandRegisterBits (VTdUnitInfo->VtdUnitBaseAddress, B_GMCD_REG_QIE);
 
     if (VTdUnitInfo->QiDescBuffer != NULL) {
       FreePages(VTdUnitInfo->QiDescBuffer, EFI_SIZE_TO_PAGES (VTdUnitInfo->QiDescBufferSize));
@@ -198,7 +196,7 @@ QueuedInvalidationCheckFault (
   if (FaultReg & (B_FSTS_REG_IQE | B_FSTS_REG_ITE | B_FSTS_REG_ICE)) {
     IqercdReg.Uint64 = MmioRead64 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_IQERCD_REG);
 
-    DEBUG((DEBUG_ERROR, "Detect Queue Invalidation Error [0x%08x] - IQERCD [0x%016lx]\n", FaultReg, IqercdReg.Uint64));
+    DEBUG((DEBUG_ERROR, "VTD 0x%x Detect Queue Invalidation Error [0x%08x] - IQERCD [0x%016lx]\n", mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress, FaultReg, IqercdReg.Uint64));
 
     MmioWrite32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_FSTS_REG, FaultReg);
     return RETURN_DEVICE_ERROR;
@@ -802,7 +800,7 @@ DumpVtdCapRegs (
   IN VTD_CAP_REG *CapReg
   )
 {
-  DEBUG((DEBUG_INFO, "  CapReg   - 0x%x\n", CapReg->Uint64));
+  DEBUG((DEBUG_INFO, "  CapReg   - 0x%016lx\n", CapReg->Uint64));
   DEBUG((DEBUG_INFO, "    ND     - 0x%x\n", CapReg->Bits.ND));
   DEBUG((DEBUG_INFO, "    AFL    - 0x%x\n", CapReg->Bits.AFL));
   DEBUG((DEBUG_INFO, "    RWBF   - 0x%x\n", CapReg->Bits.RWBF));
@@ -833,7 +831,7 @@ DumpVtdECapRegs (
   IN VTD_ECAP_REG *ECapReg
   )
 {
-  DEBUG((DEBUG_INFO, "  ECapReg  - 0x%x\n", ECapReg->Uint64));
+  DEBUG((DEBUG_INFO, "  ECapReg  - 0x%016lx\n", ECapReg->Uint64));
   DEBUG((DEBUG_INFO, "    C      - 0x%x\n", ECapReg->Bits.C));
   DEBUG((DEBUG_INFO, "    QI     - 0x%x\n", ECapReg->Bits.QI));
   DEBUG((DEBUG_INFO, "    DT     - 0x%x\n", ECapReg->Bits.DT));
diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
index 2e252fe5b..03b39d183 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
@@ -54,6 +54,7 @@ FlushWriteBuffer (
 
   if (CapReg.Bits.RWBF != 0) {
     Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
+    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits
     MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);
     do {
       Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
diff --git a/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c b/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
index 3e22c3d92..135e740d6 100644
--- a/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
+++ b/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
@@ -1497,6 +1497,7 @@ VtdLibFlushWriteBuffer (
 
   if (CapReg.Bits.RWBF != 0) {
     Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
+    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits
     MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);
     do {
       Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
@@ -1664,7 +1665,6 @@ VtdLibDisableQueuedInvalidationInterface (
   IN UINTN                      VtdUnitBaseAddress
   )
 {
-  UINT32         Reg32;
   QI_256_DESC    QiDesc;
 
   QiDesc.Uint64[0] = QI_IWD_TYPE;
@@ -1674,14 +1674,8 @@ VtdLibDisableQueuedInvalidationInterface (
 
   VtdLibSubmitQueuedInvalidationDescriptor (VtdUnitBaseAddress, &QiDesc, TRUE);
 
-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  Reg32 &= (~B_GMCD_REG_QIE);
-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
-
-  DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. [%x] GCMD_REG = 0x%x\n", VtdUnitBaseAddress, Reg32));
-  do {
-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
-  } while ((Reg32 & B_GSTS_REG_QIES) != 0);
+  DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. [%x]\n", VtdUnitBaseAddress));
+  VtdLibClearGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
 
   MmioWrite64 (VtdUnitBaseAddress + R_IQA_REG, 0);
 }
-- 
2.26.2.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#115617): https://edk2.groups.io/g/devel/message/115617
Mute This Topic: https://groups.io/mt/104461797/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [edk2-devel] [PATCH] IntelSiliconPkg/VTd: Reset the one-shot bits before modifing GCMD_REG
       [not found] <17B574F2916A4457.20004@groups.io>
@ 2024-02-29  7:09 ` Huang, Jenny
  2024-02-29  7:45   ` Sheng Wei
  0 siblings, 1 reply; 3+ messages in thread
From: Huang, Jenny @ 2024-02-29  7:09 UTC (permalink / raw)
  To: devel@edk2.groups.io, Sheng, W; +Cc: Ni, Ray, Chaganty, Rangasai V

Reviewed-by: Jenny Huang <jenny.huang@intel.com>

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Sheng, W
Sent: Monday, February 19, 2024 7:37 PM
To: devel@edk2.groups.io
Cc: Ni, Ray <ray.ni@intel.com>; Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Huang, Jenny <jenny.huang@intel.com>
Subject: [edk2-devel] [PATCH] IntelSiliconPkg/VTd: Reset the one-shot bits before modifing GCMD_REG

Here is the process of modify GCMD_REG.
  Read GSTS_REG
  Reset the one-shot bits.
  Modify the target comamnd value.
  Write the command value to GCMD_REG.
  Wait until GSTS_REG indicates command is serviced.

Cc: Ray Ni <ray.ni@intel.com>
Cc: Rangasai V Chaganty <rangasai.v.chaganty@intel.com>
Cc: Jenny Huang <jenny.huang@intel.com>
Signed-off-by: Sheng Wei <w.sheng@intel.com>
---
 .../Feature/VTd/IntelVTdCoreDxe/VtdReg.c      | 13 ++----
 .../VTd/IntelVTdCorePei/IntelVTdDmar.c        |  9 +---
 .../VTd/IntelVTdDmarPei/IntelVTdDmar.c        | 43 +++++++++---------
 .../Feature/VTd/IntelVTdDxe/VtdReg.c          | 44 +++++++++----------
 .../Feature/VTd/IntelVTdPmrPei/VtdReg.c       |  1 +
 .../IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c     | 12 ++---
 6 files changed, 51 insertions(+), 71 deletions(-)

diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
index edeb4b3ff..21e2d5f1b 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
@@ -112,13 +112,8 @@ PerpareCacheInvalidationInterface (
   // Enable the queued invalidation interface through the Global Command Register.

   // When enabled, hardware sets the QIES field in the Global Status Register.

   //

-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  Reg32 |= B_GMCD_REG_QIE;

-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));

-  do {

-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  } while ((Reg32 & B_GSTS_REG_QIES) == 0);

+  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));

+  VtdLibSetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);

 

   VTdLogAddEvent (VTDLOG_DXE_QUEUED_INVALIDATION, VTD_LOG_QI_ENABLE, VtdUnitBaseAddress);

 

@@ -577,7 +572,7 @@ DumpVtdCapRegs (
   IN VTD_CAP_REG *CapReg

   )

 {

-  DEBUG((DEBUG_INFO, "  CapReg   - 0x%x\n", CapReg->Uint64));

+  DEBUG((DEBUG_INFO, "  CapReg   - 0x%lx\n", CapReg->Uint64));

   DEBUG((DEBUG_INFO, "    ND     - 0x%x\n", CapReg->Bits.ND));

   DEBUG((DEBUG_INFO, "    AFL    - 0x%x\n", CapReg->Bits.AFL));

   DEBUG((DEBUG_INFO, "    RWBF   - 0x%x\n", CapReg->Bits.RWBF));

@@ -737,7 +732,7 @@ DumpVtdIfError (
     if (HasError) {

       REPORT_STATUS_CODE (EFI_ERROR_CODE, PcdGet32 (PcdErrorCodeVTdError));

       DEBUG((DEBUG_INFO, "\n#### ERROR ####\n"));

-      DumpVtdRegs (mVtdUnitInformation[Num].VtdUnitBaseAddress);
+      DumpVtdRegs (mVtdUnitInformation[Num].VtdUnitBaseAddress);

       DEBUG((DEBUG_INFO, "#### ERROR ####\n\n"));

       //

       // Clear

diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
index 93207ba52..549313dbf 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
@@ -120,13 +120,8 @@ PerpareCacheInvalidationInterface (
   // Enable the queued invalidation interface through the Global Command Register.

   // When enabled, hardware sets the QIES field in the Global Status Register.

   //

-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  Reg32 |= B_GMCD_REG_QIE;

-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));

-  do {

-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  } while ((Reg32 & B_GSTS_REG_QIES) == 0);

+  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));

+  VtdLibSetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);

 

   VTdLogAddEvent (VTDLOG_PEI_QUEUED_INVALIDATION, VTD_LOG_QI_ENABLE, VtdUnitBaseAddress);

 

diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
index e1b867973..533fb2b9a 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
@@ -20,6 +20,18 @@
 #include <Ppi/IoMmu.h>

 #include "IntelVTdDmarPei.h"

 

+VOID

+SetGlobalCommandRegisterBits (

+  IN UINTN     VtdUnitBaseAddress,

+  IN UINT32    BitMask

+  );

+

+VOID

+ClearGlobalCommandRegisterBits (

+  IN UINTN     VtdUnitBaseAddress,

+  IN UINT32    BitMask

+  );

+

 /**

   Flush VTD page table and context table memory.

 

@@ -58,6 +70,7 @@ FlushWriteBuffer (
 

   if (CapReg.Bits.RWBF != 0) {

     Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

+    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits

     MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);

     do {

       Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

@@ -104,11 +117,7 @@ PerpareCacheInvalidationInterface (
   Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

   if ((Reg32 & B_GSTS_REG_QIES) != 0) {

     DEBUG ((DEBUG_INFO,"Queued Invalidation Interface was enabled.\n"));

-    Reg32 &= (~B_GSTS_REG_QIES);

-    MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-    do {

-      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-    } while ((Reg32 & B_GSTS_REG_QIES) != 0);

+    ClearGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);

     MmioWrite64 (VtdUnitBaseAddress + R_IQA_REG, 0);

   }

 

@@ -144,13 +153,8 @@ PerpareCacheInvalidationInterface (
   // Enable the queued invalidation interface through the Global Command Register.

   // When enabled, hardware sets the QIES field in the Global Status Register.

   //

-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  Reg32 |= B_GMCD_REG_QIE;

-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));

-  do {

-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  } while ((Reg32 & B_GSTS_REG_QIES) == 0);

+  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));

+  SetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);

 

   return EFI_SUCCESS;

 }

@@ -165,16 +169,9 @@ DisableQueuedInvalidationInterface (
   IN VTD_UNIT_INFO *VTdUnitInfo

   )

 {

-  UINT32         Reg32;

-

   if (VTdUnitInfo->EnableQueuedInvalidation != 0) {

-    Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);

-    Reg32 &= (~B_GMCD_REG_QIE);

-    MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));

-    do {

-      Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);

-    } while ((Reg32 & B_GSTS_REG_QIES) != 0);

+    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface.\n"));

+    ClearGlobalCommandRegisterBits (VTdUnitInfo->VtdUnitBaseAddress, B_GMCD_REG_QIE);

 

     if (VTdUnitInfo->QiDescBuffer != NULL) {

       FreePages(VTdUnitInfo->QiDescBuffer, EFI_SIZE_TO_PAGES (VTdUnitInfo->QiDescBufferSize));

@@ -206,7 +203,7 @@ QueuedInvalidationCheckFault (
   if (FaultReg & (B_FSTS_REG_IQE | B_FSTS_REG_ITE | B_FSTS_REG_ICE)) {

     IqercdReg.Uint64 = MmioRead64 (VTdUnitInfo->VtdUnitBaseAddress + R_IQERCD_REG);

 

-    DEBUG((DEBUG_ERROR, "Detect Queue Invalidation Error [0x%08x] - IQERCD [0x%016lx]\n", FaultReg, IqercdReg.Uint64));

+    DEBUG((DEBUG_ERROR, "VTD 0x%x Detect Queue Invalidation Error [0x%08x] - IQERCD [0x%016lx]\n", VTdUnitInfo->VtdUnitBaseAddress, FaultReg, IqercdReg.Uint64));

 

     MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_FSTS_REG, FaultReg);

     return RETURN_DEVICE_ERROR;

@@ -763,7 +760,7 @@ EnableVTdTranslationProtection (
 

     if (VtdUnitInfo->ExtRootEntryTable != 0) {

       DEBUG ((DEBUG_INFO, "EnableVtdDmar (%d) ExtRootEntryTable 0x%x\n", Index, VtdUnitInfo->ExtRootEntryTable));

-      Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->ExtRootEntryTable | BIT11);
+      Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->ExtRootEntryTable | BIT11);

     } else {

       DEBUG ((DEBUG_INFO, "EnableVtdDmar (%d) RootEntryTable 0x%x\n", Index, VtdUnitInfo->RootEntryTable));

       Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->RootEntryTable);

diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
index 30dab4a64..2c48eefe9 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
@@ -12,6 +12,18 @@ VTD_UNIT_INFORMATION             *mVtdUnitInformation;
 

 BOOLEAN  mVtdEnabled;

 

+VOID

+SetGlobalCommandRegisterBits (

+  IN UINTN     VtdUnitBaseAddress,

+  IN UINT32    BitMask

+  );

+

+VOID

+ClearGlobalCommandRegisterBits (

+  IN UINTN     VtdUnitBaseAddress,

+  IN UINT32    BitMask

+  );

+

 /**

   Flush VTD page table and context table memory.

 

@@ -47,6 +59,7 @@ FlushWriteBuffer (
 

   if (mVtdUnitInformation[VtdIndex].CapReg.Bits.RWBF != 0) {

     Reg32 = MmioRead32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_GSTS_REG);

+    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits

     MmioWrite32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);

     do {

       Reg32 = MmioRead32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_GSTS_REG);

@@ -93,11 +106,7 @@ PerpareCacheInvalidationInterface (
   Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

   if ((Reg32 & B_GSTS_REG_QIES) != 0) {

     DEBUG ((DEBUG_ERROR,"Queued Invalidation Interface was enabled.\n"));

-    Reg32 &= (~B_GSTS_REG_QIES);

-    MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-    do {

-      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-    } while ((Reg32 & B_GSTS_REG_QIES) != 0);

+    ClearGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);

   }

 

   //

@@ -132,13 +141,8 @@ PerpareCacheInvalidationInterface (
   // Enable the queued invalidation interface through the Global Command Register.

   // When enabled, hardware sets the QIES field in the Global Status Register.

   //

-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  Reg32 |= B_GMCD_REG_QIE;

-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));

-  do {

-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  } while ((Reg32 & B_GSTS_REG_QIES) == 0);

+  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));

+  SetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);

 

   return EFI_SUCCESS;

 }

@@ -153,19 +157,13 @@ DisableQueuedInvalidationInterface (
   IN UINTN  VtdIndex

   )

 {

-  UINT32                Reg32;

   VTD_UNIT_INFORMATION  *VTdUnitInfo;

 

   VTdUnitInfo = &mVtdUnitInformation[VtdIndex];

 

   if (VTdUnitInfo->EnableQueuedInvalidation != 0) {

-    Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);

-    Reg32 &= (~B_GMCD_REG_QIE);

-    MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. GCMD_REG = 0x%x\n", Reg32));

-    do {

-      Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);

-    } while ((Reg32 & B_GSTS_REG_QIES) != 0);

+    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface.\n"));

+    ClearGlobalCommandRegisterBits (VTdUnitInfo->VtdUnitBaseAddress, B_GMCD_REG_QIE);

 

     if (VTdUnitInfo->QiDescBuffer != NULL) {

       FreePages(VTdUnitInfo->QiDescBuffer, EFI_SIZE_TO_PAGES (VTdUnitInfo->QiDescBufferSize));

@@ -198,7 +196,7 @@ QueuedInvalidationCheckFault (
   if (FaultReg & (B_FSTS_REG_IQE | B_FSTS_REG_ITE | B_FSTS_REG_ICE)) {

     IqercdReg.Uint64 = MmioRead64 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_IQERCD_REG);

 

-    DEBUG((DEBUG_ERROR, "Detect Queue Invalidation Error [0x%08x] - IQERCD [0x%016lx]\n", FaultReg, IqercdReg.Uint64));

+    DEBUG((DEBUG_ERROR, "VTD 0x%x Detect Queue Invalidation Error [0x%08x] - IQERCD [0x%016lx]\n", mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress, FaultReg, IqercdReg.Uint64));

 

     MmioWrite32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_FSTS_REG, FaultReg);

     return RETURN_DEVICE_ERROR;

@@ -802,7 +800,7 @@ DumpVtdCapRegs (
   IN VTD_CAP_REG *CapReg

   )

 {

-  DEBUG((DEBUG_INFO, "  CapReg   - 0x%x\n", CapReg->Uint64));

+  DEBUG((DEBUG_INFO, "  CapReg   - 0x%016lx\n", CapReg->Uint64));

   DEBUG((DEBUG_INFO, "    ND     - 0x%x\n", CapReg->Bits.ND));

   DEBUG((DEBUG_INFO, "    AFL    - 0x%x\n", CapReg->Bits.AFL));

   DEBUG((DEBUG_INFO, "    RWBF   - 0x%x\n", CapReg->Bits.RWBF));

@@ -833,7 +831,7 @@ DumpVtdECapRegs (
   IN VTD_ECAP_REG *ECapReg

   )

 {

-  DEBUG((DEBUG_INFO, "  ECapReg  - 0x%x\n", ECapReg->Uint64));

+  DEBUG((DEBUG_INFO, "  ECapReg  - 0x%016lx\n", ECapReg->Uint64));

   DEBUG((DEBUG_INFO, "    C      - 0x%x\n", ECapReg->Bits.C));

   DEBUG((DEBUG_INFO, "    QI     - 0x%x\n", ECapReg->Bits.QI));

   DEBUG((DEBUG_INFO, "    DT     - 0x%x\n", ECapReg->Bits.DT));

diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
index 2e252fe5b..03b39d183 100644
--- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
+++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
@@ -54,6 +54,7 @@ FlushWriteBuffer (
 

   if (CapReg.Bits.RWBF != 0) {

     Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

+    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits

     MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);

     do {

       Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

diff --git a/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c b/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
index 3e22c3d92..135e740d6 100644
--- a/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
+++ b/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
@@ -1497,6 +1497,7 @@ VtdLibFlushWriteBuffer (
 

   if (CapReg.Bits.RWBF != 0) {

     Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

+    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits

     MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);

     do {

       Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

@@ -1664,7 +1665,6 @@ VtdLibDisableQueuedInvalidationInterface (
   IN UINTN                      VtdUnitBaseAddress

   )

 {

-  UINT32         Reg32;

   QI_256_DESC    QiDesc;

 

   QiDesc.Uint64[0] = QI_IWD_TYPE;

@@ -1674,14 +1674,8 @@ VtdLibDisableQueuedInvalidationInterface (
 

   VtdLibSubmitQueuedInvalidationDescriptor (VtdUnitBaseAddress, &QiDesc, TRUE);

 

-  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  Reg32 &= (~B_GMCD_REG_QIE);

-  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);

-

-  DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. [%x] GCMD_REG = 0x%x\n", VtdUnitBaseAddress, Reg32));

-  do {

-    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);

-  } while ((Reg32 & B_GSTS_REG_QIES) != 0);

+  DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. [%x]\n", VtdUnitBaseAddress));

+  VtdLibClearGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);

 

   MmioWrite64 (VtdUnitBaseAddress + R_IQA_REG, 0);

 }

-- 
2.26.2.windows.1



-=-=-=-=-=-=
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#115617): https://edk2.groups.io/g/devel/message/115617
Mute This Topic: https://groups.io/mt/104461797/2558558
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [w.sheng@intel.com]
-=-=-=-=-=-=




-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116134): https://edk2.groups.io/g/devel/message/116134
Mute This Topic: https://groups.io/mt/104461797/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [edk2-devel] [PATCH] IntelSiliconPkg/VTd: Reset the one-shot bits before modifing GCMD_REG
  2024-02-29  7:09 ` [edk2-devel] [PATCH] IntelSiliconPkg/VTd: Reset the one-shot bits before modifing GCMD_REG Huang, Jenny
@ 2024-02-29  7:45   ` Sheng Wei
  0 siblings, 0 replies; 3+ messages in thread
From: Sheng Wei @ 2024-02-29  7:45 UTC (permalink / raw)
  To: Ni, Ray, devel@edk2.groups.io; +Cc: Chaganty, Rangasai V, Huang, Jenny

Hi Ray,
Could you help to review and merge this Vtd driver patch to edk2platforms branch?
This patch is used to fix a bug about missing to mask one-shot bits when write VTD GCMD_REG register.
Here is the PR of this patch.
https://github.com/tianocore/edk2-platforms/pull/125
Thank you.
BR
Sheng Wei

> -----Original Message-----
> From: Huang, Jenny <jenny.huang@intel.com>
> Sent: Thursday, February 29, 2024 3:10 PM
> To: devel@edk2.groups.io; Sheng, W <w.sheng@intel.com>
> Cc: Ni, Ray <ray.ni@intel.com>; Chaganty, Rangasai V
> <rangasai.v.chaganty@intel.com>
> Subject: RE: [edk2-devel] [PATCH] IntelSiliconPkg/VTd: Reset the one-shot bits
> before modifing GCMD_REG
> 
> Reviewed-by: Jenny Huang <jenny.huang@intel.com>
> 
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Sheng, W
> Sent: Monday, February 19, 2024 7:37 PM
> To: devel@edk2.groups.io
> Cc: Ni, Ray <ray.ni@intel.com>; Chaganty, Rangasai V
> <rangasai.v.chaganty@intel.com>; Huang, Jenny <jenny.huang@intel.com>
> Subject: [edk2-devel] [PATCH] IntelSiliconPkg/VTd: Reset the one-shot bits
> before modifing GCMD_REG
> 
> Here is the process of modify GCMD_REG.
>   Read GSTS_REG
>   Reset the one-shot bits.
>   Modify the target comamnd value.
>   Write the command value to GCMD_REG.
>   Wait until GSTS_REG indicates command is serviced.
> 
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Rangasai V Chaganty <rangasai.v.chaganty@intel.com>
> Cc: Jenny Huang <jenny.huang@intel.com>
> Signed-off-by: Sheng Wei <w.sheng@intel.com>
> ---
>  .../Feature/VTd/IntelVTdCoreDxe/VtdReg.c      | 13 ++----
>  .../VTd/IntelVTdCorePei/IntelVTdDmar.c        |  9 +---
>  .../VTd/IntelVTdDmarPei/IntelVTdDmar.c        | 43 +++++++++---------
>  .../Feature/VTd/IntelVTdDxe/VtdReg.c          | 44 +++++++++----------
>  .../Feature/VTd/IntelVTdPmrPei/VtdReg.c       |  1 +
>  .../IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c     | 12 ++---
>  6 files changed, 51 insertions(+), 71 deletions(-)
> 
> diff --git
> a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
> index edeb4b3ff..21e2d5f1b 100644
> --- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
> +++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCoreDxe/VtdReg.c
> @@ -112,13 +112,8 @@ PerpareCacheInvalidationInterface (
>    // Enable the queued invalidation interface through the Global Command
> Register.
> 
>    // When enabled, hardware sets the QIES field in the Global Status Register.
> 
>    //
> 
> -  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  Reg32 |= B_GMCD_REG_QIE;
> 
> -  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
> 
> -  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG =
> 0x%x\n", Reg32));
> 
> -  do {
> 
> -    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  } while ((Reg32 & B_GSTS_REG_QIES) == 0);
> 
> +  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));
> 
> +  VtdLibSetGlobalCommandRegisterBits (VtdUnitBaseAddress,
> B_GMCD_REG_QIE);
> 
> 
> 
>    VTdLogAddEvent (VTDLOG_DXE_QUEUED_INVALIDATION,
> VTD_LOG_QI_ENABLE, VtdUnitBaseAddress);
> 
> 
> 
> @@ -577,7 +572,7 @@ DumpVtdCapRegs (
>    IN VTD_CAP_REG *CapReg
> 
>    )
> 
>  {
> 
> -  DEBUG((DEBUG_INFO, "  CapReg   - 0x%x\n", CapReg->Uint64));
> 
> +  DEBUG((DEBUG_INFO, "  CapReg   - 0x%lx\n", CapReg->Uint64));
> 
>    DEBUG((DEBUG_INFO, "    ND     - 0x%x\n", CapReg->Bits.ND));
> 
>    DEBUG((DEBUG_INFO, "    AFL    - 0x%x\n", CapReg->Bits.AFL));
> 
>    DEBUG((DEBUG_INFO, "    RWBF   - 0x%x\n", CapReg->Bits.RWBF));
> 
> @@ -737,7 +732,7 @@ DumpVtdIfError (
>      if (HasError) {
> 
>        REPORT_STATUS_CODE (EFI_ERROR_CODE, PcdGet32
> (PcdErrorCodeVTdError));
> 
>        DEBUG((DEBUG_INFO, "\n#### ERROR ####\n"));
> 
> -      DumpVtdRegs (mVtdUnitInformation[Num].VtdUnitBaseAddress);
> +      DumpVtdRegs (mVtdUnitInformation[Num].VtdUnitBaseAddress);
> 
>        DEBUG((DEBUG_INFO, "#### ERROR ####\n\n"));
> 
>        //
> 
>        // Clear
> 
> diff --git
> a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
> index 93207ba52..549313dbf 100644
> ---
> a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
> +++
> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdCorePei/IntelVTdDmar.c
> @@ -120,13 +120,8 @@ PerpareCacheInvalidationInterface (
>    // Enable the queued invalidation interface through the Global Command
> Register.
> 
>    // When enabled, hardware sets the QIES field in the Global Status Register.
> 
>    //
> 
> -  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  Reg32 |= B_GMCD_REG_QIE;
> 
> -  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
> 
> -  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG =
> 0x%x\n", Reg32));
> 
> -  do {
> 
> -    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  } while ((Reg32 & B_GSTS_REG_QIES) == 0);
> 
> +  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));
> 
> +  VtdLibSetGlobalCommandRegisterBits (VtdUnitBaseAddress,
> B_GMCD_REG_QIE);
> 
> 
> 
>    VTdLogAddEvent (VTDLOG_PEI_QUEUED_INVALIDATION,
> VTD_LOG_QI_ENABLE, VtdUnitBaseAddress);
> 
> 
> 
> diff --git
> a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
> index e1b867973..533fb2b9a 100644
> ---
> a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
> +++
> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDmarPei/IntelVTdDmar.c
> @@ -20,6 +20,18 @@
>  #include <Ppi/IoMmu.h>
> 
>  #include "IntelVTdDmarPei.h"
> 
> 
> 
> +VOID
> 
> +SetGlobalCommandRegisterBits (
> 
> +  IN UINTN     VtdUnitBaseAddress,
> 
> +  IN UINT32    BitMask
> 
> +  );
> 
> +
> 
> +VOID
> 
> +ClearGlobalCommandRegisterBits (
> 
> +  IN UINTN     VtdUnitBaseAddress,
> 
> +  IN UINT32    BitMask
> 
> +  );
> 
> +
> 
>  /**
> 
>    Flush VTD page table and context table memory.
> 
> 
> 
> @@ -58,6 +70,7 @@ FlushWriteBuffer (
> 
> 
>    if (CapReg.Bits.RWBF != 0) {
> 
>      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> +    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits
> 
>      MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 |
> B_GMCD_REG_WBF);
> 
>      do {
> 
>        Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> @@ -104,11 +117,7 @@ PerpareCacheInvalidationInterface (
>    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
>    if ((Reg32 & B_GSTS_REG_QIES) != 0) {
> 
>      DEBUG ((DEBUG_INFO,"Queued Invalidation Interface was enabled.\n"));
> 
> -    Reg32 &= (~B_GSTS_REG_QIES);
> 
> -    MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
> 
> -    do {
> 
> -      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -    } while ((Reg32 & B_GSTS_REG_QIES) != 0);
> 
> +    ClearGlobalCommandRegisterBits (VtdUnitBaseAddress,
> B_GMCD_REG_QIE);
> 
>      MmioWrite64 (VtdUnitBaseAddress + R_IQA_REG, 0);
> 
>    }
> 
> 
> 
> @@ -144,13 +153,8 @@ PerpareCacheInvalidationInterface (
>    // Enable the queued invalidation interface through the Global Command
> Register.
> 
>    // When enabled, hardware sets the QIES field in the Global Status Register.
> 
>    //
> 
> -  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  Reg32 |= B_GMCD_REG_QIE;
> 
> -  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
> 
> -  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG =
> 0x%x\n", Reg32));
> 
> -  do {
> 
> -    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  } while ((Reg32 & B_GSTS_REG_QIES) == 0);
> 
> +  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));
> 
> +  SetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
> 
> 
> 
>    return EFI_SUCCESS;
> 
>  }
> 
> @@ -165,16 +169,9 @@ DisableQueuedInvalidationInterface (
>    IN VTD_UNIT_INFO *VTdUnitInfo
> 
>    )
> 
>  {
> 
> -  UINT32         Reg32;
> 
> -
> 
>    if (VTdUnitInfo->EnableQueuedInvalidation != 0) {
> 
> -    Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);
> 
> -    Reg32 &= (~B_GMCD_REG_QIE);
> 
> -    MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_GCMD_REG,
> Reg32);
> 
> -    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. GCMD_REG
> = 0x%x\n", Reg32));
> 
> -    do {
> 
> -      Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress +
> R_GSTS_REG);
> 
> -    } while ((Reg32 & B_GSTS_REG_QIES) != 0);
> 
> +    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface.\n"));
> 
> +    ClearGlobalCommandRegisterBits (VTdUnitInfo->VtdUnitBaseAddress,
> B_GMCD_REG_QIE);
> 
> 
> 
>      if (VTdUnitInfo->QiDescBuffer != NULL) {
> 
>        FreePages(VTdUnitInfo->QiDescBuffer, EFI_SIZE_TO_PAGES (VTdUnitInfo-
> >QiDescBufferSize));
> 
> @@ -206,7 +203,7 @@ QueuedInvalidationCheckFault (
>    if (FaultReg & (B_FSTS_REG_IQE | B_FSTS_REG_ITE | B_FSTS_REG_ICE)) {
> 
>      IqercdReg.Uint64 = MmioRead64 (VTdUnitInfo->VtdUnitBaseAddress +
> R_IQERCD_REG);
> 
> 
> 
> -    DEBUG((DEBUG_ERROR, "Detect Queue Invalidation Error [0x%08x] -
> IQERCD [0x%016lx]\n", FaultReg, IqercdReg.Uint64));
> 
> +    DEBUG((DEBUG_ERROR, "VTD 0x%x Detect Queue Invalidation Error
> [0x%08x] - IQERCD [0x%016lx]\n", VTdUnitInfo->VtdUnitBaseAddress,
> FaultReg, IqercdReg.Uint64));
> 
> 
> 
>      MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_FSTS_REG,
> FaultReg);
> 
>      return RETURN_DEVICE_ERROR;
> 
> @@ -763,7 +760,7 @@ EnableVTdTranslationProtection (
> 
> 
>      if (VtdUnitInfo->ExtRootEntryTable != 0) {
> 
>        DEBUG ((DEBUG_INFO, "EnableVtdDmar (%d) ExtRootEntryTable 0x%x\n",
> Index, VtdUnitInfo->ExtRootEntryTable));
> 
> -      Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->ExtRootEntryTable |
> BIT11);
> +      Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->ExtRootEntryTable |
> BIT11);
> 
>      } else {
> 
>        DEBUG ((DEBUG_INFO, "EnableVtdDmar (%d) RootEntryTable 0x%x\n",
> Index, VtdUnitInfo->RootEntryTable));
> 
>        Status = EnableDmar (VtdUnitInfo, VtdUnitInfo->RootEntryTable);
> 
> diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
> index 30dab4a64..2c48eefe9 100644
> --- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
> +++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c
> @@ -12,6 +12,18 @@ VTD_UNIT_INFORMATION
> *mVtdUnitInformation;
> 
> 
>  BOOLEAN  mVtdEnabled;
> 
> 
> 
> +VOID
> 
> +SetGlobalCommandRegisterBits (
> 
> +  IN UINTN     VtdUnitBaseAddress,
> 
> +  IN UINT32    BitMask
> 
> +  );
> 
> +
> 
> +VOID
> 
> +ClearGlobalCommandRegisterBits (
> 
> +  IN UINTN     VtdUnitBaseAddress,
> 
> +  IN UINT32    BitMask
> 
> +  );
> 
> +
> 
>  /**
> 
>    Flush VTD page table and context table memory.
> 
> 
> 
> @@ -47,6 +59,7 @@ FlushWriteBuffer (
> 
> 
>    if (mVtdUnitInformation[VtdIndex].CapReg.Bits.RWBF != 0) {
> 
>      Reg32 = MmioRead32
> (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_GSTS_REG);
> 
> +    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits
> 
>      MmioWrite32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress +
> R_GCMD_REG, Reg32 | B_GMCD_REG_WBF);
> 
>      do {
> 
>        Reg32 = MmioRead32
> (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_GSTS_REG);
> 
> @@ -93,11 +106,7 @@ PerpareCacheInvalidationInterface (
>    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
>    if ((Reg32 & B_GSTS_REG_QIES) != 0) {
> 
>      DEBUG ((DEBUG_ERROR,"Queued Invalidation Interface was enabled.\n"));
> 
> -    Reg32 &= (~B_GSTS_REG_QIES);
> 
> -    MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
> 
> -    do {
> 
> -      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -    } while ((Reg32 & B_GSTS_REG_QIES) != 0);
> 
> +    ClearGlobalCommandRegisterBits (VtdUnitBaseAddress,
> B_GMCD_REG_QIE);
> 
>    }
> 
> 
> 
>    //
> 
> @@ -132,13 +141,8 @@ PerpareCacheInvalidationInterface (
>    // Enable the queued invalidation interface through the Global Command
> Register.
> 
>    // When enabled, hardware sets the QIES field in the Global Status Register.
> 
>    //
> 
> -  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  Reg32 |= B_GMCD_REG_QIE;
> 
> -  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
> 
> -  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface. GCMD_REG =
> 0x%x\n", Reg32));
> 
> -  do {
> 
> -    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  } while ((Reg32 & B_GSTS_REG_QIES) == 0);
> 
> +  DEBUG ((DEBUG_INFO, "Enable Queued Invalidation Interface.\n"));
> 
> +  SetGlobalCommandRegisterBits (VtdUnitBaseAddress, B_GMCD_REG_QIE);
> 
> 
> 
>    return EFI_SUCCESS;
> 
>  }
> 
> @@ -153,19 +157,13 @@ DisableQueuedInvalidationInterface (
>    IN UINTN  VtdIndex
> 
>    )
> 
>  {
> 
> -  UINT32                Reg32;
> 
>    VTD_UNIT_INFORMATION  *VTdUnitInfo;
> 
> 
> 
>    VTdUnitInfo = &mVtdUnitInformation[VtdIndex];
> 
> 
> 
>    if (VTdUnitInfo->EnableQueuedInvalidation != 0) {
> 
> -    Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress + R_GSTS_REG);
> 
> -    Reg32 &= (~B_GMCD_REG_QIE);
> 
> -    MmioWrite32 (VTdUnitInfo->VtdUnitBaseAddress + R_GCMD_REG,
> Reg32);
> 
> -    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. GCMD_REG
> = 0x%x\n", Reg32));
> 
> -    do {
> 
> -      Reg32 = MmioRead32 (VTdUnitInfo->VtdUnitBaseAddress +
> R_GSTS_REG);
> 
> -    } while ((Reg32 & B_GSTS_REG_QIES) != 0);
> 
> +    DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface.\n"));
> 
> +    ClearGlobalCommandRegisterBits (VTdUnitInfo->VtdUnitBaseAddress,
> B_GMCD_REG_QIE);
> 
> 
> 
>      if (VTdUnitInfo->QiDescBuffer != NULL) {
> 
>        FreePages(VTdUnitInfo->QiDescBuffer, EFI_SIZE_TO_PAGES (VTdUnitInfo-
> >QiDescBufferSize));
> 
> @@ -198,7 +196,7 @@ QueuedInvalidationCheckFault (
>    if (FaultReg & (B_FSTS_REG_IQE | B_FSTS_REG_ITE | B_FSTS_REG_ICE)) {
> 
>      IqercdReg.Uint64 = MmioRead64
> (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress + R_IQERCD_REG);
> 
> 
> 
> -    DEBUG((DEBUG_ERROR, "Detect Queue Invalidation Error [0x%08x] -
> IQERCD [0x%016lx]\n", FaultReg, IqercdReg.Uint64));
> 
> +    DEBUG((DEBUG_ERROR, "VTD 0x%x Detect Queue Invalidation Error
> [0x%08x] - IQERCD [0x%016lx]\n",
> mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress, FaultReg,
> IqercdReg.Uint64));
> 
> 
> 
>      MmioWrite32 (mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress +
> R_FSTS_REG, FaultReg);
> 
>      return RETURN_DEVICE_ERROR;
> 
> @@ -802,7 +800,7 @@ DumpVtdCapRegs (
>    IN VTD_CAP_REG *CapReg
> 
>    )
> 
>  {
> 
> -  DEBUG((DEBUG_INFO, "  CapReg   - 0x%x\n", CapReg->Uint64));
> 
> +  DEBUG((DEBUG_INFO, "  CapReg   - 0x%016lx\n", CapReg->Uint64));
> 
>    DEBUG((DEBUG_INFO, "    ND     - 0x%x\n", CapReg->Bits.ND));
> 
>    DEBUG((DEBUG_INFO, "    AFL    - 0x%x\n", CapReg->Bits.AFL));
> 
>    DEBUG((DEBUG_INFO, "    RWBF   - 0x%x\n", CapReg->Bits.RWBF));
> 
> @@ -833,7 +831,7 @@ DumpVtdECapRegs (
>    IN VTD_ECAP_REG *ECapReg
> 
>    )
> 
>  {
> 
> -  DEBUG((DEBUG_INFO, "  ECapReg  - 0x%x\n", ECapReg->Uint64));
> 
> +  DEBUG((DEBUG_INFO, "  ECapReg  - 0x%016lx\n", ECapReg->Uint64));
> 
>    DEBUG((DEBUG_INFO, "    C      - 0x%x\n", ECapReg->Bits.C));
> 
>    DEBUG((DEBUG_INFO, "    QI     - 0x%x\n", ECapReg->Bits.QI));
> 
>    DEBUG((DEBUG_INFO, "    DT     - 0x%x\n", ECapReg->Bits.DT));
> 
> diff --git a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
> index 2e252fe5b..03b39d183 100644
> --- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
> +++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/VtdReg.c
> @@ -54,6 +54,7 @@ FlushWriteBuffer (
> 
> 
>    if (CapReg.Bits.RWBF != 0) {
> 
>      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> +    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits
> 
>      MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 |
> B_GMCD_REG_WBF);
> 
>      do {
> 
>        Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> diff --git
> a/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
> b/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
> index 3e22c3d92..135e740d6 100644
> ---
> a/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
> +++
> b/Silicon/Intel/IntelSiliconPkg/Library/IntelVTdPeiDxeLib/IntelVTdPeiDxeLib.c
> @@ -1497,6 +1497,7 @@ VtdLibFlushWriteBuffer (
> 
> 
>    if (CapReg.Bits.RWBF != 0) {
> 
>      Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> +    Reg32 = (Reg32 & 0x96FFFFFF);       // Reset the one-shot bits
> 
>      MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32 |
> B_GMCD_REG_WBF);
> 
>      do {
> 
>        Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> @@ -1664,7 +1665,6 @@ VtdLibDisableQueuedInvalidationInterface (
>    IN UINTN                      VtdUnitBaseAddress
> 
>    )
> 
>  {
> 
> -  UINT32         Reg32;
> 
>    QI_256_DESC    QiDesc;
> 
> 
> 
>    QiDesc.Uint64[0] = QI_IWD_TYPE;
> 
> @@ -1674,14 +1674,8 @@ VtdLibDisableQueuedInvalidationInterface (
> 
> 
>    VtdLibSubmitQueuedInvalidationDescriptor (VtdUnitBaseAddress, &QiDesc,
> TRUE);
> 
> 
> 
> -  Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  Reg32 &= (~B_GMCD_REG_QIE);
> 
> -  MmioWrite32 (VtdUnitBaseAddress + R_GCMD_REG, Reg32);
> 
> -
> 
> -  DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. [%x]
> GCMD_REG = 0x%x\n", VtdUnitBaseAddress, Reg32));
> 
> -  do {
> 
> -    Reg32 = MmioRead32 (VtdUnitBaseAddress + R_GSTS_REG);
> 
> -  } while ((Reg32 & B_GSTS_REG_QIES) != 0);
> 
> +  DEBUG ((DEBUG_INFO, "Disable Queued Invalidation Interface. [%x]\n",
> VtdUnitBaseAddress));
> 
> +  VtdLibClearGlobalCommandRegisterBits (VtdUnitBaseAddress,
> B_GMCD_REG_QIE);
> 
> 
> 
>    MmioWrite64 (VtdUnitBaseAddress + R_IQA_REG, 0);
> 
>  }
> 
> --
> 2.26.2.windows.1
> 
> 
> 
> -=-=-=-=-=-=
> Groups.io Links: You receive all messages sent to this group.
> View/Reply Online (#115617):
> https://edk2.groups.io/g/devel/message/115617
> Mute This Topic: https://groups.io/mt/104461797/2558558
> Group Owner: devel+owner@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [w.sheng@intel.com]
> -=-=-=-=-=-=
> 



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116136): https://edk2.groups.io/g/devel/message/116136
Mute This Topic: https://groups.io/mt/104461797/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-02-29  7:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <17B574F2916A4457.20004@groups.io>
2024-02-29  7:09 ` [edk2-devel] [PATCH] IntelSiliconPkg/VTd: Reset the one-shot bits before modifing GCMD_REG Huang, Jenny
2024-02-29  7:45   ` Sheng Wei
2024-02-20  3:36 Sheng Wei

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox