Skip to content

Commit

Permalink
DynamicTablesPkg: Exempt some _CPC field from checks
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Sami Mujawar <[email protected]>
  • Loading branch information
pierregondois authored and mergify[bot] committed Jan 29, 2024
1 parent dec9d35 commit dc33394
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
3 changes: 3 additions & 0 deletions DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@
BaseLib
MemoryAllocationLib

[FixedPcd]
gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdDevelopmentPlatformRelaxations

[BuildOptions]
*_*_*_CC_FLAGS = -DAML_HANDLE

Expand Down
28 changes: 24 additions & 4 deletions DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) &&
Expand All @@ -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;
Expand Down

0 comments on commit dc33394

Please sign in to comment.