From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=o3jEFG0f; spf=pass (domain: arm.com, ip: 40.107.14.89, mailfrom: alexei.fedorov@arm.com) Received: from EUR01-VE1-obe.outbound.protection.outlook.com (EUR01-VE1-obe.outbound.protection.outlook.com [40.107.14.89]) by groups.io with SMTP; Wed, 12 Jun 2019 02:35:50 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hTcxQfqZhLpJPEsxRpTh1MJ/3crJD5OI++h59kM5XUg=; b=o3jEFG0fD3+FMu1Dr0YCG0vQkLviw/+4IOO2EdKf1fcuD1dtEt9qh9lLLoUuMRbKO6G1PUIeP0lHkoZUlNcSQXtgHJRj5NjcatSbB1x9LNd8OzNLXp8G7RIzWQqRF1JST2yIL7T1QNGo/Y7vwD342iN8RGH7Lhfn579cSm14cNE= Received: from VI1PR0801MB1743.eurprd08.prod.outlook.com (10.168.64.145) by VI1PR0801MB1949.eurprd08.prod.outlook.com (10.173.73.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1987.11; Wed, 12 Jun 2019 09:35:45 +0000 Received: from VI1PR0801MB1743.eurprd08.prod.outlook.com ([fe80::edba:e8eb:22b1:4582]) by VI1PR0801MB1743.eurprd08.prod.outlook.com ([fe80::edba:e8eb:22b1:4582%9]) with mapi id 15.20.1987.010; Wed, 12 Jun 2019 09:35:45 +0000 From: "Alexei Fedorov" To: "devel@edk2.groups.io" , Krzysztof Koch CC: Ard Biesheuvel , Leif Lindholm , Michael D Kinney , Sami Mujawar , Matteo Carlini , Stephanie Hughes-Fitt , nd Subject: Re: [edk2-devel] [edk2-platforms PATCH v1 1/1 -resend] Platform/ARM/JunoPkg: Add support for PPTT dynamic generation Thread-Topic: [edk2-devel] [edk2-platforms PATCH v1 1/1 -resend] Platform/ARM/JunoPkg: Add support for PPTT dynamic generation Thread-Index: AQHVIQG/c67/wV7FqEq1zy78c5H2vKaXwjeF Date: Wed, 12 Jun 2019 09:35:45 +0000 Message-ID: References: <20190612093158.36624-1-krzysztof.koch@arm.com> In-Reply-To: <20190612093158.36624-1-krzysztof.koch@arm.com> Accept-Language: en-GB, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Alexei.Fedorov@arm.com; x-originating-ip: [217.140.106.53] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 94f8a250-fe26-48af-d0b2-08d6ef195859 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600148)(711020)(4605104)(1401327)(4618075)(2017052603328)(7193020);SRVR:VI1PR0801MB1949; x-ms-traffictypediagnostic: VI1PR0801MB1949: x-ms-exchange-purlcount: 4 nodisclaimer: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3968; x-forefront-prvs: 0066D63CE6 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(136003)(396003)(376002)(366004)(346002)(39860400002)(199004)(189003)(229853002)(966005)(72206003)(14454004)(3846002)(6116002)(478600001)(606006)(26005)(186003)(476003)(256004)(14444005)(316002)(54896002)(86362001)(55016002)(6306002)(9686003)(236005)(53936002)(99286004)(54906003)(74316002)(53946003)(110136005)(2906002)(105004)(6436002)(66066001)(68736007)(8936002)(81166006)(81156014)(8676002)(25786009)(6636002)(486006)(2501003)(19627405001)(33656002)(71200400001)(71190400001)(4326008)(30864003)(6506007)(53546011)(5660300002)(11346002)(52536014)(446003)(66946007)(102836004)(66446008)(66476007)(66556008)(64756008)(7736002)(76116006)(7696005)(73956011)(76176011)(6246003)(559001)(579004)(569006);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR0801MB1949;H:VI1PR0801MB1743.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: RvRsER/268NY9Y8BLkhS0L0lonT7VZT0Lh6GRikmxFBdCZ4q/DCW0/HsGO/mKgTzqln2GRUOs6EauraY6m1zGkLLGMr8gR2ZAv4bNVzbIsw+GNufNgQSGFDJfhCgxPP9W+GJYsRMMWdJ264EXLq/xOoy9KRB0AkngIxVRIM+egmenN8yUH9cR3vvgFm7Huu8JD3zVzWKl4u6O0Io/CwKo5aK5//evA03lJK1L7KoSbr89533UvKoH30V+0nSRhGaGoemBf4q4pcEEfQidUskmFp8PDhzF3ZxjugPWM0H3pwRJ/MmPx/KVQu3kGDUDAU7s1C/v4CJJWeWD3GJC2V/3kCKZ9q+knRpHGPQwWSXmjL++Bcj4BJzOrXEcjZX8aHDgErUINGKOMf1b8L8BGG5vyEkpJnDQdC62GrQsATW8aI= MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 94f8a250-fe26-48af-d0b2-08d6ef195859 X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Jun 2019 09:35:45.3104 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Alexei.Fedorov@arm.com X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1949 Content-Language: en-GB Content-Type: multipart/alternative; boundary="_000_VI1PR0801MB17437883AC8E2DB656A23CDE9AEC0VI1PR0801MB1743_" --_000_VI1PR0801MB17437883AC8E2DB656A23CDE9AEC0VI1PR0801MB1743_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Alexei Fedorov Alexei ________________________________ From: devel@edk2.groups.io on behalf of Krzysztof K= och via Groups.Io Sent: 12 June 2019 10:31 To: devel@edk2.groups.io Cc: Ard Biesheuvel; Leif Lindholm; Michael D Kinney; Sami Mujawar; Matteo = Carlini; Stephanie Hughes-Fitt; nd Subject: [edk2-devel] [edk2-platforms PATCH v1 1/1 -resend] Platform/ARM/J= unoPkg: Add support for PPTT dynamic generation Update the Platform Respository for the Juno platform to include support for generation of the Processor Properties Topology Table (PPTT) using the Dynamic Tables Framework. The Platform Repository now also describes the cache and processor topology in Juno (all revisions). Signed-off-by: Krzysztof Koch --- Changes can be seen at: https://github.com/KrzysztofKoch1/edk2-platforms/t= ree/392_dynamic_pptt_juno_v1 Notes: v1: - add support for dynamic generation of PPTT [Krzysztof] Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Configu= rationManager.c | 443 +++++++++++++++++++- Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Configu= rationManager.h | 136 +++++- 2 files changed, 575 insertions(+), 4 deletions(-) diff --git a/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManage= rDxe/ConfigurationManager.c b/Platform/ARM/JunoPkg/ConfigurationManager/Con= figurationManagerDxe/ConfigurationManager.c index 78b906ddb8bbd35c32b4be98b1ee8bd973b6b818..2ef79ba5df750e869d241fcba9= 8fdd44b1f26002 100644 --- a/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Co= nfigurationManager.c +++ b/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Co= nfigurationManager.c @@ -96,7 +96,13 @@ EDKII_PLATFORM_REPOSITORY_INFO ArmJunoPlatformRepositor= yInfo =3D { CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdt), (EFI_ACPI_DESCRIPTION_HEADER*)ssdtuart_aml_code }, - + // PPTT Table + { + EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATUR= E, + EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_REVISION, + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdPptt), + NULL + }, /* PCI MCFG Table PCIe is only available on Juno R1 and R2. Add the PCI table entries at the end of the table so that @@ -261,6 +267,301 @@ EDKII_PLATFORM_REPOSITORY_INFO ArmJunoPlatformReposi= toryInfo =3D { 127, // SPI Base used by this frame. 224 + }, + + // Processor Hierarchy Nodes + { + // Package + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[0]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + CM_NULL_TOKEN, + // CM_OBJECT_TOKEN GicCToken + CM_NULL_TOKEN, + // UINT32 NoOfPrivateResources + 0, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + CM_NULL_TOKEN + }, + // 'big' cluster + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[1]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + REFERENCE_TOKEN (ProcHierarchyInfo[0]), // -> Package + // CM_OBJECT_TOKEN GicCToken + CM_NULL_TOKEN, + // UINT32 NoOfPrivateResources + BIG_CLUSTER_RESOURCE_COUNT, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + REFERENCE_TOKEN (BigClusterResources) + }, + // 'LITTLE' cluster + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[2]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + REFERENCE_TOKEN (ProcHierarchyInfo[0]), // -> Package + // CM_OBJECT_TOKEN GicCToken + CM_NULL_TOKEN, + // UINT32 NoOfPrivateResources + LITTLE_CLUSTER_RESOURCE_COUNT, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + REFERENCE_TOKEN (LittleClusterResources) + }, + // Two 'big' cores + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[3]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + REFERENCE_TOKEN (ProcHierarchyInfo[1]), // -> 'big' cluster + // CM_OBJECT_TOKEN GicCToken + REFERENCE_TOKEN (GicCInfo[0]), + // UINT32 NoOfPrivateResources + BIG_CORE_RESOURCE_COUNT, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + REFERENCE_TOKEN (BigCoreResources) + }, + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[4]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + REFERENCE_TOKEN (ProcHierarchyInfo[1]), // -> 'big' cluster + // CM_OBJECT_TOKEN GicCToken + REFERENCE_TOKEN (GicCInfo[1]), + // UINT32 NoOfPrivateResources + BIG_CORE_RESOURCE_COUNT, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + REFERENCE_TOKEN (BigCoreResources) + }, + // Four 'LITTLE' cores + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[5]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'LITTLE' cluster + // CM_OBJECT_TOKEN GicCToken + REFERENCE_TOKEN (GicCInfo[2]), + // UINT32 NoOfPrivateResources + LITTLE_CORE_RESOURCE_COUNT, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + REFERENCE_TOKEN (LittleCoreResources) + }, + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[6]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'LITTLE' cluster + // CM_OBJECT_TOKEN GicCToken + REFERENCE_TOKEN (GicCInfo[3]), + // UINT32 NoOfPrivateResources + LITTLE_CORE_RESOURCE_COUNT, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + REFERENCE_TOKEN (LittleCoreResources) + }, + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[7]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'LITTLE' cluster + // CM_OBJECT_TOKEN GicCToken + REFERENCE_TOKEN (GicCInfo[4]), + // UINT32 NoOfPrivateResources + LITTLE_CORE_RESOURCE_COUNT, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + REFERENCE_TOKEN (LittleCoreResources) + }, + { + // CM_OBJECT_TOKEN Token + REFERENCE_TOKEN (ProcHierarchyInfo[8]), + // UINT32 Flags + PROC_NODE_FLAGS ( + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL + ), + // CM_OBJECT_TOKEN ParentToken + REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'LITTLE' cluster + // CM_OBJECT_TOKEN GicCToken + REFERENCE_TOKEN (GicCInfo[5]), + // UINT32 NoOfPrivateResources + LITTLE_CORE_RESOURCE_COUNT, + // CM_OBJECT_TOKEN PrivateResourcesArrayToken + REFERENCE_TOKEN (LittleCoreResources) + } + }, + + // Cache information + { + // 'big' cluster's L2 cache + { + REFERENCE_TOKEN (CacheInfo[0]), // CM_OBJECT_TOKEN Token + CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCac= heToken + 0x200000, // UINT32 Size + 2048, // UINT32 NumberOfSets + 16, // UINT32 Associativity + CACHE_ATTRIBUTES ( // UINT8 Attributes + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK + ), + 64 // UINT16 LineSize + }, + // 'big' core's L1 instruction cache + { + REFERENCE_TOKEN (CacheInfo[1]), // CM_OBJECT_TOKEN Token + CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCac= heToken + 0xc000, // UINT32 Size + 256, // UINT32 NumberOfSets + 3, // UINT32 Associativity + CACHE_ATTRIBUTES ( // UINT8 Attributes + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK + ), + 64 // UINT16 LineSize + }, + // 'big' core's L1 data cache + { + REFERENCE_TOKEN (CacheInfo[2]), // CM_OBJECT_TOKEN Token + CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCac= heToken + 0x8000, // UINT32 Size + 256, // UINT32 NumberOfSets + 2, // UINT32 Associativity + CACHE_ATTRIBUTES ( // UINT8 Attributes + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_DATA, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK + ), + 64 // UINT16 LineSize + }, + // 'LITTLE' cluster's L2 cache + { + REFERENCE_TOKEN (CacheInfo[3]), // CM_OBJECT_TOKEN Token + CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCac= heToken + 0x100000, // UINT32 Size + 1024, // UINT32 NumberOfSets + 16, // UINT32 Associativity + CACHE_ATTRIBUTES ( // UINT8 Attributes + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK + ), + 64 // UINT16 LineSize + }, + // 'LITTLE' core's L1 instruction cache + { + REFERENCE_TOKEN (CacheInfo[4]), // CM_OBJECT_TOKEN Token + CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCac= heToken + 0x8000, // UINT32 Size + 256, // UINT32 NumberOfSets + 2, // UINT32 Associativity + CACHE_ATTRIBUTES ( // UINT8 Attributes + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK + ), + 64 // UINT16 LineSize + }, + // 'LITTLE' core's L1 data cache + { + REFERENCE_TOKEN (CacheInfo[5]), // CM_OBJECT_TOKEN Token + CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCac= heToken + 0x8000, // UINT32 Size + 128, // UINT32 NumberOfSets + 4, // UINT32 Associativity + CACHE_ATTRIBUTES ( // UINT8 Attributes + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_DATA, + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK + ), + 64 // UINT16 LineSize + } + }, + // Resources private to the 'big' cluster (shared among cores) + { + { REFERENCE_TOKEN (CacheInfo[0]) } // -> 'big' cluster's L2 cache + }, + // Resources private to each individual 'big' core instance + { + { REFERENCE_TOKEN (CacheInfo[1]) }, // -> 'big' core's L1 I-cache + { REFERENCE_TOKEN (CacheInfo[2]) } // -> 'big' core's L1 D-cache + }, + // Resources private to the 'LITTLE' cluster (shared among cores) + { + { REFERENCE_TOKEN (CacheInfo[3]) } // -> 'LITTLE' cluster's L2 cache + }, + // Resources private to each individual 'LITTLE' core instance + { + { REFERENCE_TOKEN (CacheInfo[4]) }, // -> 'LITTLE' core's L1 I-cache + { REFERENCE_TOKEN (CacheInfo[5]) } // -> 'LITTLE' core's L1 D-cache } }; @@ -329,6 +630,121 @@ GetGTBlockTimerFrameInfo ( return EFI_SUCCESS; } +/** Return GIC CPU Interface Info. + + @param [in] This Pointer to the Configuration Manager Pr= otocol. + @param [in] CmObjectId The Object ID of the CM object requeste= d + @param [in] SearchToken A unique token for identifying the requ= ested + CM_ARM_GICC_INFO object. + @param [in, out] CmObject Pointer to the Configuration Manager Ob= ject + descriptor describing the requested Obj= ect. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object information is not = found. +**/ +EFI_STATUS +EFIAPI +GetGicCInfo ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, + IN CONST CM_OBJECT_ID CmObjectId, + IN CONST CM_OBJECT_TOKEN SearchToken, + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject + ) +{ + EDKII_PLATFORM_REPOSITORY_INFO * PlatformRepo; + UINT32 TotalObjCount; + UINT32 ObjIndex; + + if ((This =3D=3D NULL) || (CmObject =3D=3D NULL)) { + ASSERT (This !=3D NULL); + ASSERT (CmObject !=3D NULL); + return EFI_INVALID_PARAMETER; + } + + PlatformRepo =3D This->PlatRepoInfo; + + TotalObjCount =3D sizeof (PlatformRepo->GicCInfo) / + sizeof (PlatformRepo->GicCInfo[0]); + + for (ObjIndex =3D 0; ObjIndex < TotalObjCount; ObjIndex++) { + if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->GicCInfo[ObjIn= dex]) { + CmObject->ObjectId =3D CmObjectId; + CmObject->Size =3D sizeof (PlatformRepo->GicCInfo[ObjIndex]); + CmObject->Data =3D (VOID*)&PlatformRepo->GicCInfo[ObjIndex]; + CmObject->Count =3D 1; + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} + +/** Return a list of Configuration Manager object references pointed to b= y the + given input token. + + @param [in] This Pointer to the Configuration Manager Pr= otocol. + @param [in] CmObjectId The Object ID of the CM object requeste= d + @param [in] SearchToken A unique token for identifying the requ= ested + CM_ARM_OBJ_REF list. + @param [in, out] CmObject Pointer to the Configuration Manager Ob= ject + descriptor describing the requested Obj= ect. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object information is not = found. +**/ +EFI_STATUS +EFIAPI +GetCmObjRefs ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, + IN CONST CM_OBJECT_ID CmObjectId, + IN CONST CM_OBJECT_TOKEN SearchToken, + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject + ) +{ + EDKII_PLATFORM_REPOSITORY_INFO * PlatformRepo; + + if ((This =3D=3D NULL) || (CmObject =3D=3D NULL)) { + ASSERT (This !=3D NULL); + ASSERT (CmObject !=3D NULL); + return EFI_INVALID_PARAMETER; + } + + PlatformRepo =3D This->PlatRepoInfo; + + if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->BigClusterResour= ces) { + CmObject->Size =3D sizeof (PlatformRepo->BigClusterResources); + CmObject->Data =3D (VOID*)&PlatformRepo->BigClusterResources; + CmObject->Count =3D sizeof (PlatformRepo->BigClusterResources) / + sizeof (PlatformRepo->BigClusterResources[0]); + return EFI_SUCCESS; + } + if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->BigCoreResources= ) { + CmObject->Size =3D sizeof (PlatformRepo->BigCoreResources); + CmObject->Data =3D (VOID*)&PlatformRepo->BigCoreResources; + CmObject->Count =3D sizeof (PlatformRepo->BigCoreResources) / + sizeof (PlatformRepo->BigCoreResources[0]); + return EFI_SUCCESS; + } + if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->LittleClusterRes= ources) { + CmObject->Size =3D sizeof (PlatformRepo->LittleClusterResources); + CmObject->Data =3D (VOID*)&PlatformRepo->LittleClusterResources; + CmObject->Count =3D sizeof (PlatformRepo->LittleClusterResources) / + sizeof (PlatformRepo->LittleClusterResources[0]); + return EFI_SUCCESS; + } + if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->LittleCoreResour= ces) { + CmObject->Size =3D sizeof (PlatformRepo->LittleCoreResources); + CmObject->Data =3D (VOID*)&PlatformRepo->LittleCoreResources; + CmObject->Count =3D sizeof (PlatformRepo->LittleCoreResources) / + sizeof (PlatformRepo->LittleCoreResources[0]); + return EFI_SUCCESS; + } + + return EFI_NOT_FOUND; +} + /** Return a standard namespace object. @param [in] This Pointer to the Configuration Manager Proto= col. @@ -486,12 +902,14 @@ GetArmNameSpaceObject ( Token, GetGTBlockTimerFrameInfo ); - HANDLE_CM_OBJECT ( + HANDLE_CM_OBJECT_REF_BY_TOKEN ( EArmObjGicCInfo, CmObjectId, PlatformRepo->GicCInfo, (sizeof (PlatformRepo->GicCInfo) / - sizeof (PlatformRepo->GicCInfo[0])) + sizeof (PlatformRepo->GicCInfo[0])), + Token, + GetGicCInfo ); HANDLE_CM_OBJECT ( EArmObjGicDInfo, @@ -518,6 +936,25 @@ GetArmNameSpaceObject ( PlatformRepo->GicMsiFrameInfo, 1 ); + HANDLE_CM_OBJECT ( + EArmObjProcHierarchyInfo, + CmObjectId, + PlatformRepo->ProcHierarchyInfo, + (sizeof (PlatformRepo->ProcHierarchyInfo) / + sizeof (PlatformRepo->ProcHierarchyInfo[0])) + ); + HANDLE_CM_OBJECT ( + EArmObjCacheInfo, + CmObjectId, + PlatformRepo->CacheInfo, + sizeof (PlatformRepo->CacheInfo) / sizeof (PlatformRepo->CacheInfo[= 0]) + ); + HANDLE_CM_OBJECT_SEARCH_PLAT_REPO ( + EArmObjCmRef, + CmObjectId, + Token, + GetCmObjRefs + ); case EArmObjPciConfigSpaceInfo: if (PlatformRepo->JunoRevision !=3D JUNO_REVISION_R0) { diff --git a/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManage= rDxe/ConfigurationManager.h b/Platform/ARM/JunoPkg/ConfigurationManager/Con= figurationManagerDxe/ConfigurationManager.h index 060817430fe75fdf79196f8a9d31561028fb0f50..7fdf663fc6d2ad80da26ff1f16= 35c858d5be4e93 100644 --- a/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Co= nfigurationManager.h +++ b/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Co= nfigurationManager.h @@ -20,6 +20,12 @@ */ #define CFG_MGR_OEM_ID { 'A', 'R', 'M', 'L', 'T', 'D' } +/** A helper macro for mapping a reference token +*/ +#define REFERENCE_TOKEN(Field) = \ + (CM_OBJECT_TOKEN)((UINT8*)&ArmJunoPlatformRepositoryInfo + = \ + OFFSET_OF (EDKII_PLATFORM_REPOSITORY_INFO, Field)) + /** A helper macro for populating the GIC CPU information */ #define GICC_ENTRY( = \ @@ -46,6 +52,36 @@ EnergyEfficiency /* UINT8 ProcessorPowerEfficiencyClass*/ = \ } +/** A helper macro for populating the Processor Hierarchy Node flags +*/ +#define PROC_NODE_FLAGS( \ + PhysicalPackage, \ + AcpiProcessorIdValid, \ + ProcessorIsThread, \ + NodeIsLeaf, \ + IdenticalImplementation \ + ) \ + ( \ + PhysicalPackage | \ + (AcpiProcessorIdValid << 1) | \ + (ProcessorIsThread << 2) | \ + (NodeIsLeaf << 3) | \ + (IdenticalImplementation << 4) \ + ) + +/** A helper macro for populating the Cache Type Structure's attributes +*/ +#define CACHE_ATTRIBUTES( \ + AllocationType, \ + CacheType, \ + WritePolicy \ + ) \ + ( \ + AllocationType | \ + (CacheType << 2) | \ + (WritePolicy << 4) \ + ) + /** A helper macro for returning configuration manager objects */ #define HANDLE_CM_OBJECT(ObjId, CmObjectId, Object, ObjectCount) \ @@ -102,13 +138,46 @@ break; = \ } +/** A helper macro for returning configuration manager objects referenced + by token when the entire platform repository is in scope and the + CM_NULL_TOKEN value is not allowed. +*/ +#define HANDLE_CM_OBJECT_SEARCH_PLAT_REPO( = \ + ObjId, = \ + CmObjectId, = \ + Token, = \ + HandlerProc = \ + ) = \ + case ObjId: { = \ + CmObject->ObjectId =3D CmObjectId; = \ + if (Token =3D=3D CM_NULL_TOKEN) { = \ + Status =3D EFI_INVALID_PARAMETER; = \ + DEBUG (( = \ + DEBUG_ERROR, = \ + #ObjId ": CM_NULL_TOKEN value is not allowed when searching" = \ + " the entire platform repository.\n" = \ + )); = \ + } else { = \ + Status =3D HandlerProc (This, CmObjectId, Token, CmObject); = \ + DEBUG (( = \ + DEBUG_INFO, = \ + #ObjId ": Token =3D 0x%p, Ptr =3D 0x%p, Size =3D %d, Count =3D %d= \n", \ + (VOID*)Token, = \ + CmObject->Data, = \ + CmObject->Size, = \ + CmObject->Count = \ + )); = \ + } = \ + break; = \ + } + /** The number of CPUs */ #define PLAT_CPU_COUNT 6 /** The number of ACPI tables to install */ -#define PLAT_ACPI_TABLE_COUNT 10 +#define PLAT_ACPI_TABLE_COUNT 11 /** The number of platform generic timer blocks */ @@ -118,6 +187,53 @@ */ #define PLAT_GTFRAME_COUNT 2 +/** For all Juno revisions, the cache and processor topology is identical= . + + Terms 'big' and 'LITTLE' are used in favour of A72, A57 or A53 to take = into + account that Juno r2 uses Cortex-A72 as 'big' cores, whereas Juno r0 an= d r1 + have Cortex-A57 as 'big' cores. +*/ + +/** The number of Processor Hierarchy Nodes + - one package node + - two cluster nodes ('big' + 'LITTLE') + - two 'big' cores + - four 'LITTLE' cores +*/ +#define PLAT_PROC_HIERARCHY_NODE_COUNT 9 + +/** The number of unique cache structures: + - 'big' core L1 instruction cache + - 'big' core L1 data cache + - 'big' core L2 cache + - 'LITTLE' core L1 instruction cache + - 'LITTLE' core L1 data cache + - 'LITTLE' core L2 cache +*/ +#define PLAT_CACHE_COUNT 6 + +/** The number of resources private to the entire 'big' cluster + - L2 cache +*/ +#define BIG_CLUSTER_RESOURCE_COUNT 1 + +/** The number of resources private to 'big' core instance + - L1 data cache + - L1 instruction cache +*/ +#define BIG_CORE_RESOURCE_COUNT 2 + +/** The number of resources private to the entire 'LITTLE' cluster + - L2 cache +*/ +#define LITTLE_CLUSTER_RESOURCE_COUNT 1 + +/** The number of resources private to each 'LITTLE' core instance + - L1 data cache + - L1 instruction cache +*/ +#define LITTLE_CORE_RESOURCE_COUNT 2 + /** A structure describing the platform configuration manager repository information */ @@ -166,6 +282,24 @@ typedef struct PlatformRepositoryInfo { /// GIC MSI Frame information CM_ARM_GIC_MSI_FRAME_INFO GicMsiFrameInfo; + // Processor topology information + CM_ARM_PROC_HIERARCHY_INFO ProcHierarchyInfo[PLAT_PROC_HIERA= RCHY_NODE_COUNT]; + + // Cache information + CM_ARM_CACHE_INFO CacheInfo[PLAT_CACHE_COUNT]; + + // 'big' cluster private resources + CM_ARM_OBJ_REF BigClusterResources[BIG_CLUSTER_R= ESOURCE_COUNT]; + + // 'big' core private resources + CM_ARM_OBJ_REF BigCoreResources[BIG_CORE_RESOURC= E_COUNT]; + + // 'LITTLE' cluster private resources + CM_ARM_OBJ_REF LittleClusterResources[LITTLE_CLU= STER_RESOURCE_COUNT]; + + // 'LITTLE' core private resources + CM_ARM_OBJ_REF LittleCoreResources[LITTLE_CORE_R= ESOURCE_COUNT]; + /// Juno Board Revision UINT32 JunoRevision; } EDKII_PLATFORM_REPOSITORY_INFO; -- 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' --_000_VI1PR0801MB17437883AC8E2DB656A23CDE9AEC0VI1PR0801MB1743_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable
Reviewed-by: Alexei Fedorov <Alexei.Fedorov@arm.com>

