From dc3339470166884197e9be5a6b3e7afe13104f1f Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Mon, 29 Jan 2024 13:09:35 +0100 Subject: 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 Reviewed-by: Sami Mujawar --- DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf | 3 +++ .../Library/Common/AmlLib/CodeGen/AmlCodeGen.c | 28 ++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) (limited to 'DynamicTablesPkg/Library') 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; -- cgit v1.2.3