From 9e3898cb15fa9eed3ef3e9de4488be1681d53ff4 Mon Sep 17 00:00:00 2001 From: Sandesh Shetty Date: Sat, 12 Sep 2020 00:01:05 +0200 Subject: [PATCH] Fix provisioning backwards compatibility with AEP PMem modules. This fix allows provisioning AEP PMem modules with ipmctl 2.x version as it is meant to be backwards compatible. This issue was seen as an invalid revision was written into PCD partition #1 Config Header when new goals were created using ipmctl 2.x version. Fixes #149 Signed-off-by: Sandesh Shetty --- DcpmPkg/driver/Core/Dimm.c | 8 +++++++- DcpmPkg/driver/Core/Region.c | 12 +++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/DcpmPkg/driver/Core/Dimm.c b/DcpmPkg/driver/Core/Dimm.c index a4ddd096..657d43c3 100644 --- a/DcpmPkg/driver/Core/Dimm.c +++ b/DcpmPkg/driver/Core/Dimm.c @@ -5965,7 +5965,13 @@ GenerateOemPcdHeader ( pPlatformConfigData->Header.Signature = NVDIMM_CONFIGURATION_HEADER_SIG; pPlatformConfigData->Header.Length = sizeof (*pPlatformConfigData); - pPlatformConfigData->Header.Revision.AsUint8 = gNvmDimmData->PMEMDev.pPcatHead->pPlatformConfigAttr->Header.Revision.AsUint8; + // For Purley platforms, only one revision (0x1) for PCD Config Header is supported + if (IS_ACPI_HEADER_REV_MAJ_0_MIN_VALID(gNvmDimmData->PMEMDev.pPcatHead->pPlatformConfigAttr)) { + pPlatformConfigData->Header.Revision.AsUint8 = NVDIMM_CONFIGURATION_TABLES_REVISION_1; + } + else { + pPlatformConfigData->Header.Revision.AsUint8 = gNvmDimmData->PMEMDev.pPcatHead->pPlatformConfigAttr->Header.Revision.AsUint8; + } CopyMem_S(&pPlatformConfigData->Header.OemId, sizeof(pPlatformConfigData->Header.OemId), NVDIMM_CONFIGURATION_HEADER_OEM_ID, NVDIMM_CONFIGURATION_HEADER_OEM_ID_LEN); pPlatformConfigData->Header.OemTableId = NVDIMM_CONFIGURATION_HEADER_OEM_TABLE_ID; pPlatformConfigData->Header.OemRevision = NVDIMM_CONFIGURATION_HEADER_OEM_REVISION; diff --git a/DcpmPkg/driver/Core/Region.c b/DcpmPkg/driver/Core/Region.c index 76dc7962..cba76efe 100644 --- a/DcpmPkg/driver/Core/Region.c +++ b/DcpmPkg/driver/Core/Region.c @@ -3972,9 +3972,15 @@ SendConfigInputToDimm( pNewConfHeader->ConfInputDataSize = pNewConfigInput->Header.Length; CurrentOffset += pNewConfHeader->ConfInputDataSize; - /** Update Configuration Header Revision **/ - CopyMem_S(&pNewConfHeader->Header.Revision, sizeof(ACPI_REVISION), - &pNewConfigInput->Header.Revision, sizeof(ACPI_REVISION)); + /** + Update Configuration Header Revision + Not needed for Purley platforms, as only one + revision (0x1) is supported. + **/ + if (!IS_ACPI_HEADER_REV_MAJ_0_MIN_VALID(pNewConfHeader)) { + CopyMem_S(&pNewConfHeader->Header.Revision, sizeof(ACPI_REVISION), + &pNewConfigInput->Header.Revision, sizeof(ACPI_REVISION)); + } } else { pNewConfHeader->ConfInputStartOffset = 0; pNewConfHeader->ConfInputDataSize = 0;