summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre Gondois <pierre.gondois@arm.com>2024-01-29 13:09:35 +0100
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2024-01-29 16:47:03 +0000
commitdc3339470166884197e9be5a6b3e7afe13104f1f (patch)
tree7a34d5a77229327937ac676e1d25a2fc053b9e59
parentdec9d3573829ac020e34d19a4f39d3154f066379 (diff)
downloadedk2-dc3339470166884197e9be5a6b3e7afe13104f1f.tar.gz
edk2-dc3339470166884197e9be5a6b3e7afe13104f1f.tar.bz2
edk2-dc3339470166884197e9be5a6b3e7afe13104f1f.zip
DynamicTablesPkg: Exempt some _CPC field from checks
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>
-rw-r--r--DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf3
-rw-r--r--DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c28
2 files changed, 27 insertions, 4 deletions
diff --git a/DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf b/DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf
index 6d0aa6ff93..f269691864 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf
+++ b/DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf
@@ -71,6 +71,9 @@
BaseLib
MemoryAllocationLib
+[FixedPcd]
+ gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdDevelopmentPlatformRelaxations
+
[BuildOptions]
*_*_*_CC_FLAGS = -DAML_HANDLE
diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
index 6f3f46e3b1..22c2d598d0 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
@@ -3532,6 +3532,29 @@ AmlCreateCpcNode (
return EFI_INVALID_PARAMETER;
}
+ /// The following fields are theoretically mandatory, but not supported
+ /// by some platforms.
+ /// - PerformanceLimitedRegister
+ /// - ReferencePerformanceCounterRegister
+ /// - DeliveredPerformanceCounterRegister
+ /// Warn if BIT0 in PcdDevelopmentPlatformRelaxations is set, otherwise
+ /// return an error.
+ if (IsNullGenericAddress (&CpcInfo->PerformanceLimitedRegister) ||
+ IsNullGenericAddress (&CpcInfo->ReferencePerformanceCounterRegister) ||
+ IsNullGenericAddress (&CpcInfo->DeliveredPerformanceCounterRegister))
+ {
+ if ((PcdGet64 (PcdDevelopmentPlatformRelaxations) & BIT0) != 0) {
+ DEBUG ((
+ DEBUG_WARN,
+ "Missing PerformanceLimited|ReferencePerformanceCounter|"
+ "DeliveredPerformanceCounter field in _CPC object\n"
+ ));
+ } else {
+ ASSERT (0);
+ return EFI_INVALID_PARAMETER;
+ }
+ }
+
if ((IsNullGenericAddress (&CpcInfo->HighestPerformanceBuffer) &&
(CpcInfo->HighestPerformanceInteger == 0)) ||
(IsNullGenericAddress (&CpcInfo->NominalPerformanceBuffer) &&
@@ -3540,10 +3563,7 @@ AmlCreateCpcNode (
(CpcInfo->LowestNonlinearPerformanceInteger == 0)) ||
(IsNullGenericAddress (&CpcInfo->LowestPerformanceBuffer) &&
(CpcInfo->LowestPerformanceInteger == 0)) ||
- IsNullGenericAddress (&CpcInfo->DesiredPerformanceRegister) ||
- IsNullGenericAddress (&CpcInfo->ReferencePerformanceCounterRegister) ||
- IsNullGenericAddress (&CpcInfo->DeliveredPerformanceCounterRegister) ||
- IsNullGenericAddress (&CpcInfo->PerformanceLimitedRegister))
+ IsNullGenericAddress (&CpcInfo->DesiredPerformanceRegister))
{
ASSERT (0);
return EFI_INVALID_PARAMETER;