Alexei


From: devel@edk2.groups.io= <devel@edk2.groups.io> on behalf of Krzysztof Koch via Groups.Io <= ;krzysztof.koch=3Darm.com@groups.io>
Sent: 12 June 2019 10:31
To: devel@edk2.groups.io
Cc: Ard Biesheuvel; Leif Lindholm; Michael D Kinney; Sami Mujawar; = Matteo Carlini; Stephanie Hughes-Fitt; nd
Subject: [edk2-devel] [edk2-platforms PATCH v1 1/1 -resend] Platfor= m/ARM/JunoPkg: Add support for PPTT dynamic generation
 
Update the Platform Respository for the Juno plat= form
to include support for generation of the Processor Properties
Topology Table (PPTT) using the Dynamic Tables Framework.

The Platform Repository now also describes the cache and
processor topology in Juno (all revisions).

Signed-off-by: Krzysztof Koch <krzysztof.koch@arm.com>
---

Changes can be seen at: https://github.com/KrzysztofKoch1/edk2-platforms/tree/392_dynamic_pptt_jun= o_v1

Notes:
    v1:
    - add support for dynamic generation of PPTT [Krzysztof= ]

 Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Co= nfigurationManager.c | 443 +++++++++= 3;+++++++++-
 Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Co= nfigurationManager.h | 136 +++++-
 2 files changed, 575 insertions(+), 4 deletions(-)

