]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test Then Write" Macros.
[mirror_edk2.git] / UefiCpuPkg / Include / Library / RegisterCpuFeaturesLib.h
index e420e7f075fed9fbd1c72864943d3fd89970ab03..5bd464b32e2e2bc0175a867cf4cebc8f4c6ba411 100644 (file)
@@ -348,6 +348,32 @@ CpuRegisterTableWrite (
   IN UINT64              Value\r
   );\r
 \r
+/**\r
+  Adds an entry in specified register table.\r
+\r
+  This function adds an entry in specified register table, with given register type,\r
+  register index, bit section and value.\r
+\r
+  Driver will  test the current value before setting new value.\r
+\r
+  @param[in]  ProcessorNumber  The index of the CPU to add a register table entry\r
+  @param[in]  RegisterType     Type of the register to program\r
+  @param[in]  Index            Index of the register to program\r
+  @param[in]  ValueMask        Mask of bits in register to write\r
+  @param[in]  Value            Value to write\r
+\r
+  @note This service could be called by BSP only.\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuRegisterTableTestThenWrite (\r
+  IN UINTN               ProcessorNumber,\r
+  IN REGISTER_TYPE       RegisterType,\r
+  IN UINT64              Index,\r
+  IN UINT64              ValueMask,\r
+  IN UINT64              Value\r
+  );\r
+\r
 /**\r
   Adds an entry in specified Pre-SMM register table.\r
 \r
@@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite (
     CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index, MAX_UINT32, Value);  \\r
   } while(FALSE);\r
 \r
+/**\r
+  Adds a 32-bit register write entry in specified register table.\r
+\r
+  This macro adds an entry in specified register table, with given register type,\r
+  register index, and value.\r
+\r
+  Driver will  test the current value before setting new value.\r
+\r
+  @param[in]  ProcessorNumber  The index of the CPU to add a register table entry.\r
+  @param[in]  RegisterType     Type of the register to program\r
+  @param[in]  Index            Index of the register to program\r
+  @param[in]  Value            Value to write\r
+\r
+  @note This service could be called by BSP only.\r
+**/\r
+#define CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber, RegisterType, Index, Value)     \\r
+  do {                                                                                        \\r
+    CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType, Index, MAX_UINT32, Value);  \\r
+  } while(FALSE);\r
+\r
 /**\r
   Adds a 64-bit register write entry in specified register table.\r
 \r
@@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite (
     CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index, MAX_UINT64, Value);  \\r
   } while(FALSE);\r
 \r
+/**\r
+  Adds a 64-bit register write entry in specified register table.\r
+\r
+  This macro adds an entry in specified register table, with given register type,\r
+  register index, and value.\r
+\r
+  Driver will  test the current value before setting new value.\r
+\r
+  @param[in]  ProcessorNumber  The index of the CPU to add a register table entry.\r
+  @param[in]  RegisterType     Type of the register to program\r
+  @param[in]  Index            Index of the register to program\r
+  @param[in]  Value            Value to write\r
+\r
+  @note This service could be called by BSP only.\r
+**/\r
+#define CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber, RegisterType, Index, Value)     \\r
+  do {                                                                                        \\r
+    CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType, Index, MAX_UINT64, Value);  \\r
+  } while(FALSE);\r
+\r
 /**\r
   Adds a bit field write entry in specified register table.\r
 \r
@@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite (
     CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index, ~ValueMask, Value);             \\r
   } while(FALSE);\r
 \r
+/**\r
+  Adds a bit field write entry in specified register table.\r
+\r
+  This macro adds an entry in specified register table, with given register type,\r
+  register index, bit field section, and value.\r
+\r
+  Driver will  test the current value before setting new value.\r
+\r
+  @param[in]  ProcessorNumber  The index of the CPU to add a register table entry.\r
+  @param[in]  RegisterType     Type of the register to program.\r
+  @param[in]  Index            Index of the register to program.\r
+  @param[in]  Type             The data type name of a register structure.\r
+  @param[in]  Field            The bit fiel name in register structure to write.\r
+  @param[in]  Value            Value to write to the bit field.\r
+\r
+  @note This service could be called by BSP only.\r
+**/\r
+#define CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber, RegisterType, Index, Type, Field, Value) \\r
+  do {                                                                                                     \\r
+    UINT64  ValueMask;                                                                                     \\r
+    ValueMask = MAX_UINT64;                                                                                \\r
+    ((Type *)(&ValueMask))->Field = 0;                                                                     \\r
+    CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType, Index, ~ValueMask, Value);               \\r
+  } while(FALSE);\r
+\r
 /**\r
   Adds a 32-bit register write entry in specified register table.\r
 \r