]> xenbits.xensource.com Git - people/aperard/ovmf.git/commitdiff
DynamicTablesPkg: Exempt some _CPC field from checks
authorPierre Gondois <pierre.gondois@arm.com>
Mon, 29 Jan 2024 12:09:35 +0000 (13:09 +0100)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Mon, 29 Jan 2024 16:47:03 +0000 (16:47 +0000)
When generating _CPC objects, some fields are mandatory by spec [1].
Some fields cannot be supported by a the Juno platform, which is used
to test the _CPC generation. Therefore, rely on the
PcdDevelopmentPlatformRelaxations Pcd to either:
- warn about the missing fields and and let the OS handle the
  missing information
- consider the missing fields as an error

_CPC fields that are exempted from checks when the Pcd is set:
- PerformanceLimitedRegister
- ReferencePerformanceCounterRegister
- DeliveredPerformanceCounterRegister

[1] Cf. non-optional fields in:
    ACPI 6.5, s8.4.6.1 '_CPC (Continuous Performance Control)'

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf
DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c

index 6d0aa6ff934cf44eb5497e1e3464c46c4f076989..f269691864d45a70e0b37aedd93b8917fdaa93c1 100644 (file)
@@ -71,6 +71,9 @@
   BaseLib\r
   MemoryAllocationLib\r
 \r
+[FixedPcd]\r
+  gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdDevelopmentPlatformRelaxations\r
+\r
 [BuildOptions]\r
   *_*_*_CC_FLAGS = -DAML_HANDLE\r
 \r
index 6f3f46e3b1ed369dc51b4f75433cb406baa628f6..22c2d598d0d89aedfaef5af73fe1e01272eeec2d 100644 (file)
@@ -3532,6 +3532,29 @@ AmlCreateCpcNode (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  /// The following fields are theoretically mandatory, but not supported\r
+  /// by some platforms.\r
+  /// - PerformanceLimitedRegister\r
+  /// - ReferencePerformanceCounterRegister\r
+  /// - DeliveredPerformanceCounterRegister\r
+  /// Warn if BIT0 in PcdDevelopmentPlatformRelaxations is set, otherwise\r
+  /// return an error.\r
+  if (IsNullGenericAddress (&CpcInfo->PerformanceLimitedRegister) ||\r
+      IsNullGenericAddress (&CpcInfo->ReferencePerformanceCounterRegister) ||\r
+      IsNullGenericAddress (&CpcInfo->DeliveredPerformanceCounterRegister))\r
+  {\r
+    if ((PcdGet64 (PcdDevelopmentPlatformRelaxations) & BIT0) != 0) {\r
+      DEBUG ((\r
+        DEBUG_WARN,\r
+        "Missing PerformanceLimited|ReferencePerformanceCounter|"\r
+        "DeliveredPerformanceCounter field in _CPC object\n"\r
+        ));\r
+    } else {\r
+      ASSERT (0);\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
+\r
   if ((IsNullGenericAddress (&CpcInfo->HighestPerformanceBuffer) &&\r
        (CpcInfo->HighestPerformanceInteger == 0)) ||\r
       (IsNullGenericAddress (&CpcInfo->NominalPerformanceBuffer) &&\r
@@ -3540,10 +3563,7 @@ AmlCreateCpcNode (
        (CpcInfo->LowestNonlinearPerformanceInteger == 0)) ||\r
       (IsNullGenericAddress (&CpcInfo->LowestPerformanceBuffer) &&\r
        (CpcInfo->LowestPerformanceInteger == 0)) ||\r
-      IsNullGenericAddress (&CpcInfo->DesiredPerformanceRegister) ||\r
-      IsNullGenericAddress (&CpcInfo->ReferencePerformanceCounterRegister) ||\r
-      IsNullGenericAddress (&CpcInfo->DeliveredPerformanceCounterRegister) ||\r
-      IsNullGenericAddress (&CpcInfo->PerformanceLimitedRegister))\r
+      IsNullGenericAddress (&CpcInfo->DesiredPerformanceRegister))\r
   {\r
     ASSERT (0);\r
     return EFI_INVALID_PARAMETER;\r