diff --git a/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManage= rDxe/ConfigurationManager.c b/Platform/ARM/JunoPkg/ConfigurationManager/Con= figurationManagerDxe/ConfigurationManager.c
index 78b906ddb8bbd35c32b4be98b1ee8bd973b6b818..2ef79ba5df750e869d241fcba9= 8fdd44b1f26002 100644
--- a/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Co= nfigurationManager.c
+++ b/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationM= anagerDxe/ConfigurationManager.c
@@ -96,7 +96,13 @@ EDKII_PLATFORM_REPOSITORY_INFO ArmJunoPlatformRepos= itoryInfo =3D {
       CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcp= iTableIdSsdt),
       (EFI_ACPI_DESCRIPTION_HEADER*)ssdtuar= t_aml_code
     },
-
+    // PPTT Table
+    {
+      EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPO= LOGY_TABLE_STRUCTURE_SIGNATURE,
+      EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPO= LOGY_TABLE_REVISION,
+      CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpi= TableIdPptt),
+      NULL
+    },
     /* PCI MCFG Table
        PCIe is only available on Juno = R1 and R2.
        Add the PCI table entries at th= e end of the table so that
@@ -261,6 +267,301 @@ EDKII_PLATFORM_REPOSITORY_INFO ArmJunoPlatformRe= positoryInfo =3D {
     127,
     // SPI Base used by this frame.
     224
+  },
+
+  // Processor Hierarchy Nodes
+  {
+    // Package
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[0])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_INVALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= NOT_LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_NOT_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      CM_NULL_TOKEN,
+      // CM_OBJECT_TOKEN  GicCToken
+      CM_NULL_TOKEN,
+      // UINT32  NoOfPrivateResources +      0,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      CM_NULL_TOKEN
+    },
+    // 'big' cluster
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[1])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= NOT_PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_INVALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= NOT_LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      REFERENCE_TOKEN (ProcHierarchyInfo[0])= , // -> Package
+      // CM_OBJECT_TOKEN  GicCToken
+      CM_NULL_TOKEN,
+      // UINT32  NoOfPrivateResources +      BIG_CLUSTER_RESOURCE_COUNT,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      REFERENCE_TOKEN (BigClusterResources)<= br> +    },
+    // 'LITTLE' cluster
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[2])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= NOT_PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_INVALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= NOT_LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      REFERENCE_TOKEN (ProcHierarchyInfo[0])= , // -> Package
+      // CM_OBJECT_TOKEN  GicCToken
+      CM_NULL_TOKEN,
+      // UINT32  NoOfPrivateResources +      LITTLE_CLUSTER_RESOURCE_COUNT,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      REFERENCE_TOKEN (LittleClusterResource= s)
+    },
+    // Two 'big' cores
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[3])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= NOT_PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_VALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_NOT_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      REFERENCE_TOKEN (ProcHierarchyInfo[1])= , // -> 'big' cluster
+      // CM_OBJECT_TOKEN  GicCToken
+      REFERENCE_TOKEN (GicCInfo[0]),
+      // UINT32  NoOfPrivateResources +      BIG_CORE_RESOURCE_COUNT,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      REFERENCE_TOKEN (BigCoreResources)
+    },
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[4])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= NOT_PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_VALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_NOT_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      REFERENCE_TOKEN (ProcHierarchyInfo[1])= , // -> 'big' cluster
+      // CM_OBJECT_TOKEN  GicCToken
+      REFERENCE_TOKEN (GicCInfo[1]),
+      // UINT32  NoOfPrivateResources +      BIG_CORE_RESOURCE_COUNT,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      REFERENCE_TOKEN (BigCoreResources)
+    },
+    // Four 'LITTLE' cores
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[5])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= NOT_PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_VALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_NOT_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      REFERENCE_TOKEN (ProcHierarchyInfo[2])= , // -> 'LITTLE' cluster
+      // CM_OBJECT_TOKEN  GicCToken
+      REFERENCE_TOKEN (GicCInfo[2]),
+      // UINT32  NoOfPrivateResources +      LITTLE_CORE_RESOURCE_COUNT,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      REFERENCE_TOKEN (LittleCoreResources)<= br> +    },
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[6])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= NOT_PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_VALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_NOT_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      REFERENCE_TOKEN (ProcHierarchyInfo[2])= , // -> 'LITTLE' cluster
+      // CM_OBJECT_TOKEN  GicCToken
+      REFERENCE_TOKEN (GicCInfo[3]),
+      // UINT32  NoOfPrivateResources +      LITTLE_CORE_RESOURCE_COUNT,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      REFERENCE_TOKEN (LittleCoreResources)<= br> +    },
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[7])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= NOT_PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_VALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_NOT_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      REFERENCE_TOKEN (ProcHierarchyInfo[2])= , // -> 'LITTLE' cluster
+      // CM_OBJECT_TOKEN  GicCToken
+      REFERENCE_TOKEN (GicCInfo[4]),
+      // UINT32  NoOfPrivateResources +      LITTLE_CORE_RESOURCE_COUNT,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      REFERENCE_TOKEN (LittleCoreResources)<= br> +    },
+    {
+      // CM_OBJECT_TOKEN  Token
+      REFERENCE_TOKEN (ProcHierarchyInfo[8])= ,
+      // UINT32  Flags
+      PROC_NODE_FLAGS (
+        EFI_ACPI_6_3_PPTT_PACKAGE_= NOT_PHYSICAL,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_ID_VALID,
+        EFI_ACPI_6_3_PPTT_PROCESSO= R_IS_NOT_THREAD,
+        EFI_ACPI_6_3_PPTT_NODE_IS_= LEAF,
+        EFI_ACPI_6_3_PPTT_IMPLEMEN= TATION_NOT_IDENTICAL
+      ),
+      // CM_OBJECT_TOKEN  ParentToken +      REFERENCE_TOKEN (ProcHierarchyInfo[2])= , // -> 'LITTLE' cluster
+      // CM_OBJECT_TOKEN  GicCToken
+      REFERENCE_TOKEN (GicCInfo[5]),
+      // UINT32  NoOfPrivateResources +      LITTLE_CORE_RESOURCE_COUNT,
+      // CM_OBJECT_TOKEN  PrivateResour= cesArrayToken
+      REFERENCE_TOKEN (LittleCoreResources)<= br> +    }
+  },
+
+  // Cache information
+  {
+    // 'big' cluster's L2 cache
+    {
+      REFERENCE_TOKEN (CacheInfo[0]),  = // CM_OBJECT_TOKEN  Token
+      CM_NULL_TOKEN,    =             &nb= sp;  // CM_OBJECT_TOKEN  NextLevelOfCacheToken
+      0x200000,     = ;            &n= bsp;      // UINT32  Size
+      2048,     &nb= sp;            =           // UINT32  Numb= erOfSets
+      16,      = ;            &n= bsp;           // UINT32&= nbsp; Associativity
+      CACHE_ATTRIBUTES (   &n= bsp;           // UINT8&n= bsp;  Attributes
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_ALLOCATION_READ_WRITE,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_CACHE_TYPE_UNIFIED,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_WRITE_POLICY_WRITE_BACK
+      ),
+      64      =             &nb= sp;            // UI= NT16  LineSize
+    },
+    // 'big' core's L1 instruction cache
+    {
+      REFERENCE_TOKEN (CacheInfo[1]),  = // CM_OBJECT_TOKEN  Token
+      CM_NULL_TOKEN,    =             &nb= sp;  // CM_OBJECT_TOKEN  NextLevelOfCacheToken
+      0xc000,     &= nbsp;           &nbs= p;        // UINT32  Size
+      256,     &nbs= p;            &= nbsp;          // UINT32 = NumberOfSets
+      3,      =             &nb= sp;            // UI= NT32  Associativity
+      CACHE_ATTRIBUTES (   &n= bsp;           // UINT8&n= bsp;  Attributes
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_ALLOCATION_READ,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_CACHE_TYPE_INSTRUCTION,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_WRITE_POLICY_WRITE_BACK
+      ),
+      64      =             &nb= sp;            // UI= NT16  LineSize
+    },
+    // 'big' core's L1 data cache
+    {
+      REFERENCE_TOKEN (CacheInfo[2]),  = // CM_OBJECT_TOKEN  Token
+      CM_NULL_TOKEN,    =             &nb= sp;  // CM_OBJECT_TOKEN  NextLevelOfCacheToken
+      0x8000,     &= nbsp;           &nbs= p;        // UINT32  Size
+      256,     &nbs= p;            &= nbsp;          // UINT32 = NumberOfSets
+      2,      =             &nb= sp;            // UI= NT32  Associativity
+      CACHE_ATTRIBUTES (   &n= bsp;           // UINT8&n= bsp;  Attributes
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_ALLOCATION_READ_WRITE,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_CACHE_TYPE_DATA,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_WRITE_POLICY_WRITE_BACK
+      ),
+      64      =             &nb= sp;            // UI= NT16  LineSize
+    },
+    // 'LITTLE' cluster's L2 cache
+    {
+      REFERENCE_TOKEN (CacheInfo[3]),  = // CM_OBJECT_TOKEN  Token
+      CM_NULL_TOKEN,    =             &nb= sp;  // CM_OBJECT_TOKEN  NextLevelOfCacheToken
+      0x100000,     = ;            &n= bsp;      // UINT32  Size
+      1024,     &nb= sp;            =           // UINT32  Numb= erOfSets
+      16,      = ;            &n= bsp;           // UINT32&= nbsp; Associativity
+      CACHE_ATTRIBUTES (   &n= bsp;           // UINT8&n= bsp;  Attributes
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_ALLOCATION_READ_WRITE,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_CACHE_TYPE_UNIFIED,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_WRITE_POLICY_WRITE_BACK
+      ),
+      64      =             &nb= sp;            // UI= NT16  LineSize
+    },
+    // 'LITTLE' core's L1 instruction cache
+    {
+      REFERENCE_TOKEN (CacheInfo[4]),  = // CM_OBJECT_TOKEN  Token
+      CM_NULL_TOKEN,    =             &nb= sp;  // CM_OBJECT_TOKEN  NextLevelOfCacheToken
+      0x8000,     &= nbsp;           &nbs= p;        // UINT32  Size
+      256,     &nbs= p;            &= nbsp;          // UINT32 = NumberOfSets
+      2,      =             &nb= sp;            // UI= NT32  Associativity
+      CACHE_ATTRIBUTES (   &n= bsp;           // UINT8&n= bsp;  Attributes
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_ALLOCATION_READ,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_CACHE_TYPE_INSTRUCTION,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_WRITE_POLICY_WRITE_BACK
+      ),
+      64      =             &nb= sp;            // UI= NT16  LineSize
+    },
+    // 'LITTLE' core's L1 data cache
+    {
+      REFERENCE_TOKEN (CacheInfo[5]),  = // CM_OBJECT_TOKEN  Token
+      CM_NULL_TOKEN,    =             &nb= sp;  // CM_OBJECT_TOKEN  NextLevelOfCacheToken
+      0x8000,     &= nbsp;           &nbs= p;        // UINT32  Size
+      128,     &nbs= p;            &= nbsp;          // UINT32 = NumberOfSets
+      4,      =             &nb= sp;            // UI= NT32  Associativity
+      CACHE_ATTRIBUTES (   &n= bsp;           // UINT8&n= bsp;  Attributes
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_ALLOCATION_READ_WRITE,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_CACHE_TYPE_DATA,
+        EFI_ACPI_6_3_CACHE_ATTRIBU= TES_WRITE_POLICY_WRITE_BACK
+      ),
+      64      =             &nb= sp;            // UI= NT16  LineSize
+    }
+  },
+  // Resources private to the 'big' cluster (shared among cores)=
+  {
+    { REFERENCE_TOKEN (CacheInfo[0]) }  // -> = 'big' cluster's L2 cache
+  },
+  // Resources private to each individual 'big' core instance +  {
+    { REFERENCE_TOKEN (CacheInfo[1]) }, // -> 'big'= core's L1 I-cache
+    { REFERENCE_TOKEN (CacheInfo[2]) }  // -> = 'big' core's L1 D-cache
+  },
+  // Resources private to the 'LITTLE' cluster (shared among cor= es)
+  {
+    { REFERENCE_TOKEN (CacheInfo[3]) }  // -> = 'LITTLE' cluster's L2 cache
+  },
+  // Resources private to each individual 'LITTLE' core instance=
+  {
+    { REFERENCE_TOKEN (CacheInfo[4]) }, // -> 'LITT= LE' core's L1 I-cache
+    { REFERENCE_TOKEN (CacheInfo[5]) }  // -> = 'LITTLE' core's L1 D-cache
   }
 };
 
@@ -329,6 +630,121 @@ GetGTBlockTimerFrameInfo (
   return EFI_SUCCESS;
 }
 
+/** Return GIC CPU Interface Info.
+
+  @param [in]      This  &nbs= p;        Pointer to the Configuration M= anager Protocol.
+  @param [in]      CmObjectId &nbs= p;   The Object ID of the CM object requested
+  @param [in]      SearchToken &nb= sp;  A unique token for identifying the requested
+           &nb= sp;            =           CM_ARM_GICC_INFO obj= ect.
+  @param [in, out] CmObject       = Pointer to the Configuration Manager Object
+           &nb= sp;            =           descriptor describin= g the requested Object.
+
+  @retval EFI_SUCCESS       &= nbsp;     Success.
+  @retval EFI_INVALID_PARAMETER   A parameter is inval= id.
+  @retval EFI_NOT_FOUND       = ;    The required object information is not found.
+**/
+EFI_STATUS
+EFIAPI
+GetGicCInfo (
+  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  * CO= NST This,
+  IN  CONST CM_OBJECT_ID      = ;            &n= bsp;            = ;   CmObjectId,
+  IN  CONST CM_OBJECT_TOKEN     &n= bsp;            = ;             S= earchToken,
+  IN  OUT   CM_OBJ_DESCRIPTOR   &n= bsp;            = ;     * CONST CmObject
+  )
+{
+  EDKII_PLATFORM_REPOSITORY_INFO  * PlatformRepo;
+  UINT32         &n= bsp;            = ;      TotalObjCount;
+  UINT32         &n= bsp;            = ;      ObjIndex;
+
+  if ((This =3D=3D NULL) || (CmObject =3D=3D NULL)) {
+    ASSERT (This !=3D NULL);
+    ASSERT (CmObject !=3D NULL);
+    return EFI_INVALID_PARAMETER;
+  }
+
+  PlatformRepo =3D This->PlatRepoInfo;
+
+  TotalObjCount =3D sizeof (PlatformRepo->GicCInfo) /
+           &nb= sp;        sizeof (PlatformRepo->GicC= Info[0]);
+
+  for (ObjIndex =3D 0; ObjIndex < TotalObjCount; ObjIndex+= ;+) {
+    if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&Platf= ormRepo->GicCInfo[ObjIndex]) {
+      CmObject->ObjectId =3D CmObjectId;<= br> +      CmObject->Size =3D sizeof (Platform= Repo->GicCInfo[ObjIndex]);
+      CmObject->Data =3D (VOID*)&Plat= formRepo->GicCInfo[ObjIndex];
+      CmObject->Count =3D 1;
+      return EFI_SUCCESS;
+    }
+  }
+
+  return EFI_NOT_FOUND;
+}
+
+/** Return a list of Configuration Manager object references pointed = to by the
+    given input token.
+
+  @param [in]      This  &nbs= p;        Pointer to the Configuration M= anager Protocol.
+  @param [in]      CmObjectId &nbs= p;   The Object ID of the CM object requested
+  @param [in]      SearchToken &nb= sp;  A unique token for identifying the requested
+           &nb= sp;            =           CM_ARM_OBJ_REF list.=
+  @param [in, out] CmObject       = Pointer to the Configuration Manager Object
+           &nb= sp;            =           descriptor describin= g the requested Object.
+
+  @retval EFI_SUCCESS       &= nbsp;     Success.
+  @retval EFI_INVALID_PARAMETER   A parameter is inval= id.
+  @retval EFI_NOT_FOUND       = ;    The required object information is not found.
+**/
+EFI_STATUS
+EFIAPI
+GetCmObjRefs (
+  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  * CO= NST This,
+  IN  CONST CM_OBJECT_ID      = ;            &n= bsp;            = ;   CmObjectId,
+  IN  CONST CM_OBJECT_TOKEN     &n= bsp;            = ;             S= earchToken,
+  IN  OUT   CM_OBJ_DESCRIPTOR   &n= bsp;            = ;     * CONST CmObject
+  )
+{
+  EDKII_PLATFORM_REPOSITORY_INFO  * PlatformRepo;
+
+  if ((This =3D=3D NULL) || (CmObject =3D=3D NULL)) {
+    ASSERT (This !=3D NULL);
+    ASSERT (CmObject !=3D NULL);
+    return EFI_INVALID_PARAMETER;
+  }
+
+  PlatformRepo =3D This->PlatRepoInfo;
+
+  if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->= BigClusterResources) {
+    CmObject->Size =3D sizeof (PlatformRepo->Big= ClusterResources);
+    CmObject->Data =3D (VOID*)&PlatformRepo->= ;BigClusterResources;
+    CmObject->Count =3D sizeof (PlatformRepo->Bi= gClusterResources) /
+           &nb= sp;            sizeo= f (PlatformRepo->BigClusterResources[0]);
+    return EFI_SUCCESS;
+  }
+  if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->= BigCoreResources) {
+    CmObject->Size =3D sizeof (PlatformRepo->Big= CoreResources);
+    CmObject->Data =3D (VOID*)&PlatformRepo->= ;BigCoreResources;
+    CmObject->Count =3D sizeof (PlatformRepo->Bi= gCoreResources) /
+           &nb= sp;            sizeo= f (PlatformRepo->BigCoreResources[0]);
+    return EFI_SUCCESS;
+  }
+  if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->= LittleClusterResources) {
+    CmObject->Size =3D sizeof (PlatformRepo->Lit= tleClusterResources);
+    CmObject->Data =3D (VOID*)&PlatformRepo->= ;LittleClusterResources;
+    CmObject->Count =3D sizeof (PlatformRepo->Li= ttleClusterResources) /
+           &nb= sp;            sizeo= f (PlatformRepo->LittleClusterResources[0]);
+    return EFI_SUCCESS;
+  }
+  if (SearchToken =3D=3D (CM_OBJECT_TOKEN)&PlatformRepo->= LittleCoreResources) {
+    CmObject->Size =3D sizeof (PlatformRepo->Lit= tleCoreResources);
+    CmObject->Data =3D (VOID*)&PlatformRepo->= ;LittleCoreResources;
+    CmObject->Count =3D sizeof (PlatformRepo->Li= ttleCoreResources) /
+           &nb= sp;            sizeo= f (PlatformRepo->LittleCoreResources[0]);
+    return EFI_SUCCESS;
+  }
+
+  return EFI_NOT_FOUND;
+}
+
 /** Return a standard namespace object.
 
   @param [in]      This  &nb= sp;     Pointer to the Configuration Manager Protocol.<= br> @@ -486,12 +902,14 @@ GetArmNameSpaceObject (
       Token,
       GetGTBlockTimerFrameInfo
       );
-    HANDLE_CM_OBJECT (
+    HANDLE_CM_OBJECT_REF_BY_TOKEN (
       EArmObjGicCInfo,
       CmObjectId,
       PlatformRepo->GicCInfo,
       (sizeof (PlatformRepo->GicCInfo) /=
-         sizeof (PlatformRepo->= ;GicCInfo[0]))
+         sizeof (PlatformRepo= ->GicCInfo[0])),
+      Token,
+      GetGicCInfo
       );
     HANDLE_CM_OBJECT (
       EArmObjGicDInfo,
@@ -518,6 +936,25 @@ GetArmNameSpaceObject (
       PlatformRepo->GicMsiFrameInfo,
       1
       );
+    HANDLE_CM_OBJECT (
+      EArmObjProcHierarchyInfo,
+      CmObjectId,
+      PlatformRepo->ProcHierarchyInfo, +      (sizeof (PlatformRepo->ProcHierarch= yInfo) /
+         sizeof (PlatformRepo= ->ProcHierarchyInfo[0]))
+      );
+    HANDLE_CM_OBJECT (
+      EArmObjCacheInfo,
+      CmObjectId,
+      PlatformRepo->CacheInfo,
+      sizeof (PlatformRepo->CacheInfo) / = sizeof (PlatformRepo->CacheInfo[0])
+      );
+    HANDLE_CM_OBJECT_SEARCH_PLAT_REPO (
+      EArmObjCmRef,
+      CmObjectId,
+      Token,
+      GetCmObjRefs
+      );
 
     case EArmObjPciConfigSpaceInfo:
       if (PlatformRepo->JunoRevision != =3D JUNO_REVISION_R0) {
diff --git a/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManage= rDxe/ConfigurationManager.h b/Platform/ARM/JunoPkg/ConfigurationManager/Con= figurationManagerDxe/ConfigurationManager.h
index 060817430fe75fdf79196f8a9d31561028fb0f50..7fdf663fc6d2ad80da26ff1f16= 35c858d5be4e93 100644
--- a/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationManagerDxe/Co= nfigurationManager.h
+++ b/Platform/ARM/JunoPkg/ConfigurationManager/ConfigurationM= anagerDxe/ConfigurationManager.h
@@ -20,6 +20,12 @@
 */
 #define CFG_MGR_OEM_ID    { 'A', 'R', 'M', 'L', 'T', = 'D' }
 
