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>
This commit is contained in:
Pierre Gondois 2024-01-29 13:09:35 +01:00 committed by mergify[bot]
parent dec9d35738
commit dc33394701
2 changed files with 27 additions and 4 deletions

View File

@ -71,6 +71,9 @@
BaseLib BaseLib
MemoryAllocationLib MemoryAllocationLib
[FixedPcd]
gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdDevelopmentPlatformRelaxations
[BuildOptions] [BuildOptions]
*_*_*_CC_FLAGS = -DAML_HANDLE *_*_*_CC_FLAGS = -DAML_HANDLE

View File

@ -3532,6 +3532,29 @@ AmlCreateCpcNode (
return EFI_INVALID_PARAMETER; 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) && if ((IsNullGenericAddress (&CpcInfo->HighestPerformanceBuffer) &&
(CpcInfo->HighestPerformanceInteger == 0)) || (CpcInfo->HighestPerformanceInteger == 0)) ||
(IsNullGenericAddress (&CpcInfo->NominalPerformanceBuffer) && (IsNullGenericAddress (&CpcInfo->NominalPerformanceBuffer) &&
@ -3540,10 +3563,7 @@ AmlCreateCpcNode (
(CpcInfo->LowestNonlinearPerformanceInteger == 0)) || (CpcInfo->LowestNonlinearPerformanceInteger == 0)) ||
(IsNullGenericAddress (&CpcInfo->LowestPerformanceBuffer) && (IsNullGenericAddress (&CpcInfo->LowestPerformanceBuffer) &&
(CpcInfo->LowestPerformanceInteger == 0)) || (CpcInfo->LowestPerformanceInteger == 0)) ||
IsNullGenericAddress (&CpcInfo->DesiredPerformanceRegister) || IsNullGenericAddress (&CpcInfo->DesiredPerformanceRegister))
IsNullGenericAddress (&CpcInfo->ReferencePerformanceCounterRegister) ||
IsNullGenericAddress (&CpcInfo->DeliveredPerformanceCounterRegister) ||
IsNullGenericAddress (&CpcInfo->PerformanceLimitedRegister))
{ {
ASSERT (0); ASSERT (0);
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;