+/** A helper macro for mapping a reference token
+*/
+#define REFERENCE_TOKEN(Field)      &nb= sp;            =             &nb= sp;           \
+  (CM_OBJECT_TOKEN)((UINT8*)&ArmJunoPlatformRepositoryInfo &= #43;            = ; \
+    OFFSET_OF (EDKII_PLATFORM_REPOSITORY_INFO, Field))=
+
 /** A helper macro for populating the GIC CPU information
 */
 #define GICC_ENTRY(        &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;        \
@@ -46,6 +52,36 @@
     EnergyEfficiency     &nb= sp;    /* UINT8   ProcessorPowerEfficiencyClass*/ = \
     }
 
+/** A helper macro for populating the Processor Hierarchy Node flags<= br> +*/
+#define PROC_NODE_FLAGS(       &nb= sp;            =             &nb= sp;            =    \
+          PhysicalPackag= e,            &= nbsp;           &nbs= p;            &= nbsp;        \
+          AcpiProcessorI= dValid,           &n= bsp;            = ;            &n= bsp;    \
+          ProcessorIsThr= ead,            = ;            &n= bsp;            = ;       \
+          NodeIsLeaf,&nb= sp;            =             &nb= sp;            =              \<= br> +          IdenticalImple= mentation           =             &nb= sp;            =    \
+          )  &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        \
+  (          &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        \
+    PhysicalPackage |     &nb= sp;            =             &nb= sp;            =         \
+    (AcpiProcessorIdValid << 1) |  &nb= sp;            =             &nb= sp;           \
+    (ProcessorIsThread << 2) |   =             &nb= sp;            =             &nb= sp; \
+    (NodeIsLeaf << 3) |    &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;       \
+    (IdenticalImplementation << 4)  &n= bsp;            = ;            &n= bsp;          \
+  )
+
+/** A helper macro for populating the Cache Type Structure's attribut= es
+*/
+#define CACHE_ATTRIBUTES(       &n= bsp;            = ;            &n= bsp;            = ;  \
+          AllocationType= ,            &n= bsp;            = ;            &n= bsp;         \
+          CacheType,&nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p; \
+          WritePolicy&nb= sp;            =             &nb= sp;            =              \<= br> +          )  &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        \
+  (          &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        \
+    AllocationType |     &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        \
+    (CacheType << 2) |    &n= bsp;            = ;            &n= bsp;            = ;        \
+    (WritePolicy << 4)    &n= bsp;            = ;            &n= bsp;            = ;        \
+  )
+
 /** A helper macro for returning configuration manager objects
 */
 #define HANDLE_CM_OBJECT(ObjId, CmObjectId, Object, ObjectCount)&nbs= p;     \
@@ -102,13 +138,46 @@
     break;       &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        \
   }
 
+/** A helper macro for returning configuration manager objects refere= nced
+    by token when the entire platform repository is in= scope and the
+    CM_NULL_TOKEN value is not allowed.
+*/
+#define HANDLE_CM_OBJECT_SEARCH_PLAT_REPO(    &nb= sp;            =             &nb= sp;    \
+          ObjId, &n= bsp;            = ;            &n= bsp;            = ;            &n= bsp;        \
+          CmObjectId,&nb= sp;            =             &nb= sp;            =             &nb= sp;    \
+          Token, &n= bsp;            = ;            &n= bsp;            = ;            &n= bsp;        \
+          HandlerProc&nb= sp;            =             &nb= sp;            =             &nb= sp;    \
+          )  &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;            \ +  case ObjId: {        &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;  \
+    CmObject->ObjectId =3D CmObjectId;  &= nbsp;           &nbs= p;            &= nbsp;            \ +    if (Token =3D=3D CM_NULL_TOKEN) {   = ;            &n= bsp;            = ;            &n= bsp;  \
+      Status =3D EFI_INVALID_PARAMETER; = ;            &n= bsp;            = ;             \=
+      DEBUG ((     =             &nb= sp;            =             &nb= sp;            =        \
+        DEBUG_ERROR,  &n= bsp;            = ;            &n= bsp;            = ;            &n= bsp;   \
+        #ObjId ": CM_NULL_TOK= EN value is not allowed when searching"     &= nbsp;  \
+        " the entire platform= repository.\n"         &= nbsp;           &nbs= p;          \
+        ));    = ;            &n= bsp;            = ;            &n= bsp;            = ;           \
+    } else {       =             &nb= sp;            =             &nb= sp;            =        \
+      Status =3D HandlerProc (This, CmObject= Id, Token, CmObject);         =     \
+      DEBUG ((     =             &nb= sp;            =             &nb= sp;            =        \
+        DEBUG_INFO,  &nb= sp;            =             &nb= sp;            =             &nb= sp;    \
+        #ObjId ": Token =3D 0= x%p, Ptr =3D 0x%p, Size =3D %d, Count =3D %d\n",   &nbs= p;   \
+        (VOID*)Token,  &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;  \
+        CmObject->Data, &n= bsp;            = ;            &n= bsp;            = ;            &n= bsp; \
+        CmObject->Size, &n= bsp;            = ;            &n= bsp;            = ;            &n= bsp; \
+        CmObject->Count &n= bsp;            = ;            &n= bsp;            = ;            &n= bsp; \
+        ));    = ;            &n= bsp;            = ;            &n= bsp;            = ;           \
+    }        &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;            \ +    break;       &n= bsp;            = ;            &n= bsp;            = ;            &n= bsp;        \
+  }
+
 /** The number of CPUs
 */
 #define PLAT_CPU_COUNT       &nbs= p;  6
 
 /** The number of ACPI tables to install
 */
-#define PLAT_ACPI_TABLE_COUNT   10
+#define PLAT_ACPI_TABLE_COUNT   11
 
 /** The number of platform generic timer blocks
 */
@@ -118,6 +187,53 @@
 */
 #define PLAT_GTFRAME_COUNT       =    2
 
+/** For all Juno revisions, the cache and processor topology is ident= ical.
+
+  Terms 'big' and 'LITTLE' are used in favour of A72, A57 or A53= to take into
+  account that Juno r2 uses Cortex-A72 as 'big' cores, whereas J= uno r0 and r1
+  have Cortex-A57 as 'big' cores.
+*/
+
+/** The number of Processor Hierarchy Nodes
+    - one package node
+    - two cluster nodes ('big' + 'LITTLE')
+    - two 'big' cores
+    - four 'LITTLE' cores
+*/
+#define PLAT_PROC_HIERARCHY_NODE_COUNT  9
+
+/** The number of unique cache structures:
+    - 'big' core L1 instruction cache
+    - 'big' core L1 data cache
+    - 'big' core L2 cache
+    - 'LITTLE' core L1 instruction cache
+    - 'LITTLE' core L1 data cache
+    - 'LITTLE' core L2 cache
+*/
+#define PLAT_CACHE_COUNT       &nb= sp;        6
+
+/** The number of resources private to the entire 'big' cluster
+    - L2 cache
+*/
+#define BIG_CLUSTER_RESOURCE_COUNT  1
+
+/** The number of resources private to 'big' core instance
+    - L1 data cache
+    - L1 instruction cache
+*/
+#define BIG_CORE_RESOURCE_COUNT  2
+
+/** The number of resources private to the entire 'LITTLE' cluster +    - L2 cache
+*/
+#define LITTLE_CLUSTER_RESOURCE_COUNT  1
+
+/** The number of resources private to each 'LITTLE' core instance +    - L1 data cache
+    - L1 instruction cache
+*/
+#define LITTLE_CORE_RESOURCE_COUNT  2
+
 /** A structure describing the platform configuration
     manager repository information
 */
@@ -166,6 +282,24 @@ typedef struct PlatformRepositoryInfo {
   /// GIC MSI Frame information
   CM_ARM_GIC_MSI_FRAME_INFO      =        GicMsiFrameInfo;
 
+  // Processor topology information
+  CM_ARM_PROC_HIERARCHY_INFO      =       ProcHierarchyInfo[PLAT_PROC_HIERARCHY_NODE_C= OUNT];
+
+  // Cache information
+  CM_ARM_CACHE_INFO       &nb= sp;            = CacheInfo[PLAT_CACHE_COUNT];
+
+  // 'big' cluster private resources
+  CM_ARM_OBJ_REF        =             &nb= sp;   BigClusterResources[BIG_CLUSTER_RESOURCE_COUNT];
+
+  // 'big' core private resources
+  CM_ARM_OBJ_REF        =             &nb= sp;   BigCoreResources[BIG_CORE_RESOURCE_COUNT];
+
+  // 'LITTLE' cluster private resources
+  CM_ARM_OBJ_REF        =             &nb= sp;   LittleClusterResources[LITTLE_CLUSTER_RESOURCE_COUNT];
+
+  // 'LITTLE' core private resources
+  CM_ARM_OBJ_REF        =             &nb= sp;   LittleCoreResources[LITTLE_CORE_RESOURCE_COUNT];
+
   /// Juno Board Revision
   UINT32         &= nbsp;           &nbs= p;          JunoRevision;
 } EDKII_PLATFORM_REPOSITORY_INFO;
--
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'





--_000_VI1PR0801MB17437883AC8E2DB656A23CDE9AEC0VI1PR0801MB1743_--